Hi, Peter Chen <peter.chen@xxxxxxx> writes: > Hi Balbi, > > When do configfs function add and remove stress test, I find dwc3 > gadget .pullup will timeout if there is a request on the way. Even I what do you mean by "a request on the way"? > enlarge the delay, there is still timeout for .pullup. > > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index f13bef950951..e95955b6a225 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -1827,6 +1827,7 @@ static int dwc3_gadget_run_stop(struct dwc3 *dwc, int is_on, int suspend) > do { > reg = dwc3_readl(dwc->regs, DWC3_DSTS); > reg &= DWC3_DSTS_DEVCTRLHLT; > + udelay(1); > } while (--timeout && !(!is_on ^ !reg)); > > if (!timeout) > @@ -1861,6 +1862,8 @@ static int dwc3_gadget_pullup(struct usb_gadget *g, int is_on) > spin_lock_irqsave(&dwc->lock, flags); > ret = dwc3_gadget_run_stop(dwc, is_on, false); > spin_unlock_irqrestore(&dwc->lock, flags); > + if (ret) > + dev_err(dwc->dev, "%s:ret = %d\n", __func__, ret); > > return ret; > } > > This timeout causes the NULL pointer issue for ethernet gadget, eg. NCM, the reason > is ncm->notify_req is NULL, but the ncm_notify_complete is not called before .unbind is > called. See below oops: sounds like a bug in ncm. If we haven't connected to host side yet, we can't really complete the request. > It is very easy to reproduce it, just create ncm function, > and sleep 1 second, then, remove it. > > I am not sure if it is the common issue for dwc3, there is no such > requirement for chipidea and cadence3. Would you please have a check? could you capture tracepoints of what's happening here? -- balbi
Attachment:
signature.asc
Description: PGP signature