diff -urN linux.old/drivers/pci/probe.c linux.dev/drivers/pci/probe.c --- linux.old/drivers/pci/probe.c 2006-06-08 20:21:20.000000000 +0200 +++ linux.dev/drivers/pci/probe.c 2006-06-08 20:19:40.000000000 +0200 @@ -760,15 +760,22 @@ u32 l; u8 hdr_type; int delay = 1; - - if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l)) - return NULL; - - /* some broken boards return 0 or ~0 if a slot is empty: */ - if (l == 0xffffffff || l == 0x00000000 || - l == 0x0000ffff || l == 0xffff0000) - return NULL; - + do { + if (pci_bus_read_config_dword(bus, devfn, PCI_VENDOR_ID, &l)) + return NULL; + /* some broken boards return 0 or ~0 if a slot is empty: */ + if (l == 0xffffffff || l == 0x00000000 || + l == 0x0000ffff || l == 0xffff0000){ + if (delay > 4) + return NULL; + /* But that could also be the previous dev not settled */ + pr_debug("PCI: retrying scan at 0x%x, because config is 0x%x\n",devfn,l); + msleep(delay); + delay *=2; + l=0; + } + }while (l==0); + /* Configuration request Retry Status */ while (l == 0xffff0001) { msleep(delay); @@ -903,7 +910,10 @@ /* Go find them, Rover! */ for (devfn = 0; devfn < 0x100; devfn += 8) + { + if (bus->number == 0 && (devfn >> 3) > 21) break; pci_scan_slot(bus, devfn); + } /* * After performing arch-dependent fixup of the bus, look behind