summaryrefslogtreecommitdiffstats
path: root/target/linux/rb532-2.6/patches/210-pci_fixes.patch
blob: 02cd2f063cc365c349d94579a34c29b0b7e54929 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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