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 <[email protected]>
---
 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

_______________________________________________
MeeGo-kernel mailing list
[email protected]
http://lists.meego.com/listinfo/meego-kernel

Reply via email to