U-Boot Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Mattijs Korpershoek via U-Boot <u-boot@lists.u-boot-project.org>
To: Ye Li <ye.li@oss.nxp.com>, Ye Li <ye.li@nxp.com>,
	lukma@denx.de, u-boot@lists.denx.de
Cc: festevam@gmail.com, peng.fan@nxp.com, uboot-imx@nxp.com,
	xu.yang_2@nxp.com, jason.he_1@nxp.com
Subject: Re: [PATCH 3/3] usb: ci_udc: verify all dtds are inactive before completing request
Date: Wed, 22 Jul 2026 09:13:59 +0200	[thread overview]
Message-ID: <87h5lrijig.fsf@kernel.org> (raw)
In-Reply-To: <adfa3625-6870-4bae-919d-f7c9ff6e44fb@oss.nxp.com>

Hi Ye,

On Fri, Jul 10, 2026 at 17:28, Ye Li <ye.li@oss.nxp.com> wrote:

> Hi Mattijs,
>
> On 6/16/2026 5:30 PM, Mattijs Korpershoek wrote:
>> Hi Ye,
>> 
>> Thank you for the patch.
>> 
>> On Fri, May 22, 2026 at 15:55, Ye Li <ye.li@nxp.com> wrote:
>> 
>>> From: Jason He <jason.he_1@nxp.com>
>>>
>>> According to device mode spec, the ACTIVE status field of dtds should
>>> be check to determine whether the transfers completed successfully.
>>> However, this is not implemented in handle_ep_complete.
>>> When two EPs are enabled and transferring, EPa requests with multiple dtds
>>> and EPb request with one dtd. Irq is triggred on EPb. The udc_irq handler
>>> finds both EPb's and EPa's ENDPTCOMPLETE=1 while not all of EPa's dtds
>>> have been completed. Because ACTIVE status is not checked, this case
>>> causes crash in ci_udc driver.
>>>
>>> Signed-off-by: Jason He <jason.he_1@nxp.com>
>>> Signed-off-by: Ye Li <ye.li@nxp.com>
>>> ---
>>>   drivers/usb/gadget/ci_udc.c | 11 +++++++++++
>>>   1 file changed, 11 insertions(+)
>>>
>>> diff --git a/drivers/usb/gadget/ci_udc.c b/drivers/usb/gadget/ci_udc.c
>>> index 0baad83ef90..53796887dac 100644
>>> --- a/drivers/usb/gadget/ci_udc.c
>>> +++ b/drivers/usb/gadget/ci_udc.c
>>> @@ -733,6 +733,17 @@ static void handle_ep_complete(struct ci_ep *ci_ep)
>>>   	ci_invalidate_qtd(num);
>>>   	ci_req = list_first_entry(&ci_ep->queue, struct ci_req, queue);
>>>   
>>> +	/* Check all dtd are completed, otherwise return for next irq process */
>>> +	next_td = item;
>>> +	for (j = 0; j < ci_req->dtd_count; j++) {
>>> +		ci_invalidate_td(next_td);
>>> +		if (next_td->info & INFO_ACTIVE)
>>> +			return;
>>> +		if (j != ci_req->dtd_count - 1)
>>> +			next_td = (struct ept_queue_item *)(unsigned long)
>>> +				next_td->next;
>>> +	}
>> 
>> A very similar loop (that walks all the dtds) is just below:
>> 
>>> +
>>>   	next_td = item;
>>>   	len = 0;
>>>   	for (j = 0; j < ci_req->dtd_count; j++) {
>> 
>> Can't we merge both loops together?
>> 
> This loop will free each dtd. If the ACTIVE flag is set in the middle of 
> loop, previous dtds should NOT be freed since this transfer is not done. 
> That's why we add a loop to check ACTIVE prior this loop.
>
> If merge two loops together, another list to temporally record dtds for 
> free is needed. Then have to traverse the list to free each one when no 
> ACTIVE found. This traversing will add a loop too.
>
> Best regards,
> Ye Li

Ah yeah, you are right. Sorry about that.

Reviewed-by: Mattijs Korpershoek <mkorpershoek@kernel.org>

>
>>> -- 
>>> 2.37.1

  reply	other threads:[~2026-07-22  7:14 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-22  7:55 [PATCH 1/3] usb: ci_udc: set correct ep type in ep_enable() Ye Li
2026-05-22  7:55 ` [PATCH 2/3] usb: ci_udc: Update usb request status Ye Li
2026-06-16  9:15   ` Mattijs Korpershoek
2026-05-22  7:55 ` [PATCH 3/3] usb: ci_udc: verify all dtds are inactive before completing request Ye Li
2026-06-16  9:30   ` Mattijs Korpershoek
2026-07-10  9:28     ` Ye Li
2026-07-22  7:13       ` Mattijs Korpershoek via U-Boot [this message]
2026-06-16  9:05 ` [PATCH 1/3] usb: ci_udc: set correct ep type in ep_enable() Mattijs Korpershoek
2026-07-22  7:17 ` Mattijs Korpershoek via U-Boot

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=87h5lrijig.fsf@kernel.org \
    --to=u-boot@lists.u-boot-project.org \
    --cc=festevam@gmail.com \
    --cc=jason.he_1@nxp.com \
    --cc=lukma@denx.de \
    --cc=mkorpershoek@kernel.org \
    --cc=peng.fan@nxp.com \
    --cc=u-boot@lists.denx.de \
    --cc=uboot-imx@nxp.com \
    --cc=xu.yang_2@nxp.com \
    --cc=ye.li@nxp.com \
    --cc=ye.li@oss.nxp.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