*
* @v pci PCI device to fill in
* @v busdevfn Starting bus:dev.fn address
- * @ret busdevfn Bus:dev.fn address of next PCI device, or negative error
+ * @ret busdevfn Bus:dev.fn address of next PCI device
+ * @ret rc Return status code
*/
-int pci_find_next ( struct pci_device *pci, unsigned int busdevfn ) {
+int pci_find_next ( struct pci_device *pci, uint32_t *busdevfn ) {
static unsigned int end;
unsigned int sub_end;
uint8_t hdrtype;
end = PCI_BUSDEVFN ( 0, pci_num_bus(), 0, 0 );
/* Find next PCI device, if any */
- for ( ; busdevfn < end ; busdevfn++ ) {
+ for ( ; *busdevfn < end ; (*busdevfn)++ ) {
/* Check for PCI device existence */
memset ( pci, 0, sizeof ( *pci ) );
- pci_init ( pci, busdevfn );
+ pci_init ( pci, *busdevfn );
if ( ( rc = pci_read_config ( pci ) ) != 0 )
continue;
}
/* Return this device */
- return busdevfn;
+ return 0;
}
return -ENODEV;
*/
static int pcibus_probe ( struct root_device *rootdev ) {
struct pci_device *pci = NULL;
- int busdevfn = 0;
+ uint32_t busdevfn = 0;
int rc;
for ( busdevfn = 0 ; 1 ; busdevfn++ ) {
}
/* Find next PCI device, if any */
- busdevfn = pci_find_next ( pci, busdevfn );
- if ( busdevfn < 0 )
+ if ( ( rc = pci_find_next ( pci, &busdevfn ) ) != 0 )
break;
/* Look for a driver */
struct named_setting setting;
struct pci_device pci;
unsigned long prev;
- int next;
+ uint32_t busdevfn;
int len;
int rc;
if ( ( len = fetchn_setting ( setting.settings, &setting.setting,
NULL, &setting.setting, &prev ) ) < 0 ) {
/* Setting not yet defined: start searching from 00:00.0 */
- prev = 0;
+ busdevfn = 0;
} else {
/* Setting is defined: start searching from next location */
- prev++;
+ busdevfn = ( prev + 1 );
}
/* Find next existent PCI device */
- if ( ( next = pci_find_next ( &pci, prev ) ) < 0 ) {
- rc = next;
+ if ( ( rc = pci_find_next ( &pci, &busdevfn ) ) != 0 )
goto err_find_next;
- }
/* Apply default type if necessary. Use ":uint16" rather than
* ":busdevfn" to allow for easy inclusion within a
/* Store setting */
if ( ( rc = storen_setting ( setting.settings, &setting.setting,
- next ) ) != 0 ) {
+ busdevfn ) ) != 0 ) {
printf ( "Could not store \"%s\": %s\n",
setting.setting.name, strerror ( rc ) );
goto err_store;
extern unsigned long pci_bar_start ( struct pci_device *pci,
unsigned int reg );
extern int pci_read_config ( struct pci_device *pci );
-extern int pci_find_next ( struct pci_device *pci, unsigned int busdevfn );
+extern int pci_find_next ( struct pci_device *pci, uint32_t *busdevfn );
extern int pci_find_driver ( struct pci_device *pci );
extern int pci_probe ( struct pci_device *pci );
extern void pci_remove ( struct pci_device *pci );