USB: EHCI: change return value of qh_completions()
This patch (as1658) cleans up the usage of qh_completions() in ehci-hcd. Currently the function's return value indicates whether any URBs were given back; the idea was that the caller can scan the QH over again to handle any URBs that were dequeued by a completion handler. This is not necessary; when qh_completions() is ready to give back dequeued URBs, it does its own rescanning. Therefore the new return value will be a flag indicating whether the caller needs to unlink the QH. This is more convenient than forcing the caller to check qh->needs_rescan, and it makes a lot more sense -- why should "needs_rescan" imply that an unlink is needed? The callers are also changed to remove the unneeded rescans. Lastly, the check for whether qh->qtd_list is non-empty is removed from the start of qh_completions(). Two of the callers have to make this test anyway, so the same test can simply be added to the other two callers. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
c1fdb68e3d
commit
79bcf7b02b
@@ -649,7 +649,8 @@ static void end_unlink_intr(struct ehci_hcd *ehci, struct ehci_qh *qh)
|
||||
qh->qh_state = QH_STATE_IDLE;
|
||||
hw->hw_next = EHCI_LIST_END(ehci);
|
||||
|
||||
qh_completions(ehci, qh);
|
||||
if (!list_empty(&qh->qtd_list))
|
||||
qh_completions(ehci, qh);
|
||||
|
||||
/* reschedule QH iff another request is queued */
|
||||
if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) {
|
||||
@@ -914,7 +915,7 @@ static void scan_intr(struct ehci_hcd *ehci)
|
||||
|
||||
list_for_each_entry_safe(qh, ehci->qh_scan_next, &ehci->intr_qh_list,
|
||||
intr_node) {
|
||||
rescan:
|
||||
|
||||
/* clean any finished work for this qh */
|
||||
if (!list_empty(&qh->qtd_list)) {
|
||||
int temp;
|
||||
@@ -927,12 +928,9 @@ static void scan_intr(struct ehci_hcd *ehci)
|
||||
* in qh_unlink_periodic().
|
||||
*/
|
||||
temp = qh_completions(ehci, qh);
|
||||
if (unlikely(qh->needs_rescan ||
|
||||
(list_empty(&qh->qtd_list) &&
|
||||
qh->qh_state == QH_STATE_LINKED)))
|
||||
if (unlikely(temp || (list_empty(&qh->qtd_list) &&
|
||||
qh->qh_state == QH_STATE_LINKED)))
|
||||
start_unlink_intr(ehci, qh);
|
||||
else if (temp != 0)
|
||||
goto rescan;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user