Commit f38efdb2 authored by Shahar S Matityahu's avatar Shahar S Matityahu Committed by Luca Coelho
Browse files

iwlwifi: add dump collection in case alive flow fails



Trigger dump collection if the alive flow fails, regardless of the
reason.

Signed-off-by: default avatarShahar S Matityahu <shahar.s.matityahu@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 868a1e86
Loading
Loading
Loading
Loading
+26 −1
Original line number Diff line number Diff line
@@ -973,6 +973,30 @@ const struct iwl_fw_dump_desc iwl_dump_desc_assert = {
};
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)
@@ -998,7 +1022,8 @@ int iwl_fw_dbg_collect_desc(struct iwl_fw_runtime *fwrt,
	    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))
+1 −0
Original line number Diff line number Diff line
@@ -368,4 +368,5 @@ static inline void iwl_fw_resume_timestamp(struct iwl_fw_runtime *fwrt) {}

#endif /* CONFIG_IWLWIFI_DEBUGFS */

void iwl_fw_alive_error_dump(struct iwl_fw_runtime *fwrt);
#endif  /* __iwl_fw_dbg_h__ */
+2 −0
Original line number Diff line number Diff line
@@ -328,6 +328,7 @@ iwl_fw_error_next_data(struct iwl_fw_error_dump_data *data)
 * @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,
@@ -345,6 +346,7 @@ enum iwl_fw_dbg_trigger {
	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,
+1 −0
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ struct iwl_fwrt_shared_mem_cfg {

enum iwl_fw_runtime_status {
	IWL_FWRT_STATUS_DUMPING = 0,
	IWL_FWRT_STATUS_WAIT_ALIVE,
};

/**
+2 −0
Original line number Diff line number Diff line
@@ -299,6 +299,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
	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,
@@ -369,6 +370,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
		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;
}
Loading