UPSTREAM: usb: dwc2: fix transfer stop programming for out endpoint
authorDu, Changbin <changbin.du@intel.com>
Fri, 4 Dec 2015 07:38:23 +0000 (15:38 +0800)
committerHuang, Tao <huangtao@rock-chips.com>
Tue, 3 Jan 2017 10:47:42 +0000 (18:47 +0800)
To stop an out endpoint, software should set sets the Global OUT NAK,
but not the Global Non-periodic IN NAK. This driver bug leads the out-ep
failed be in disabled state with below error.

dwc2_hsotg_ep_stop_xfr: timeout DOEPCTL.EPDisable

Change-Id: I5f8cc03a2a8c33311d9caf76fd028d15c66e58a8
Acked-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Du, Changbin <changbin.du@intel.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Signed-off-by: Huang, Tao <huangtao@rock-chips.com>
(cherry picked from commit 0676c7e734e3807f4e91f5d0edcaeed1f5ff412a)

drivers/usb/dwc2/gadget.c

index 0abf73c91beb0f5eef5f25a4e46b7070ee03fdc2..92a182feb936b95aaf8b1da34fc05a23bf1d7a63 100644 (file)
@@ -2911,15 +2911,15 @@ static void dwc2_hsotg_ep_stop_xfr(struct dwc2_hsotg *hsotg,
                                "%s: timeout DIEPINT.NAKEFF\n", __func__);
        } else {
                /* Clear any pending nak effect interrupt */
-               dwc2_writel(GINTSTS_GINNAKEFF, hsotg->regs + GINTSTS);
+               dwc2_writel(GINTSTS_GOUTNAKEFF, hsotg->regs + GINTSTS);
 
-               __orr32(hsotg->regs + DCTL, DCTL_SGNPINNAK);
+               __orr32(hsotg->regs + DCTL, DCTL_SGOUTNAK);
 
                /* Wait for global nak to take effect */
                if (dwc2_hsotg_wait_bit_set(hsotg, GINTSTS,
-                                               GINTSTS_GINNAKEFF, 100))
+                                               GINTSTS_GOUTNAKEFF, 100))
                        dev_warn(hsotg->dev,
-                               "%s: timeout GINTSTS.GINNAKEFF\n", __func__);
+                               "%s: timeout GINTSTS.GOUTNAKEFF\n", __func__);
        }
 
        /* Disable ep */
@@ -2944,7 +2944,7 @@ static void dwc2_hsotg_ep_stop_xfr(struct dwc2_hsotg *hsotg,
                /* TODO: Flush shared tx fifo */
        } else {
                /* Remove global NAKs */
-               __bic32(hsotg->regs + DCTL, DCTL_SGNPINNAK);
+               __bic32(hsotg->regs + DCTL, DCTL_SGOUTNAK);
        }
 }