diff mbox series

[2/2] usb: dwc3: gadget: Handle DEV_TXF_FLUSH_BYPASS capability

Message ID 65c3070c666cd6b8beeee62d7f8e3e704ebf2d32.1619134559.git.Thinh.Nguyen@synopsys.com (mailing list archive)
State Accepted
Commit ddae7979cdd5ed417f2b3ebdc5742e2a600b5ad5
Headers show
Series usb: dwc3: gadget: Check new capability | expand

Commit Message

Thinh Nguyen April 22, 2021, 11:51 p.m. UTC
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.

Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
---
 drivers/usb/dwc3/core.h   |  3 +++
 drivers/usb/dwc3/gadget.c | 10 +++++++++-
 2 files changed, 12 insertions(+), 1 deletion(-)

Comments

Felipe Balbi April 23, 2021, 6:09 a.m. UTC | #1
Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes:

> 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.
>
> Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>

so we still need to force restart for RX? Just making sure. Other than
that:

Acked-by: Felipe Balbi <balbi@kernel.org>
Thinh Nguyen April 26, 2021, 9:27 p.m. UTC | #2
Felipe Balbi wrote:
> Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes:
> 
>> 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.
>>
>> Signed-off-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
> 
> so we still need to force restart for RX? Just making sure. Other than
> that:
> 
> Acked-by: Felipe Balbi <balbi@kernel.org>
> 

Yes, it's only for Tx. Same behavior remains for Rx. We have some
updates to simplify our design handling Tx direction.

Thanks,
Thinh
diff mbox series

Patch

diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index b678200cc51e..b1e875c58f20 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -379,6 +379,9 @@ 
 #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
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 90f4f9e69b22..dd80e5ca8c78 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -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;
 		}
 	}