scsi: hisi_sas: Fix setting of hisi_sas_slot.is_internal
[ Upstream commitc763ec4c10] The hisi_sas_slot.is_internal member is not set properly for ATA commands which the driver sends directly. A TMF struct pointer is normally used as a test to set this, but it is NULL for those commands. It's not ideal, but pass an empty TMF struct to set that member properly. Link: https://lore.kernel.org/r/1643627607-138785-1-git-send-email-john.garry@huawei.com Fixes:dc313f6b12("scsi: hisi_sas: Factor out task prep and delivery code") Reported-by: Xiang Chen <chenxiang66@hisilicon.com> Signed-off-by: John Garry <john.garry@huawei.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Stable-dep-of:8aa580cd92("scsi: hisi_sas: Enable force phy when SATA disk directly connected") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
8b8e6d433b
commit
04bbb1b72b
@@ -408,8 +408,7 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba,
|
||||
struct hisi_sas_slot *slot,
|
||||
struct hisi_sas_dq *dq,
|
||||
struct hisi_sas_device *sas_dev,
|
||||
struct hisi_sas_internal_abort *abort,
|
||||
struct hisi_sas_tmf_task *tmf)
|
||||
struct hisi_sas_internal_abort *abort)
|
||||
{
|
||||
struct hisi_sas_cmd_hdr *cmd_hdr_base;
|
||||
int dlvry_queue_slot, dlvry_queue;
|
||||
@@ -435,8 +434,6 @@ void hisi_sas_task_deliver(struct hisi_hba *hisi_hba,
|
||||
cmd_hdr_base = hisi_hba->cmd_hdr[dlvry_queue];
|
||||
slot->cmd_hdr = &cmd_hdr_base[dlvry_queue_slot];
|
||||
|
||||
slot->tmf = tmf;
|
||||
slot->is_internal = tmf;
|
||||
task->lldd_task = slot;
|
||||
|
||||
memset(slot->cmd_hdr, 0, sizeof(struct hisi_sas_cmd_hdr));
|
||||
@@ -595,7 +592,7 @@ static int hisi_sas_task_exec(struct sas_task *task, gfp_t gfp_flags,
|
||||
slot->is_internal = tmf;
|
||||
|
||||
/* protect task_prep and start_delivery sequence */
|
||||
hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL, tmf);
|
||||
hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, NULL);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -1333,12 +1330,13 @@ static int hisi_sas_softreset_ata_disk(struct domain_device *device)
|
||||
struct hisi_hba *hisi_hba = dev_to_hisi_hba(device);
|
||||
struct device *dev = hisi_hba->dev;
|
||||
int s = sizeof(struct host_to_dev_fis);
|
||||
struct hisi_sas_tmf_task tmf = {};
|
||||
|
||||
ata_for_each_link(link, ap, EDGE) {
|
||||
int pmp = sata_srst_pmp(link);
|
||||
|
||||
hisi_sas_fill_ata_reset_cmd(link->device, 1, pmp, fis);
|
||||
rc = hisi_sas_exec_internal_tmf_task(device, fis, s, NULL);
|
||||
rc = hisi_sas_exec_internal_tmf_task(device, fis, s, &tmf);
|
||||
if (rc != TMF_RESP_FUNC_COMPLETE)
|
||||
break;
|
||||
}
|
||||
@@ -1349,7 +1347,7 @@ static int hisi_sas_softreset_ata_disk(struct domain_device *device)
|
||||
|
||||
hisi_sas_fill_ata_reset_cmd(link->device, 0, pmp, fis);
|
||||
rc = hisi_sas_exec_internal_tmf_task(device, fis,
|
||||
s, NULL);
|
||||
s, &tmf);
|
||||
if (rc != TMF_RESP_FUNC_COMPLETE)
|
||||
dev_err(dev, "ata disk %016llx de-reset failed\n",
|
||||
SAS_ADDR(device->sas_addr));
|
||||
@@ -2003,7 +2001,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
|
||||
slot->port = port;
|
||||
slot->is_internal = true;
|
||||
|
||||
hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort, NULL);
|
||||
hisi_sas_task_deliver(hisi_hba, slot, dq, sas_dev, abort);
|
||||
|
||||
return 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user