diff options
author | Florian Fainelli <florian@openwrt.org> | 2012-09-05 20:19:29 +0000 |
---|---|---|
committer | Florian Fainelli <florian@openwrt.org> | 2012-09-05 20:19:29 +0000 |
commit | 3730e6c7947ec9cdb9e5118a1f75eebdc80539b7 (patch) | |
tree | fb6a224892e4032ebdf0cee6537a6cd841163cfd /target | |
parent | d8b2fef763050c6d5900845729d770545f51fbc6 (diff) | |
download | upstream-3730e6c7947ec9cdb9e5118a1f75eebdc80539b7.tar.gz upstream-3730e6c7947ec9cdb9e5118a1f75eebdc80539b7.tar.bz2 upstream-3730e6c7947ec9cdb9e5118a1f75eebdc80539b7.zip |
add some ohci workarounds to make ohci work
SVN-Revision: 33323
Diffstat (limited to 'target')
-rw-r--r-- | target/linux/mcs814x/patches-3.3/013-ohci_workarounds.patch | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/target/linux/mcs814x/patches-3.3/013-ohci_workarounds.patch b/target/linux/mcs814x/patches-3.3/013-ohci_workarounds.patch new file mode 100644 index 0000000000..9b905a7529 --- /dev/null +++ b/target/linux/mcs814x/patches-3.3/013-ohci_workarounds.patch @@ -0,0 +1,64 @@ +--- a/drivers/usb/host/ohci.h ++++ b/drivers/usb/host/ohci.h +@@ -114,7 +114,7 @@ struct td { + /* PSW is only for ISO. Only 1 PSW entry is used, but on + * big-endian PPC hardware that's the second entry. + */ +-#define MAXPSW 2 ++#define MAXPSW 8 + __hc16 hwPSW [MAXPSW]; + + /* rest are purely for the driver's use */ +--- a/drivers/usb/host/ohci-hcd.c ++++ b/drivers/usb/host/ohci-hcd.c +@@ -497,6 +497,7 @@ static int ohci_init (struct ohci_hcd *o + { + int ret; + struct usb_hcd *hcd = ohci_to_hcd(ohci); ++ u32 hcca_area; + + if (distrust_firmware) + ohci->flags |= OHCI_QUIRK_HUB_POWER; +@@ -550,11 +551,13 @@ static int ohci_init (struct ohci_hcd *o + if (ohci->hcca) + return 0; + +- ohci->hcca = dma_alloc_coherent (hcd->self.controller, +- sizeof *ohci->hcca, &ohci->hcca_dma, 0); ++ hcca_area = ohci_readl(ohci, &ohci->regs->hcca); ++ ohci->hcca = ioremap_nocache(hcca_area, sizeof *ohci->hcca); + if (!ohci->hcca) + return -ENOMEM; + ++ ohci->hcca_dma = hcca_area; ++ + if ((ret = ohci_mem_init (ohci)) < 0) + ohci_stop (hcd); + else { +@@ -572,6 +575,7 @@ static int ohci_init (struct ohci_hcd *o + */ + static int ohci_run (struct ohci_hcd *ohci) + { ++ int i = 0; + u32 mask, val; + int first = ohci->fminterval == 0; + struct usb_hcd *hcd = ohci_to_hcd(ohci); +@@ -622,6 +626,8 @@ static int ohci_run (struct ohci_hcd *oh + msleep(val); + + memset (ohci->hcca, 0, sizeof (struct ohci_hcca)); ++ for (i = 0; i < NUM_INTS; i++) ++ ohci->hcca->int_table[i] = 0; + + /* 2msec timelimit here means no irqs/preempt */ + spin_lock_irq (&ohci->lock); +@@ -909,9 +915,6 @@ static void ohci_stop (struct usb_hcd *h + remove_debug_files (ohci); + ohci_mem_cleanup (ohci); + if (ohci->hcca) { +- dma_free_coherent (hcd->self.controller, +- sizeof *ohci->hcca, +- ohci->hcca, ohci->hcca_dma); + ohci->hcca = NULL; + ohci->hcca_dma = 0; + } |