ata: Don't try to use non-existent ports
authorSimon Glass <sjg@chromium.org>
Tue, 17 Jan 2023 17:47:53 +0000 (10:47 -0700)
committerTom Rini <trini@konsulko.com>
Mon, 23 Jan 2023 23:11:40 +0000 (18:11 -0500)
The controller indicates the number of ports but also has a port map
which specifies which ports are actually valid. Make use of this to
avoid trying to send commands to an invalid port.

This avoids a crash on some controllers.

Signed-off-by: Simon Glass <sjg@chromium.org>
drivers/ata/ahci.c

index de6131f..272c48b 100644 (file)
@@ -675,6 +675,12 @@ static int ata_scsiop_inquiry(struct ahci_uc_priv *uc_priv,
        /* Read id from sata */
        port = pccb->target;
 
+       /* If this port number is not valid, give up */
+       if (!(uc_priv->port_map & (1 << port))) {
+               debug("Port %x not valid in map %x\n", port, uc_priv->port_map);
+               return -ENODEV;
+       }
+
        if (ahci_device_data_io(uc_priv, port, (u8 *)&fis, sizeof(fis),
                                (u8 *)tmpid, ATA_ID_WORDS * 2, 0)) {
                debug("scsi_ahci: SCSI inquiry command failure.\n");