From f6d462c72a534e8fdfb318c56ef42c645d38b704 Mon Sep 17 00:00:00 2001 From: Alan Stern Date: Mon, 26 Nov 2012 12:36:21 -0500 Subject: [PATCH] --- yaml --- r: 338705 b: refs/heads/master c: 50ce5c0683aa83eb161624ea89daa5a9eee0c2ce h: refs/heads/master i: 338703: 496716c6ecbc3b81365e54b6de50d5aefe8ca6e5 v: v3 --- [refs] | 2 +- trunk/drivers/usb/host/ohci-q.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index cb0739c5e010..7eabfeb02268 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 31b6a1048b7292efff8b5b53ae3d9d29adde385e +refs/heads/master: 50ce5c0683aa83eb161624ea89daa5a9eee0c2ce diff --git a/trunk/drivers/usb/host/ohci-q.c b/trunk/drivers/usb/host/ohci-q.c index 177a213790d4..7482cfbe8c5e 100644 --- a/trunk/drivers/usb/host/ohci-q.c +++ b/trunk/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 (NVIDIA for sure, maybe others) + * occasionally forget to add TDs to the done queue. Since + * TDs for a given endpoint are always 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; }