[PATCH] usb: gadget: u_serial: Dequeue the console request only when queued

From: Fabricio Akio via B4 Relay

Date: Mon Sep 28 2026 - 14:24:23 EST


From: Fabricio Akio <fabricioakio@xxxxxxxxx>

gs_console_disconnect() dequeues the console request even when it is
idle, which dwc3 reports as "request ... was not queued" on every
disconnect. Dequeue it only while req->length marks it as queued.

Signed-off-by: Fabricio Akio <fabricioakio@xxxxxxxxx>
---
Tested on a Motorola Moto X4 (XT1900-6, SDM630) with the sdm660-mainline
7.2.3 tree and the gadget serial console in use: "request ... was not
queued to ep3in" is logged on every system suspend without this patch,
and not over three consecutive cycles with it. The path where the
request is still queued at disconnect was not exercised. Applies
unchanged to next-20260928.
---
drivers/usb/gadget/function/u_serial.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/gadget/function/u_serial.c b/drivers/usb/gadget/function/u_serial.c
index cdd1dfc666c4..53a56ddec08a 100644
--- a/drivers/usb/gadget/function/u_serial.c
+++ b/drivers/usb/gadget/function/u_serial.c
@@ -1055,6 +1055,7 @@ static void gs_console_disconnect(struct gs_port *port)
struct gs_console *cons = port->console;
struct usb_request *req;
struct usb_ep *ep;
+ bool was_queued;

if (!cons)
return;
@@ -1063,6 +1064,8 @@ static void gs_console_disconnect(struct gs_port *port)

req = cons->req;
ep = cons->console.data;
+ /* A non-zero length marks the request as queued. */
+ was_queued = req && req->length;
cons->req = NULL;

spin_unlock(&cons->lock);
@@ -1070,7 +1073,8 @@ static void gs_console_disconnect(struct gs_port *port)
if (!req)
return;

- usb_ep_dequeue(ep, req);
+ if (was_queued)
+ usb_ep_dequeue(ep, req);
gs_free_req(ep, req);
}


---
base-commit: 6375e61c01e93e35ee7acd336a689ac1fae4b509
change-id: 20260928-u-serial-console-dequeue-f9790a8e87c6

Best regards,
--
Fabricio Akio <fabricioakio@xxxxxxxxx>