From: Mathias Nyman <mathias.nyman@linux.intel.com>
To: Michal Pecio <michal.pecio@gmail.com>
Cc: dylan_robinson@motu.com, linux-usb@vger.kernel.org,
mathias.nyman@intel.com, stern@rowland.harvard.edu
Subject: Re: [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs
Date: Thu, 6 Aug 2026 16:25:15 +0300 [thread overview]
Message-ID: <0e2f28f5-aa38-4401-8287-b55aab577243@linux.intel.com> (raw)
In-Reply-To: <20260806101706.72a8de47.michal.pecio@gmail.com>
On 8/6/26 11:17, Michal Pecio wrote:
>> + /* calculate valid frame window, in frame units, see xhci 4.11.2.5 */
>> + curr_frame = MFINDEX_TO_FRAME(mfindex);
>> + win_start = (curr_frame + DIV_ROUND_UP_POW2(ist, 8) + 1) % MAX_FRAMES;
>> + win_end = (curr_frame + 895) % MAX_FRAMES;
>>
>> - start_frame &= 0x7ff;
>> - start_frame_id = (start_frame_id >> 3) & 0x7ff;
>> - end_frame_id = (end_frame_id >> 3) & 0x7ff;
>> + // FIXME, used to check if !list_empty(&ep_ring->td_list)), is that reliable
>
> This doesn't look very professional :)
>
> (Surprised to find that checkpatch doesn't warn about C++ comments...)
>
I'll remove that comment, but didn't it help highlight the !list_empty
case for you :)
> But most importantly, as Alan explained, list_empty() was indeed the
> specific check which should be performed.
>
> * If there are pending URBs on the endpoint, a new non-ASAP URB is
> scheduled contiguously after the last one.
> * If there are no pending URBs, new non-ASAP URB is scheduled ASAP.
>
> (The exact meaning of "pending" is a little tricky in presence of BH
> giveback, but that's another issue and it also affects ehci-hcd).
>
>>
>> - if (start_frame_id < end_frame_id) {
>> - if (start_frame > end_frame_id ||
>> - start_frame < start_frame_id)
>> - ret = -EINVAL;
>> - } else if (start_frame_id > end_frame_id) {
>> - if ((start_frame > end_frame_id &&
>> - start_frame < start_frame_id))
>> - ret = -EINVAL;
>> + /* Is this the first URB starting the whole isoc transfer */
>
> Nitpick: xHCI calls this "isoch data flow" and ehci-hcd "stream".
>
> Isn't "isoc transfer", per USB spec, things that happens during one
> interval? But not 100% sure about it and too lazy to check now...
>
>> + if (ep->next_uframe < 0) {
>
> And where is ep->next_uframe coming from?
First set in xhci_queue_isoc_tx_prepare(), and then set after every URB
enque in xhci_queue_isoc_tx()
>
> Besides initialization, it's made -1 if and only if xHCI endpoint
> state isn't Running at the time of submission. This effectively means
> that to start a new "isoch data flow" aka "stream", class driver must
> unlink the last remaining URB of the previous flow. If the driver
> doesn't unlink (or tries too late), the endpoint goes Running-Idle.
If class driver doesn't unlink remaining urbs then list won't be empty
and you have the exact same situation.
Checking if list is empty doesn't help here.
>
> So you have removed the wrong condition here. It should be empty list,
> not xHCI endpoint state, which drivers don't care or even know about.
>
> Moreover, we know that Endpoint Context state is one of the least
> trustworthy piecese of information, and notably it may remain Stopped
> for a while after a doorbell ring. This means that multiple URBs may
> be scheduled as new "streams" and get assigned the same start_frame.
>
Ok, we basically have different opinion on how to identify when a new
isoc data flow starts. You would rely on checking if list is empty, and
I'm looking at harware endpoint state.
I don't trust the 'empty list check' as I'm not convinced there can't be
cases in software where list is empty even mid isoc data flow. Something
like extreme long interval and BH delay in class driver receiving URB.
We can add empty list check as well in some places.
For example xhci_isoc_tx_prepare() could benefit from having both empty list
and hw endpoint state check when setting next_uframe = -1;
But we are late in the rc cycle and merge window opens soon, so I'm going
to submit this anyway to get things forward.
This patch is tested, solves an existing issue, and moves the frame_id code
in the right direction.
Any issues we discover later can be fixed when discovered.
We can't keep finetuning this forever to cover potential issues by broken
hardware
Thanks
Mathias
next prev parent reply other threads:[~2026-08-06 13:25 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-04 21:25 [Bug 220748] New: usb: xhci_queue_isoc_tx_prepare ignore start_frame and always assumes URB_ISO_ASAP is set bugzilla-daemon
2025-11-05 8:40 ` [Bug 220748] " bugzilla-daemon
2025-11-05 8:48 ` bugzilla-daemon
2025-11-05 8:53 ` bugzilla-daemon
2025-11-05 9:06 ` bugzilla-daemon
2025-11-05 15:47 ` bugzilla-daemon
2025-11-05 18:28 ` bugzilla-daemon
2025-11-05 18:30 ` bugzilla-daemon
2025-11-05 20:16 ` bugzilla-daemon
2025-11-05 21:18 ` bugzilla-daemon
2025-11-06 3:52 ` bugzilla-daemon
2025-11-06 8:27 ` bugzilla-daemon
2025-11-06 8:35 ` bugzilla-daemon
2025-11-06 15:03 ` bugzilla-daemon
2025-11-08 10:33 ` bugzilla-daemon
2025-11-08 16:09 ` bugzilla-daemon
2025-11-10 10:23 ` bugzilla-daemon
2025-11-10 10:42 ` bugzilla-daemon
2026-05-04 23:53 ` bugzilla-daemon
2026-05-04 23:54 ` bugzilla-daemon
2026-05-05 1:14 ` bugzilla-daemon
2026-05-05 9:59 ` bugzilla-daemon
2026-05-05 17:09 ` bugzilla-daemon
2026-05-05 17:10 ` bugzilla-daemon
2026-05-05 17:10 ` bugzilla-daemon
2026-05-05 17:13 ` bugzilla-daemon
2026-05-06 13:32 ` bugzilla-daemon
2026-05-06 15:03 ` bugzilla-daemon
2026-05-07 2:38 ` Alan Stern
2026-05-07 16:17 ` Dylan Robinson
2026-05-07 17:24 ` Alan Stern
2026-05-07 21:16 ` Dylan Robinson
2026-05-08 3:02 ` Alan Stern
2026-05-08 17:20 ` Dylan Robinson
2026-05-09 1:25 ` Alan Stern
2026-05-09 22:12 ` Michal Pecio
2026-05-10 12:39 ` Dylan Robinson
2026-05-11 19:21 ` [RFT PATCH] xhci: fix frame id calculation for isoc transfer Mathias Nyman
2026-05-11 19:36 ` Mathias Nyman
2026-05-12 9:08 ` Michal Pecio
2026-05-13 14:30 ` Mathias Nyman
2026-05-13 14:35 ` [RFT PATCHv2 1/2] xhci: fix frame id calculation and checks for isoc URBs Mathias Nyman
2026-05-13 14:35 ` [RFT PATCHv2 2/2] xhci: Set frame ID field of isoc TRB when starting an isoch stream Mathias Nyman
2026-05-14 21:16 ` [RFT PATCH] xhci: fix frame id calculation for isoc transfer Dylan Robinson
2026-05-14 22:10 ` Dylan Robinson
2026-05-15 4:32 ` Michal Pecio
2026-05-15 18:13 ` Dylan Robinson
2026-05-18 7:13 ` Michal Pecio
2026-05-21 14:20 ` Dylan Robinson
2026-05-21 15:24 ` Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 2/3] xhci: Set frame ID field of isoc TRB when starting an isoch stream Mathias Nyman
2026-05-21 15:27 ` [RFT PATCHv3 3/3] xhci: tune urb->start_frame in ring overrun and underrun cases Mathias Nyman
2026-05-26 0:49 ` Dylan Robinson
2026-05-26 12:15 ` Michal Pecio
2026-05-27 20:20 ` Dylan Robinson
2026-08-06 8:17 ` [RFT PATCHv3 1/3] xhci: fix frame id calculation and checks for isoc URBs Michal Pecio
2026-08-06 13:25 ` Mathias Nyman [this message]
2026-08-06 22:01 ` Michal Pecio
2026-08-07 0:07 ` Mathias Nyman
2026-08-07 8:26 ` Michal Pecio
2026-08-07 11:10 ` Mathias Nyman
2026-08-07 16:48 ` Alan Stern
2026-08-07 17:30 ` Dylan Robinson
2026-08-07 21:29 ` Michal Pecio
2026-08-10 14:12 ` Mathias Nyman
2026-05-07 21:54 ` [Bug 220748] usb: xhci_queue_isoc_tx_prepare ignore start_frame and always assumes URB_ISO_ASAP is set Michal Pecio
2026-05-08 3:09 ` Alan Stern
2026-05-08 9:41 ` Michal Pecio
2026-05-08 14:54 ` Alan Stern
2026-05-08 21:39 ` Dylan Robinson
2026-05-09 11:10 ` Michal Pecio
2026-05-09 20:18 ` Dylan Robinson
2026-05-11 19:15 ` bugzilla-daemon
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=0e2f28f5-aa38-4401-8287-b55aab577243@linux.intel.com \
--to=mathias.nyman@linux.intel.com \
--cc=dylan_robinson@motu.com \
--cc=linux-usb@vger.kernel.org \
--cc=mathias.nyman@intel.com \
--cc=michal.pecio@gmail.com \
--cc=stern@rowland.harvard.edu \
/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