Commit 0f630c58 authored by Igor Pylypiv's avatar Igor Pylypiv Committed by Martin K. Petersen
Browse files

scsi: pm80xx: Do not use libsas port ID



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: default avatarIgor Pylypiv <ipylypiv@google.com>
Signed-off-by: default avatarTerrence Adams <tadamsjr@google.com>
Link: https://lore.kernel.org/r/20241121194915.3039073-1-tadamsjr@google.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 841df27d
Loading
Loading
Loading
Loading
+2 −19
Original line number Diff line number Diff line
@@ -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)) {