Commit 72f8810e authored by John Garry's avatar John Garry Committed by Martin K. Petersen

scsi: libsas: Add sas_query_task()

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.comTested-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 29d77690
...@@ -1988,23 +1988,13 @@ static int hisi_sas_clear_nexus_ha(struct sas_ha_struct *sas_ha) ...@@ -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) 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; int rc = TMF_RESP_FUNC_FAILED;
if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { 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; struct hisi_sas_slot *slot = task->lldd_task;
u32 tag = slot->idx; u32 tag = slot->idx;
int_to_scsilun(cmnd->device->lun, &lun); rc = sas_query_task(task, tag);
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);
switch (rc) { switch (rc) {
/* The task is still in Lun, release it then */ /* The task is still in Lun, release it then */
case TMF_RESP_FUNC_SUCC: case TMF_RESP_FUNC_SUCC:
......
...@@ -1073,6 +1073,22 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun) ...@@ -1073,6 +1073,22 @@ int sas_lu_reset(struct domain_device *dev, u8 *lun)
} }
EXPORT_SYMBOL_GPL(sas_lu_reset); 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. * Tell an upper layer that it needs to initiate an abort for a given task.
* This should only ever be called by an LLDD. * This should only ever be called by an LLDD.
......
...@@ -1422,27 +1422,20 @@ int mvs_I_T_nexus_reset(struct domain_device *dev) ...@@ -1422,27 +1422,20 @@ int mvs_I_T_nexus_reset(struct domain_device *dev)
int mvs_query_task(struct sas_task *task) int mvs_query_task(struct sas_task *task)
{ {
u32 tag; u32 tag;
struct scsi_lun lun;
struct sas_tmf_task tmf_task;
int rc = TMF_RESP_FUNC_FAILED; int rc = TMF_RESP_FUNC_FAILED;
if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) { 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 domain_device *dev = task->dev;
struct mvs_device *mvi_dev = (struct mvs_device *)dev->lldd_dev; struct mvs_device *mvi_dev = (struct mvs_device *)dev->lldd_dev;
struct mvs_info *mvi = mvi_dev->mvi_info; struct mvs_info *mvi = mvi_dev->mvi_info;
int_to_scsilun(cmnd->device->lun, &lun);
rc = mvs_find_tag(mvi, task, &tag); rc = mvs_find_tag(mvi, task, &tag);
if (rc == 0) { if (rc == 0) {
rc = TMF_RESP_FUNC_FAILED; rc = TMF_RESP_FUNC_FAILED;
return rc; return rc;
} }
tmf_task.tmf = TMF_QUERY_TASK; rc = sas_query_task(task, tag);
tmf_task.tag_of_task_to_be_managed = cpu_to_le16(tag);
rc = mvs_debug_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
switch (rc) { switch (rc) {
/* The task is still in Lun, release it then */ /* The task is still in Lun, release it then */
case TMF_RESP_FUNC_SUCC: case TMF_RESP_FUNC_SUCC:
......
...@@ -1138,8 +1138,6 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun) ...@@ -1138,8 +1138,6 @@ int pm8001_lu_reset(struct domain_device *dev, u8 *lun)
int pm8001_query_task(struct sas_task *task) int pm8001_query_task(struct sas_task *task)
{ {
u32 tag = 0xdeadbeef; u32 tag = 0xdeadbeef;
struct scsi_lun lun;
struct sas_tmf_task tmf_task;
int rc = TMF_RESP_FUNC_FAILED; int rc = TMF_RESP_FUNC_FAILED;
if (unlikely(!task || !task->lldd_task || !task->dev)) if (unlikely(!task || !task->lldd_task || !task->dev))
return rc; return rc;
...@@ -1150,17 +1148,14 @@ int pm8001_query_task(struct sas_task *task) ...@@ -1150,17 +1148,14 @@ int pm8001_query_task(struct sas_task *task)
struct pm8001_hba_info *pm8001_ha = struct pm8001_hba_info *pm8001_ha =
pm8001_find_ha_by_dev(dev); pm8001_find_ha_by_dev(dev);
int_to_scsilun(cmnd->device->lun, &lun);
rc = pm8001_find_tag(task, &tag); rc = pm8001_find_tag(task, &tag);
if (rc == 0) { if (rc == 0) {
rc = TMF_RESP_FUNC_FAILED; rc = TMF_RESP_FUNC_FAILED;
return rc; return rc;
} }
pm8001_dbg(pm8001_ha, EH, "Query:[%16ph]\n", cmnd->cmnd); 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) { switch (rc) {
/* The task is still in Lun, release it then */ /* The task is still in Lun, release it then */
case TMF_RESP_FUNC_SUCC: case TMF_RESP_FUNC_SUCC:
......
...@@ -725,6 +725,7 @@ int sas_request_addr(struct Scsi_Host *shost, u8 *addr); ...@@ -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_abort_task_set(struct domain_device *dev, u8 *lun);
int sas_clear_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_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, int sas_notify_port_event(struct asd_sas_phy *phy, enum port_event event,
gfp_t gfp_flags); gfp_t gfp_flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment