summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/ehci-hcd.c9
-rw-r--r--drivers/usb/host/ehci-q.c2
-rw-r--r--drivers/usb/host/ehci.h1
3 files changed, 5 insertions, 7 deletions
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index efee426a2465..8b75e4279a47 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1041,14 +1041,9 @@ static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
/* defer till later if busy */
if (ehci->async_unlink) {
- struct ehci_qh *last;
-
- for (last = ehci->async_unlink;
- last->unlink_next;
- last = last->unlink_next)
- continue;
qh->qh_state = QH_STATE_UNLINK_WAIT;
- last->unlink_next = qh;
+ ehci->async_unlink_last->unlink_next = qh;
+ ehci->async_unlink_last = qh;
/* start IAA cycle */
} else
diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
index 8e80cde8c35e..5193612c96ea 100644
--- a/drivers/usb/host/ehci-q.c
+++ b/drivers/usb/host/ehci-q.c
@@ -1227,6 +1227,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
qh->qh_state = QH_STATE_UNLINK;
ehci->async_unlink = qh;
+ if (!qh->unlink_next)
+ ehci->async_unlink_last = qh;
prev = ehci->async;
while (prev->qh_next.qh != qh)
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
index 3c6c07c0956a..475f23e10bbf 100644
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -82,6 +82,7 @@ struct ehci_hcd { /* one per controller */
struct ehci_qh *async;
struct ehci_qh *dummy; /* For AMD quirk use */
struct ehci_qh *async_unlink;
+ struct ehci_qh *async_unlink_last;
struct ehci_qh *qh_scan_next;
unsigned scanning : 1;