]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
USB: imx_udc: Fix IMX UDC gadget ep0 irq handling
authorDarius Augulis <augulis.darius@gmail.com>
Wed, 21 Jan 2009 13:18:33 +0000 (15:18 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Tue, 24 Mar 2009 23:20:28 +0000 (16:20 -0700)
Fix ep0 interrupt handling in IMX UDC Gadget.

Signed-off-by: Darius Augulis <augulis.darius@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/gadget/imx_udc.c

index 3ee5bd8bea701a4dad78f9e253b51b141b8bf8d4..e590464c3a50b9e6521ae6663733a5b637febbb9 100644 (file)
@@ -1133,6 +1133,7 @@ end_irq:
 static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev)
 {
        struct imx_udc_struct *imx_usb = dev;
+       struct imx_ep_struct *imx_ep = &imx_usb->imx_ep[0];
        int intr = __raw_readl(imx_usb->base + USB_EP_INTR(0));
 
        dump_ep_intr(__func__, 0, intr, imx_usb->dev);
@@ -1142,16 +1143,15 @@ static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev)
                return IRQ_HANDLED;
        }
 
-       /* DEVREQ IRQ has highest priority */
+       /* DEVREQ has highest priority */
        if (intr & (EPINTR_DEVREQ | EPINTR_MDEVREQ))
                handle_ep0_devreq(imx_usb);
        /* Seem i.MX is missing EOF interrupt sometimes.
-        * Therefore we monitor both EOF and FIFO_EMPTY interrups
-        * when transmiting, and both EOF and FIFO_FULL when
-        * receiving data.
+        * Therefore we don't monitor EOF.
+        * We call handle_ep0() only if a request is queued for ep0.
         */
-       else if (intr & (EPINTR_EOF | EPINTR_FIFO_EMPTY | EPINTR_FIFO_FULL))
-               handle_ep0(&imx_usb->imx_ep[0]);
+       else if (!list_empty(&imx_ep->queue))
+               handle_ep0(imx_ep);
 
        __raw_writel(intr, imx_usb->base + USB_EP_INTR(0));