From 2b9cdf477e09da9d8da483ef6253b99d55cf9b39 Mon Sep 17 00:00:00 2001 From: mb Date: Sun, 6 Sep 2009 19:49:07 +0000 Subject: [PATCH] bcm47xx: Apply bcm5354 USB fix git-svn-id: svn://svn.openwrt.org/openwrt/trunk@17531 3c298f89-4303-0410-b956-a3cf2f4a3e73 --- .../275-usb2-bcm5354-init.patch | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 target/linux/brcm47xx/patches-2.6.28/275-usb2-bcm5354-init.patch diff --git a/target/linux/brcm47xx/patches-2.6.28/275-usb2-bcm5354-init.patch b/target/linux/brcm47xx/patches-2.6.28/275-usb2-bcm5354-init.patch new file mode 100644 index 000000000..a16632915 --- /dev/null +++ b/target/linux/brcm47xx/patches-2.6.28/275-usb2-bcm5354-init.patch @@ -0,0 +1,63 @@ +This patch significantly improves the reliability of high speed +usb writes on the bcm5354. It implements a work around for version 2 +of the usb20 core that was cribbed from the GPL sources for the +Asus wl500gpv2 and verified against the wl520gu sources. + +Reference: +GPL/WL-520gu-NewUI/src/linux/linux/arch/mips/brcm-boards/bcm947xx/pcibios.c +GPL/WL-500gPV2-NewUI/src/linux/linux/arch/mips/brcm-boards/bcm947xx/pcibios.c + +Signed-off-by: Steve Brown + +--- + drivers/usb/host/ohci-ssb.c | 37 +++++++++++++++++++++++-------------- + 1 file changed, 23 insertions(+), 14 deletions(-) + +--- linux-2.6.28.10.orig/drivers/usb/host/ohci-ssb.c ++++ linux-2.6.28.10/drivers/usb/host/ohci-ssb.c +@@ -141,22 +141,31 @@ static int ssb_ohci_attach(struct ssb_de + */ + ssb_device_enable(dev, 0); + ssb_write32(dev, 0x200, 0x7ff); ++ ++ /* Change Flush control reg */ ++ tmp = ssb_read32(dev, 0x400); ++ tmp &= ~8; ++ ssb_write32(dev, 0x400, tmp); ++ tmp = ssb_read32(dev, 0x400); ++ ++ /* Change Shim control reg */ ++ tmp = ssb_read32(dev, 0x304); ++ tmp &= ~0x100; ++ ssb_write32(dev, 0x304, tmp); ++ tmp = ssb_read32(dev, 0x304); ++ + udelay(1); +- if (dev->id.revision == 1) { // bug in rev 1 + +- /* Change Flush control reg */ +- tmp = ssb_read32(dev, 0x400); +- tmp &= ~8; +- ssb_write32(dev, 0x400, tmp); +- tmp = ssb_read32(dev, 0x400); +- printk("USB20H fcr: 0x%0x\n", tmp); +- +- /* Change Shim control reg */ +- tmp = ssb_read32(dev, 0x304); +- tmp &= ~0x100; +- ssb_write32(dev, 0x304, tmp); +- tmp = ssb_read32(dev, 0x304); +- printk("USB20H shim: 0x%0x\n", tmp); ++ /* Work around for 5354 failures */ ++ if ((dev->id.revision == 2) && (dev->bus->chip_id == 0x5354)) { ++ /* Change syn01 reg */ ++ tmp = 0x00fe00fe; ++ ssb_write32(dev, 0x894, tmp); ++ ++ /* Change syn03 reg */ ++ tmp = ssb_read32(dev, 0x89c); ++ tmp |= 0x1; ++ ssb_write32(dev, 0x89c, tmp); + } + } else + ssb_device_enable(dev, 0);