On Mon, Apr 10, 2023, Wesley Cheng wrote: > Do not call gadget stop until the poll for controller halt is > completed. DEVTEN is cleared as part of gadget stop, so the intention to > allow ep0 events to continue while waiting for controller halt is not > happening. > > Fixes: c96683798e27 ("usb: dwc3: ep0: Don't prepare beyond Setup stage") > Signed-off-by: Wesley Cheng <quic_wcheng@xxxxxxxxxxx> > --- > drivers/usb/dwc3/gadget.c | 15 +++++++++++++-- > 1 file changed, 13 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 91768f1bdbaf..9715de8e99bc 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -2566,7 +2566,6 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) > * bit. > */ > dwc3_stop_active_transfers(dwc); > - __dwc3_gadget_stop(dwc); > spin_unlock_irqrestore(&dwc->lock, flags); > > /* > @@ -2596,7 +2595,19 @@ static int dwc3_gadget_soft_disconnect(struct dwc3 *dwc) > * remaining event generated by the controller while polling for > * DSTS.DEVCTLHLT. > */ > - return dwc3_gadget_run_stop(dwc, false, false); > + ret = dwc3_gadget_run_stop(dwc, false, false); > + > + /* > + * Stop the gadget after controller is halted, so that if needed, the > + * events to update EP0 state can still occur while the run/stop > + * routine polls for the halted state. DEVTEN is cleared as part of > + * gadget stop. > + */ > + spin_lock_irqsave(&dwc->lock, flags); > + __dwc3_gadget_stop(dwc); > + spin_unlock_irqrestore(&dwc->lock, flags); > + > + return ret; > } > > static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) Acked-by: Thinh Nguyen <Thinh.Nguyen@xxxxxxxxxxxx> Thanks, Thinh