Linux USB
 help / color / mirror / Atom feed
From: Michal Pecio <michal.pecio@gmail.com>
To: Dylan Robinson <dylan_robinson@motu.com>
Cc: Mathias Nyman <mathias.nyman@linux.intel.com>,
	linux-usb@vger.kernel.org, mathias.nyman@intel.com,
	stern@rowland.harvard.edu
Subject: Re: [RFT PATCHv3 3/3] xhci: tune urb->start_frame in ring overrun and underrun cases
Date: Tue, 26 May 2026 14:15:05 +0200	[thread overview]
Message-ID: <20260526141505.455ab0c3.michal.pecio@gmail.com> (raw)
In-Reply-To: <CA+Df+jcBu2zhzwfeT9AuWdK4QoqoQeJ1EB7nzRVvDMrcevQ1_A@mail.gmail.com>

On Mon, 25 May 2026 20:49:15 -0400, Dylan Robinson wrote:
> On Thu, May 21, 2026 at 11:27 AM Mathias Nyman wrote:
> > Make sure a new urb->start_frame is calculated for isoc URBs
> > submitted late mid stream, i.e. isoc URB is submitted to an empty
> > ring after a ring underrun or overrun event.
> >
> > If URB was queud late, but before xhci driver handles the ring
> > underrun/overrun event then kick the urb->start_frame forward by one
> > ESIT for that delayed URB.
> >
> > the gap in urb->start_frame allows class drivers to detect the
> > glitch in isochronous transfers.  
> 
> This does appear to create a detectable gap, but urb->start_frame
> still drifts relative to the actual frame id. After each
> underrun/overrun, urb->start_frame becomes increasingly offset.

That's not surprising, the exact delay is unpredictable, which will
affect drivers that tolarate the gap and continue their stream.

> 
> > +       /* re-calculate urb->start_frame on next urb enqueue */
> > +       if (list_empty(&ep->ring->td_list)) {
> > +               ep->next_uframe = -2; // FIXME define something, or use suitable -EXXX
> > +               ep->skip = false;  // maybe, or is it the wrong place?
> > +               return 0;
> > +       }  
> 
> Since mid-stream URBs can be submitted after an underrun or overrun
> has already occurred, but before the xrun event has been handled, the
> TD list is not necessarily empty here and all subsequent URBs will
> still be scheduled as SIA.

Yes, they have already been written to the ring as SIA. (And if they
weren't SIA, the HW is empirically known to do weird things. The 1.0
spec was weird and so is the HW which implements it).

These URBs will very likely execute in a wrong interval, unless we stop
the endpoint to remove them (which we may fail to do quickly enough)
or completely prevent submissions violating the IST in the first place.

> I think the only way to prevent this drift would be to intentionally
> introduce an additional gap so that the host controller driver can
> restart the stream on a known frame.

If we want to gamble that maybe a slight IST violation will still
succeed anyway, this seems to be the only recovery when we lose.

Either way, we need to fail certain IST-violating submissions with
-EXDEV or complete them immediately with -EXDEV status. Which is what
I was working on and finding various issues with (the driver doesn't
expect queued URBs which aren't written to the ring). Unfortunately,
it still isn't finished as I have little free time currently.

By the way, do you know what Windows does in such cases?

Regards,
Michal

  reply	other threads:[~2026-05-26 12:15 UTC|newest]

Thread overview: 64+ 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 [this message]
2026-05-27 20:20                                             ` Dylan Robinson
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=20260526141505.455ab0c3.michal.pecio@gmail.com \
    --to=michal.pecio@gmail.com \
    --cc=dylan_robinson@motu.com \
    --cc=linux-usb@vger.kernel.org \
    --cc=mathias.nyman@intel.com \
    --cc=mathias.nyman@linux.intel.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