scsi: libsas: Add sas_query_task()
authorJohn Garry <john.garry@huawei.com>
Thu, 17 Feb 2022 15:42:44 +0000 (23:42 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 19 Feb 2022 20:59:36 +0000 (15:59 -0500)
Add a generic implementation of query task TMF handler, and use in LLDDs.

Link: https://lore.kernel.org/r/1645112566-115804-17-git-send-email-john.garry@huawei.com
Tested-by: Yihang Li <liyihang6@hisilicon.com>
Tested-by: Damien Le Moal <damien.lemoal@opensource.wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: John Garry <john.garry@huawei.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/hisi_sas/hisi_sas_main.c
drivers/scsi/libsas/sas_scsi_host.c
drivers/scsi/mvsas/mv_sas.c
drivers/scsi/pm8001/pm8001_sas.c
include/scsi/libsas.h

index 3773874..808eefa 100644 (file)
@@ -1988,23 +1988,13 @@ static int hisi_sas_clear_nexus_ha(struct sas_ha_struct *sas_ha)
 
 static int hisi_sas_query_task(struct sas_task *task)
 {
-       struct scsi_lun lun;
-       struct sas_tmf_task tmf_task;
        int rc = TMF_RESP_FUNC_FAILED;
 
        if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
-               struct scsi_cmnd *cmnd = task->uldd_task;
-               struct domain_device *device = task->dev;
                struct hisi_sas_slot *slot = task->lldd_task;
                u32 tag = slot->idx;
 
-               int_to_scsilun(cmnd->device->lun, &lun);
-               tmf_task.tmf = TMF_QUERY_TASK;
-               tmf_task.tag_of_task_to_be_managed = tag;
-
-               rc = hisi_sas_debug_issue_ssp_tmf(device,
-                                                 lun.scsi_lun,
-                                                 &tmf_task);
+               rc = sas_query_task(task, tag);
                switch (rc) {
                /* The task is still in Lun, release it then */
                case TMF_RESP_FUNC_SUCC:
index d6f29e1..1923a06 100644 (file)
@@ -1073,6 +1073,22 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun)
 }
 EXPORT_SYMBOL_GPL(sas_lu_reset);
 
+int sas_query_task(struct sas_task *task, u16 tag)
+{
+       struct sas_tmf_task tmf_task = {
+               .tmf = TMF_QUERY_TASK,
+               .tag_of_task_to_be_managed = tag,
+       };
+       struct scsi_cmnd *cmnd = task->uldd_task;
+       struct domain_device *dev = task->dev;
+       struct scsi_lun lun;
+
+       int_to_scsilun(cmnd->device->lun, &lun);
+
+       return sas_execute_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
+}
+EXPORT_SYMBOL_GPL(sas_query_task);
+
 /*
  * Tell an upper layer that it needs to initiate an abort for a given task.
  * This should only ever be called by an LLDD.
index fdaaa43..63a96c3 100644 (file)
@@ -1422,27 +1422,20 @@ int mvs_I_T_nexus_reset(struct domain_device *dev)
 int mvs_query_task(struct sas_task *task)
 {
        u32 tag;
-       struct scsi_lun lun;
-       struct sas_tmf_task tmf_task;
        int rc = TMF_RESP_FUNC_FAILED;
 
        if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
-               struct scsi_cmnd * cmnd = (struct scsi_cmnd *)task->uldd_task;
                struct domain_device *dev = task->dev;
                struct mvs_device *mvi_dev = (struct mvs_device *)dev->lldd_dev;
                struct mvs_info *mvi = mvi_dev->mvi_info;
 
-               int_to_scsilun(cmnd->device->lun, &lun);
                rc = mvs_find_tag(mvi, task, &tag);
                if (rc == 0) {
                        rc = TMF_RESP_FUNC_FAILED;
                        return rc;
                }
 
-               tmf_task.tmf = TMF_QUERY_TASK;
-               tmf_task.tag_of_task_to_be_managed = cpu_to_le16(tag);
-
-               rc = mvs_debug_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
+               rc = sas_query_task(task, tag);
                switch (rc) {
                /* The task is still in Lun, release it then */
                case TMF_RESP_FUNC_SUCC:
index 18e8420..e8bdc33 100644 (file)
@@ -1138,8 +1138,6 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun)
 int pm8001_query_task(struct sas_task *task)
 {
        u32 tag = 0xdeadbeef;
-       struct scsi_lun lun;
-       struct sas_tmf_task tmf_task;
        int rc = TMF_RESP_FUNC_FAILED;
        if (unlikely(!task || !task->lldd_task || !task->dev))
                return rc;
@@ -1150,17 +1148,14 @@ int pm8001_query_task(struct sas_task *task)
                struct pm8001_hba_info *pm8001_ha =
                        pm8001_find_ha_by_dev(dev);
 
-               int_to_scsilun(cmnd->device->lun, &lun);
                rc = pm8001_find_tag(task, &tag);
                if (rc == 0) {
                        rc = TMF_RESP_FUNC_FAILED;
                        return rc;
                }
                pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd);
-               tmf_task.tmf =  TMF_QUERY_TASK;
-               tmf_task.tag_of_task_to_be_managed = tag;
 
-               rc = pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
+               rc = sas_query_task(task, tag);
                switch (rc) {
                /* The task is still in Lun, release it then */
                case TMF_RESP_FUNC_SUCC:
index 7b1e2e7..bf8613f 100644 (file)
@@ -725,6 +725,7 @@ int sas_request_addr(struct Scsi_Host *shost, u8 *addr);
 int sas_abort_task_set(struct domain_device *dev, u8 *lun);
 int sas_clear_task_set(struct domain_device *dev, u8 *lun);
 int sas_lu_reset(struct domain_device *dev, u8 *lun);
+int sas_query_task(struct sas_task *task, u16 tag);
 
 int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
                          gfp_t gfp_flags);