- Certain initialization sequences had problems with IRQs. Fixed last month in EHCI, but this ohci patch didn't seem needed back then. OK, so now I saw the same bug in OHCI. (I could believe UHCI needs it too, sigh.)
- When restarting endpoint i/o after a queue fault, the HC needs to be told the control (or bulk) list filled (CLF/BLF). Likely this wasn't common (usbtest test10 subcase7 fault recovery reproduced it nicely).
Please merge. Lack of the first one might make trouble for some people.
- Dave
--- 1.14/drivers/usb/host/ohci-pci.c Thu Jul 31 14:36:49 2003
+++ edited/drivers/usb/host/ohci-pci.c Mon Aug 25 18:03:05 2003
@@ -30,6 +30,15 @@
/*-------------------------------------------------------------------------*/
+static int
+ohci_pci_reset (struct usb_hcd *hcd)
+{
+ struct ohci_hcd *ohci = hcd_to_ohci (hcd);
+
+ ohci->regs = hcd->regs;
+ return hc_reset (ohci);
+}
+
static int __devinit
ohci_pci_start (struct usb_hcd *hcd)
{
@@ -89,12 +98,6 @@
ohci_stop (hcd);
return ret;
}
- ohci->regs = hcd->regs;
-
- if (hc_reset (ohci) < 0) {
- ohci_stop (hcd);
- return -ENODEV;
- }
if (hc_start (ohci) < 0) {
ohci_err (ohci, "can't start\n");
@@ -315,6 +318,7 @@
/*
* basic lifecycle operations
*/
+ .reset = ohci_pci_reset,
.start = ohci_pci_start,
#ifdef CONFIG_PM
.suspend = ohci_pci_suspend,
--- 1.42/drivers/usb/host/ohci-q.c Mon Jul 14 11:27:33 2003
+++ edited/drivers/usb/host/ohci-q.c Mon Aug 25 19:15:06 2003
@@ -1013,10 +1013,22 @@
if (list_empty (&ed->td_list))
ed_deschedule (ohci, ed);
/* ... reenabling halted EDs only after fault cleanup */
- else if (!(ed->hwINFO & ED_DEQUEUE)) {
+ else if ((ed->hwINFO & (ED_SKIP | ED_DEQUEUE)) == ED_SKIP) {
td = list_entry (ed->td_list.next, struct td, td_list);
- if (!(td->hwINFO & TD_DONE))
+ if (!(td->hwINFO & TD_DONE)) {
ed->hwINFO &= ~ED_SKIP;
+ /* ... hc may need waking-up */
+ switch (ed->type) {
+ case PIPE_CONTROL:
+ writel (OHCI_CLF,
+ &ohci->regs->cmdstatus);
+ break;
+ case PIPE_BULK:
+ writel (OHCI_BLF,
+ &ohci->regs->cmdstatus);
+ break;
+ }
+ }
}
td = td_next;
