Wesley Cheng wrote: > > > On 4/14/2021 11:26 PM, Felipe Balbi wrote: >> Wesley Cheng <wch...@codeaurora.org> 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 <wch...@codeaurora.org> >>> --- >>> 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(). BR, Thinh