usb: dwc3: gadget: Use SET_EP_PRIME for NoStream
authorThinh Nguyen <Thinh.Nguyen@synopsys.com>
Wed, 6 May 2020 02:47:15 +0000 (19:47 -0700)
committerFelipe Balbi <balbi@kernel.org>
Mon, 25 May 2020 08:09:42 +0000 (11:09 +0300)
DWC_usb32 v1.00a and later can use SET_EP_PRIME command to reinitiate a
stream. Use the command to handle NoStream rejection instead of ending
and restarting the endpoint.

Signed-off-by: Thinh Nguyen <thinhn@synopsys.com>
Signed-off-by: Felipe Balbi <balbi@kernel.org>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index 4def088329c7bd29f5839a1890ee9c36fbcce82e..013f42a2b5dcc652cd70ef2e0b4b9ce664eecce9 100644 (file)
@@ -1161,6 +1161,9 @@ struct dwc3 {
 #define DWC31_REVISION_180A    0x3138302a
 #define DWC31_REVISION_190A    0x3139302a
 
+#define DWC32_REVISION_ANY     0x0
+#define DWC32_REVISION_100A    0x3130302a
+
        u32                     version_type;
 
 #define DWC31_VERSIONTYPE_ANY          0x0
index 0380f76151a1d9d9b4039803d6afca7073bcbb29..fea4fde1b5e3358951f6541a98b2fc0a7a437f3a 100644 (file)
@@ -2844,9 +2844,16 @@ static void dwc3_gadget_endpoint_stream_event(struct dwc3_ep *dep,
                 * hosts, force to reinitate the stream until the host is ready
                 * instead of waiting for the host to prime the endpoint.
                 */
-               dep->flags |= DWC3_EP_DELAY_START;
-               dwc3_stop_active_transfer(dep, true, true);
-               return;
+               if (DWC3_VER_IS_WITHIN(DWC32, 100A, ANY)) {
+                       unsigned int cmd = DWC3_DGCMD_SET_ENDPOINT_PRIME;
+
+                       dwc3_send_gadget_generic_command(dwc, cmd, dep->number);
+               } else {
+                       dep->flags |= DWC3_EP_DELAY_START;
+                       dwc3_stop_active_transfer(dep, true, true);
+                       return;
+               }
+               break;
        }
 
 out: