struct asd_sas_port *sas_port = device->port;
        struct device *dev = &hisi_hba->pdev->dev;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
+       unsigned long flags;
 
        if (!sas_port) {
                struct task_status_struct *ts = &task->task_status;
        }
 
        list_add_tail(&slot->entry, &sas_dev->list);
-       spin_lock(&task->task_state_lock);
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
-       spin_unlock(&task->task_state_lock);
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        hisi_hba->slot_prep = slot;
 
                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;
        }
 
-       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 scsi_cmnd *cmnd = task->uldd_task;
        struct asd_sas_port *sas_port = device->port;
        struct hisi_sas_cmd_hdr *cmd_hdr_base;
        int dlvry_queue_slot, dlvry_queue, n_elem = 0, rc, slot_idx;
+       unsigned long flags;
 
        if (unlikely(test_bit(HISI_SAS_RESET_BIT, &hisi_hba->flags)))
                return -EINVAL;
 
 
        list_add_tail(&slot->entry, &sas_dev->list);
-       spin_lock(&task->task_state_lock);
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_AT_INITIATOR;
-       spin_unlock(&task->task_state_lock);
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        hisi_hba->slot_prep = slot;
 
 
        struct hisi_sas_complete_v1_hdr *complete_queue =
                        hisi_hba->complete_hdr[slot->cmplt_queue];
        struct hisi_sas_complete_v1_hdr *complete_hdr;
+       unsigned long flags;
        u32 cmplt_hdr_data;
 
        complete_hdr = &complete_queue[slot->cmplt_queue_slot];
        device = task->dev;
        sas_dev = device->lldd_dev;
 
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags &=
                ~(SAS_TASK_STATE_PENDING | SAS_TASK_AT_INITIATOR);
        task->task_state_flags |= SAS_TASK_STATE_DONE;
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        memset(ts, 0, sizeof(*ts));
        ts->resp = SAS_TASK_COMPLETE;
 
                        hisi_hba->complete_hdr[slot->cmplt_queue];
        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))
        device = task->dev;
        sas_dev = device->lldd_dev;
 
-       spin_lock(&task->task_state_lock);
+       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(&task->task_state_lock);
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
 
        memset(ts, 0, sizeof(*ts));
        ts->resp = SAS_TASK_COMPLETE;
        }
 
 out:
+       spin_lock_irqsave(&task->task_state_lock, flags);
        task->task_state_flags |= SAS_TASK_STATE_DONE;
+       spin_unlock_irqrestore(&task->task_state_lock, flags);
        hisi_sas_slot_task_free(hisi_hba, task, slot);
        sts = ts->stat;