On Thu, Jun 13, 2024, Mike Looijmans wrote: > > > > Wait, I thought the host initiated the usb suspend. Did you trigger usb > > suspend by putting the host in suspend? Or does the suspend event only > > come when you perform a disconnect? > > All I do is unplug the cable. The host (PC running Ubuntu 22) doesn't eject > or suspend or anything like that. > This is a very typical connect/disconnect flow. I'm surprised that it's not caught on your platform before. What's the compatible string for your platform? > > > > > Can you confirm if the suspend event was there before you disconnect the > > device? > > Disconnecting the cable is what leads to the "suspend" event. > Can you try this: It's a simple workaround, but may not catch the issue while operating in Fullspeed. diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 89fc690fdf34..894ca1044281 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c @@ -4339,6 +4339,18 @@ static void dwc3_gadget_suspend_interrupt(struct dwc3 *dwc, { enum dwc3_link_state next = evtinfo & DWC3_LINK_STATE_MASK; + if (next == DWC3_LINK_STATE_U3) { + u8 speed; + u32 reg; + + reg = dwc3_readl(dwc->regs, DWC3_DSTS); + speed = reg & DWC3_DSTS_CONNECTSPD; + if (dwc->speed != speed) { + dwc3_gadget_disconnect_interrupt(dwc); + return; + } + } + if (!dwc->suspended && next == DWC3_LINK_STATE_U3) { dwc->suspended = true; dwc3_suspend_gadget(dwc); Otherwise, there's no other SW workaround that I can think of. BR, Thinh