Message ID | 20210825042855.7977-1-wcheng@codeaurora.org (mailing list archive) |
---|---|
State | Accepted |
Commit | 4a1e25c0a029b97ea4a3d423a6392bfacc3b2e39 |
Headers | show |
Series | [v5] usb: dwc3: gadget: Stop EP0 transfers during pullup disable | expand |
Wesley Cheng <wcheng@codeaurora.org> writes: > During a USB cable disconnect, or soft disconnect scenario, a pending > SETUP transaction may not be completed, leading to the following > error: > > dwc3 a600000.dwc3: timed out waiting for SETUP phase > > If this occurs, then the entire pullup disable routine is skipped and > proper cleanup and halting of the controller does not complete. > > Instead of returning an error (which is ignored from the UDC > perspective), allow the pullup disable routine to continue, which > will also handle disabling of EP0/1. This will end any active > transfers as well. Ensure to clear any delayed_status also, as the > timeout could happen within the STATUS stage. > > Cc: <stable@vger.kernel.org> > Fixes: bb0147364850 ("usb: dwc3: gadget: don't clear RUN/STOP when it's invalid to do so") > Reviewed-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> > Signed-off-by: Wesley Cheng <wcheng@codeaurora.org> Acked-by: Felipe Balbi <balbi@kernel.org>
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 5d084542718d..63f6d9f2a692 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -2428,10 +2428,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) ret = wait_for_completion_timeout(&dwc->ep0_in_setup, msecs_to_jiffies(DWC3_PULL_UP_TIMEOUT)); - if (ret == 0) { - dev_err(dwc->dev, "timed out waiting for SETUP phase\n"); - return -ETIMEDOUT; - } + if (ret == 0) + dev_warn(dwc->dev, "timed out waiting for SETUP phase\n"); } /* @@ -2643,6 +2641,7 @@ static int __dwc3_gadget_start(struct dwc3 *dwc) /* begin to receive SETUP packets */ dwc->ep0state = EP0_SETUP_PHASE; dwc->link_state = DWC3_LINK_STATE_SS_DIS; + dwc->delayed_status = false; dwc3_ep0_out_start(dwc); dwc3_gadget_enable_irq(dwc);