aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/ohci.h
diff options
context:
space:
mode:
authorMike Nuss <mike@terascala.com>2007-08-01 16:24:30 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2007-10-12 17:54:59 -0400
commit89a0fd18a96eb1f8732714b575073f8a8d69c009 (patch)
tree166d14fc49ad7fd646e1e7aa7decf6b3bea6d381 /drivers/usb/host/ohci.h
parente8fa0ce65c58dbb60be279c4e33534650dcacc31 (diff)
USB: OHCI handles more ZFMicro quirks
The ZF Micro OHCI controller exhibits unexpected behavior that seems to be related to high load. Under certain conditions, the controller will complete a TD, remove it from the endpoint's queue, and fail to add it to the donelist. This causes the endpoint to appear to stop responding. Worse, if the device is removed while in that state, OHCI will hang while waiting for the orphaned TD to complete. The situation is not recoverable without rebooting. This fix enhances the scope of the existing OHCI_QUIRK_ZFMICRO flag: 1. A watchdog routine periodically scans the OHCI structures to check for orphaned TDs. In these cases the TD is taken back from the controller and completed normally. 2. If a device is removed while the endpoint is hung but before the watchdog catches the situation, any outstanding TDs are taken back from the controller in the 'sanitize' phase. The ohci-hcd driver used to print "INTR_SF lossage" in this situation; this changes it to the universally accurate "ED unlink timeout". Other instances of this message presumably have different root causes. Both this Compaq quirk and a NEC quirk are now properly compiled out for non-PCI builds of this driver. Signed-off-by: Mike Nuss <mike@terascala.com> Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/ohci.h')
-rw-r--r--drivers/usb/host/ohci.h26
1 files changed, 26 insertions, 0 deletions
diff --git a/drivers/usb/host/ohci.h b/drivers/usb/host/ohci.h
index 4ada43cf1387..dd4d5b4dcb6c 100644
--- a/drivers/usb/host/ohci.h
+++ b/drivers/usb/host/ohci.h
@@ -401,8 +401,34 @@ struct ohci_hcd {
401 // there are also chip quirks/bugs in init logic 401 // there are also chip quirks/bugs in init logic
402 402
403 struct work_struct nec_work; /* Worker for NEC quirk */ 403 struct work_struct nec_work; /* Worker for NEC quirk */
404
405 /* Needed for ZF Micro quirk */
406 struct timer_list unlink_watchdog;
407 unsigned eds_scheduled;
408 struct ed *ed_to_check;
409 unsigned zf_delay;
404}; 410};
405 411
412#ifdef CONFIG_PCI
413static inline int quirk_nec(struct ohci_hcd *ohci)
414{
415 return ohci->flags & OHCI_QUIRK_NEC;
416}
417static inline int quirk_zfmicro(struct ohci_hcd *ohci)
418{
419 return ohci->flags & OHCI_QUIRK_ZFMICRO;
420}
421#else
422static inline int quirk_nec(struct ohci_hcd *ohci)
423{
424 return 0;
425}
426static inline int quirk_zfmicro(struct ohci_hcd *ohci)
427{
428 return 0;
429}
430#endif
431
406/* convert between an hcd pointer and the corresponding ohci_hcd */ 432/* convert between an hcd pointer and the corresponding ohci_hcd */
407static inline struct ohci_hcd *hcd_to_ohci (struct usb_hcd *hcd) 433static inline struct ohci_hcd *hcd_to_ohci (struct usb_hcd *hcd)
408{ 434{