return TMF_RESP_FUNC_FAILED;
        }
 
+       spin_lock_irqsave(&task->task_state_lock, flags);
        if (task->task_state_flags & SAS_TASK_STATE_DONE) {
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
                rc = TMF_RESP_FUNC_COMPLETE;
                goto out;
        }
+       task->task_state_flags |= SAS_TASK_STATE_ABORTED;
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        sas_dev->dev_status = HISI_SAS_DEV_EH;
        if (task->lldd_task && task->task_proto & SAS_PROTOCOL_SSP) {
 
        struct hisi_sas_complete_v2_hdr *complete_hdr =
                        &complete_queue[slot->cmplt_queue_slot];
        unsigned long flags;
-       int aborted;
 
        if (unlikely(!task || !task->lldd_task || !task->dev))
                return -EINVAL;
        sas_dev = device->lldd_dev;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
-       aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED;
        task->task_state_flags &=
                ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
        spin_unlock_irqrestore(&task->task_state_lock, flags);
        memset(ts, 0, sizeof(*ts));
        ts->resp = SAS_TASK_COMPLETE;
 
-       if (unlikely(aborted)) {
-               dev_dbg(dev, "slot_complete: task(%p) aborted\n", task);
-               ts->stat = SAS_ABORTED_TASK;
-               spin_lock_irqsave(&hisi_hba->lock, flags);
-               hisi_sas_slot_task_free(hisi_hba, task, slot);
-               spin_unlock_irqrestore(&hisi_hba->lock, flags);
-               return ts->stat;
-       }
-
        if (unlikely(!sas_dev)) {
                dev_dbg(dev, "slot complete: port has no device\n");
                ts->stat = SAS_PHY_DOWN;
        }
 
 out:
+       hisi_sas_slot_task_free(hisi_hba, task, slot);
+       sts = ts->stat;
        spin_lock_irqsave(&task->task_state_lock, flags);
+       if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+               dev_info(dev, "slot complete: task(%p) aborted\n", task);
+               return SAS_ABORTED_TASK;
+       }
        task->task_state_flags |= SAS_TASK_STATE_DONE;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
-       spin_lock_irqsave(&hisi_hba->lock, flags);
-       hisi_sas_slot_task_free(hisi_hba, task, slot);
-       spin_unlock_irqrestore(&hisi_hba->lock, flags);
-       sts = ts->stat;
 
        if (task->task_done)
                task->task_done(task);
 
                        hisi_hba->complete_hdr[slot->cmplt_queue];
        struct hisi_sas_complete_v3_hdr *complete_hdr =
                        &complete_queue[slot->cmplt_queue_slot];
-       int aborted;
        unsigned long flags;
 
        if (unlikely(!task || !task->lldd_task || !task->dev))
        sas_dev = device->lldd_dev;
 
        spin_lock_irqsave(&task->task_state_lock, flags);
-       aborted = task->task_state_flags & SAS_TASK_STATE_ABORTED;
        task->task_state_flags &=
                ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
        spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        memset(ts, 0, sizeof(*ts));
        ts->resp = SAS_TASK_COMPLETE;
-       if (unlikely(aborted)) {
-               dev_dbg(dev, "slot complete: task(%p) aborted\n", task);
-               ts->stat = SAS_ABORTED_TASK;
-               spin_lock_irqsave(&hisi_hba->lock, flags);
-               hisi_sas_slot_task_free(hisi_hba, task, slot);
-               spin_unlock_irqrestore(&hisi_hba->lock, flags);
-               return ts->stat;
-       }
 
        if (unlikely(!sas_dev)) {
                dev_dbg(dev, "slot complete: port has not device\n");
        }
 
 out:
+       hisi_sas_slot_task_free(hisi_hba, task, slot);
+       sts = ts->stat;
        spin_lock_irqsave(&task->task_state_lock, flags);
+       if (task->task_state_flags & SAS_TASK_STATE_ABORTED) {
+               spin_unlock_irqrestore(&task->task_state_lock, flags);
+               dev_info(dev, "slot complete: task(%p) aborted\n", task);
+               return SAS_ABORTED_TASK;
+       }
        task->task_state_flags |= SAS_TASK_STATE_DONE;
        spin_unlock_irqrestore(&task->task_state_lock, flags);
-       spin_lock_irqsave(&hisi_hba->lock, flags);
-       hisi_sas_slot_task_free(hisi_hba, task, slot);
-       spin_unlock_irqrestore(&hisi_hba->lock, flags);
-       sts = ts->stat;
 
        if (task->task_done)
                task->task_done(task);