|  | From: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 
|  | Date: Fri, 8 Nov 2013 17:34:54 +0100 | 
|  | Subject: usb: do no disable interrupts in giveback | 
|  |  | 
|  | Since commit 94dfd7ed ("USB: HCD: support giveback of URB in tasklet | 
|  | context") the USB code disables interrupts before invoking the complete | 
|  | callback. | 
|  | This should not be required the HCD completes the URBs either in hard-irq | 
|  | context or in BH context. Lockdep may report false positives if one has two | 
|  | HCDs (one completes in IRQ and the other in BH context) and is using the same | 
|  | USB driver (device) with both HCDs. This is safe since the same URBs are never | 
|  | mixed with those two HCDs. | 
|  | Longeterm we should force all HCDs to complete in the same context. | 
|  |  | 
|  | Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> | 
|  | --- | 
|  | drivers/usb/core/hcd.c |    3 --- | 
|  | 1 file changed, 3 deletions(-) | 
|  |  | 
|  | --- a/drivers/usb/core/hcd.c | 
|  | +++ b/drivers/usb/core/hcd.c | 
|  | @@ -1736,7 +1736,6 @@ static void __usb_hcd_giveback_urb(struc | 
|  | struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus); | 
|  | struct usb_anchor *anchor = urb->anchor; | 
|  | int status = urb->unlinked; | 
|  | -	unsigned long flags; | 
|  |  | 
|  | urb->hcpriv = NULL; | 
|  | if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && | 
|  | @@ -1764,9 +1763,7 @@ static void __usb_hcd_giveback_urb(struc | 
|  | * and no one may trigger the above deadlock situation when | 
|  | * running complete() in tasklet. | 
|  | */ | 
|  | -	local_irq_save(flags); | 
|  | urb->complete(urb); | 
|  | -	local_irq_restore(flags); | 
|  |  | 
|  | usb_anchor_resume_wakeups(anchor); | 
|  | atomic_dec(&urb->use_count); |