mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-06 08:31:17 +00:00
Don't forget to check the vendor when probing. Also, there's no need
to double check for if the card has probed before. In fact, there's no reason to single check either. Simplify the code as a result. $FreeBSD$ added to lxutil.c in a non-standard way to help keep the diffs with upstream to a minimum. Differential Revision: https://reviews.freebsd.org/D3263
This commit is contained in:
parent
e7e71dd7f3
commit
123049cf36
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=286208
|
@ -19,6 +19,7 @@
|
|||
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
|
||||
|
||||
******************************************************************************/
|
||||
/* $FreeBSD$ */
|
||||
/******************************************************************************
|
||||
This program is part of PMC-Sierra initiator/target device driver.
|
||||
The functions here are commonly used by different type of drivers that support
|
||||
|
@ -756,37 +757,30 @@ STATIC int agtiapi_ProbeCard( device_t dev,
|
|||
int thisCard )
|
||||
{
|
||||
int idx;
|
||||
static U32 cardMap[4] = { 0, 0, 0, 0 };
|
||||
u_int16_t agtiapi_vendor; // PCI vendor ID
|
||||
u_int16_t agtiapi_dev; // PCI device ID
|
||||
AGTIAPI_PRINTK("agtiapi_ProbeCard: start\n");
|
||||
|
||||
if ( ! atomic_cmpset_32( &cardMap[thisCard], 0, 5 ) ) { // card already ran
|
||||
AGTIAPI_PRINTK( "We'll only ID this card once -- %d\n", thisCard );
|
||||
return 2; // error return value; card already ran this function
|
||||
}
|
||||
else {
|
||||
agtiapi_dev = pci_get_device( dev ); // get PCI device ID
|
||||
for( idx = 0; idx < COUNT(ag_card_type); idx++ )
|
||||
{
|
||||
if( ag_card_type[idx].deviceId == agtiapi_dev )
|
||||
{ // device ID match
|
||||
memset( (void *)&agCardInfoList[ thisCard ], 0,
|
||||
sizeof(ag_card_info_t) );
|
||||
thisCardInst->cardIdIndex = idx;
|
||||
thisCardInst->pPCIDev = dev;
|
||||
thisCardInst->cardNameIndex = ag_card_type[idx].cardNameIndex;
|
||||
thisCardInst->cardID =
|
||||
pci_read_config( dev, ag_card_type[idx].membar, 4 ); // memAddr
|
||||
AGTIAPI_PRINTK("agtiapi_ProbeCard: We've got PMC SAS, probe successful %p / %p\n",
|
||||
thisCardInst->pPCIDev, thisCardInst );
|
||||
device_printf( dev,
|
||||
"agtiapi PCI Probe Vendor ID : 0x%x Device ID : 0x%x\n",
|
||||
pci_get_vendor(dev), agtiapi_dev );
|
||||
device_set_desc( dev, ag_card_names[ag_card_type[idx].cardNameIndex] );
|
||||
return 0;
|
||||
}
|
||||
agtiapi_vendor = pci_get_vendor( dev ); // get PCI vendor ID
|
||||
agtiapi_dev = pci_get_device( dev ); // get PCI device ID
|
||||
for( idx = 0; idx < COUNT(ag_card_type); idx++ )
|
||||
{
|
||||
if ( ag_card_type[idx].deviceId == agtiapi_dev &&
|
||||
ag_card_type[idx].vendorId == agtiapi_vendor)
|
||||
{ // device ID match
|
||||
memset( (void *)&agCardInfoList[ thisCard ], 0,
|
||||
sizeof(ag_card_info_t) );
|
||||
thisCardInst->cardIdIndex = idx;
|
||||
thisCardInst->pPCIDev = dev;
|
||||
thisCardInst->cardNameIndex = ag_card_type[idx].cardNameIndex;
|
||||
thisCardInst->cardID =
|
||||
pci_read_config( dev, ag_card_type[idx].membar, 4 ); // memAddr
|
||||
AGTIAPI_PRINTK("agtiapi_ProbeCard: We've got PMC SAS, probe successful %p / %p\n",
|
||||
thisCardInst->pPCIDev, thisCardInst );
|
||||
device_set_desc( dev, ag_card_names[ag_card_type[idx].cardNameIndex] );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 7;
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -214,7 +214,6 @@ STATIC void agtiapi_CheckIOTimeout(void *data);
|
|||
|
||||
|
||||
|
||||
static unsigned char cardMap[AGTIAPI_MAX_CARDS] = { 0, 0, 0, 0 };
|
||||
static ag_card_info_t agCardInfoList[ AGTIAPI_MAX_CARDS ]; // card info list
|
||||
static void agtiapi_cam_action( struct cam_sim *, union ccb * );
|
||||
static void agtiapi_cam_poll( struct cam_sim * );
|
||||
|
@ -695,37 +694,20 @@ agtiapi_probe()
|
|||
static int agtiapi_probe( device_t dev )
|
||||
{
|
||||
int retVal;
|
||||
|
||||
if ( pci_get_vendor(dev) == PCI_VENDOR_ID_PMC_SIERRA ||
|
||||
pci_get_vendor(dev) == PCI_VENDOR_ID_HIALEAH )
|
||||
int thisCard;
|
||||
ag_card_info_t *thisCardInst;
|
||||
|
||||
thisCard = device_get_unit( dev );
|
||||
if ( thisCard >= AGTIAPI_MAX_CARDS )
|
||||
{
|
||||
int thisCard = device_get_unit( dev );
|
||||
// AGTIAPI_PRINTK("agtiapi_probe: thisCard %d\n", thisCard);
|
||||
if( thisCard >= AGTIAPI_MAX_CARDS)
|
||||
{
|
||||
device_printf( dev, "Too many PMC-Sierra cards detected ERROR!\n" );
|
||||
return (ENXIO); // maybe change to different return value?
|
||||
}
|
||||
ag_card_info_t *thisCardInst = &agCardInfoList[ thisCard ];
|
||||
retVal = agtiapi_ProbeCard( dev, thisCardInst, thisCard );
|
||||
if ( retVal ) {
|
||||
// error on probe
|
||||
if( retVal == 2 ) return 0; // another thread ran probe on this card
|
||||
device_printf( dev,
|
||||
"agtiapi_probe: PCI DEVICE NOT SUPPORTED by this driver!!"
|
||||
"Vendor ID : 0x%x Device ID : 0x%x\n",
|
||||
pci_get_vendor(dev), pci_get_device( dev ) );
|
||||
return (ENXIO); // maybe change to different return value?
|
||||
}
|
||||
else {
|
||||
// AGTIAPI_PRINTK( "agtiapi_ProbeCard: returned with pointer values "
|
||||
// "%p / %p\n",
|
||||
// thisCardInst->pPCIDev, thisCardInst );
|
||||
cardMap[thisCard] = 11; // record this card is present
|
||||
return( BUS_PROBE_DEFAULT ); // successful probe
|
||||
}
|
||||
device_printf( dev, "Too many PMC-Sierra cards detected ERROR!\n" );
|
||||
return (ENXIO); // maybe change to different return value?
|
||||
}
|
||||
return (ENXIO);
|
||||
thisCardInst = &agCardInfoList[ thisCard ];
|
||||
retVal = agtiapi_ProbeCard( dev, thisCardInst, thisCard );
|
||||
if ( retVal )
|
||||
return (ENXIO); // maybe change to different return value?
|
||||
return( BUS_PROBE_DEFAULT ); // successful probe
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue