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

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
...@@ -567,6 +567,8 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv, ...@@ -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)
......
...@@ -74,12 +74,15 @@ ...@@ -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 { ...@@ -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
......
...@@ -138,6 +138,7 @@ struct iwl_ucode_tlv { ...@@ -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 { ...@@ -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;
......
...@@ -65,6 +65,8 @@ ...@@ -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 { ...@@ -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__ */
...@@ -827,6 +827,7 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment