aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-16 21:46:21 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-11-16 21:46:21 -0500
commit0c864d8b3e51bd61f43484268c9aa4eb9a199b02 (patch)
treede9fa5c3792c84fa173e6d27c856bde0254f7eeb /drivers/usb/core
parent4fd24483d1de7a3c183fa862fa9ff13b49361966 (diff)
parentf4a75d2eb7b1e2206094b901be09adb31ba63681 (diff)
Merge 3.7-rc6 into usb-next.
This resolves a conflict with these files: drivers/usb/early/ehci-dbgp.c drivers/usb/host/ehci-ls1x.c drivers/usb/host/ohci-xls.c drivers/usb/musb/ux500.c Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/hcd.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index eaa14514e173..4225d5e72131 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -2166,8 +2166,15 @@ EXPORT_SYMBOL_GPL(usb_bus_start_enum);
2166irqreturn_t usb_hcd_irq (int irq, void *__hcd) 2166irqreturn_t usb_hcd_irq (int irq, void *__hcd)
2167{ 2167{
2168 struct usb_hcd *hcd = __hcd; 2168 struct usb_hcd *hcd = __hcd;
2169 unsigned long flags;
2169 irqreturn_t rc; 2170 irqreturn_t rc;
2170 2171
2172 /* IRQF_DISABLED doesn't work correctly with shared IRQs
2173 * when the first handler doesn't use it. So let's just
2174 * assume it's never used.
2175 */
2176 local_irq_save(flags);
2177
2171 if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd))) 2178 if (unlikely(HCD_DEAD(hcd) || !HCD_HW_ACCESSIBLE(hcd)))
2172 rc = IRQ_NONE; 2179 rc = IRQ_NONE;
2173 else if (hcd->driver->irq(hcd) == IRQ_NONE) 2180 else if (hcd->driver->irq(hcd) == IRQ_NONE)
@@ -2175,6 +2182,7 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd)
2175 else 2182 else
2176 rc = IRQ_HANDLED; 2183 rc = IRQ_HANDLED;
2177 2184
2185 local_irq_restore(flags);
2178 return rc; 2186 return rc;
2179} 2187}
2180EXPORT_SYMBOL_GPL(usb_hcd_irq); 2188EXPORT_SYMBOL_GPL(usb_hcd_irq);
@@ -2362,6 +2370,14 @@ static int usb_hcd_request_irqs(struct usb_hcd *hcd,
2362 int retval; 2370 int retval;
2363 2371
2364 if (hcd->driver->irq) { 2372 if (hcd->driver->irq) {
2373
2374 /* IRQF_DISABLED doesn't work as advertised when used together
2375 * with IRQF_SHARED. As usb_hcd_irq() will always disable
2376 * interrupts we can remove it here.
2377 */
2378 if (irqflags & IRQF_SHARED)
2379 irqflags &= ~IRQF_DISABLED;
2380
2365 snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", 2381 snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d",
2366 hcd->driver->description, hcd->self.busnum); 2382 hcd->driver->description, hcd->self.busnum);
2367 retval = request_irq(irqnum, &usb_hcd_irq, irqflags, 2383 retval = request_irq(irqnum, &usb_hcd_irq, irqflags,