forked from Minki/linux
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: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
This commit is contained in:
parent
5788ab75ec
commit
06ddbf5ada
@ -567,6 +567,8 @@ static int iwl_parse_tlv_firmware(struct iwl_drv *drv,
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
if (build)
|
||||
|
@ -74,12 +74,15 @@
|
||||
* @IWL_FW_ERROR_DUMP_RXF:
|
||||
* @IWL_FW_ERROR_DUMP_TXCMD: last TX command data, structured as
|
||||
* &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 {
|
||||
IWL_FW_ERROR_DUMP_SRAM = 0,
|
||||
IWL_FW_ERROR_DUMP_REG = 1,
|
||||
IWL_FW_ERROR_DUMP_RXF = 2,
|
||||
IWL_FW_ERROR_DUMP_TXCMD = 3,
|
||||
IWL_FW_ERROR_DUMP_DEV_FW_INFO = 4,
|
||||
|
||||
IWL_FW_ERROR_DUMP_MAX,
|
||||
};
|
||||
@ -120,6 +123,27 @@ struct iwl_fw_error_dump_txcmd {
|
||||
u8 data[];
|
||||
} __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
|
||||
* @data: previous data block
|
||||
|
@ -138,6 +138,7 @@ struct iwl_ucode_tlv {
|
||||
};
|
||||
|
||||
#define IWL_TLV_UCODE_MAGIC 0x0a4c5749
|
||||
#define FW_VER_HUMAN_READABLE_SZ 64
|
||||
|
||||
struct iwl_tlv_ucode_header {
|
||||
/*
|
||||
@ -148,7 +149,7 @@ struct iwl_tlv_ucode_header {
|
||||
*/
|
||||
__le32 zero;
|
||||
__le32 magic;
|
||||
u8 human_readable[64];
|
||||
u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
|
||||
__le32 ver; /* major/minor/API/serial */
|
||||
__le32 build;
|
||||
__le64 ignore;
|
||||
|
@ -65,6 +65,8 @@
|
||||
#include <linux/types.h>
|
||||
#include <net/mac80211.h>
|
||||
|
||||
#include "iwl-fw-file.h"
|
||||
|
||||
/**
|
||||
* enum iwl_ucode_tlv_flag - ucode API flags
|
||||
* @IWL_UCODE_TLV_FLAGS_PAN: This is PAN capable microcode; this previously
|
||||
@ -312,6 +314,7 @@ struct iwl_fw {
|
||||
bool mvm_fw;
|
||||
|
||||
struct ieee80211_cipher_scheme cs[IWL_UCODE_MAX_CS];
|
||||
u8 human_readable[FW_VER_HUMAN_READABLE_SZ];
|
||||
};
|
||||
|
||||
#endif /* __iwl_fw_h__ */
|
||||
|
@ -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_data *dump_data;
|
||||
struct iwl_fw_error_dump_info *dump_info;
|
||||
u32 file_len;
|
||||
u32 trans_len;
|
||||
|
||||
@ -835,10 +836,11 @@ void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
|
||||
if (mvm->fw_error_dump)
|
||||
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 +
|
||||
sizeof(*dump_file) +
|
||||
sizeof(*dump_data) * 2;
|
||||
sizeof(*dump_info);
|
||||
|
||||
trans_len = iwl_trans_dump_data(mvm->trans, NULL, 0);
|
||||
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->file_len = cpu_to_le32(file_len);
|
||||
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->len = cpu_to_le32(mvm->fw_error_rxf_len);
|
||||
memcpy(dump_data->data, mvm->fw_error_rxf, mvm->fw_error_rxf_len);
|
||||
|
Loading…
Reference in New Issue
Block a user