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: Tue, 13 Oct 2026 08:38:04 +0530 [thread overview]
Message-ID: <a8021139-a675-4875-b437-7e837d5433b1@samsung.com> (raw)
In-Reply-To: <as2N1JlPnpKBYcsb@vbox>
On 10/13/2026 7:22 AM, Thinh Nguyen wrote:
> On Mon, Oct 12, 2026, Selvarasu Ganesan wrote:
>> 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.
> Was there another SETUP packet aborting the ClearFeature(ep_halt) while
> this is going on?
We dont see any evidence from the log to say SETUP packet aborting,
anyway we will add a debug logs to confirm this one.
>
>>>> * 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.
> Yes, it's required. The suggested patch now enables IOC for ep_disable.
> So we need to track its completion with DWC3_EP_END_TRANSFER_PENDING.
> This handles the case where the End Transfer completes after ep_disable
> returns. If the function driver re-enables and queues to the endpoint
> before then, the driver would issue Start Transfer while the resource is
> still held. That's the original issue.
>
> If the End Transfer never completes, the endpoint is stuck. Clearing the
> flag doesn't recover it. The dwc3_schedule_err_recovery() is now in
I mean 'not recover here' is the failure to clear the
DWC3_EP_END_TRANSFER_PENDING flag upon cable reconnection, caused by a
missing command completion from the prior connection.
Sure we can use dwc3_schedule_err_recovery(), and thanks for the suggestion.
> mainline. We can use that as recovery for -ETIMEDOUT.
>
> Looking at the recovery function now, we also need to reset the
> dep->flags on recovery which I missed when reviewing the change. I'll
> send a patch for this.
Great, Thank you.
>
>> @@ -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.
> The ep_queue change only covers the giveback window inside ep_disable,
> not this case.
agree.
>
>> 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;
>>
> (Can you help fix your mail client? I had to unmangle the diff above to
> know what it was)
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,
> Thinh
prev parent reply other threads:[~2026-10-13 3:08 UTC|newest]
Thread overview: 20+ 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
2026-10-13 1:52 ` Thinh Nguyen
2026-10-13 3:08 ` 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=a8021139-a675-4875-b437-7e837d5433b1@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®