Thinh Nguyen wrote: > Wesley Cheng wrote: >> >> >> On 4/14/2021 11:26 PM, Felipe Balbi wrote: >>> Wesley Cheng <wcheng@xxxxxxxxxxxxxx> writes: >>> >>>> If an error is received when issuing a start or update transfer >>>> command, the error handler will stop all active requests (including >>>> the current USB request), and call dwc3_gadget_giveback() to notify >>>> function drivers of the requests which have been stopped. Avoid >>>> having to cancel the current request which is trying to be queued, as >>>> the function driver will handle the EP queue error accordingly. >>>> Simply unmap the request as it was done before, and allow previously >>>> started transfers to be cleaned up. >>>> >>>> Signed-off-by: Wesley Cheng <wcheng@xxxxxxxxxxxxxx> >>>> --- >>>> drivers/usb/dwc3/gadget.c | 5 +++++ >>>> 1 file changed, 5 insertions(+) >>>> >>>> diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c >>>> index e1b04c97..4200775 100644 >>>> --- a/drivers/usb/dwc3/gadget.c >>>> +++ b/drivers/usb/dwc3/gadget.c >>>> @@ -1399,6 +1399,11 @@ static int __dwc3_gadget_kick_transfer(struct dwc3_ep *dep) >>>> if (ret == -EAGAIN) >>>> return ret; >>>> >>>> + /* Avoid canceling current request, as it has not been started */ >>>> + if (req->trb) >>>> + memset(req->trb, 0, sizeof(struct dwc3_trb)); >>> >>> we don't need a full memset. I think ensuring HWO bit is zero is enough. >>> >> Hi Felipe, >> >> Thanks for the input/review, will make this change to just clear the HWO. >> > > Make sure to increment the dequeue pointer also. I think you can use > dwc3_gadget_ep_skip_trbs(). > Nevermind. There maybe a problem with using dwc3_gadget_ep_skip_trbs(). Thinh