| From 58577118cc7cec9eb7c1836bf88f865ff2c5e3a3 Mon Sep 17 00:00:00 2001 |
| From: Kuen-Han Tsai <khtsai@google.com> |
| Date: Thu, 7 Aug 2025 17:06:55 +0800 |
| Subject: usb: dwc3: Ignore late xferNotReady event to prevent halt timeout |
| |
| From: Kuen-Han Tsai <khtsai@google.com> |
| |
| commit 58577118cc7cec9eb7c1836bf88f865ff2c5e3a3 upstream. |
| |
| During a device-initiated disconnect, the End Transfer command resets |
| the event filter, allowing a new xferNotReady event to be generated |
| before the controller is fully halted. Processing this late event |
| incorrectly triggers a Start Transfer, which prevents the controller |
| from halting and results in a DSTS.DEVCTLHLT bit polling timeout. |
| |
| Ignore the late xferNotReady event if the controller is already in a |
| disconnected state. |
| |
| Fixes: 72246da40f37 ("usb: Introduce DesignWare USB3 DRD Driver") |
| Cc: stable <stable@kernel.org> |
| Signed-off-by: Kuen-Han Tsai <khtsai@google.com> |
| Acked-by: Thinh Nguyen <Thinh.Nguyen@synopsys.com> |
| Link: https://lore.kernel.org/r/20250807090700.2397190-1-khtsai@google.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/usb/dwc3/gadget.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/drivers/usb/dwc3/gadget.c |
| +++ b/drivers/usb/dwc3/gadget.c |
| @@ -3590,6 +3590,15 @@ static void dwc3_gadget_endpoint_transfe |
| static void dwc3_gadget_endpoint_transfer_not_ready(struct dwc3_ep *dep, |
| const struct dwc3_event_depevt *event) |
| { |
| + /* |
| + * During a device-initiated disconnect, a late xferNotReady event can |
| + * be generated after the End Transfer command resets the event filter, |
| + * but before the controller is halted. Ignore it to prevent a new |
| + * transfer from starting. |
| + */ |
| + if (!dep->dwc->connected) |
| + return; |
| + |
| dwc3_gadget_endpoint_frame_from_event(dep, event); |
| |
| /* |