Commit e8704b81 authored by Shahar S Matityahu's avatar Shahar S Matityahu Committed by Luca Coelho

iwlwifi: dbg_ini: abort region collection in case the size is 0

Allows to abort region collection in case the region size is 0.
It is needed for future regions that their size might be 0.
Signed-off-by: default avatarShahar S Matityahu <shahar.s.matityahu@intel.com>
Signed-off-by: default avatarLuca Coelho <luciano.coelho@intel.com>
parent 6669e924
...@@ -1674,20 +1674,24 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt, ...@@ -1674,20 +1674,24 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt,
struct iwl_dump_ini_mem_ops *ops) struct iwl_dump_ini_mem_ops *ops)
{ {
struct iwl_fw_ini_error_dump_header *header = (void *)(*data)->data; struct iwl_fw_ini_error_dump_header *header = (void *)(*data)->data;
u32 num_of_ranges, i, type = le32_to_cpu(reg->region_type); u32 num_of_ranges, i, type = le32_to_cpu(reg->region_type), size;
void *range; void *range;
if (WARN_ON(!ops || !ops->get_num_of_ranges || !ops->get_size || if (WARN_ON(!ops || !ops->get_num_of_ranges || !ops->get_size ||
!ops->fill_mem_hdr || !ops->fill_range)) !ops->fill_mem_hdr || !ops->fill_range))
return; return;
size = ops->get_size(fwrt, reg);
if (!size)
return;
IWL_DEBUG_FW(fwrt, "WRT: collecting region: id=%d, type=%d\n", IWL_DEBUG_FW(fwrt, "WRT: collecting region: id=%d, type=%d\n",
le32_to_cpu(reg->region_id), type); le32_to_cpu(reg->region_id), type);
num_of_ranges = ops->get_num_of_ranges(fwrt, reg); num_of_ranges = ops->get_num_of_ranges(fwrt, reg);
(*data)->type = cpu_to_le32(type | INI_DUMP_BIT); (*data)->type = cpu_to_le32(type | INI_DUMP_BIT);
(*data)->len = cpu_to_le32(ops->get_size(fwrt, reg)); (*data)->len = cpu_to_le32(size);
header->region_id = reg->region_id; header->region_id = reg->region_id;
header->num_of_ranges = cpu_to_le32(num_of_ranges); header->num_of_ranges = cpu_to_le32(num_of_ranges);
...@@ -1700,7 +1704,7 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt, ...@@ -1700,7 +1704,7 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt,
IWL_ERR(fwrt, IWL_ERR(fwrt,
"WRT: failed to fill region header: id=%d, type=%d\n", "WRT: failed to fill region header: id=%d, type=%d\n",
le32_to_cpu(reg->region_id), type); le32_to_cpu(reg->region_id), type);
memset(*data, 0, le32_to_cpu((*data)->len)); memset(*data, 0, size);
return; return;
} }
...@@ -1711,7 +1715,7 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt, ...@@ -1711,7 +1715,7 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt,
IWL_ERR(fwrt, IWL_ERR(fwrt,
"WRT: failed to dump region: id=%d, type=%d\n", "WRT: failed to dump region: id=%d, type=%d\n",
le32_to_cpu(reg->region_id), type); le32_to_cpu(reg->region_id), type);
memset(*data, 0, le32_to_cpu((*data)->len)); memset(*data, 0, size);
return; return;
} }
range = range + range_size; range = range + range_size;
...@@ -1722,7 +1726,8 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt, ...@@ -1722,7 +1726,8 @@ iwl_dump_ini_mem(struct iwl_fw_runtime *fwrt,
static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt, static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt,
struct iwl_fw_ini_trigger *trigger) struct iwl_fw_ini_trigger *trigger)
{ {
int i, size = 0, hdr_len = sizeof(struct iwl_fw_error_dump_data); int i, ret_size = 0, hdr_len = sizeof(struct iwl_fw_error_dump_data);
u32 size;
if (!trigger || !trigger->num_regions) if (!trigger || !trigger->num_regions)
return 0; return 0;
...@@ -1754,32 +1759,40 @@ static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt, ...@@ -1754,32 +1759,40 @@ static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt,
case IWL_FW_INI_REGION_CSR: case IWL_FW_INI_REGION_CSR:
case IWL_FW_INI_REGION_LMAC_ERROR_TABLE: case IWL_FW_INI_REGION_LMAC_ERROR_TABLE:
case IWL_FW_INI_REGION_UMAC_ERROR_TABLE: case IWL_FW_INI_REGION_UMAC_ERROR_TABLE:
size += hdr_len + iwl_dump_ini_mem_get_size(fwrt, reg); size = iwl_dump_ini_mem_get_size(fwrt, reg);
if (size)
ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_TXF: case IWL_FW_INI_REGION_TXF:
size += hdr_len + iwl_dump_ini_txf_get_size(fwrt, reg); size = iwl_dump_ini_txf_get_size(fwrt, reg);
if (size)
ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_RXF: case IWL_FW_INI_REGION_RXF:
size += hdr_len + iwl_dump_ini_rxf_get_size(fwrt, reg); size = iwl_dump_ini_rxf_get_size(fwrt, reg);
if (size)
ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_PAGING: case IWL_FW_INI_REGION_PAGING:
size += hdr_len; if (iwl_fw_dbg_is_paging_enabled(fwrt))
if (iwl_fw_dbg_is_paging_enabled(fwrt)) { size = iwl_dump_ini_paging_get_size(fwrt, reg);
size += iwl_dump_ini_paging_get_size(fwrt, reg); else
} else { size = iwl_dump_ini_paging_gen2_get_size(fwrt,
size += iwl_dump_ini_paging_gen2_get_size(fwrt, reg);
reg); if (size)
} ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_DRAM_BUFFER: case IWL_FW_INI_REGION_DRAM_BUFFER:
if (!fwrt->trans->num_blocks) if (!fwrt->trans->num_blocks)
break; break;
size += hdr_len + size = iwl_dump_ini_mon_dram_get_size(fwrt, reg);
iwl_dump_ini_mon_dram_get_size(fwrt, reg); if (size)
ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_INTERNAL_BUFFER: case IWL_FW_INI_REGION_INTERNAL_BUFFER:
size += hdr_len + size = iwl_dump_ini_mon_smem_get_size(fwrt, reg);
iwl_dump_ini_mon_smem_get_size(fwrt, reg); if (size)
ret_size += hdr_len + size;
break; break;
case IWL_FW_INI_REGION_DRAM_IMR: case IWL_FW_INI_REGION_DRAM_IMR:
/* Undefined yet */ /* Undefined yet */
...@@ -1787,7 +1800,7 @@ static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt, ...@@ -1787,7 +1800,7 @@ static int iwl_fw_ini_get_trigger_len(struct iwl_fw_runtime *fwrt,
break; break;
} }
} }
return size; return ret_size;
} }
static void iwl_fw_ini_dump_trigger(struct iwl_fw_runtime *fwrt, static void iwl_fw_ini_dump_trigger(struct iwl_fw_runtime *fwrt,
......
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