]> git.baikalelectronics.ru Git - kernel.git/commitdiff
iwlwifi: dbg: split iwl_fw_error_dump to two functions
authorSara Sharon <sara.sharon@intel.com>
Mon, 11 Jun 2018 12:30:07 +0000 (15:30 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Sat, 6 Oct 2018 07:25:43 +0000 (10:25 +0300)
Split iwl_fw_error_dump to two parts.  The first part will dump the
actual data, and second will do the file allocations, trans calls and
actual file operations.  This is done in order to enable reuse of the
code for the new debug ini infrastructure.

Signed-off-by: Sara Sharon <sara.sharon@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/dbg.c

index c2a6c4ffd35661c84045d44f6d83ba887cbd84a4..d3d0a197942febe59a462fc20ceca0e86e4e2f0d 100644 (file)
@@ -683,15 +683,15 @@ out:
        return fifo_len;
 }
 
-void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
+static struct iwl_fw_error_dump_file *
+_iwl_fw_error_dump(struct iwl_fw_runtime *fwrt,
+                  struct iwl_fw_dump_ptrs *fw_error_dump)
 {
        struct iwl_fw_error_dump_file *dump_file;
        struct iwl_fw_error_dump_data *dump_data;
        struct iwl_fw_error_dump_info *dump_info;
        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_mem = fwrt->fw->dbg.mem_tlv;
        struct iwl_fwrt_shared_mem_cfg *mem_cfg = &fwrt->smem_cfg;
@@ -702,22 +702,10 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
        bool monitor_dump_only = false;
        int i;
 
-       IWL_DEBUG_INFO(fwrt, "WRT dump start\n");
-
-       /* there's no point in fw dump if the bus is dead */
-       if (test_bit(STATUS_TRANS_DEAD, &fwrt->trans->status)) {
-               IWL_ERR(fwrt, "Skip fw error dump since bus is dead\n");
-               goto out;
-       }
-
        if (fwrt->dump.trig &&
            fwrt->dump.trig->mode & IWL_FW_DBG_TRIGGER_MONITOR_ONLY)
                monitor_dump_only = true;
 
-       fw_error_dump = kzalloc(sizeof(*fw_error_dump), GFP_KERNEL);
-       if (!fw_error_dump)
-               goto out;
-
        /* SRAM - include stack CCM if driver knows the values for it */
        if (!fwrt->trans->cfg->dccm_offset || !fwrt->trans->cfg->dccm_len) {
                const struct fw_img *img;
@@ -794,10 +782,8 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
                            fwrt->dump.desc->len;
 
        dump_file = vzalloc(file_len);
-       if (!dump_file) {
-               kfree(fw_error_dump);
-               goto out;
-       }
+       if (!dump_file)
+               return NULL;
 
        fw_error_dump->fwrt_ptr = dump_file;
 
@@ -876,7 +862,7 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
 
        /* In case we only want monitor dump, skip to dump trasport data */
        if (monitor_dump_only)
-               goto dump_trans_data;
+               goto out;
 
        if (fwrt->fw->dbg.dump_mask & BIT(IWL_FW_ERROR_DUMP_MEM))
                iwl_fw_dump_mem(fwrt, &dump_data, sram_len, sram_ofs, smem_len,
@@ -939,13 +925,44 @@ void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
                                      ARRAY_SIZE(iwl_prph_dump_addr_9000));
        }
 
-dump_trans_data:
+out:
+       dump_file->file_len = cpu_to_le32(file_len);
+       return dump_file;
+}
+
+void iwl_fw_error_dump(struct iwl_fw_runtime *fwrt)
+{
+       struct iwl_fw_dump_ptrs *fw_error_dump;
+       struct iwl_fw_error_dump_file *dump_file;
+       struct scatterlist *sg_dump_data;
+       u32 file_len;
+
+       IWL_DEBUG_INFO(fwrt, "WRT dump start\n");
+
+       /* there's no point in fw dump if the bus is dead */
+       if (test_bit(STATUS_TRANS_DEAD, &fwrt->trans->status)) {
+               IWL_ERR(fwrt, "Skip fw error dump since bus is dead\n");
+               goto out;
+       }
+
+       fw_error_dump = kzalloc(sizeof(*fw_error_dump), GFP_KERNEL);
+       if (!fw_error_dump)
+               goto out;
+
+       dump_file = _iwl_fw_error_dump(fwrt, fw_error_dump);
+       if (!dump_file) {
+               kfree(fw_error_dump);
+               goto out;
+       }
+
        fw_error_dump->trans_ptr = iwl_trans_dump_data(fwrt->trans,
                                                       fwrt->dump.trig);
+       file_len = le32_to_cpu(dump_file->file_len);
        fw_error_dump->fwrt_len = file_len;
-       if (fw_error_dump->trans_ptr)
+       if (fw_error_dump->trans_ptr) {
                file_len += fw_error_dump->trans_ptr->len;
-       dump_file->file_len = cpu_to_le32(file_len);
+               dump_file->file_len = cpu_to_le32(file_len);
+       }
 
        sg_dump_data = alloc_sgtable(file_len);
        if (sg_dump_data) {