iwlwifi: pcie: support page dumping in wrt in gen2
authorLiad Kaufman <liad.kaufman@intel.com>
Sun, 12 Mar 2017 09:09:58 +0000 (11:09 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 2 Jun 2017 11:07:54 +0000 (14:07 +0300)
In gen2, page dumping needs to be done in the trans
layer, as it is the one with access to the paging
pointers.

Signed-off-by: Liad Kaufman <liad.kaufman@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/pcie/trans.c

index 70acf85..85f44d8 100644 (file)
@@ -2754,6 +2754,13 @@ static struct iwl_trans_dump_data
                                  (PAGE_SIZE << trans_pcie->rx_page_order));
        }
 
+       /* Paged memory for gen2 HW */
+       if (trans->cfg->gen2)
+               for (i = 0; i < trans_pcie->init_dram.paging_cnt; i++)
+                       len += sizeof(*data) +
+                              sizeof(struct iwl_fw_error_dump_paging) +
+                              trans_pcie->init_dram.paging[i].size;
+
        dump_data = vzalloc(len);
        if (!dump_data)
                return NULL;
@@ -2793,6 +2800,28 @@ static struct iwl_trans_dump_data
        if (dump_rbs)
                len += iwl_trans_pcie_dump_rbs(trans, &data, num_rbs);
 
+       /* Paged memory for gen2 HW */
+       if (trans->cfg->gen2) {
+               for (i = 0; i < trans_pcie->init_dram.paging_cnt; i++) {
+                       struct iwl_fw_error_dump_paging *paging;
+                       dma_addr_t addr =
+                               trans_pcie->init_dram.paging[i].physical;
+                       u32 page_len = trans_pcie->init_dram.paging[i].size;
+
+                       data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_PAGING);
+                       data->len = cpu_to_le32(sizeof(*paging) + page_len);
+                       paging = (void *)data->data;
+                       paging->index = cpu_to_le32(i);
+                       dma_sync_single_for_cpu(trans->dev, addr, page_len,
+                                               DMA_BIDIRECTIONAL);
+                       memcpy(paging->data,
+                              trans_pcie->init_dram.paging[i].block, page_len);
+                       data = iwl_fw_error_next_data(data);
+
+                       len += sizeof(*data) + sizeof(*paging) + page_len;
+               }
+       }
+
        len += iwl_trans_pcie_dump_monitor(trans, &data, monitor_len);
 
        dump_data->len = len;