add a better pci fix for rb532
SVN-Revision: 5861
This commit is contained in:
parent
6a5a5e896b
commit
e8258da964
2 changed files with 25 additions and 48 deletions
|
@ -130,13 +130,14 @@ diff -urN linux.old/arch/mips/pci/Makefile linux.dev/arch/mips/pci/Makefile
|
||||||
diff -urN linux.old/arch/mips/pci/ops-rc32434.c linux.dev/arch/mips/pci/ops-rc32434.c
|
diff -urN linux.old/arch/mips/pci/ops-rc32434.c linux.dev/arch/mips/pci/ops-rc32434.c
|
||||||
--- linux.old/arch/mips/pci/ops-rc32434.c 1970-01-01 01:00:00.000000000 +0100
|
--- linux.old/arch/mips/pci/ops-rc32434.c 1970-01-01 01:00:00.000000000 +0100
|
||||||
+++ linux.dev/arch/mips/pci/ops-rc32434.c 2006-12-14 04:09:50.000000000 +0100
|
+++ linux.dev/arch/mips/pci/ops-rc32434.c 2006-12-14 04:09:50.000000000 +0100
|
||||||
@@ -0,0 +1,195 @@
|
@@ -0,0 +1,218 @@
|
||||||
+/**************************************************************************
|
+/**************************************************************************
|
||||||
+ *
|
+ *
|
||||||
+ * BRIEF MODULE DESCRIPTION
|
+ * BRIEF MODULE DESCRIPTION
|
||||||
+ * pci_ops for IDT EB434 board
|
+ * pci_ops for IDT EB434 board
|
||||||
+ *
|
+ *
|
||||||
+ * Copyright 2004 IDT Inc. (rischelp@idt.com)
|
+ * Copyright 2004 IDT Inc. (rischelp@idt.com)
|
||||||
|
+ * Copyright 2006 Felix Fietkau <nbd@openwrt.org>
|
||||||
+ *
|
+ *
|
||||||
+ * This program is free software; you can redistribute it and/or modify it
|
+ * This program is free software; you can redistribute it and/or modify it
|
||||||
+ * under the terms of the GNU General Public License as published by the
|
+ * under the terms of the GNU General Public License as published by the
|
||||||
|
@ -242,8 +243,30 @@ diff -urN linux.old/arch/mips/pci/ops-rc32434.c linux.dev/arch/mips/pci/ops-rc32
|
||||||
+ int where, u32 * val)
|
+ int where, u32 * val)
|
||||||
+{
|
+{
|
||||||
+ int ret;
|
+ int ret;
|
||||||
+
|
+ int delay = 1;
|
||||||
|
+
|
||||||
|
+ if (bus->number == 0 && (devfn >> 3) > 21)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+retry:
|
||||||
+ ret = config_access(PCI_ACCESS_READ, bus, devfn, where, val);
|
+ ret = config_access(PCI_ACCESS_READ, bus, devfn, where, val);
|
||||||
|
+
|
||||||
|
+ /* PCI scan: check for invalid values, device may not have
|
||||||
|
+ * finished initializing */
|
||||||
|
+
|
||||||
|
+ if (where == PCI_VENDOR_ID) {
|
||||||
|
+ if (ret == 0xffffffff || ret == 0x00000000 ||
|
||||||
|
+ ret == 0x0000ffff || ret == 0xffff0000) {
|
||||||
|
+
|
||||||
|
+ if (delay > 4)
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+ delay *= 2;
|
||||||
|
+ msleep(delay);
|
||||||
|
+ goto retry;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ return ret;
|
+ return ret;
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
|
|
|
@ -1,46 +0,0 @@
|
||||||
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
|
|
Loading…
Reference in a new issue