Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06ddbf5a authored by Emmanuel Grumbach's avatar Emmanuel Grumbach
Browse files

iwlwifi: add device / firmware to fw-error-dump file



This can be useful later for parsing since the parsing may
differ based on the device's family / bus.
Also add the human readable version of the firmware.

Signed-off-by: default avatarEmmanuel Grumbach <emmanuel.grumbach@intel.com>
parent 5788ab75
Loading
Loading
Loading
Loading
+2 −0
Original line number Original line Diff line number Diff line
@@ -567,6 +567,8 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
	}
	}


	drv->fw.ucode_ver = le32_to_cpu(ucode->ver);
	drv->fw.ucode_ver = le32_to_cpu(ucode->ver);
	memcpy(drv->fw.human_readable, ucode->human_readable,
	       sizeof(drv->fw.human_readable));
	build = le32_to_cpu(ucode->build);
	build = le32_to_cpu(ucode->build);


	if (build)
	if (build)
+24 −0
Original line number Original line Diff line number Diff line
@@ -74,12 +74,15 @@
 * @IWL_FW_ERROR_DUMP_RXF:
 * @IWL_FW_ERROR_DUMP_RXF:
 * @IWL_FW_ERROR_DUMP_TXCMD: last TX command data, structured as
 * @IWL_FW_ERROR_DUMP_TXCMD: last TX command data, structured as
 *	&struct iwl_fw_error_dump_txcmd packets
 *	&struct iwl_fw_error_dump_txcmd packets
 * @IWL_FW_ERROR_DUMP_DEV_FW_INFO:  struct %iwl_fw_error_dump_info
 *	info on the device / firmware.
 */
 */
enum iwl_fw_error_dump_type {
enum iwl_fw_error_dump_type {
	IWL_FW_ERROR_DUMP_SRAM = 0,
	IWL_FW_ERROR_DUMP_SRAM = 0,
	IWL_FW_ERROR_DUMP_REG = 1,
	IWL_FW_ERROR_DUMP_REG = 1,
	IWL_FW_ERROR_DUMP_RXF = 2,
	IWL_FW_ERROR_DUMP_RXF = 2,
	IWL_FW_ERROR_DUMP_TXCMD = 3,
	IWL_FW_ERROR_DUMP_TXCMD = 3,
	IWL_FW_ERROR_DUMP_DEV_FW_INFO = 4,


	IWL_FW_ERROR_DUMP_MAX,
	IWL_FW_ERROR_DUMP_MAX,
};
};
@@ -120,6 +123,27 @@ struct iwl_fw_error_dump_txcmd {
	u8 data[];
	u8 data[];
} __packed;
} __packed;


enum iwl_fw_error_dump_family {
	IWL_FW_ERROR_DUMP_FAMILY_7 = 7,
	IWL_FW_ERROR_DUMP_FAMILY_8 = 8,
};

/**
 * struct iwl_fw_error_dump_info - info on the device / firmware
 * @device_family: the family of the device (7 / 8)
 * @hw_step: the step of the device
 * @fw_human_readable: human readable FW version
 * @dev_human_readable: name of the device
 * @bus_human_readable: name of the bus used
 */
struct iwl_fw_error_dump_info {
	__le32 device_family;
	__le32 hw_step;
	u8 fw_human_readable[FW_VER_HUMAN_READABLE_SZ];
	u8 dev_human_readable[64];
	u8 bus_human_readable[8];
} __packed;

/**
/**
 * iwl_mvm_fw_error_next_data - advance fw error dump data pointer
 * iwl_mvm_fw_error_next_data - advance fw error dump data pointer
 * @data: previous data block
 * @data: previous data block
+3 −2
Original line number Original line Diff line number Diff line
@@ -138,6 +138,7 @@ struct iwl_ucode_tlv {
};
};


#define IWL_TLV_UCODE_MAGIC		0x0a4c5749
#define IWL_TLV_UCODE_MAGIC		0x0a4c5749
#define FW_VER_HUMAN_READABLE_SZ	64


struct iwl_tlv_ucode_header {
struct iwl_tlv_ucode_header {
	/*
	/*
@@ -148,7 +149,7 @@ struct iwl_tlv_ucode_header {
	 */
	 */
	__le32 zero;
	__le32 zero;
	__le32 magic;
	__le32 magic;
	u8 human_readable[64];
	u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
	__le32 ver;		/* major/minor/API/serial */
	__le32 ver;		/* major/minor/API/serial */
	__le32 build;
	__le32 build;
	__le64 ignore;
	__le64 ignore;
+3 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,8 @@
#include <linux/types.h>
#include <linux/types.h>
#include <net/mac80211.h>
#include <net/mac80211.h>


#include "iwl-fw-file.h"

/**
/**
 * enum iwl_ucode_tlv_flag - ucode API flags
 * enum iwl_ucode_tlv_flag - ucode API flags
 * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
 * @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
@@ -312,6 +314,7 @@ struct iwl_fw {
	bool mvm_fw;
	bool mvm_fw;


	struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
	struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
	u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
};
};


#endif  /* __iwl_fw_h__ */
#endif  /* __iwl_fw_h__ */
+21 −3
Original line number Original line Diff line number Diff line
@@ -827,6 +827,7 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
{
{
	struct iwl_fw_error_dump_file *dump_file;
	struct iwl_fw_error_dump_file *dump_file;
	struct iwl_fw_error_dump_data *dump_data;
	struct iwl_fw_error_dump_data *dump_data;
	struct iwl_fw_error_dump_info *dump_info;
	u32 file_len;
	u32 file_len;
	u32 trans_len;
	u32 trans_len;


@@ -835,10 +836,11 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
	if (mvm->fw_error_dump)
	if (mvm->fw_error_dump)
		return;
		return;


	file_len = mvm->fw_error_sram_len +
	file_len = sizeof(*dump_file) +
		   sizeof(*dump_data) * 3 +
		   mvm->fw_error_sram_len +
		   mvm->fw_error_rxf_len +
		   mvm->fw_error_rxf_len +
		   sizeof(*dump_file) +
		   sizeof(*dump_info);
		   sizeof(*dump_data) * 2;


	trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
	trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
	if (trans_len)
	if (trans_len)
@@ -853,6 +855,22 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
	dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
	dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
	dump_file->file_len = cpu_to_le32(file_len);
	dump_file->file_len = cpu_to_le32(file_len);
	dump_data = (void *)dump_file->data;
	dump_data = (void *)dump_file->data;

	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
	dump_data->len = cpu_to_le32(sizeof(*dump_info));
	dump_info = (void *) dump_data->data;
	dump_info->device_family =
		mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
	memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
	       sizeof(dump_info->fw_human_readable));
	strncpy(dump_info->dev_human_readable, mvm->cfg->name,
		sizeof(dump_info->dev_human_readable));
	strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
		sizeof(dump_info->bus_human_readable));

	dump_data = iwl_mvm_fw_error_next_data(dump_data);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
	dump_data->len = cpu_to_le32(mvm->fw_error_rxf_len);
	dump_data->len = cpu_to_le32(mvm->fw_error_rxf_len);
	memcpy(dump_data->data, mvm->fw_error_rxf, mvm->fw_error_rxf_len);
	memcpy(dump_data->data, mvm->fw_error_rxf, mvm->fw_error_rxf_len);