ieee80211_resume_disconnect(vif);
 }
 
-static bool iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
-                                  struct ieee80211_vif *vif)
+enum rt_status {
+       FW_ALIVE,
+       FW_NEEDS_RESET,
+       FW_ERROR,
+};
+
+static enum rt_status iwl_mvm_check_rt_status(struct iwl_mvm *mvm,
+                                             struct ieee80211_vif *vif)
 {
        u32 err_id;
 
        if (iwl_fwrt_read_err_table(mvm->trans,
                                    mvm->trans->dbg.lmac_error_event_table[0],
                                    &err_id)) {
-               if (err_id == RF_KILL_INDICATOR_FOR_WOWLAN && vif) {
-                       struct cfg80211_wowlan_wakeup wakeup = {
-                               .rfkill_release = true,
-                       };
-                       ieee80211_report_wowlan_wakeup(vif, &wakeup,
-                                                      GFP_KERNEL);
+               if (err_id == RF_KILL_INDICATOR_FOR_WOWLAN) {
+                       IWL_WARN(mvm, "Rfkill was toggled during suspend\n");
+                       if (vif) {
+                               struct cfg80211_wowlan_wakeup wakeup = {
+                                       .rfkill_release = true,
+                               };
+
+                               ieee80211_report_wowlan_wakeup(vif, &wakeup,
+                                                              GFP_KERNEL);
+                       }
+
+                       return FW_NEEDS_RESET;
                }
-               return true;
+               return FW_ERROR;
        }
 
        /* check if we have lmac2 set and check for error */
        if (iwl_fwrt_read_err_table(mvm->trans,
                                    mvm->trans->dbg.lmac_error_event_table[1],
                                    NULL))
-               return true;
+               return FW_ERROR;
 
        /* check for umac error */
        if (iwl_fwrt_read_err_table(mvm->trans,
                                    mvm->trans->dbg.umac_error_event_table,
                                    NULL))
-               return true;
+               return FW_ERROR;
 
-       return false;
+       return FW_ALIVE;
 }
 
 /*
        bool d0i3_first = fw_has_capa(&mvm->fw->ucode_capa,
                                      IWL_UCODE_TLV_CAPA_D0I3_END_FIRST);
        bool resume_notif_based = iwl_mvm_d3_resume_notif_based(mvm);
+       enum rt_status rt_status;
        bool keep = false;
 
        mutex_lock(&mvm->mutex);
 
        iwl_fw_dbg_read_d3_debug_data(&mvm->fwrt);
 
-       if (iwl_mvm_check_rt_status(mvm, vif)) {
-               IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
+       rt_status = iwl_mvm_check_rt_status(mvm, vif);
+       if (rt_status != FW_ALIVE) {
                set_bit(STATUS_FW_ERROR, &mvm->trans->status);
-               iwl_mvm_dump_nic_error_log(mvm);
-               iwl_dbg_tlv_time_point(&mvm->fwrt,
-                                      IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
-               iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
-                                       false, 0);
+               if (rt_status == FW_ERROR) {
+                       IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
+                       iwl_mvm_dump_nic_error_log(mvm);
+                       iwl_dbg_tlv_time_point(&mvm->fwrt,
+                                              IWL_FW_INI_TIME_POINT_FW_ASSERT,
+                                              NULL);
+                       iwl_fw_dbg_collect_desc(&mvm->fwrt,
+                                               &iwl_dump_desc_assert,
+                                               false, 0);
+               }
                ret = 1;
                goto err;
        }
                .notif_expected =
                        IWL_D3_NOTIF_D3_END_NOTIF,
        };
+       enum rt_status rt_status;
        int ret;
 
        lockdep_assert_held(&mvm->mutex);
        mvm->last_reset_or_resume_time_jiffies = jiffies;
        iwl_fw_dbg_read_d3_debug_data(&mvm->fwrt);
 
-       if (iwl_mvm_check_rt_status(mvm, NULL)) {
-               IWL_ERR(mvm, "FW Error occurred during suspend. Restarting.\n");
+       rt_status = iwl_mvm_check_rt_status(mvm, NULL);
+       if (rt_status != FW_ALIVE) {
                set_bit(STATUS_FW_ERROR, &mvm->trans->status);
-               iwl_mvm_dump_nic_error_log(mvm);
-               iwl_dbg_tlv_time_point(&mvm->fwrt,
-                                      IWL_FW_INI_TIME_POINT_FW_ASSERT, NULL);
-               iwl_fw_dbg_collect_desc(&mvm->fwrt, &iwl_dump_desc_assert,
-                                       false, 0);
+               if (rt_status == FW_ERROR) {
+                       IWL_ERR(mvm,
+                               "iwl_mvm_check_rt_status failed, device is gone during suspend\n");
+                       iwl_mvm_dump_nic_error_log(mvm);
+                       iwl_dbg_tlv_time_point(&mvm->fwrt,
+                                              IWL_FW_INI_TIME_POINT_FW_ASSERT,
+                                              NULL);
+                       iwl_fw_dbg_collect_desc(&mvm->fwrt,
+                                               &iwl_dump_desc_assert,
+                                               false, 0);
+               }
                mvm->trans->state = IWL_TRANS_NO_FW;
                ret = -ENODEV;