diff options
author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-16 21:46:21 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2012-11-16 21:46:21 -0500 |
commit | 0c864d8b3e51bd61f43484268c9aa4eb9a199b02 (patch) | |
tree | de9fa5c3792c84fa173e6d27c856bde0254f7eeb /drivers/usb/core | |
parent | 4fd24483d1de7a3c183fa862fa9ff13b49361966 (diff) | |
parent | f4a75d2eb7b1e2206094b901be09adb31ba63681 (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.c | 16 |
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); | |||
2166 | irqreturn_t usb_hcd_irq (int irq, void *__hcd) | 2166 | irqreturn_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 | } |
2180 | EXPORT_SYMBOL_GPL(usb_hcd_irq); | 2188 | EXPORT_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, |