|
@@ -545,11 +545,13 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
|
|
|
struct iwl_fw_error_dump_data *dump_data;
|
|
|
struct iwl_fw_error_dump_info *dump_info;
|
|
|
struct iwl_fw_error_dump_mem *dump_mem;
|
|
|
+ struct iwl_fw_error_dump_smem_cfg *dump_smem_cfg;
|
|
|
struct iwl_fw_error_dump_trigger_desc *dump_trig;
|
|
|
struct iwl_fw_dump_ptrs *fw_error_dump;
|
|
|
struct scatterlist *sg_dump_data;
|
|
|
u32 sram_len, sram_ofs;
|
|
|
const struct iwl_fw_dbg_mem_seg_tlv *fw_dbg_mem = fwrt->fw->dbg_mem_tlv;
|
|
|
+ struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg;
|
|
|
u32 file_len, fifo_data_len = 0, prph_len = 0, radio_len = 0;
|
|
|
u32 smem_len = fwrt->fw->n_dbg_mem_tlv ? 0 : fwrt->trans->cfg->smem_len;
|
|
|
u32 sram2_len = fwrt->fw->n_dbg_mem_tlv ?
|
|
@@ -585,8 +587,6 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
|
|
|
|
|
|
/* reading RXF/TXF sizes */
|
|
|
if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) {
|
|
|
- struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg;
|
|
|
-
|
|
|
fifo_data_len = 0;
|
|
|
|
|
|
/* Count RXF2 size */
|
|
@@ -675,7 +675,8 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
|
|
|
}
|
|
|
|
|
|
file_len = sizeof(*dump_file) +
|
|
|
- sizeof(*dump_data) * 2 +
|
|
|
+ sizeof(*dump_data) * 3 +
|
|
|
+ sizeof(*dump_smem_cfg) +
|
|
|
fifo_data_len +
|
|
|
prph_len +
|
|
|
radio_len +
|
|
@@ -706,8 +707,8 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
|
|
|
|
|
|
/* If we only want a monitor dump, reset the file length */
|
|
|
if (monitor_dump_only) {
|
|
|
- file_len = sizeof(*dump_file) + sizeof(*dump_data) +
|
|
|
- sizeof(*dump_info);
|
|
|
+ file_len = sizeof(*dump_file) + sizeof(*dump_data) * 2 +
|
|
|
+ sizeof(*dump_info) + sizeof(*dump_smem_cfg);
|
|
|
}
|
|
|
|
|
|
if (fwrt->dump.desc)
|
|
@@ -744,6 +745,33 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
|
|
|
sizeof(dump_info->bus_human_readable));
|
|
|
|
|
|
dump_data = iwl_fw_error_next_data(dump_data);
|
|
|
+
|
|
|
+ /* Dump shared memory configuration */
|
|
|
+ dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_CFG);
|
|
|
+ dump_data->len = cpu_to_le32(sizeof(*dump_smem_cfg));
|
|
|
+ dump_smem_cfg = (void *)dump_data->data;
|
|
|
+ dump_smem_cfg->num_lmacs = cpu_to_le32(mem_cfg->num_lmacs);
|
|
|
+ dump_smem_cfg->num_txfifo_entries =
|
|
|
+ cpu_to_le32(mem_cfg->num_txfifo_entries);
|
|
|
+ for (i = 0; i < MAX_NUM_LMAC; i++) {
|
|
|
+ int j;
|
|
|
+
|
|
|
+ for (j = 0; j < TX_FIFO_MAX_NUM; j++)
|
|
|
+ dump_smem_cfg->lmac[i].txfifo_size[j] =
|
|
|
+ cpu_to_le32(mem_cfg->lmac[i].txfifo_size[j]);
|
|
|
+ dump_smem_cfg->lmac[i].rxfifo1_size =
|
|
|
+ cpu_to_le32(mem_cfg->lmac[i].rxfifo1_size);
|
|
|
+ }
|
|
|
+ dump_smem_cfg->rxfifo2_size = cpu_to_le32(mem_cfg->rxfifo2_size);
|
|
|
+ dump_smem_cfg->internal_txfifo_addr =
|
|
|
+ cpu_to_le32(mem_cfg->internal_txfifo_addr);
|
|
|
+ for (i = 0; i < TX_FIFO_INTERNAL_MAX_NUM; i++) {
|
|
|
+ dump_smem_cfg->internal_txfifo_size[i] =
|
|
|
+ cpu_to_le32(mem_cfg->internal_txfifo_size[i]);
|
|
|
+ }
|
|
|
+
|
|
|
+ dump_data = iwl_fw_error_next_data(dump_data);
|
|
|
+
|
|
|
/* We only dump the FIFOs if the FW is in error state */
|
|
|
if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status)) {
|
|
|
iwl_fw_dump_fifos(fwrt, &dump_data);
|