]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
usb: dwc3: gadget: Handle DEV_TXF_FLUSH_BYPASS capability
authorThinh Nguyen <Thinh.Nguyen@synopsys.com>
Thu, 22 Apr 2021 23:51:43 +0000 (16:51 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 23 Apr 2021 11:05:15 +0000 (13:05 +0200)
DWC_usb32 IP introduces a new behavior when handling NoStream event for
IN endpoints. If the controller is capable of DEV_TXF_FLUSH_BYPASS, then
the driver does not need to force to restart stream for IN endpoints.
The controller will generate ERDY and restart the stream periodically.

Acked-by: Felipe Balbi <balbi@kernel.org>
Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Link: https://lore.kernel.org/r/65c3070c666cd6b8beeee62d7f8e3e704ebf2d32.1619134559.git.Thinh.Nguyen@synopsys.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/dwc3/core.h
drivers/usb/dwc3/gadget.c

index b678200cc51e8f4c234805311e592f84a6183136..b1e875c58f20f69813f206a117f738743a0fa366 100644 (file)
 #define DWC3_GHWPARAMS7_RAM1_DEPTH(n)  ((n) & 0xffff)
 #define DWC3_GHWPARAMS7_RAM2_DEPTH(n)  (((n) >> 16) & 0xffff)
 
+/* Global HWPARAMS9 Register */
+#define DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS   BIT(0)
+
 /* Global Frame Length Adjustment Register */
 #define DWC3_GFLADJ_30MHZ_SDBND_SEL            BIT(7)
 #define DWC3_GFLADJ_30MHZ_MASK                 0x3f
index 90f4f9e69b227f1fb555b3af2269639af7d042d4..dd80e5ca8c78b6e402864a00b8e314a7a09e175f 100644 (file)
@@ -730,8 +730,16 @@ static int __dwc3_gadget_ep_enable(struct dwc3_ep *dep, unsigned int action)
                         * All stream eps will reinitiate stream on NoStream
                         * rejection until we can determine that the host can
                         * prime after the first transfer.
+                        *
+                        * However, if the controller is capable of
+                        * TXF_FLUSH_BYPASS, then IN direction endpoints will
+                        * automatically restart the stream without the driver
+                        * initiation.
                         */
-                       dep->flags |= DWC3_EP_FORCE_RESTART_STREAM;
+                       if (!dep->direction ||
+                           !(dwc->hwparams.hwparams9 &
+                             DWC3_GHWPARAMS9_DEV_TXF_FLUSH_BYPASS))
+                               dep->flags |= DWC3_EP_FORCE_RESTART_STREAM;
                }
        }