commit: 1996e6c572969a8cf6d7fa97eef621219acd94a9
From: Alan Stern <[email protected]>
Date: Mon, 14 May 2012 13:48:16 -0400
Subject: USB: EHCI: work around bug in the Philips ISP1562 controller

This patch (as1556) works around a bug in the Philips ISP1562 EHCI
controller.  Although the controller claims to support frame-list
lengths smaller than the default of 1024 for its periodic schedule, in
fact smaller values don't work.  A new quirk flag is added to indicate
when the bug is present, and if it is then the schedule size is left
at the default value.

Signed-off-by: Alan Stern <[email protected]>
Cc: stable <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/usb/host/ehci-hcd.c |    2 +-
 drivers/usb/host/ehci-pci.c |    7 +++++++
 drivers/usb/host/ehci.h     |    1 +
 3 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 5cb775b..f644ba9 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -639,7 +639,7 @@ static int ehci_init(struct usb_hcd *hcd)
        INIT_LIST_HEAD(&ehci->cached_itd_list);
        INIT_LIST_HEAD(&ehci->cached_sitd_list);
 
-       if (HCC_PGM_FRAMELISTLEN(hcc_params)) {
+       if (HCC_PGM_FRAMELISTLEN(hcc_params) && !ehci->sched_size_bug) {
                /* periodic schedule size can be smaller than default */
                switch (EHCI_TUNE_FLS) {
                case 0: ehci->periodic_size = 1024; break;
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index bc94d7b..4baafa3 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -97,6 +97,13 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
                        break;
                }
                break;
+
+       case PCI_VENDOR_ID_PHILIPS:
+               /*
+                * Philips controllers set HCC_PGM_FRAMELISTLEN, but
+                * they don't implement schedule sizes shorter than 1024.
+                */
+               ehci->sched_size_bug = 1;
        }
 
        /* cache this readonly data; minimize chip reads */
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 2694ed6..2a6652f 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -149,6 +149,7 @@ struct ehci_hcd {                   /* one per controller */
        unsigned                use_dummy_qh:1; /* AMD Frame List table quirk*/
        unsigned                has_synopsys_hc_bug:1; /* Synopsys HC */
        unsigned                frame_index_bug:1; /* MosChip (AKA NetMos) */
+       unsigned                sched_size_bug:1; /* Philips */
 
        /* required for usb32 quirk */
        #define OHCI_CTRL_HCFS          (3 << 6)
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to