[v2,2/2] usb: dwc3: gadget: when the started list is empty stop the active xfer

Message ID 20200624144907.9604-3-m.grzeschik@pengutronix.de
State New
Headers show
  • usb: dwc3: gadget: improve isoc handling
Related show

Commit Message

Michael Grzeschik June 24, 2020, 2:49 p.m.
When we have nothing left to be queued after handling the last trb
we have to stop the current transfer. This way we can ensure that
the next request will be queued with an new and valid timestamp
and will not directly run into an missed xfer.

Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>

v1 -> v2: - This Patch replaces the following patch by Michael Olbrich:
            usb: dwc3: gadget: restart the transfer if a isoc request is queued too late

 drivers/usb/dwc3/gadget.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)


diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 0962ddd7fbf6ae6..b2b8b911ac79b39 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -2729,7 +2729,10 @@  static bool dwc3_gadget_endpoint_trbs_complete(struct dwc3_ep *dep,
 	if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
 		goto out;
-	if (status == -EXDEV && list_empty(&dep->started_list))
+	if ((status == -EXDEV && list_empty(&dep->started_list)) ||
+		(usb_endpoint_xfer_isoc(dep->endpoint.desc) &&
+			list_empty(&dep->started_list) &&
+			list_empty(&dep->pending_list)))
 		dwc3_stop_active_transfer(dep, true, true);
 	else if (dwc3_gadget_ep_should_continue(dep))
 		if (__dwc3_gadget_kick_transfer(dep, false) == 0)