On Sun, 30 Sep 2012, Alan Stern wrote:
> To be honest, I could write a fairly simple change to the driver that
> would work around this hardware bug most of the time. But it wouldn't
> be perfect; occasionally the problem would still show up.
I decided to go ahead and write a quick patch, below. Let me know if
you get a chance to try it out.
Alan Stern
Index: usb-3.6/drivers/usb/host/ohci-q.c
===================================================================
--- usb-3.6.orig/drivers/usb/host/ohci-q.c
+++ usb-3.6/drivers/usb/host/ohci-q.c
@@ -1128,6 +1128,25 @@ dl_done_list (struct ohci_hcd *ohci)
while (td) {
struct td *td_next = td->next_dl_td;
+ struct ed *ed = td->ed;
+
+ /*
+ * Some OHCI controllers occasionally forget to add TDs
+ * to the donelist. Since TDs for a given endpoint must
+ * always be processed in order, if we find a TD on the
+ * donelist then all of its predecessors must be finished
+ * as well.
+ */
+ for (;;) {
+ struct td *td2;
+
+ td2 = list_first_entry(&ed->td_list, struct td,
+ td_list);
+ if (td2 == td)
+ break;
+ takeback_td(ohci, td2);
+ }
+
takeback_td(ohci, td);
td = td_next;
}
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html