Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 7 May 2025 21:37:12 GMT
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 86de66a67432 - main - umass: Move INQUIRY and TEST UNIT READY quirks to umass_std_transform
Message-ID:  <202505072137.547LbCGb092154@gitrepo.freebsd.org>

next in thread | raw e-mail | index | archive | help
The branch main has been updated by imp:

URL: https://cgit.FreeBSD.org/src/commit/?id=86de66a67432008fb92a1520931e6ec4365b770b

commit 86de66a67432008fb92a1520931e6ec4365b770b
Author:     Warner Losh <imp@FreeBSD.org>
AuthorDate: 2025-05-07 16:07:36 +0000
Commit:     Warner Losh <imp@FreeBSD.org>
CommitDate: 2025-05-07 21:36:55 +0000

    umass: Move INQUIRY and TEST UNIT READY quirks to umass_std_transform
    
    Only doing a short inquiry and converting TUR to START STOP UNIT are the
    same everywhere, so move those quirks to umass_std_transform.
    
    Sponsored by:           Netflix
    Differential Revision:  https://reviews.freebsd.org/D49472
---
 sys/dev/usb/storage/umass.c | 100 ++++++++++++++++----------------------------
 1 file changed, 36 insertions(+), 64 deletions(-)

diff --git a/sys/dev/usb/storage/umass.c b/sys/dev/usb/storage/umass.c
index 344a42f718fc..a5f1c891a509 100644
--- a/sys/dev/usb/storage/umass.c
+++ b/sys/dev/usb/storage/umass.c
@@ -2682,28 +2682,6 @@ umass_scsi_transform(struct umass_softc *sc, uint8_t *cmd_ptr,
 {
 	sc->sc_transfer.cmd_len = cmd_len;
 
-	switch (cmd_ptr[0]) {
-	case TEST_UNIT_READY:
-		if (sc->sc_quirks & NO_TEST_UNIT_READY) {
-			DPRINTF(sc, UDMASS_SCSI, "Converted TEST_UNIT_READY "
-			    "to START_UNIT\n");
-			memset(sc->sc_transfer.cmd_data, 0, cmd_len);
-			sc->sc_transfer.cmd_data[0] = START_STOP_UNIT;
-			sc->sc_transfer.cmd_data[4] = SSS_START;
-			return (true);
-		}
-		break;
-
-	case INQUIRY:
-		/*
-		 * some drives wedge when asked for full inquiry
-		 * information.
-		 */
-		if (sc->sc_quirks & FORCE_SHORT_INQUIRY) {
-			sc->sc_transfer.cmd_data[4] = SHORT_INQUIRY_LENGTH;
-		}
-		break;
-	}
 	return (true);
 }
 
@@ -2759,27 +2737,12 @@ umass_ufi_transform(struct umass_softc *sc, uint8_t *cmd_ptr,
 		 * should work. Copy the command into the (zeroed out)
 		 * destination buffer.
 		 */
-	case TEST_UNIT_READY:
-		if (sc->sc_quirks & NO_TEST_UNIT_READY) {
-			/*
-			 * Some devices do not support this command. Start
-			 * Stop Unit should give the same results
-			 */
-			DPRINTF(sc, UDMASS_UFI, "Converted TEST_UNIT_READY "
-			    "to START_UNIT\n");
-
-			/* Zero the command data */
-			memset(sc->sc_transfer.cmd_data, 0, UFI_COMMAND_LENGTH);
-			sc->sc_transfer.cmd_data[0] = START_STOP_UNIT;
-			sc->sc_transfer.cmd_data[4] = SSS_START;
-			return (1);
-		}
-		break;
 
 	case REZERO_UNIT:
 	case REQUEST_SENSE:
 	case FORMAT_UNIT:
 	case INQUIRY:
+	case TEST_UNIT_READY:
 	case START_STOP_UNIT:
 	case SEND_DIAGNOSTIC:
 	case PREVENT_ALLOW:
@@ -2828,30 +2791,11 @@ umass_atapi_transform(struct umass_softc *sc, uint8_t *cmd_ptr,
 		 * should work. Copy the command into the destination
 		 * buffer.
 		 */
-	case INQUIRY:
-		/*
-		 * some drives wedge when asked for full inquiry
-		 * information, so adjust the transfer length
-		 */
-		if (sc->sc_quirks & FORCE_SHORT_INQUIRY) {
-			sc->sc_transfer.cmd_data[4] = SHORT_INQUIRY_LENGTH;
-		}
-		break;
-
-	case TEST_UNIT_READY:
-		if (sc->sc_quirks & NO_TEST_UNIT_READY) {
-			DPRINTF(sc, UDMASS_SCSI, "Converted TEST_UNIT_READY "
-			    "to START_UNIT\n");
-			memset(sc->sc_transfer.cmd_data, 0, ATAPI_COMMAND_LENGTH);
-			sc->sc_transfer.cmd_data[0] = START_STOP_UNIT;
-			sc->sc_transfer.cmd_data[4] = SSS_START;
-			return (true);
-		}
-		break;
-
 	case REZERO_UNIT:
 	case REQUEST_SENSE:
+	case INQUIRY:
 	case START_STOP_UNIT:
+	case TEST_UNIT_READY:
 	case SEND_DIAGNOSTIC:
 	case PREVENT_ALLOW:
 	case READ_CAPACITY:
@@ -2905,18 +2849,46 @@ umass_no_transform(struct umass_softc *sc, uint8_t *cmd,
 
 static bool
 umass_std_transform(struct umass_softc *sc, union ccb *ccb,
-    uint8_t *cmd, uint8_t cmdlen)
+    uint8_t *cmd, uint8_t cmd_len)
 {
-	uint8_t retval;
-
 	if (cmd_len == 0 || cmd_len > sizeof(sc->sc_transfer.cmd_data)) {
 		DPRINTF(sc, UDMASS_SCSI, "Invalid command length: %d bytes\n",
 		    cmd_len);
 		return (false);		/* failure */
 	}
 
-	memcpy(sc->sc_transfer.cmd_data, cmd_ptr, cmd_len);
-	if (sc->sc_transform(sc, cmd, cmdlen))
+	/*
+	 * Copy the CDB to the cmd_data buffer and then apply the common quirks
+	 * to the code. We then pass the transformed command down to allow
+	 * further transforms.
+	 */
+	memset(sc->sc_transfer.cmd_data, 0, sizeof(sc->sc_transfer.cmd_data));
+	memcpy(sc->sc_transfer.cmd_data, cmd, cmd_len);
+	switch (cmd[0]) {
+	case TEST_UNIT_READY:
+		/*
+		 * Some drive choke on TEST UNIT READY. Convert it to START STOP
+		 * UNIT to get similar status.
+		 */
+		if ((sc->sc_quirks & NO_TEST_UNIT_READY) != 0) {
+			DPRINTF(sc, UDMASS_SCSI,
+			    "Converted TEST_UNIT_READY to START_UNIT\n");
+			memset(sc->sc_transfer.cmd_data, 0, cmd_len);
+			sc->sc_transfer.cmd_data[0] = START_STOP_UNIT;
+			sc->sc_transfer.cmd_data[4] = SSS_START;
+		}
+		break;
+
+	case INQUIRY:
+		/*
+		 * some drives wedge when asked for full inquiry
+		 * information.
+		 */
+		if ((sc->sc_quirks & FORCE_SHORT_INQUIRY) != 0)
+			sc->sc_transfer.cmd_data[4] = SHORT_INQUIRY_LENGTH;
+		break;
+	}
+	if (sc->sc_transform(sc, cmd, cmd_len))
 		return (true);	/* Execute command */
 
 	xpt_freeze_devq(ccb->ccb_h.path, 1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202505072137.547LbCGb092154>