]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
usb: dwc2: gadget: Start DDMA IN status phase in StsPhseRcvd handler
authorVahram Aharonyan <vahrama@synopsys.com>
Tue, 15 Nov 2016 03:16:31 +0000 (19:16 -0800)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Fri, 18 Nov 2016 11:54:46 +0000 (13:54 +0200)
In DDMA mode of operation IN status phase of control write transfer
should start after getting StsPhseRcvd interrupt. This interrupt is
issued by HW once host starts to send IN tokens after data stage.

Signed-off-by: Vahram Aharonyan <vahrama@synopsys.com>
Signed-off-by: John Youn <johnyoun@synopsys.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc2/gadget.c

index bcae58d72ea0def8ffb523eab0cb5a4385be3d87..e5d095924fb4e4acdaf61941837173b3cbcc325c 100644 (file)
@@ -1991,7 +1991,9 @@ static void dwc2_hsotg_handle_outdone(struct dwc2_hsotg *hsotg, int epnum)
                 */
        }
 
-       if (epnum == 0 && hsotg->ep0_state == DWC2_EP0_DATA_OUT) {
+       /* DDMA IN status phase will start from StsPhseRcvd interrupt */
+       if (!using_desc_dma(hsotg) && epnum == 0 &&
+           hsotg->ep0_state == DWC2_EP0_DATA_OUT) {
                /* Move to STATUS IN */
                dwc2_hsotg_ep0_zlp(hsotg, true);
                return;
@@ -2614,9 +2616,14 @@ static void dwc2_hsotg_epint(struct dwc2_hsotg *hsotg, unsigned int idx,
                }
        }
 
-       if (ints & DXEPINT_STSPHSERCVD)
+       if (ints & DXEPINT_STSPHSERCVD) {
                dev_dbg(hsotg->dev, "%s: StsPhseRcvd\n", __func__);
 
+               /* Move to STATUS IN for DDMA */
+               if (using_desc_dma(hsotg))
+                       dwc2_hsotg_ep0_zlp(hsotg, true);
+       }
+
        if (ints & DXEPINT_BACK2BACKSETUP)
                dev_dbg(hsotg->dev, "%s: B2BSetup/INEPNakEff\n", __func__);