From 3730e6c7947ec9cdb9e5118a1f75eebdc80539b7 Mon Sep 17 00:00:00 2001 From: Florian Fainelli Date: Wed, 5 Sep 2012 20:19:29 +0000 Subject: [PATCH] add some ohci workarounds to make ohci work SVN-Revision: 33323 --- .../patches-3.3/013-ohci_workarounds.patch | 64 +++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 target/linux/mcs814x/patches-3.3/013-ohci_workarounds.patch 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; + }