47 lines
1.3 KiB
Diff
47 lines
1.3 KiB
Diff
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
|