On Wed, Oct 28, 2020 at 04:43:10PM -0700, Wesley Cheng wrote: > The DWC3 runtime suspend routine checks for the USB connected parameter to > determine if the controller can enter into a low power state. The > connected state is only set to false after receiving a disconnect event. > However, in the case of a device initiated disconnect (i.e. UDC unbind), > the controller is halted and a disconnect event is never generated. Set > the connected flag to false if issuing a device initiated disconnect to > allow the controller to be suspended. > > Signed-off-by: Wesley Cheng <wcheng@xxxxxxxxxxxxxx> > --- > drivers/usb/dwc3/gadget.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 5d879b7606d5..6364429b2122 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -1995,6 +1995,11 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) > unsigned long flags; > int ret; > > + if (pm_runtime_suspended(dwc->dev)) { > + pm_request_resume(dwc->dev); > + return 0; > + } Isn't this racy? What happens if the controller was active but a runtime suspend occurs right here? Alan Stern > + > is_on = !!is_on; > > /* > @@ -2050,6 +2055,7 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) > dwc->ev_buf->lpos = (dwc->ev_buf->lpos + count) % > dwc->ev_buf->length; > } > + dwc->connected = false; > } > > ret = dwc3_gadget_run_stop(dwc, is_on, false); > -- > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project