From: Shahar S Matityahu <shahar.s.matity...@intel.com>

Allow to collect error table data.

Signed-off-by: Shahar S Matityahu <shahar.s.matity...@intel.com>
Signed-off-by: Luca Coelho <luciano.coe...@intel.com>
---
 drivers/net/wireless/intel/iwlwifi/fw/dbg.c   | 61 ++++++++++++++++++-
 .../wireless/intel/iwlwifi/fw/error-dump.h    | 11 ++++
 2 files changed, 70 insertions(+), 2 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c 
b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
index dbaaac2486c7..ee555b8cf5bb 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
@@ -1430,6 +1430,25 @@ static int iwl_dump_ini_rxf_iter(struct iwl_fw_runtime 
*fwrt,
        return sizeof(*range) + le32_to_cpu(range->range_data_size);
 }
 
+static int
+iwl_dump_ini_err_table_iter(struct iwl_fw_runtime *fwrt,
+                           struct iwl_dump_ini_region_data *reg_data,
+                           void *range_ptr, int idx)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       struct iwl_fw_ini_region_err_table *err_table = &reg->err_table;
+       struct iwl_fw_ini_error_dump_range *range = range_ptr;
+       u32 addr = le32_to_cpu(err_table->base_addr) +
+                  le32_to_cpu(err_table->offset);
+
+       range->internal_base_addr = cpu_to_le32(addr);
+       range->range_data_size = err_table->size;
+       iwl_trans_read_mem_bytes(fwrt->trans, addr, range->data,
+                                le32_to_cpu(err_table->size));
+
+       return sizeof(*range) + le32_to_cpu(range->range_data_size);
+}
+
 static void *
 iwl_dump_ini_mem_fill_header(struct iwl_fw_runtime *fwrt,
                             struct iwl_dump_ini_region_data *reg_data,
@@ -1524,6 +1543,20 @@ iwl_dump_ini_mon_smem_fill_header(struct iwl_fw_runtime 
*fwrt,
                                            &fwrt->trans->cfg->mon_smem_regs);
 }
 
+static void *
+iwl_dump_ini_err_table_fill_header(struct iwl_fw_runtime *fwrt,
+                                  struct iwl_dump_ini_region_data *reg_data,
+                                  void *data)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       struct iwl_fw_ini_err_table_dump *dump = data;
+
+       dump->header.version = cpu_to_le32(IWL_INI_DUMP_VER);
+       dump->version = reg->err_table.version;
+
+       return dump->ranges;
+}
+
 static u32 iwl_dump_ini_mem_ranges(struct iwl_fw_runtime *fwrt,
                                   struct iwl_dump_ini_region_data *reg_data)
 {
@@ -1706,6 +1739,20 @@ static u32 iwl_dump_ini_rxf_get_size(struct 
iwl_fw_runtime *fwrt,
        return size;
 }
 
+static u32
+iwl_dump_ini_err_table_get_size(struct iwl_fw_runtime *fwrt,
+                               struct iwl_dump_ini_region_data *reg_data)
+{
+       struct iwl_fw_ini_region_tlv *reg = (void *)reg_data->reg_tlv->data;
+       u32 size = le32_to_cpu(reg->err_table.size);
+
+       if (size)
+               size += sizeof(struct iwl_fw_ini_err_table_dump) +
+                       sizeof(struct iwl_fw_ini_error_dump_range);
+
+       return size;
+}
+
 /**
  * struct iwl_dump_ini_mem_ops - ini memory dump operations
  * @get_num_of_ranges: returns the number of memory ranges in the region.
@@ -1892,8 +1939,18 @@ static const struct iwl_dump_ini_mem_ops 
iwl_dump_ini_region_ops[] = {
                .fill_mem_hdr = iwl_dump_ini_mem_fill_header,
                .fill_range = iwl_dump_ini_rxf_iter,
        },
-       [IWL_FW_INI_REGION_LMAC_ERROR_TABLE] = {},
-       [IWL_FW_INI_REGION_UMAC_ERROR_TABLE] = {},
+       [IWL_FW_INI_REGION_LMAC_ERROR_TABLE] = {
+               .get_num_of_ranges = iwl_dump_ini_single_range,
+               .get_size = iwl_dump_ini_err_table_get_size,
+               .fill_mem_hdr = iwl_dump_ini_err_table_fill_header,
+               .fill_range = iwl_dump_ini_err_table_iter,
+       },
+       [IWL_FW_INI_REGION_UMAC_ERROR_TABLE] = {
+               .get_num_of_ranges = iwl_dump_ini_single_range,
+               .get_size = iwl_dump_ini_err_table_get_size,
+               .fill_mem_hdr = iwl_dump_ini_err_table_fill_header,
+               .fill_range = iwl_dump_ini_err_table_iter,
+       },
        [IWL_FW_INI_REGION_RSP_OR_NOTIF] = {},
        [IWL_FW_INI_REGION_DEVICE_MEMORY] = {
                .get_num_of_ranges = iwl_dump_ini_mem_ranges,
diff --git a/drivers/net/wireless/intel/iwlwifi/fw/error-dump.h 
b/drivers/net/wireless/intel/iwlwifi/fw/error-dump.h
index 629af3f9c683..7be1c4b54503 100644
--- a/drivers/net/wireless/intel/iwlwifi/fw/error-dump.h
+++ b/drivers/net/wireless/intel/iwlwifi/fw/error-dump.h
@@ -434,7 +434,18 @@ struct iwl_fw_ini_dump_info {
        u8 external_dbg_cfg_name[IWL_FW_INI_MAX_DBG_CFG_NAME_LEN];
        __le32 regions_num;
        __le32 region_ids[];
+} __packed;
 
+/**
+ * struct iwl_fw_ini_err_table_dump - ini error table dump
+ * @header: header of the region
+ * @version: error table version
+ * @ranges: the memory ranges of this this region
+ */
+struct iwl_fw_ini_err_table_dump {
+       struct iwl_fw_ini_error_dump_header header;
+       __le32 version;
+       struct iwl_fw_ini_error_dump_range ranges[];
 } __packed;
 
 /**
-- 
2.23.0

Reply via email to