From: Felix Fietkau Date: Tue, 19 Dec 2006 21:41:04 +0000 (+0000) Subject: add a better pci fix for rb532 X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;h=b0d70863de5af3751812822d4149742fbae0b90c add a better pci fix for rb532 SVN-Revision: 5861 --- diff --git a/target/linux/rb532-2.6/patches/100-rb5xx_support.patch b/target/linux/rb532-2.6/patches/100-rb5xx_support.patch index 43e68c01b2..45c8fe3b90 100644 --- a/target/linux/rb532-2.6/patches/100-rb5xx_support.patch +++ b/target/linux/rb532-2.6/patches/100-rb5xx_support.patch @@ -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 --- 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 -@@ -0,0 +1,195 @@ +@@ -0,0 +1,218 @@ +/************************************************************************** + * + * BRIEF MODULE DESCRIPTION + * pci_ops for IDT EB434 board + * + * Copyright 2004 IDT Inc. (rischelp@idt.com) ++ * Copyright 2006 Felix Fietkau + * + * 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 @@ -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 ret; -+ ++ int delay = 1; ++ ++ if (bus->number == 0 && (devfn >> 3) > 21) ++ return 0; ++ ++retry: + 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; +} + diff --git a/target/linux/rb532-2.6/patches/210-pci_fixes.patch b/target/linux/rb532-2.6/patches/210-pci_fixes.patch deleted file mode 100644 index 02cd2f063c..0000000000 --- a/target/linux/rb532-2.6/patches/210-pci_fixes.patch +++ /dev/null @@ -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