Hi, On Mon, May 14, 2012 at 01:48:16PM -0400, Alan Stern wrote: > 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 <stern@xxxxxxxxxxxxxxxxxxx> > > --- > > 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 deletion(-) > > Index: usb-3.4/drivers/usb/host/ehci.h > =================================================================== > --- usb-3.4.orig/drivers/usb/host/ehci.h > +++ usb-3.4/drivers/usb/host/ehci.h > @@ -149,6 +149,7 @@ struct ehci_hcd { /* one per controlle > 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) > Index: usb-3.4/drivers/usb/host/ehci-hcd.c > =================================================================== > --- usb-3.4.orig/drivers/usb/host/ehci-hcd.c > +++ usb-3.4/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; > Index: usb-3.4/drivers/usb/host/ehci-pci.c > =================================================================== > --- usb-3.4.orig/drivers/usb/host/ehci-pci.c > +++ usb-3.4/drivers/usb/host/ehci-pci.c > @@ -97,6 +97,13 @@ static int ehci_pci_setup(struct usb_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 */ Unrelated to $SUBJECT, but all those quirks could be passed through driver_data from pci ID table. That will remove the need for the switch statement. My 2 cents -- balbi
Attachment:
signature.asc
Description: Digital signature