From: Selvarasu Ganesan <selvarasu.g@samsung.com>
To: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
Cc: "gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
"linux-usb@vger.kernel.org" <linux-usb@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
"jh0801.jung@samsung.com" <jh0801.jung@samsung.com>,
"dh10.jung@samsung.com" <dh10.jung@samsung.com>,
"akash.m5@samsung.com" <akash.m5@samsung.com>,
"hongpooh.kim@samsung.com" <hongpooh.kim@samsung.com>,
"eomji.oh@samsung.com" <eomji.oh@samsung.com>,
"h10.kim@samsung.com" <h10.kim@samsung.com>,
"shijie.cai@samsung.com" <shijie.cai@samsung.com>,
"alim.akhtar@samsung.com" <alim.akhtar@samsung.com>,
"muhammed.ali@samsung.com" <muhammed.ali@samsung.com>,
"thiagu.r@samsung.com" <thiagu.r@samsung.com>,
"pritam.sutar@samsung.com" <pritam.sutar@samsung.com>,
"stable@vger.kernel.org" <stable@vger.kernel.org>
Subject: Re: [PATCH v3] usb: dwc3: gadget: Prevent EP resource conflicts during StartTransfer
Date: Mon, 12 Oct 2026 22:22:06 +0530 [thread overview]
Message-ID: <0a2bc277-3977-46cd-9759-ba273b5c2c4d@samsung.com> (raw)
In-Reply-To: <asglyrMYkopr3EOz@vbox>
On 10/9/2026 5:57 AM, Thinh Nguyen wrote:
> On Thu, Oct 08, 2026, Selvarasu Ganesan wrote:
>>> The End Transfer command not completing is also a separate issue. I
>>> asked you to check whether the command would eventually complete with
>>> the additional code, and it appears it doesn't.
>> We have confirmed that the completion event is never seen, once the
>> timeout occurs for end transfer. It appears the command is indeed
>> hanging in the hardware, as you suspected.
>>
>>> Can you provide some more info on your setup:
>>> * IP and version
>>> * connected speed
>>> * endpoint direction (is it always OUT?)
>>> * Is there any active transfer
>>> * tracepoints
>
>> * IP and version : 0xc120: 0x33313130
> and version (0xc1a0)?
VER_NUMBER = 0x3231302a
VER_TYPE = 0x67612a2a
>
>> * connected speed : HS mode
>> * endpoint direction (is it always OUT?) : Yes its always OUT
>> * Is there any active transfer : No, There is evidences from the log to
>> say there is a active transfer.
> The host may have sent data that would not appear in the log until
> completion. Are there any active transfer on other endpoints?
Yes, we can see active transfer on other endpoints.
>
>> * tracepoints: There is no dwc3 traces for this issue as of now due to
>> its low reproduction rate in the customer's setup.
>>
> I think you may need to file a case with our support team and provide
> additional debug info such as scan dump to investigate this further.
Sure We will file a case,
I agree that the ENDTRANSFER timeout may be a controller level issue
that we can debug separately. But, there is also a software bug here.
Let see the in the below error case, "dep->resource_index" is reset to
"0" unconditionally, even when the first ENDTRANSFER times out. A
subsequent ENDTRANSFER with resource index "0" may succeed and
incorrectly clear the pending and transfer started flags, making the
driver assume the previous transfer has completed. Since the original
transfer was never properly terminated, the endpoint may not recover,
resulting in a no-resources error on the next STARTTRANSFER.
Therefore, we need to fix this software state tracking issue
independently of the controller timeout.
Step 1:
__dwc3_gadget_ep_set_halt(dep, value=0)
->dwc3_stop_active_transfer(dep, true, true)
->END(e.g, ep2out, resource_index=7) issued, but timeout occurs
-> resource_index cleared to 0
->dwc3_send_clear_stall_ep_cmd(dep)
-> failed to clear STALL on ep2out
Step 2:
__dwc3_gadget_ep_set_halt(dep, value=0) ->Re triggered clear stall for
same EP
-> dwc3_stop_active_transfer(dep, true, true)
-> END(ep2out, resource_index=0) issued (wrong resource!)
-> Command succeeds, DWC3_EP_TRANSFER_STARTED cleared in completion
handler
Step 3:
usb_ep_queue()
-> dwc3_gadget_ep_queue()
-> __dwc3_gadget_kick_transfer()
-> starting = !(dep->flags & DWC3_EP_TRANSFER_STARTED) -> starting=0
-> Issues STARTTRANSFER (because DWC3_EP_TRANSFER_STARTED is not set)
-> Hardware rejects with NO_RESOURCE (resource 7 still held)
We are fine with the following suggestions fix to prevent resource issue
in timeout case,
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c
index 1f973e546219..bac0328423cd 100644
--- a/drivers/usb/dwc3/gadget.c
+++ b/drivers/usb/dwc3/gadget.c
@@ -1819,7 +1819,11 @@ static int __dwc3_stop_active_transfer(struct
dwc3_ep *dep, bool force, bool int
dep->resource_index = 0;
- if (!interrupt || ret)
+ if (!interrupt || (ret && ret != -ETIMEDOUT))
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
else
dep->flags |= DWC3_EP_END_TRANSFER_PENDING;
@@ -3895,6 +3899,8 @@ static void
dwc3_gadget_endpoint_command_complete(struct dwc3_ep *dep,
if (dep->stream_capable)
dep->flags |= DWC3_EP_IGNORE_NEXT_NOSTREAM;
+ dep->flags &= ~DWC3_EP_DELAY_STOP;
dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING;
dep->flags &= ~DWC3_EP_TRANSFER_STARTED;
dwc3_gadget_ep_cleanup_cancelled_requests(dep);
But regarding below changes in ep_disable that you suggested, is this
really required? It seems this could cause a bug during an endtransfer
timeout, if command completion never happens, the PENDING flag won't be
cleared, making recovery impossible.
@@ -1096,6 +1110,15 @@ static int __dwc3_gadget_ep_disable(struct
dwc3_ep *dep)
*/
if (dep->flags & DWC3_EP_DELAY_STOP)
mask |= (DWC3_EP_DELAY_STOP | DWC3_EP_TRANSFER_STARTED);
+
+ /*
+ * The End Transfer command is still in progress. Do not clear the
+ * flags, so that the ep is only rearmed once the command completes.
+ */
+ if (dep->flags & DWC3_EP_END_TRANSFER_PENDING)
+ mask |= (DWC3_EP_END_TRANSFER_PENDING |
+ DWC3_EP_TRANSFER_STARTED);
As you mentioned Clearing the flag (DWC3_EP_END_TRANSFER_PENDING) in
ep_disble only lead to a NO_RESOURCE error later. Yes i agree, but this
can prevent by below new suggestion change, so above changes (do not
clear DWC3_EP_END_TRANSFER_PENDING in ep_disable) is not required.
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index
ee837235630a..eb6666b7bb98 100644 --- a/drivers/usb/dwc3/gadget.c +++
b/drivers/usb/dwc3/gadget.c @@ -1084,6 +1084,8 @@ static int
__dwc3_gadget_ep_disable(struct dwc3_ep *dep) reg &=
~DWC3_DALEPENA_EP(dep->number); dwc3_writel(dwc, DWC3_DALEPENA, reg); +
dep->flags &= ~DWC3_EP_ENABLED; + dwc3_remove_requests(dwc, dep,
-ESHUTDOWN); dep->stream_capable = false; @@ -1990,7 +1992,8 @@ static
int __dwc3_gadget_ep_queue(struct dwc3_ep *dep, struct dwc3_request
*req) { struct dwc3 *dwc = dep->dwc; - if (!dep->endpoint.desc ||
!dwc->pullups_connected || !dwc->connected) { + if (!(dep->flags &
DWC3_EP_ENABLED) || !dep->endpoint.desc || + !dwc->pullups_connected ||
!dwc->connected) { dev_dbg(dwc->dev, "%s: can't queue to disabled
endpoint\n", dep->name); return -ESHUTDOWN;
Thanks,
Selva
>
> Thanks,
> Thinh
prev parent reply other threads:[~2026-10-12 16:52 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20260227121338epcas5p4baebb406db37f07223545b2f85751bf2@epcas5p4.samsung.com>
2026-02-27 12:12 ` Selvarasu Ganesan
2026-02-28 0:27 ` Thinh Nguyen
2026-03-03 0:39 ` Thinh Nguyen
2026-03-06 13:06 ` Selvarasu Ganesan
2026-03-06 21:41 ` Thinh Nguyen
2026-09-24 12:05 ` Selvarasu Ganesan
2026-09-24 12:24 ` Selvarasu Ganesan
2026-09-29 3:08 ` Thinh Nguyen
2026-09-29 7:04 ` Selvarasu Ganesan
2026-10-03 1:59 ` Thinh Nguyen
2026-10-06 15:52 ` Selvarasu Ganesan
2026-10-07 2:06 ` Thinh Nguyen
2026-10-07 13:57 ` Selvarasu Ganesan
2026-10-07 14:14 ` Selvarasu Ganesan
2026-10-07 23:59 ` Thinh Nguyen
2026-10-08 4:37 ` Selvarasu Ganesan
2026-10-09 0:27 ` Thinh Nguyen
2026-10-12 16:52 ` Selvarasu Ganesan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=0a2bc277-3977-46cd-9759-ba273b5c2c4d@samsung.com \
--to=selvarasu.g@samsung.com \
--cc=Thinh.Nguyen@synopsys.com \
--cc=akash.m5@samsung.com \
--cc=alim.akhtar@samsung.com \
--cc=dh10.jung@samsung.com \
--cc=eomji.oh@samsung.com \
--cc=gregkh@linuxfoundation.org \
--cc=h10.kim@samsung.com \
--cc=hongpooh.kim@samsung.com \
--cc=jh0801.jung@samsung.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=muhammed.ali@samsung.com \
--cc=pritam.sutar@samsung.com \
--cc=shijie.cai@samsung.com \
--cc=stable@vger.kernel.org \
--cc=thiagu.r@samsung.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®