]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
Revert "USB: EHCI: don't check DMA values in QH overlays"
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 20 Mar 2013 21:16:12 +0000 (14:16 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 28 Mar 2013 19:05:58 +0000 (12:05 -0700)
This reverts commit 0319f9909ce68a7516dfc8d53400e07168d281a8, which is commit
feca7746d5d9e84b105a613b7f3b6ad00d327372 upstream.

It shouldn't have gone into this stable release.

Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Joseph Salisbury <joseph.salisbury@canonical.com>
Cc: Stephen Thirlwall <sdt@dr.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/ehci-q.c

index a54c380cb108683ff25bddea20141c6a9ffd3b51..923153c473b9e7855f01908475c0264475652748 100644 (file)
@@ -137,7 +137,7 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh)
                 * qtd is updated in qh_completions(). Update the QH
                 * overlay here.
                 */
-               if (qh->hw->hw_token & ACTIVE_BIT(ehci)) {
+               if (cpu_to_hc32(ehci, qtd->qtd_dma) == qh->hw->hw_current) {
                        qh->hw->hw_qtd_next = qtd->hw_next;
                        qtd = NULL;
                }
@@ -450,19 +450,11 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
                        else if (last_status == -EINPROGRESS && !urb->unlinked)
                                continue;
 
-                       /*
-                        * If this was the active qtd when the qh was unlinked
-                        * and the overlay's token is active, then the overlay
-                        * hasn't been written back to the qtd yet so use its
-                        * token instead of the qtd's.  After the qtd is
-                        * processed and removed, the overlay won't be valid
-                        * any more.
-                        */
-                       if (state == QH_STATE_IDLE &&
-                                       qh->qtd_list.next == &qtd->qtd_list &&
-                                       (hw->hw_token & ACTIVE_BIT(ehci))) {
+                       /* qh unlinked; token in overlay may be most current */
+                       if (state == QH_STATE_IDLE
+                                       && cpu_to_hc32(ehci, qtd->qtd_dma)
+                                               == hw->hw_current) {
                                token = hc32_to_cpu(ehci, hw->hw_token);
-                               hw->hw_token &= ~ACTIVE_BIT(ehci);
 
                                /* An unlink may leave an incomplete
                                 * async transaction in the TT buffer.