]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: pm80xx: Do not use libsas port ID
authorIgor Pylypiv <ipylypiv@google.com>
Thu, 21 Nov 2024 19:49:15 +0000 (11:49 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 4 Dec 2024 19:43:48 +0000 (14:43 -0500)
libsas port IDs can differ from the controller's port IDs.  Using libsas
port ID to index pm8001_ha->port array is a bug.

Remove sas_find_local_port_id(). We can use pm8001_ha->phy[phy_id].port to
get the port ID.

Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
Signed-off-by: Terrence Adams <tadamsjr@google.com>
Link: https://lore.kernel.org/r/20241121194915.3039073-1-tadamsjr@google.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/pm8001/pm8001_sas.c

index d80cffd25a6ed08cf4d40be088c811c6354eac4a..a5b72c03b6a859da4593934b04f89c9cd8eb2678 100644 (file)
@@ -374,23 +374,6 @@ static int pm8001_task_prep_ssp(struct pm8001_hba_info *pm8001_ha,
        return PM8001_CHIP_DISP->ssp_io_req(pm8001_ha, ccb);
 }
 
- /* Find the local port id that's attached to this device */
-static int sas_find_local_port_id(struct domain_device *dev)
-{
-       struct domain_device *pdev = dev->parent;
-
-       /* Directly attached device */
-       if (!pdev)
-               return dev->port->id;
-       while (pdev) {
-               struct domain_device *pdev_p = pdev->parent;
-               if (!pdev_p)
-                       return pdev->port->id;
-               pdev = pdev->parent;
-       }
-       return 0;
-}
-
 #define DEV_IS_GONE(pm8001_dev)        \
        ((!pm8001_dev || (pm8001_dev->dev_type == SAS_PHY_UNUSED)))
 
@@ -463,10 +446,10 @@ int pm8001_queue_command(struct sas_task *task, gfp_t gfp_flags)
        spin_lock_irqsave(&pm8001_ha->lock, flags);
 
        pm8001_dev = dev->lldd_dev;
-       port = &pm8001_ha->port[sas_find_local_port_id(dev)];
+       port = pm8001_ha->phy[pm8001_dev->attached_phy].port;
 
        if (!internal_abort &&
-           (DEV_IS_GONE(pm8001_dev) || !port->port_attached)) {
+           (DEV_IS_GONE(pm8001_dev) || !port || !port->port_attached)) {
                ts->resp = SAS_TASK_UNDELIVERED;
                ts->stat = SAS_PHY_DOWN;
                if (sas_protocol_ata(task_proto)) {