USB: EHCI: consolidate code in ehci_urb_dequeue()
This patch (as1668) consolidates two nearly identical code paths in ehci_urb_dequeue(). The test for !qh can be removed because it will never succeed; the fact that usb_hcd_check_unlink_urb() returned 0 means that urb must be queued and therefore urb->hcpriv must point to a QH. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
7bc782d73c
commit
7655e3160c
|
@ -896,17 +896,21 @@ static int ehci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
switch (usb_pipetype (urb->pipe)) {
|
if (usb_pipetype(urb->pipe) == PIPE_ISOCHRONOUS) {
|
||||||
// case PIPE_CONTROL:
|
/*
|
||||||
// case PIPE_BULK:
|
* We don't expedite dequeue for isochronous URBs.
|
||||||
default:
|
* Just wait until they complete normally or their
|
||||||
|
* time slot expires.
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
qh = (struct ehci_qh *) urb->hcpriv;
|
qh = (struct ehci_qh *) urb->hcpriv;
|
||||||
if (!qh)
|
|
||||||
break;
|
|
||||||
qh->exception = 1;
|
qh->exception = 1;
|
||||||
switch (qh->qh_state) {
|
switch (qh->qh_state) {
|
||||||
case QH_STATE_LINKED:
|
case QH_STATE_LINKED:
|
||||||
start_unlink_async(ehci, qh);
|
if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT)
|
||||||
|
start_unlink_intr(ehci, qh);
|
||||||
|
else
|
||||||
|
start_unlink_async(ehci, qh);
|
||||||
break;
|
break;
|
||||||
case QH_STATE_COMPLETING:
|
case QH_STATE_COMPLETING:
|
||||||
qh->dequeue_during_giveback = 1;
|
qh->dequeue_during_giveback = 1;
|
||||||
|
@ -920,36 +924,6 @@ static int ehci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status)
|
||||||
qh_completions(ehci, qh);
|
qh_completions(ehci, qh);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case PIPE_INTERRUPT:
|
|
||||||
qh = (struct ehci_qh *) urb->hcpriv;
|
|
||||||
if (!qh)
|
|
||||||
break;
|
|
||||||
qh->exception = 1;
|
|
||||||
switch (qh->qh_state) {
|
|
||||||
case QH_STATE_LINKED:
|
|
||||||
start_unlink_intr(ehci, qh);
|
|
||||||
break;
|
|
||||||
case QH_STATE_COMPLETING:
|
|
||||||
qh->dequeue_during_giveback = 1;
|
|
||||||
break;
|
|
||||||
case QH_STATE_IDLE:
|
|
||||||
qh_completions (ehci, qh);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ehci_dbg (ehci, "bogus qh %p state %d\n",
|
|
||||||
qh, qh->qh_state);
|
|
||||||
goto done;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case PIPE_ISOCHRONOUS:
|
|
||||||
// itd or sitd ...
|
|
||||||
|
|
||||||
// wait till next completion, do it then.
|
|
||||||
// completion irqs can wait up to 1024 msec,
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
done:
|
done:
|
||||||
spin_unlock_irqrestore (&ehci->lock, flags);
|
spin_unlock_irqrestore (&ehci->lock, flags);
|
||||||
|
|
Loading…
Reference in New Issue