OSDN Git Service

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 c2a6c4f..d3d0a19 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) {