Moorestown does not support PME, so wakeups come as regular device interrupts. This means that we can receive an interrupt while we are runtime suspended, and we need to synchronously resume our controller in order to handle the irq. Since this operation can sleep, the usb_hcd_irq needs to be switched to a threaded irq. No quick check irq was implemented because we cannot do a synchronous resume from a quick check handler. Signed-off-by: Kristen Carlson Accardi <kristen@xxxxxxxxxxxxxxx> --- drivers/usb/core/hcd.c | 8 ++++++-- 1 files changed, 6 insertions(+), 2 deletions(-) diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index d2c10d0..10130db 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -2092,6 +2092,8 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) unsigned long flags; irqreturn_t rc; + pm_runtime_get_sync(hcd->self.controller); + /* IRQF_DISABLED doesn't work correctly with shared IRQs * when the first handler doesn't use it. So let's just * assume it's never used. @@ -2111,6 +2113,8 @@ irqreturn_t usb_hcd_irq (int irq, void *__hcd) } local_irq_restore(flags); + pm_runtime_put(hcd->self.controller); + return rc; } EXPORT_SYMBOL_GPL(usb_hcd_irq); @@ -2308,8 +2312,8 @@ int usb_add_hcd(struct usb_hcd *hcd, snprintf(hcd->irq_descr, sizeof(hcd->irq_descr), "%s:usb%d", hcd->driver->description, hcd->self.busnum); - if ((retval = request_irq(irqnum, &usb_hcd_irq, irqflags, - hcd->irq_descr, hcd)) != 0) { + if ((retval = request_threaded_irq(irqnum, NULL, &usb_hcd_irq, + irqflags, hcd->irq_descr, hcd)) != 0) { dev_err(hcd->self.controller, "request interrupt %d failed\n", irqnum); goto err_request_irq; -- 1.7.3.1 -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html