diff options
4 files changed, 117 insertions, 57 deletions
diff --git a/target/linux/brcm47xx/patches-2.6.30/250-ohci-ssb-usb2.patch b/target/linux/brcm47xx/patches-2.6.30/250-ohci-ssb-usb2.patch index 85361ab74..065a16b38 100644 --- a/target/linux/brcm47xx/patches-2.6.30/250-ohci-ssb-usb2.patch +++ b/target/linux/brcm47xx/patches-2.6.30/250-ohci-ssb-usb2.patch @@ -1,40 +1,31 @@ ---- a/drivers/usb/host/ohci-ssb.c -+++ b/drivers/usb/host/ohci-ssb.c -@@ -106,10 +106,59 @@ static int ssb_ohci_attach(struct ssb_de +--- + drivers/usb/host/ohci-ssb.c |   39 ++++++++++++++++++++++++++++++++++++--- + 1 file changed, 36 insertions(+), 3 deletions(-) + +--- linux-2.6.28.10.orig/drivers/usb/host/ohci-ssb.c ++++ linux-2.6.28.10/drivers/usb/host/ohci-ssb.c +@@ -106,10 +106,42 @@ static int ssb_ohci_attach(struct ssb_de   	int err = -ENOMEM;   	u32 tmp, flags = 0;  -	if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) -+	/* -+	 * THE FOLLOWING COMMENTS PRESERVED FROM GPL SOURCE RELEASE -+	 * -+	 * The USB core requires a special bit to be set during core -+	 * reset to enable host (OHCI) mode. Resetting the SB core in -+	 * pcibios_enable_device() is a hack for compatibility with -+	 * vanilla usb-ohci so that it does not have to know about -+	 * SB. A driver that wants to use the USB core in device mode -+	 * should know about SB and should reset the bit back to 0 -+	 * after calling pcibios_enable_device(). -+	 */ -+  +	if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) { ++		/* Put the device into host-mode. */   		flags |= SSB_OHCI_TMSLOW_HOSTMODE; +- +-	ssb_device_enable(dev, flags);  +		ssb_device_enable(dev, flags); -+	} -+ -+	/* -+	 * USB 2.0 special considerations: -+	 * -+	 * 1. Since the core supports both OHCI and EHCI functions, it must -+	 *    only be reset once. -+	 *  -+	 * 2. In addition to the standard SB reset sequence, the Host Control -+	 *    Register must be programmed to bring the USB core and various -+	 *    phy components out of reset.  -+	 */ -+ -+	else if (dev->id.coreid == SSB_DEV_USB20_HOST) { -+#warning FIX ME need test for core being up & exit ++	} else if (dev->id.coreid == SSB_DEV_USB20_HOST) { ++		/* ++		 * USB 2.0 special considerations: ++		 * ++		 * 1. Since the core supports both OHCI and EHCI functions, it must ++		 *    only be reset once. ++		 * ++		 * 2. In addition to the standard SSB reset sequence, the Host Control ++		 *    Register must be programmed to bring the USB core and various ++		 *    phy components out of reset. ++		 */  +		ssb_device_enable(dev, 0);  +		ssb_write32(dev, 0x200, 0x7ff);  +		udelay(1); @@ -54,15 +45,12 @@  +			tmp = ssb_read32(dev, 0x304);  +			printk("USB20H shim: 0x%0x\n", tmp);  +		} -+	} -+	else ++	} else  +		ssb_device_enable(dev, 0); --	ssb_device_enable(dev, flags); -    	hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev,   			dev_name(dev->dev)); -@@ -200,6 +249,7 @@ static int ssb_ohci_resume(struct ssb_de +@@ -200,6 +232,7 @@ static int ssb_ohci_resume(struct ssb_de   static const struct ssb_device_id ssb_ohci_table[] = {   	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOSTDEV, SSB_ANY_REV),   	SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_USB11_HOST, SSB_ANY_REV), diff --git a/target/linux/brcm47xx/patches-2.6.30/260-ohci-set-dma-mask.patch b/target/linux/brcm47xx/patches-2.6.30/260-ohci-set-dma-mask.patch index 0b9dd5160..6da3f10bf 100644 --- a/target/linux/brcm47xx/patches-2.6.30/260-ohci-set-dma-mask.patch +++ b/target/linux/brcm47xx/patches-2.6.30/260-ohci-set-dma-mask.patch @@ -1,14 +1,16 @@ ---- a/drivers/usb/host/ohci-ssb.c -+++ b/drivers/usb/host/ohci-ssb.c -@@ -159,6 +159,11 @@ static int ssb_ohci_attach(struct ssb_de - 	else - 		ssb_device_enable(dev, 0); +--- + drivers/usb/host/ohci-ssb.c |    3 +++ + 1 file changed, 3 insertions(+) + +--- linux-2.6.28.10.orig/drivers/usb/host/ohci-ssb.c ++++ linux-2.6.28.10/drivers/usb/host/ohci-ssb.c +@@ -106,6 +106,9 @@ static int ssb_ohci_attach(struct ssb_de + 	int err = -ENOMEM; + 	u32 tmp, flags = 0; -+ /* -+  * Set dma mask - 32 bit mask is just an assumption -+  */ -+ if (ssb_dma_set_mask(dev, DMA_32BIT_MASK)) -+   return -EOPNOTSUPP; -  - 	hcd = usb_create_hcd(&ssb_ohci_hc_driver, dev->dev, - 			dev_name(dev->dev)); ++	if (ssb_dma_set_mask(dev, DMA_32BIT_MASK)) ++		return -EOPNOTSUPP; ++ + 	if (dev->id.coreid == SSB_DEV_USB11_HOSTDEV) { + 		/* Put the device into host-mode. */ + 		flags |= SSB_OHCI_TMSLOW_HOSTMODE; diff --git a/target/linux/brcm47xx/patches-2.6.30/270-ehci-ssb.patch b/target/linux/brcm47xx/patches-2.6.30/270-ehci-ssb.patch index 02e44ca5f..e64dc4b1b 100644 --- a/target/linux/brcm47xx/patches-2.6.30/270-ehci-ssb.patch +++ b/target/linux/brcm47xx/patches-2.6.30/270-ehci-ssb.patch @@ -1,5 +1,12 @@ ---- a/drivers/usb/host/Kconfig -+++ b/drivers/usb/host/Kconfig +--- + drivers/usb/host/Kconfig    |   13 ++ + drivers/usb/host/ehci-hcd.c |   12 ++ + drivers/usb/host/ehci-ssb.c |  201 ++++++++++++++++++++++++++++++++++++++++++++ + drivers/usb/host/ohci-ssb.c |   23 +++++ + 4 files changed, 247 insertions(+), 2 deletions(-) + +--- linux-2.6.30.5.orig/drivers/usb/host/Kconfig ++++ linux-2.6.30.5/drivers/usb/host/Kconfig  @@ -106,6 +106,19 @@ config USB_OXU210HP_HCD   	  To compile this driver as a module, choose M here: the   	  module will be called oxu210hp-hcd. @@ -20,8 +27,8 @@   config USB_ISP116X_HCD   	tristate "ISP116X HCD support"   	depends on USB ---- a/drivers/usb/host/ehci-hcd.c -+++ b/drivers/usb/host/ehci-hcd.c +--- linux-2.6.30.5.orig/drivers/usb/host/ehci-hcd.c ++++ linux-2.6.30.5/drivers/usb/host/ehci-hcd.c  @@ -1072,8 +1072,16 @@ MODULE_LICENSE ("GPL");   #define	PLATFORM_DRIVER		ixp4xx_ehci_driver   #endif @@ -42,7 +49,7 @@   #endif  --- /dev/null -+++ b/drivers/usb/host/ehci-ssb.c ++++ linux-2.6.30.5/drivers/usb/host/ehci-ssb.c  @@ -0,0 +1,201 @@  +/*  + * Sonics Silicon Backplane @@ -207,7 +214,7 @@  +	u32 tmp, flags = 0;  +  +	hcd = usb_create_hcd(&ssb_ehci_hc_driver, dev->dev, -+		dev_name(dev->dev)); ++		dev->dev->bus_id);  +	if (!hcd)  +		goto err_dev_disable;  + @@ -245,8 +252,8 @@  +	SSB_DEVTABLE_END  +};  +MODULE_DEVICE_TABLE(ssb, ssb_ehci_table); ---- a/drivers/usb/host/ohci-ssb.c -+++ b/drivers/usb/host/ohci-ssb.c +--- linux-2.6.30.5.orig/drivers/usb/host/ohci-ssb.c ++++ linux-2.6.30.5/drivers/usb/host/ohci-ssb.c  @@ -17,6 +17,8 @@    */   #include <linux/ssb/ssb.h> @@ -290,7 +297,7 @@   static int ssb_ohci_attach(struct ssb_device *dev)   {   	struct ssb_ohci_device *ohcidev; -@@ -184,6 +199,14 @@ static int ssb_ohci_attach(struct ssb_de +@@ -165,6 +180,14 @@ static int ssb_ohci_attach(struct ssb_de   	ssb_set_drvdata(dev, hcd); diff --git a/target/linux/brcm47xx/patches-2.6.30/275-usb2-bcm5354-init.patch b/target/linux/brcm47xx/patches-2.6.30/275-usb2-bcm5354-init.patch new file mode 100644 index 000000000..a16632915 --- /dev/null +++ b/target/linux/brcm47xx/patches-2.6.30/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 <sbrown@cortland.com> + +--- + 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);  | 
