提交 d24921a3 编写于 作者: D Darius Augulis 提交者: Greg Kroah-Hartman

USB: imx_udc: Fix IMX UDC gadget ep0 irq handling

Fix ep0 interrupt handling in IMX UDC Gadget.
Signed-off-by: NDarius Augulis <augulis.darius@gmail.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
上级 593bef6c
...@@ -1133,6 +1133,7 @@ static irqreturn_t imx_udc_irq(int irq, void *dev) ...@@ -1133,6 +1133,7 @@ static irqreturn_t imx_udc_irq(int irq, void *dev)
static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev) static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev)
{ {
struct imx_udc_struct *imx_usb = 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)); int intr = __raw_readl(imx_usb->base + USB_EP_INTR(0));
dump_ep_intr(__func__, 0, intr, imx_usb->dev); dump_ep_intr(__func__, 0, intr, imx_usb->dev);
...@@ -1142,16 +1143,15 @@ static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev) ...@@ -1142,16 +1143,15 @@ static irqreturn_t imx_udc_ctrl_irq(int irq, void *dev)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
/* DEVREQ IRQ has highest priority */ /* DEVREQ has highest priority */
if (intr & (EPINTR_DEVREQ | EPINTR_MDEVREQ)) if (intr & (EPINTR_DEVREQ | EPINTR_MDEVREQ))
handle_ep0_devreq(imx_usb); handle_ep0_devreq(imx_usb);
/* Seem i.MX is missing EOF interrupt sometimes. /* Seem i.MX is missing EOF interrupt sometimes.
* Therefore we monitor both EOF and FIFO_EMPTY interrups * Therefore we don't monitor EOF.
* when transmiting, and both EOF and FIFO_FULL when * We call handle_ep0() only if a request is queued for ep0.
* receiving data.
*/ */
else if (intr & (EPINTR_EOF | EPINTR_FIFO_EMPTY | EPINTR_FIFO_FULL)) else if (!list_empty(&imx_ep->queue))
handle_ep0(&imx_usb->imx_ep[0]); handle_ep0(imx_ep);
__raw_writel(intr, imx_usb->base + USB_EP_INTR(0)); __raw_writel(intr, imx_usb->base + USB_EP_INTR(0));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册