add a better pci fix for rb532
[openwrt-10.03/.git] / target / linux / rb532-2.6 / patches / 100-rb5xx_support.patch
index 43e68c01b2a6d599e262d2c70eb13e7fa446de05..45c8fe3b9068ea8a66abd66008782242d363a40c 100644 (file)
@@ -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 <nbd@openwrt.org>
 + *         
 + *  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;
 +}
 +