};
 IWL_EXPORT_SYMBOL(iwl_dump_desc_assert);
 
+void iwl_fw_alive_error_dump(struct iwl_fw_runtime *fwrt)
+{
+       struct iwl_fw_dump_desc *iwl_dump_desc_no_alive =
+               kmalloc(sizeof(*iwl_dump_desc_no_alive), GFP_KERNEL);
+
+       if (!iwl_dump_desc_no_alive)
+               return;
+
+       iwl_dump_desc_no_alive->trig_desc.type =
+               cpu_to_le32(FW_DBG_TRIGGER_NO_ALIVE);
+       iwl_dump_desc_no_alive->len = 0;
+
+       if (WARN_ON(fwrt->dump.desc))
+               iwl_fw_free_dump_desc(fwrt);
+
+       IWL_WARN(fwrt, "Collecting data: trigger %d fired.\n",
+                FW_DBG_TRIGGER_NO_ALIVE);
+
+       fwrt->dump.desc = iwl_dump_desc_no_alive;
+       iwl_fw_error_dump(fwrt);
+       clear_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &fwrt->status);
+}
+IWL_EXPORT_SYMBOL(iwl_fw_alive_error_dump);
+
 int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
                            const struct iwl_fw_dump_desc *desc,
                            const struct iwl_fw_dbg_trigger_tlv *trigger)
            fwrt->smem_cfg.num_lmacs)
                return -EIO;
 
-       if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status))
+       if (test_and_set_bit(IWL_FWRT_STATUS_DUMPING, &fwrt->status) ||
+           test_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &fwrt->status))
                return -EBUSY;
 
        if (WARN_ON(fwrt->dump.desc))
 
 
 #endif /* CONFIG_IWLWIFI_DEBUGFS */
 
+void iwl_fw_alive_error_dump(struct iwl_fw_runtime *fwrt);
 #endif  /* __iwl_fw_dbg_h__ */
 
  * @FW_DBG_TDLS: trigger log collection upon TDLS related events.
  * @FW_DBG_TRIGGER_TX_STATUS: trigger log collection upon tx status when
  *  the firmware sends a tx reply.
+ * @FW_DBG_TRIGGER_NO_ALIVE: trigger log collection if alive flow fails
  */
 enum iwl_fw_dbg_trigger {
        FW_DBG_TRIGGER_INVALID = 0,
        FW_DBG_TRIGGER_TX_LATENCY,
        FW_DBG_TRIGGER_TDLS,
        FW_DBG_TRIGGER_TX_STATUS,
+       FW_DBG_TRIGGER_NO_ALIVE,
 
        /* must be last */
        FW_DBG_TRIGGER_MAX,
 
 
 enum iwl_fw_runtime_status {
        IWL_FWRT_STATUS_DUMPING = 0,
+       IWL_FWRT_STATUS_WAIT_ALIVE,
 };
 
 /**
 
        enum iwl_ucode_type old_type = mvm->fwrt.cur_fw_img;
        static const u16 alive_cmd[] = { MVM_ALIVE };
 
+       set_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &mvm->fwrt.status);
        if (ucode_type == IWL_UCODE_REGULAR &&
            iwl_fw_dbg_conf_usniffer(mvm->fw, FW_DBG_START_FROM_ALIVE) &&
            !(fw_has_capa(&mvm->fw->ucode_capa,
                atomic_set(&mvm->mac80211_queue_stop_count[i], 0);
 
        set_bit(IWL_MVM_STATUS_FIRMWARE_RUNNING, &mvm->status);
+       clear_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &mvm->fwrt.status);
 
        return 0;
 }
 
        mutex_lock(&mvm->mutex);
        iwl_mvm_ref(mvm, IWL_MVM_REF_INIT_UCODE);
        err = iwl_run_init_mvm_ucode(mvm, true);
+       if (test_bit(IWL_FWRT_STATUS_WAIT_ALIVE, &mvm->fwrt.status))
+               iwl_fw_alive_error_dump(&mvm->fwrt);
        if (!iwlmvm_mod_params.init_dbg || !err)
                iwl_mvm_stop_device(mvm);
        iwl_mvm_unref(mvm, IWL_MVM_REF_INIT_UCODE);