Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -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
+2 −0
Original line number Diff line number Diff line
@@ -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)
+1 −0
Original line number Diff line number Diff line
@@ -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;