static int hisi_sas_clear_nexus_ha(struct sas_ha_struct *sas_ha)
 {
        struct hisi_hba *hisi_hba = sas_ha->lldd_ha;
+       struct device *dev = hisi_hba->dev;
        HISI_SAS_DECLARE_RST_WORK_ON_STACK(r);
+       int rc, i;
 
        queue_work(hisi_hba->wq, &r.work);
        wait_for_completion(r.completion);
-       if (r.done)
-               return TMF_RESP_FUNC_COMPLETE;
+       if (!r.done)
+               return TMF_RESP_FUNC_FAILED;
+
+       for (i = 0; i < HISI_SAS_MAX_DEVICES; i++) {
+               struct hisi_sas_device *sas_dev = &hisi_hba->devices[i];
+               struct domain_device *device = sas_dev->sas_device;
+
+               if ((sas_dev->dev_type == SAS_PHY_UNUSED) || !device ||
+                   DEV_IS_EXPANDER(device->dev_type))
+                       continue;
+
+               rc = hisi_sas_debug_I_T_nexus_reset(device);
+               if (rc != TMF_RESP_FUNC_COMPLETE)
+                       dev_info(dev, "clear nexus ha: for device[%d] rc=%d\n",
+                                sas_dev->device_id, rc);
+       }
+
+       hisi_sas_release_tasks(hisi_hba);
 
-       return TMF_RESP_FUNC_FAILED;
+       return TMF_RESP_FUNC_COMPLETE;
 }
 
 static int hisi_sas_query_task(struct sas_task *task)