Commit 2f5bb665 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

USB: EHCI: add pointer to end of async-unlink list

This patch (as1570) adds a pointer for the end of ehci-hcd's
async-unlink list.  The list (which is actually a queue) is singly
linked, so having a pointer to its end makes adding new entries easier
-- there's no longer any need to scan through the whole list.

In principle it could be changed to a standard doubly-linked list.  It
turns out that doing so actually makes the code less clear, so I'm
leaving it as is.
Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 99ac5b1e
...@@ -1041,14 +1041,9 @@ static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) ...@@ -1041,14 +1041,9 @@ static void unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
/* defer till later if busy */ /* defer till later if busy */
if (ehci->async_unlink) { 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; 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 */ /* start IAA cycle */
} else } else
......
...@@ -1227,6 +1227,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh) ...@@ -1227,6 +1227,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
qh->qh_state = QH_STATE_UNLINK; qh->qh_state = QH_STATE_UNLINK;
ehci->async_unlink = qh; ehci->async_unlink = qh;
if (!qh->unlink_next)
ehci->async_unlink_last = qh;
prev = ehci->async; prev = ehci->async;
while (prev->qh_next.qh != qh) while (prev->qh_next.qh != qh)
......
...@@ -82,6 +82,7 @@ struct ehci_hcd { /* one per controller */ ...@@ -82,6 +82,7 @@ struct ehci_hcd { /* one per controller */
struct ehci_qh *async; struct ehci_qh *async;
struct ehci_qh *dummy; /* For AMD quirk use */ struct ehci_qh *dummy; /* For AMD quirk use */
struct ehci_qh *async_unlink; struct ehci_qh *async_unlink;
struct ehci_qh *async_unlink_last;
struct ehci_qh *qh_scan_next; struct ehci_qh *qh_scan_next;
unsigned scanning : 1; unsigned scanning : 1;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment