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:
Warner Losh 2015-08-02 16:26:41 +00:00
parent e7e71dd7f3
commit 123049cf36
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=286208
2 changed files with 33 additions and 57 deletions

View file

@ -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;
}

View file

@ -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
}