]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: hisi_sas: Pass abort structure for internal abort
authorJohn Garry <john.garry@huawei.com>
Wed, 15 Dec 2021 14:37:36 +0000 (22:37 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 2 May 2025 05:44:07 +0000 (07:44 +0200)
[ Upstream commit 08c61b5d902b70180b517e9f2616ad70b7a98dcf ]

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>
Stable-dep-of: 8aa580cd9284 ("scsi: hisi_sas: Enable force phy when SATA disk directly connected")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/hisi_sas/hisi_sas.h
drivers/scsi/hisi_sas/hisi_sas_main.c

index 57be32ba0109f486315b149027b5d50450a38a51..39da9f1645135a402e9c11f903f653b66a3e341b 100644 (file)
@@ -134,6 +134,11 @@ struct hisi_sas_rst {
        bool done;
 };
 
+struct hisi_sas_internal_abort {
+       unsigned int flag;
+       unsigned int tag;
+};
+
 #define HISI_SAS_RST_WORK_INIT(r, c) \
        {       .hisi_hba = hisi_hba, \
                .completion = &c, \
index ff6b6868cd9556ba00e7ed48e73f9b10d3c80ddd..321e6fae03adc22adc6fc1f485bc742e793e0cbb 100644 (file)
@@ -273,11 +273,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,
-               struct hisi_sas_slot *slot,
-               int device_id, int abort_flag, int tag_to_abort)
+               struct hisi_sas_internal_abort *abort,
+               struct hisi_sas_slot *slot, int device_id)
 {
        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,
@@ -1968,8 +1968,9 @@ static int hisi_sas_query_task(struct sas_task *task)
 
 static int
 hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
-                                 struct sas_task *task, int abort_flag,
-                                 int task_tag, struct hisi_sas_dq *dq)
+                                 struct hisi_sas_internal_abort *abort,
+                                 struct sas_task *task,
+                                 struct hisi_sas_dq *dq)
 {
        struct domain_device *device = task->dev;
        struct hisi_sas_device *sas_dev = device->lldd_dev;
@@ -2026,8 +2027,7 @@ hisi_sas_internal_abort_task_exec(struct hisi_hba *hisi_hba, int device_id,
        memset(hisi_sas_status_buf_addr_mem(slot), 0,
               sizeof(struct hisi_sas_err_record));
 
-       hisi_sas_task_prep_abort(hisi_hba, slot, device_id,
-                                     abort_flag, task_tag);
+       hisi_sas_task_prep_abort(hisi_hba, abort, slot, device_id);
 
        spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
@@ -2065,9 +2065,12 @@ _hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
 {
        struct sas_task *task;
        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;
        int res;
-
        /*
         * 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
@@ -2092,7 +2095,7 @@ _hisi_sas_internal_task_abort(struct hisi_hba *hisi_hba,
        add_timer(&task->slow_task->timer);
 
        res = hisi_sas_internal_abort_task_exec(hisi_hba, sas_dev->device_id,
-                                               task, abort_flag, tag, dq);
+                                               &abort, task, dq);
        if (res) {
                del_timer(&task->slow_task->timer);
                dev_err(dev, "internal task abort: executing internal task failed: %d\n",