Hi, Michael Grzeschik wrote: > 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@xxxxxxxxxxxxxx> > > --- > 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))) The -EXDEV check is also for isoc, maybe rearrange this for easier read: if (usb_endpoint_xfer_isoc(dep->endpoint.desc) && list_empty(&dep->started_list) && (list_empty(&dep->pending_list) || status == -EXDEV)) > dwc3_stop_active_transfer(dep, true, true); > else if (dwc3_gadget_ep_should_continue(dep)) > if (__dwc3_gadget_kick_transfer(dep, false) == 0) BR, Thinh