]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/usb/host/ehci-q.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/roland...
[karo-tx-linux.git] / drivers / usb / host / ehci-q.c
index 5200481deb27725ebecd7c7e9355066fa3b20a32..b85b54160cdaeade20792ad9878d9751606f3b50 100644 (file)
@@ -1116,7 +1116,8 @@ static void scan_async (struct ehci_hcd *ehci)
        struct ehci_qh          *qh;
        enum ehci_timer_action  action = TIMER_IO_WATCHDOG;
 
-       ehci->stamp = ehci_readl(ehci, &ehci->regs->frame_index);
+       if (!++(ehci->stamp))
+               ehci->stamp++;
        timer_action_done (ehci, TIMER_ASYNC_SHRINK);
 rescan:
        qh = ehci->async->qh_next.qh;
@@ -1147,14 +1148,12 @@ rescan:
                         * doesn't stay idle for long.
                         * (plus, avoids some kind of re-activation race.)
                         */
-                       if (list_empty(&qh->qtd_list) &&
-                                       qh->qh_state == QH_STATE_LINKED) {
-                               if (!ehci->reclaim &&
-                                   ((ehci->stamp - qh->stamp) & 8191) >=
-                                               EHCI_SHRINK_UFRAMES)
-                                       start_unlink_async(ehci, qh);
-                               else
+                       if (list_empty (&qh->qtd_list)) {
+                               if (qh->stamp == ehci->stamp)
                                        action = TIMER_ASYNC_SHRINK;
+                               else if (!ehci->reclaim
+                                           && qh->qh_state == QH_STATE_LINKED)
+                                       start_unlink_async (ehci, qh);
                        }
 
                        qh = qh->qh_next.qh;