schedule_hard_reset = false, delay_reset, from_dev_release, from_watchdog_thread;
        u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE] = {0};
        struct hl_ctx *ctx;
-       int i, rc;
+       int i, rc, hw_fini_rc;
 
        if (!hdev->init_done) {
                dev_err(hdev->dev, "Can't reset before initialization is done\n");
        }
 
        /* Reset the H/W. It will be in idle state after this returns */
-       hdev->asic_funcs->hw_fini(hdev, hard_reset, fw_reset);
+       hw_fini_rc = hdev->asic_funcs->hw_fini(hdev, hard_reset, fw_reset);
 
        if (hard_reset) {
                hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
                hl_ctx_put(ctx);
        }
 
+       if (hw_fini_rc) {
+               rc = hw_fini_rc;
+               goto out_err;
+       }
        /* Finished tear-down, starting to re-initialize */
 
        if (hard_reset) {
        hl_cb_pool_fini(hdev);
 
        /* Reset the H/W. It will be in idle state after this returns */
-       hdev->asic_funcs->hw_fini(hdev, true, false);
+       rc = hdev->asic_funcs->hw_fini(hdev, true, false);
+       if (rc)
+               dev_err(hdev->dev, "hw_fini failed in device fini while removing device %d\n", rc);
 
        hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
 
 
        rc = hl_fw_read_preboot_status(hdev);
        if (rc) {
                if (hdev->reset_on_preboot_fail)
+                       /* we are already on failure flow, so don't check if hw_fini fails. */
                        hdev->asic_funcs->hw_fini(hdev, true, false);
                goto pci_fini;
        }
 
        if (gaudi_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
                dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
-               hdev->asic_funcs->hw_fini(hdev, true, false);
+               rc = hdev->asic_funcs->hw_fini(hdev, true, false);
+               if (rc) {
+                       dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);
+                       goto pci_fini;
+               }
        }
 
        return 0;
 
        rc = hl_fw_read_preboot_status(hdev);
        if (rc) {
                if (hdev->reset_on_preboot_fail)
+                       /* we are already on failure flow, so don't check if hw_fini fails. */
                        hdev->asic_funcs->hw_fini(hdev, true, false);
                goto pci_fini;
        }
 
        if (gaudi2_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
                dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
-               hdev->asic_funcs->hw_fini(hdev, true, false);
+               rc = hdev->asic_funcs->hw_fini(hdev, true, false);
+               if (rc) {
+                       dev_err(hdev->dev, "failed to reset HW during early init (%d)\n", rc);
+                       goto pci_fini;
+               }
        }
 
        return 0;
 
        rc = hl_fw_read_preboot_status(hdev);
        if (rc) {
                if (hdev->reset_on_preboot_fail)
+                       /* we are already on failure flow, so don't check if hw_fini fails. */
                        hdev->asic_funcs->hw_fini(hdev, true, false);
                goto pci_fini;
        }
 
        if (goya_get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
                dev_dbg(hdev->dev, "H/W state is dirty, must reset before initializing\n");
-               hdev->asic_funcs->hw_fini(hdev, true, false);
+               rc = hdev->asic_funcs->hw_fini(hdev, true, false);
+               if (rc) {
+                       dev_err(hdev->dev, "failed to reset HW in dirty state (%d)\n", rc);
+                       goto pci_fini;
+               }
        }
 
        if (!hdev->pldm) {