usb: dwc3: core: Enable AutoRetry feature in the controller
authorAnurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
Fri, 27 Jul 2018 07:41:20 +0000 (13:11 +0530)
committerFelipe Balbi <felipe.balbi@linux.intel.com>
Mon, 30 Jul 2018 07:39:18 +0000 (10:39 +0300)
By default when core sees any transaction error (CRC or overflow) it
replies with terminating retry ACK (Retry=1 and Nump == 0).

Enabling this Auto Retry feature in controller will make the core send
a non-terminanting ACK upon such transaction errors. That is, ACK TP
with Retry=1 and Nump != 0.

Doing so will give controller a chance to recover from transient error
conditions.

Signed-off-by: Anurag Kumar Vulisha <anurag.kumar.vulisha@xilinx.com>
Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
drivers/usb/dwc3/core.c
drivers/usb/dwc3/core.h

index 64ba664d467c295b856dd14c10b0b60c650afdf9..88c80fcc39f57bbb69dfacd92dd3b3ae691466e8 100644 (file)
@@ -985,6 +985,22 @@ static int dwc3_core_init(struct dwc3 *dwc)
                dwc3_writel(dwc->regs, DWC3_GUCTL1, reg);
        }
 
+       if (dwc->dr_mode == USB_DR_MODE_HOST ||
+           dwc->dr_mode == USB_DR_MODE_OTG) {
+               reg = dwc3_readl(dwc->regs, DWC3_GUCTL);
+
+               /*
+                * Enable Auto retry Feature to make the controller operating in
+                * Host mode on seeing transaction errors(CRC errors or internal
+                * overrun scenerios) on IN transfers to reply to the device
+                * with a non-terminating retry ACK (i.e, an ACK transcation
+                * packet with Retry=1 & Nump != 0)
+                */
+               reg |= DWC3_GUCTL_HSTINAUTORETRY;
+
+               dwc3_writel(dwc->regs, DWC3_GUCTL, reg);
+       }
+
        /*
         * Must config both number of packets and max burst settings to enable
         * RX and/or TX threshold.
index 5f14fb7121b11019ca19066b5ce1c9b07dd538d3..5bfb62533e0fecb7de12738e2f3cb66a6fb7154f 100644 (file)
 #define DWC3_GCTL_GBLHIBERNATIONEN     BIT(1)
 #define DWC3_GCTL_DSBLCLKGTNG          BIT(0)
 
+/* Global User Control Register */
+#define DWC3_GUCTL_HSTINAUTORETRY      BIT(14)
+
 /* Global User Control 1 Register */
 #define DWC3_GUCTL1_TX_IPGAP_LINECHECK_DIS     BIT(28)
 #define DWC3_GUCTL1_DEV_L1_EXIT_BY_HW  BIT(24)