|
@@ -247,6 +247,8 @@ static int qtd_copy_status (
|
|
|
|
|
|
static void
|
|
|
ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status)
|
|
|
+__releases(ehci->lock)
|
|
|
+__acquires(ehci->lock)
|
|
|
{
|
|
|
if (usb_pipetype(urb->pipe) == PIPE_INTERRUPT) {
|
|
|
/* ... update hc-wide periodic stats */
|
|
@@ -272,8 +274,11 @@ ehci_urb_done(struct ehci_hcd *ehci, struct urb *urb, int status)
|
|
|
urb->actual_length, urb->transfer_buffer_length);
|
|
|
#endif
|
|
|
|
|
|
+ /* complete() can reenter this HCD */
|
|
|
usb_hcd_unlink_urb_from_ep(ehci_to_hcd(ehci), urb);
|
|
|
+ spin_unlock (&ehci->lock);
|
|
|
usb_hcd_giveback_urb(ehci_to_hcd(ehci), urb, status);
|
|
|
+ spin_lock (&ehci->lock);
|
|
|
}
|
|
|
|
|
|
static int qh_schedule (struct ehci_hcd *ehci, struct ehci_qh *qh);
|