Message ID | bed19f474892bb74be92b762c6727a6a7d0106e4.1585643834.git.thinhn@synopsys.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/2] usb: dwc3: gadget: Fix request completion check | expand |
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@vger.kernel.org > Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling") > Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> > --- > 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
Hi Thinh, Thinh Nguyen <Thinh.Nguyen@synopsys.com> writes: > 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@vger.kernel.org >> Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling") >> Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> >> --- >> 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. That's okay. Usually it's better to have the series split, but since it's only two patches, I can manage :-) I'll just leave patch 2 unread :-)
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; }
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@vger.kernel.org Fixes: e0c42ce590fe ("usb: dwc3: gadget: simplify IOC handling") Signed-off-by: Thinh Nguyen <thinhn@synopsys.com> --- Changes in v2: - Add Cc: stable tag drivers/usb/dwc3/gadget.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)