git: ec3cc37bd938 - main - umass: Bring in small fix from NetBSD's umass
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 07 May 2025 21:37:15 UTC
The branch main has been updated by imp:
URL: https://cgit.FreeBSD.org/src/commit/?id=ec3cc37bd938446839a34ab9eca79c75257383e1
commit ec3cc37bd938446839a34ab9eca79c75257383e1
Author: Warner Losh <imp@FreeBSD.org>
AuthorDate: 2025-05-07 16:07:50 +0000
Commit: Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-05-07 21:36:55 +0000
umass: Bring in small fix from NetBSD's umass
When completing a request for UFI, don't fail the request on
non-zero asc/ascq values if we've done a request sense.
This idea is from umass.c 1.100 by mycroft. He used it to help
elminate the INQUIRY_SHORT quirk that we still have. However, it will
make little difference because we treat both return values the same
for CBI. And it appears we have (maybe bogusly) some devices that
specify this quirk that aren't CBI.
Sponsored by: Netflix
Differential Revision: https://reviews.freebsd.org/D49475
---
sys/dev/usb/storage/umass.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c
index c3a5028f5726..cacf4ddf8f16 100644
--- a/sys/dev/usb/storage/umass.c
+++ b/sys/dev/usb/storage/umass.c
@@ -431,6 +431,7 @@ struct umass_softc {
uint8_t sc_maxlun; /* maximum LUN number, inclusive */
uint8_t sc_last_xfer_index;
uint8_t sc_status_try;
+ bool sc_sending_sense;
};
struct umass_probe_proto {
@@ -2013,16 +2014,20 @@ umass_t_cbi_status_callback(struct usb_xfer *xfer, usb_error_t error)
/*
* Section 3.4.3.1.3 specifies that the UFI command
* protocol returns an ASC and ASCQ in the interrupt
- * data block.
+ * data block. However, we might also be fetching the
+ * sense explicitly, where they are likely to be
+ * non-zero, in which case we should succeed.
*/
DPRINTF(sc, UDMASS_CBI, "UFI CCI, ASC = 0x%02x, "
"ASCQ = 0x%02x\n", sc->sbl.ufi.asc,
sc->sbl.ufi.ascq);
- status = (((sc->sbl.ufi.asc == 0) &&
- (sc->sbl.ufi.ascq == 0)) ?
- STATUS_CMD_OK : STATUS_CMD_FAILED);
+ if ((sc->sbl.ufi.asc == 0 && sc->sbl.ufi.ascq == 0) ||
+ sc->sc_transfer.cmd_data[0] == REQUEST_SENSE)
+ status = STATUS_CMD_OK;
+ else
+ status = STATUS_CMD_FAILED;
sc->sc_transfer.ccb = NULL;