mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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

      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®