scsi: hisi_sas: Pass abort structure for internal abort
To help factor out code in future, it's useful to know if we're executing an internal abort, so pass a pointer to the structure. The idea is that a NULL pointer means not an internal abort. Link: https://lore.kernel.org/r/1639579061-179473-4-git-send-email-john.garry@huawei.com Reviewed-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>
This commit is contained in:
parent
934385a4fd
commit
08c61b5d90
@ -133,6 +133,11 @@ struct hisi_sas_rst {
|
|||||||
bool done;
|
bool done;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct hisi_sas_internal_abort {
|
||||||
|
unsigned int flag;
|
||||||
|
unsigned int tag;
|
||||||
|
};
|
||||||
|
|
||||||
#define HISI_SAS_RST_WORK_INIT(r, c) \
|
#define HISI_SAS_RST_WORK_INIT(r, c) \
|
||||||
{ .hisi_hba = hisi_hba, \
|
{ .hisi_hba = hisi_hba, \
|
||||||
.completion = &c, \
|
.completion = &c, \
|
||||||
|
@ -265,11 +265,11 @@ static void hisi_sas_task_prep_ata(struct hisi_hba *hisi_hba,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void hisi_sas_task_prep_abort(struct hisi_hba *hisi_hba,
|
static void hisi_sas_task_prep_abort(struct hisi_hba *hisi_hba,
|
||||||
struct hisi_sas_slot *slot,
|
struct hisi_sas_internal_abort *abort,
|
||||||
int device_id, int abort_flag, int tag_to_abort)
|
struct hisi_sas_slot *slot, int device_id)
|
||||||
{
|
{
|
||||||
hisi_hba->hw->prep_abort(hisi_hba, slot,
|
hisi_hba->hw->prep_abort(hisi_hba, slot,
|
||||||
device_id, abort_flag, tag_to_abort);
|
device_id, abort->flag, abort->tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
|
static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
|
||||||
@ -2008,8 +2008,9 @@ static int hisi_sas_query_task(struct sas_task *task)
|
|||||||
|
|
||||||
static int
|
static int
|
||||||
hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
|
hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
|
||||||
struct sas_task *task, int abort_flag,
|
struct hisi_sas_internal_abort *abort,
|
||||||
int task_tag, struct hisi_sas_dq *dq)
|
struct sas_task *task,
|
||||||
|
struct hisi_sas_dq *dq)
|
||||||
{
|
{
|
||||||
struct domain_device *device = task->dev;
|
struct domain_device *device = task->dev;
|
||||||
struct hisi_sas_device *sas_dev = device->lldd_dev;
|
struct hisi_sas_device *sas_dev = device->lldd_dev;
|
||||||
@ -2066,8 +2067,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
|
|||||||
memset(hisi_sas_status_buf_addr_mem(slot), 0,
|
memset(hisi_sas_status_buf_addr_mem(slot), 0,
|
||||||
sizeof(struct hisi_sas_err_record));
|
sizeof(struct hisi_sas_err_record));
|
||||||
|
|
||||||
hisi_sas_task_prep_abort(hisi_hba, slot, device_id,
|
hisi_sas_task_prep_abort(hisi_hba, abort, slot, device_id);
|
||||||
abort_flag, task_tag);
|
|
||||||
|
|
||||||
spin_lock_irqsave(&task->task_state_lock, flags);
|
spin_lock_irqsave(&task->task_state_lock, flags);
|
||||||
task->task_state_flags |= SAS_TASK_AT_INITIATOR;
|
task->task_state_flags |= SAS_TASK_AT_INITIATOR;
|
||||||
@ -2105,9 +2105,12 @@ _hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
|
|||||||
{
|
{
|
||||||
struct sas_task *task;
|
struct sas_task *task;
|
||||||
struct hisi_sas_device *sas_dev = device->lldd_dev;
|
struct hisi_sas_device *sas_dev = device->lldd_dev;
|
||||||
|
struct hisi_sas_internal_abort abort = {
|
||||||
|
.flag = abort_flag,
|
||||||
|
.tag = tag,
|
||||||
|
};
|
||||||
struct device *dev = hisi_hba->dev;
|
struct device *dev = hisi_hba->dev;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The interface is not realized means this HW don't support internal
|
* The interface is not realized means this HW don't support internal
|
||||||
* abort, or don't need to do internal abort. Then here, we return
|
* abort, or don't need to do internal abort. Then here, we return
|
||||||
@ -2132,7 +2135,7 @@ _hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
|
|||||||
add_timer(&task->slow_task->timer);
|
add_timer(&task->slow_task->timer);
|
||||||
|
|
||||||
res = hisi_sas_internal_abort_task_exec(hisi_hba, sas_dev->device_id,
|
res = hisi_sas_internal_abort_task_exec(hisi_hba, sas_dev->device_id,
|
||||||
task, abort_flag, tag, dq);
|
&abort, task, dq);
|
||||||
if (res) {
|
if (res) {
|
||||||
del_timer_sync(&task->slow_task->timer);
|
del_timer_sync(&task->slow_task->timer);
|
||||||
dev_err(dev, "internal task abort: executing internal task failed: %d\n",
|
dev_err(dev, "internal task abort: executing internal task failed: %d\n",
|
||||||
|
Loading…
Reference in New Issue
Block a user