Commit 693e66a0 authored by John Garry's avatar John Garry Committed by Martin K. Petersen
Browse files

scsi: libsas: Add TMF handler aborted callback

The hisi_sas and pm8001 TMF handlers have some special processing for when
the TMF is aborted, so add a callback and fill it in for those drivers.

Link: https://lore.kernel.org/r/1645112566-115804-13-git-send-email-john.garry@huawei.com


Tested-by: default avatarYihang Li <liyihang6@hisilicon.com>
Tested-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarJohn Garry <john.garry@huawei.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 2037a340
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -666,6 +666,25 @@ static struct hisi_sas_device *hisi_sas_alloc_dev(struct domain_device *device)
	return sas_dev;
}

static void hisi_sas_tmf_aborted(struct sas_task *task)
{
	struct hisi_sas_slot *slot = task->lldd_task;
	struct domain_device *device = task->dev;
	struct hisi_sas_device *sas_dev = device->lldd_dev;
	struct hisi_hba *hisi_hba = sas_dev->hisi_hba;

	if (slot) {
		struct hisi_sas_cq *cq =
			   &hisi_hba->cq[slot->dlvry_queue];
		/*
		 * sync irq to avoid free'ing task
		 * before using task in IO completion
		 */
		synchronize_irq(cq->irq_no);
		slot->task = NULL;
	}
}

#define HISI_SAS_DISK_RECOVER_CNT 3
static int hisi_sas_init_device(struct domain_device *device)
{
@@ -2322,6 +2341,7 @@ static struct sas_domain_function_template hisi_sas_transport_ops = {
	.lldd_clear_nexus_ha	= hisi_sas_clear_nexus_ha,
	.lldd_port_formed	= hisi_sas_port_formed,
	.lldd_write_gpio	= hisi_sas_write_gpio,
	.lldd_tmf_aborted	= hisi_sas_tmf_aborted,
};

void hisi_sas_init_mem(struct hisi_hba *hisi_hba)
+2 −0
Original line number Diff line number Diff line
@@ -966,6 +966,8 @@ int sas_execute_tmf(struct domain_device *device, void *parameter,
			if (!(task->task_state_flags & SAS_TASK_STATE_DONE)) {
				pr_err("TMF task timeout for %016llx and not done\n",
				       SAS_ADDR(device->sas_addr));
				if (i->dft->lldd_tmf_aborted)
					i->dft->lldd_tmf_aborted(task);
				break;
			}
			pr_warn("TMF task timeout for %016llx and done\n",
+1 −0
Original line number Diff line number Diff line
@@ -129,6 +129,7 @@ static struct sas_domain_function_template pm8001_transport_ops = {
	.lldd_query_task	= pm8001_query_task,
	.lldd_port_formed	= pm8001_port_formed,
	.lldd_tmf_exec_complete = pm8001_setds_completion,
	.lldd_tmf_aborted	= pm8001_tmf_aborted,
};

/**
+8 −0
Original line number Diff line number Diff line
@@ -1390,3 +1390,11 @@ void pm8001_setds_completion(struct domain_device *dev)
		wait_for_completion(&completion_setstate);
	}
}

void pm8001_tmf_aborted(struct sas_task *task)
{
	struct pm8001_ccb_info *ccb = task->lldd_task;

	if (ccb)
		ccb->task = NULL;
}
+1 −0
Original line number Diff line number Diff line
@@ -743,6 +743,7 @@ pm8001_ccb_task_free_done(struct pm8001_hba_info *pm8001_ha,
	task->task_done(task);
}
void pm8001_setds_completion(struct domain_device *dev);
void pm8001_tmf_aborted(struct sas_task *task);

#endif
Loading