From 884d36b0e0b86c3ab0a44e5dcc5a2761046aea1c Mon Sep 17 00:00:00 2001 From: Pratham Pratap Date: Mon, 23 Mar 2020 11:09:23 +0530 Subject: [PATCH] usb: dwc3: gadget: Add delay for EPCMDCMPLT In some cases issuing end_transfer command as part of remove requests to eps is taking around 2ms for the endpoint command complete interrupt(EPCMDCMPLT). And before EPCMDCMPLT interrupt driver has already unmapped the request which controller may access leading to SMMU fault. Fix this by adding delay before giving back the requests to gadget driver. Change-Id: Iba10f5337a43c5f7db702321f6dce3b5e1b1af44 Signed-off-by: Pratham Pratap --- drivers/usb/dwc3/gadget.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index c9e4bd51d802..6b89c2688738 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -816,6 +816,13 @@ static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) dwc->eps[1]->trb_enqueue = 0; } + if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) + udelay(2000); + + if (dep->flags & DWC3_EP_END_TRANSFER_PENDING) + dbg_log_string("ep end_xfer cmd completion timeout for %d", + dep->number); + /* - giveback all requests to gadget driver */ while (!list_empty(&dep->started_list)) { req = next_request(&dep->started_list);