From: Liad Kaufman <[email protected]>

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 <[email protected]>
Signed-off-by: Luca Coelho <[email protected]>
---
 drivers/net/wireless/intel/iwlwifi/pcie/trans.c | 29 +++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
index 70acf850a9f1..85f44d8f1c41 100644
--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
@@ -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;
-- 
2.11.0

Reply via email to