All of lore.kernel.org
 help / color / mirror / Atom feed
From: Thinh Nguyen <Thinh.Nguyen@synopsys.com>
To: Alan Stern <stern@rowland.harvard.edu>
Cc: "Thinh Nguyen" <Thinh.Nguyen@synopsys.com>,
	"Michal Pecio" <michal.pecio@gmail.com>,
	"Oliver Neukum" <oneukum@suse.com>, "Bjørn Mork" <bjorn@mork.no>,
	"USB list" <linux-usb@vger.kernel.org>
Subject: Re: correctly handling EPROTO
Date: Thu, 19 Mar 2026 23:16:22 +0000	[thread overview]
Message-ID: <20260319231620.3ukqxsrwqikp5zbd@synopsys.com> (raw)
In-Reply-To: <1eaf4cf3-4278-4d04-87aa-8b6069d544e1@rowland.harvard.edu>

On Wed, Mar 18, 2026, Alan Stern wrote:
> On Wed, Mar 18, 2026 at 11:59:21PM +0000, Thinh Nguyen wrote:
> > On Wed, Mar 18, 2026, Michal Pecio wrote:
> > > On Wed, 18 Mar 2026 13:46:26 -0400, Alan Stern wrote:
> > > > On Wed, Mar 18, 2026 at 10:54:20AM +0100, Oliver Neukum wrote:
> > > > > On 17.03.26 19:03, Alan Stern wrote:
> > > > > > You know, with a USB-2 host controller, transaction errors don't
> > > > > > make an endpoint unusable, and clear-halt isn't necessary.
> > > 
> > > Depends on what you mean by "usable". If you get EPROTO reading from
> > > a Transaction Translator and the TT discards the packet (because of
> > > timeout on Int or by explicit SW request on Bulk) then not only is the
> > > particular packet lost because the device got its ACK and moved on, but
> > > I suspect the next packet will be dropped too due to toggle mismatch.
> > > 
> > > Granted, EPROTO outside of disconnections is apparently rare enough
> > > that a horde of users demanging this to be fixed hasn't materialized.
> > 
> > I've seen Windows drivers handling UAS transaction error recovery
> > through clear-halt and retry SCSI command, and it works well. I hope to
> > see this type of recovery implemented for usb storage and uas devices in
> > the future.
> 
> I don't know about uas, but usb-storage handles transaction error 
> recovery in approximately the same way.  A clear-halt is issued only if 
> the device sent a halt token -- but that's not considered a transaction 

That's -EPIPE right? With this, the storage driver knows that it needs to
perform clear-halt because the bulk endpoint is STALL, not -EPROTO.

> error.  Otherwise, for things like -EPROTO, usb-storage does a device 
> reset and the SCSI command is retried.  Possibly skipping some initial 

The recovery I'm thinking of doesn't involve a port reset. A port reset
is very disruptive and will impact performance greatly. I'm referring to
an intermediate recovery step at the usb storage driver without
delegating to the SCSI layer.

Currently we _have_ to do a port reset because the bulk sequence can be
out of sync and the xhci doesn't synchronize against the device for the
storage driver to retry the command directly.

> portion of the data if the transfer was partially successful.  (This 
> might not work very well for things like tape drives, but disk drives 
> have the convenient feature that reads and writes are idempotent.)
> 
> > The retrying of the URB or sending a new set of URBs should be a
> > decision by the class driver where synchronization at the higher
> > protocol may be needed. An URB failed with -EPROTO may mean some
> > previous successful transfers need to be discarded and retried also.
> 
> That's a good point.  There's only so much we can expect the core to 
> handle.

Right. Not sure what the core can do here.

> 
> > What we do know is that an -EPROTO means that the xhci endpoint state
> > was halted, the xhci would need to reset (not soft retry) the endpoint
> > before it can be used again. Since the bulk sequence is reset from reset
> > ep command, we'd need clear-halt to synchronize with the device side.
> > The reset ep command behavior (and when to use it) is xhci specific, so
> > IMHO, it should the xhci driver to handle the clear-halt. Which URB(s)
> > need to be retried should be a decision by the upperlayer drivers.
> 
> And for which drivers will we want to go to the trouble of adding this 
> kind of error recovery?  Alternatives include doing just enough to make 
> the endpoint start working again and ignoring any data loss, or 
> declaring the whole device to be offline (which would need at least an 
> unbind and maybe even a power cycle to recover from).
> 

What I'd like to see is that the endpoint can be put in a state where
the class driver can submit a new URB without unbind/reset/power cycle.
With the current implementation of the xhci driver, we cannot do that
for bulk endpoints with -EPROTO error.

BR,
Thinh

  reply	other threads:[~2026-03-19 23:17 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-12 13:55 correctly handling EPROTO Oliver Neukum
2026-03-12 14:21 ` Alan Stern
2026-03-12 15:57   ` Oliver Neukum
2026-03-13  7:53     ` Michal Pecio
2026-03-13 10:33       ` Oliver Neukum
2026-03-13 15:28         ` Alan Stern
2026-03-13 22:45           ` Thinh Nguyen
2026-03-14  2:39             ` Alan Stern
2026-03-16 12:58               ` Oliver Neukum
2026-03-16 14:02                 ` Alan Stern
2026-03-16 14:47                   ` Oliver Neukum
2026-03-16 17:33                     ` Alan Stern
2026-03-16 19:32                       ` Oliver Neukum
2026-03-17  9:05                         ` Mathias Nyman
2026-03-17 14:31                         ` Alan Stern
2026-03-17 16:20                           ` Oliver Neukum
2026-03-17 18:03                             ` Alan Stern
2026-03-18  9:54                               ` Oliver Neukum
2026-03-18 17:46                                 ` Alan Stern
2026-03-18 21:38                                   ` Michal Pecio
2026-03-18 23:59                                     ` Thinh Nguyen
2026-03-19  2:07                                       ` Alan Stern
2026-03-19 23:16                                         ` Thinh Nguyen [this message]
2026-03-20  9:58                                           ` Michal Pecio
2026-03-20 16:20                                           ` Alan Stern
2026-03-20 17:49                                             ` Oliver Neukum
2026-03-21  2:14                                             ` Thinh Nguyen
2026-03-21  5:54                                               ` Michal Pecio
2026-03-21 15:58                                                 ` Alan Stern
2026-03-28 21:22                                                   ` Michal Pecio
2026-03-29  1:52                                                     ` Alan Stern
2026-03-29 16:46                                                       ` Michal Pecio
2026-03-30  1:32                                                         ` Alan Stern
2026-03-30 12:36                                                           ` Michal Pecio
2026-04-01 21:50                                                             ` Michal Pecio
2026-04-02  2:20                                                               ` Alan Stern
2026-03-23 10:26                                               ` Oliver Neukum
2026-03-24  1:06                                                 ` Thinh Nguyen
2026-03-24  9:28                                                   ` Oliver Neukum
2026-03-24 13:25                                                     ` Alan Stern
2026-03-25  1:44                                                     ` Thinh Nguyen
2026-03-19  1:56                                     ` Alan Stern
2026-03-19  8:40                                       ` Mathias Nyman
2026-03-19 23:34                                         ` Thinh Nguyen
2026-03-19  8:55                                       ` Michal Pecio
2026-03-19 14:24                                         ` Alan Stern

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=20260319231620.3ukqxsrwqikp5zbd@synopsys.com \
    --to=thinh.nguyen@synopsys.com \
    --cc=bjorn@mork.no \
    --cc=linux-usb@vger.kernel.org \
    --cc=michal.pecio@gmail.com \
    --cc=oneukum@suse.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.