0x9e isn't Read Capacity, it's a service action and the read capacity
command is a subcommand.

READ16 is not 0x48, it's 0x88. 0x48 is SANITIZE and that sounds like we
might have been destroying data instead of reading data. No bueno.

Signed-off-by: Hector Martin <mar...@marcan.st>
---
 drivers/ata/ahci.c  | 9 ++++++---
 drivers/scsi/scsi.c | 4 ++--
 include/scsi.h      | 8 ++++++--
 3 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 2062197afcd3..b252e9e525db 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -906,15 +906,18 @@ static int ahci_scsi_exec(struct udevice *dev, struct 
scsi_cmd *pccb)
        case SCSI_RD_CAPAC10:
                ret = ata_scsiop_read_capacity10(uc_priv, pccb);
                break;
-       case SCSI_RD_CAPAC16:
-               ret = ata_scsiop_read_capacity16(uc_priv, pccb);
-               break;
        case SCSI_TST_U_RDY:
                ret = ata_scsiop_test_unit_ready(uc_priv, pccb);
                break;
        case SCSI_INQUIRY:
                ret = ata_scsiop_inquiry(uc_priv, pccb);
                break;
+       case SCSI_SRV_ACTION_IN:
+               if ((pccb->cmd[1] & 0x1f) == SCSI_SAI_RD_CAPAC16) {
+                       ret = ata_scsiop_read_capacity16(uc_priv, pccb);
+                       break;
+               }
+               /* Fallthrough */
        default:
                printf("Unsupport SCSI command 0x%02x\n", pccb->cmd[0]);
                return -ENOTSUPP;
diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index d7b33010e469..f2c828eb305e 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -380,8 +380,8 @@ static int scsi_read_capacity(struct udevice *dev, struct 
scsi_cmd *pccb,
 
        /* Read capacity (10) was insufficient. Use read capacity (16). */
        memset(pccb->cmd, '\0', sizeof(pccb->cmd));
-       pccb->cmd[0] = SCSI_RD_CAPAC16;
-       pccb->cmd[1] = 0x10;
+       pccb->cmd[0] = SCSI_SRV_ACTION_IN;
+       pccb->cmd[1] = SCSI_SAI_RD_CAPAC16;
        pccb->cmdlen = 16;
        pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */
 
diff --git a/include/scsi.h b/include/scsi.h
index b47c7463c1d6..89e268586477 100644
--- a/include/scsi.h
+++ b/include/scsi.h
@@ -141,10 +141,9 @@ struct scsi_cmd {
 #define SCSI_MED_REMOVL        0x1E            /* Prevent/Allow medium Removal 
(O) */
 #define SCSI_READ6             0x08            /* Read 6-byte (MANDATORY) */
 #define SCSI_READ10            0x28            /* Read 10-byte (MANDATORY) */
-#define SCSI_READ16    0x48
+#define SCSI_READ16    0x88            /* Read 16-byte */
 #define SCSI_RD_CAPAC  0x25            /* Read Capacity (MANDATORY) */
 #define SCSI_RD_CAPAC10        SCSI_RD_CAPAC   /* Read Capacity (10) */
-#define SCSI_RD_CAPAC16        0x9e            /* Read Capacity (16) */
 #define SCSI_RD_DEFECT 0x37            /* Read Defect Data (O) */
 #define SCSI_READ_LONG 0x3E            /* Read Long (O) */
 #define SCSI_REASS_BLK 0x07            /* Reassign Blocks (O) */
@@ -158,15 +157,20 @@ struct scsi_cmd {
 #define SCSI_SEEK10            0x2B            /* Seek 10-Byte (O) */
 #define SCSI_SEND_DIAG 0x1D            /* Send Diagnostics (MANDATORY) */
 #define SCSI_SET_LIMIT 0x33            /* Set Limits (O) */
+#define SCSI_SRV_ACTION_IN     0x9E    /* Service Action In */
+#define SCSI_SRV_ACTION_OUT    0x9F    /* Service Action Out */
 #define SCSI_START_STP 0x1B            /* Start/Stop Unit (O) */
 #define SCSI_SYNC_CACHE        0x35            /* Synchronize Cache (O) */
 #define SCSI_VERIFY            0x2F            /* Verify (O) */
 #define SCSI_WRITE6            0x0A            /* Write 6-Byte (MANDATORY) */
 #define SCSI_WRITE10   0x2A            /* Write 10-Byte (MANDATORY) */
+#define SCSI_WRITE16   0x8A            /* Write 16-byte */
 #define SCSI_WRT_VERIFY        0x2E            /* Write and Verify (O) */
 #define SCSI_WRITE_LONG        0x3F            /* Write Long (O) */
 #define SCSI_WRITE_SAME        0x41            /* Write Same (O) */
 
+#define SCSI_SAI_RD_CAPAC16    0x10    /* Service Action: Read Capacity (16) */
+
 /**
  * struct scsi_plat - stores information about SCSI controller
  *

-- 
2.41.0

Reply via email to