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: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
99ac5b1e95
Коммит
2f5bb665ba
|
@ -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)
|
||||||
|
|
||||||
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 */
|
||||||
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;
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче