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
next prev parent 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