Hi Felipe, Thinh Nguyen wrote: > A request may not be completed because not all the TRBs are prepared for > it. This happens when we run out of available TRBs. When some TRBs are > completed, the driver needs to prepare the rest of the TRBs for the > request. The check dwc3_gadget_ep_request_completed() shouldn't be > checking the amount of data received but rather the number of pending > TRBs. Revise this request completion check. > > Cc: stable@xxxxxxxxxxxxxxx > Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling") > Signed-off-by: Thinh Nguyen <thinhn@xxxxxxxxxxxx> > --- > Changes in v2: > - Add Cc: stable tag > > drivers/usb/dwc3/gadget.c | 12 ++---------- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 1a4fc03742aa..c45853b14cff 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -2550,14 +2550,7 @@ static int dwc3_gadget_ep_reclaim_trb_linear(struct dwc3_ep *dep, > > static bool dwc3_gadget_ep_request_completed(struct dwc3_request *req) > { > - /* > - * For OUT direction, host may send less than the setup > - * length. Return true for all OUT requests. > - */ > - if (!req->direction) > - return true; > - > - return req->request.actual == req->request.length; > + return req->num_pending_sgs == 0; > } > > static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, > @@ -2581,8 +2574,7 @@ static int dwc3_gadget_ep_cleanup_completed_request(struct dwc3_ep *dep, > > req->request.actual = req->request.length - req->remaining; > > - if (!dwc3_gadget_ep_request_completed(req) || > - req->num_pending_sgs) { > + if (!dwc3_gadget_ep_request_completed(req)) { > __dwc3_gadget_kick_transfer(dep); > goto out; > } Since you'll be picking this up for the rc cycle for your fix patches, should I split this series to resend and wait for this patch to be merged first before I resend the patch 2/2? Let me know how you'd like to proceed. Thanks, Thinh