]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
wifi: iwlwifi: pcie: move iwl_trans_pcie_dump_regs() to utils.c
authorRotem Kerem <rotem.kerem@intel.com>
Thu, 12 Jun 2025 11:48:53 +0000 (14:48 +0300)
committerMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 25 Jun 2025 07:57:33 +0000 (10:57 +0300)
Move the iwl_trans_pcie_dump_regs() function to utils.c in the PCIe
directory since it operates on PCIe registers and is not
hardware-dependent.

Refactor the pcie_dbg_dumped_once indicator, previously part of the
iwl_trans_pcie struct, into a static variable within the
iwl_trans_pcie_dump_regs() function, where it is used.

Signed-off-by: Rotem Kerem <rotem.kerem@intel.com>
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20250612144708.06950459ce97.I3105158eb9ae698efebe4b9ada1093aeb1f1b869@changeid
drivers/net/wireless/intel/iwlwifi/Makefile
drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/internal.h
drivers/net/wireless/intel/iwlwifi/pcie/gen1_2/trans.c
drivers/net/wireless/intel/iwlwifi/pcie/utils.c [new file with mode: 0644]
drivers/net/wireless/intel/iwlwifi/pcie/utils.h [new file with mode: 0644]

index 71101067b889ea9657e10da96d35c0890e4f428c..b82392978b7643f0258fbc6e9d6a1976140d38ce 100644 (file)
@@ -9,7 +9,7 @@ iwlwifi-objs            += iwl-utils.o
 iwlwifi-objs           += iwl-phy-db.o iwl-nvm-parse.o
 
 # Bus
-iwlwifi-objs           += pcie/ctxt-info.o pcie/ctxt-info-v2.o pcie/drv.o
+iwlwifi-objs           += pcie/ctxt-info.o pcie/ctxt-info-v2.o pcie/drv.o pcie/utils.o
 iwlwifi-objs           += pcie/gen1_2/rx.o pcie/gen1_2/tx.o pcie/gen1_2/trans.o
 iwlwifi-objs           += pcie/gen1_2/trans-gen2.o pcie/gen1_2/tx-gen2.o
 
index b1dcaae0dc108225721908fdc186100756259cec..52c6c22e2cc657d46a27f745880b58f3b73a95cf 100644 (file)
@@ -384,7 +384,6 @@ struct iwl_pcie_txqs {
  * @txq_memory: TXQ allocation array
  * @sx_waitq: waitqueue for Sx transitions
  * @sx_state: state tracking Sx transitions
- * @pcie_dbg_dumped_once: indicates PCIe regs were dumped already
  * @opmode_down: indicates opmode went away
  * @num_rx_bufs: number of RX buffers to allocate/use
  * @affinity_mask: IRQ affinity mask for each RX queue
@@ -460,7 +459,6 @@ struct iwl_trans_pcie {
 
        u16 num_rx_bufs;
 
-       bool pcie_dbg_dumped_once;
        u32 rx_page_order;
        u32 rx_buf_bytes;
        u32 supported_dma_mask;
@@ -1069,7 +1067,6 @@ static inline bool iwl_pcie_dbg_on(struct iwl_trans *trans)
 }
 
 void iwl_trans_pcie_rf_kill(struct iwl_trans *trans, bool state, bool from_irq);
-void iwl_trans_pcie_dump_regs(struct iwl_trans *trans);
 
 #ifdef CONFIG_IWLWIFI_DEBUGFS
 void iwl_trans_pcie_dbgfs_register(struct iwl_trans *trans);
index 6054ebebd8c8fce2cf7c4040fcac1f51788801c8..c31a62b8f92582a94cb12302cd176770bcd9807b 100644 (file)
 #include "internal.h"
 #include "iwl-fh.h"
 #include "pcie/iwl-context-info-v2.h"
+#include "pcie/utils.h"
 
 /* extended range in FW SRAM */
 #define IWL_FW_MEM_EXTENDED_START      0x40000
 #define IWL_FW_MEM_EXTENDED_END                0x57FFF
 
-void iwl_trans_pcie_dump_regs(struct iwl_trans *trans)
-{
-#define PCI_DUMP_SIZE          352
-#define PCI_MEM_DUMP_SIZE      64
-#define PCI_PARENT_DUMP_SIZE   524
-#define PREFIX_LEN             32
-       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
-       struct pci_dev *pdev = trans_pcie->pci_dev;
-       u32 i, pos, alloc_size, *ptr, *buf;
-       char *prefix;
-
-       if (trans_pcie->pcie_dbg_dumped_once)
-               return;
-
-       /* Should be a multiple of 4 */
-       BUILD_BUG_ON(PCI_DUMP_SIZE > 4096 || PCI_DUMP_SIZE & 0x3);
-       BUILD_BUG_ON(PCI_MEM_DUMP_SIZE > 4096 || PCI_MEM_DUMP_SIZE & 0x3);
-       BUILD_BUG_ON(PCI_PARENT_DUMP_SIZE > 4096 || PCI_PARENT_DUMP_SIZE & 0x3);
-
-       /* Alloc a max size buffer */
-       alloc_size = PCI_ERR_ROOT_ERR_SRC +  4 + PREFIX_LEN;
-       alloc_size = max_t(u32, alloc_size, PCI_DUMP_SIZE + PREFIX_LEN);
-       alloc_size = max_t(u32, alloc_size, PCI_MEM_DUMP_SIZE + PREFIX_LEN);
-       alloc_size = max_t(u32, alloc_size, PCI_PARENT_DUMP_SIZE + PREFIX_LEN);
-
-       buf = kmalloc(alloc_size, GFP_ATOMIC);
-       if (!buf)
-               return;
-       prefix = (char *)buf + alloc_size - PREFIX_LEN;
-
-       IWL_ERR(trans, "iwlwifi transaction failed, dumping registers\n");
-
-       /* Print wifi device registers */
-       sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
-       IWL_ERR(trans, "iwlwifi device config registers:\n");
-       for (i = 0, ptr = buf; i < PCI_DUMP_SIZE; i += 4, ptr++)
-               if (pci_read_config_dword(pdev, i, ptr))
-                       goto err_read;
-       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
-
-       IWL_ERR(trans, "iwlwifi device memory mapped registers:\n");
-       for (i = 0, ptr = buf; i < PCI_MEM_DUMP_SIZE; i += 4, ptr++)
-               *ptr = iwl_read32(trans, i);
-       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
-
-       pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
-       if (pos) {
-               IWL_ERR(trans, "iwlwifi device AER capability structure:\n");
-               for (i = 0, ptr = buf; i < PCI_ERR_ROOT_COMMAND; i += 4, ptr++)
-                       if (pci_read_config_dword(pdev, pos + i, ptr))
-                               goto err_read;
-               print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET,
-                              32, 4, buf, i, 0);
-       }
-
-       /* Print parent device registers next */
-       if (!pdev->bus->self)
-               goto out;
-
-       pdev = pdev->bus->self;
-       sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
-
-       IWL_ERR(trans, "iwlwifi parent port (%s) config registers:\n",
-               pci_name(pdev));
-       for (i = 0, ptr = buf; i < PCI_PARENT_DUMP_SIZE; i += 4, ptr++)
-               if (pci_read_config_dword(pdev, i, ptr))
-                       goto err_read;
-       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
-
-       /* Print root port AER registers */
-       pos = 0;
-       pdev = pcie_find_root_port(pdev);
-       if (pdev)
-               pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
-       if (pos) {
-               IWL_ERR(trans, "iwlwifi root port (%s) AER cap structure:\n",
-                       pci_name(pdev));
-               sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
-               for (i = 0, ptr = buf; i <= PCI_ERR_ROOT_ERR_SRC; i += 4, ptr++)
-                       if (pci_read_config_dword(pdev, pos + i, ptr))
-                               goto err_read;
-               print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32,
-                              4, buf, i, 0);
-       }
-       goto out;
-
-err_read:
-       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
-       IWL_ERR(trans, "Read failed at 0x%X\n", i);
-out:
-       trans_pcie->pcie_dbg_dumped_once = 1;
-       kfree(buf);
-}
-
 int iwl_trans_pcie_sw_reset(struct iwl_trans *trans, bool retake_ownership)
 {
        /* Reset entire device - do controller reset (results in SHRD_HW_RST) */
@@ -704,7 +611,7 @@ static int iwl_pcie_load_firmware_chunk(struct iwl_trans *trans,
                                 trans_pcie->ucode_write_complete, 5 * HZ);
        if (!ret) {
                IWL_ERR(trans, "Failed to load firmware chunk!\n");
-               iwl_trans_pcie_dump_regs(trans);
+               iwl_trans_pcie_dump_regs(trans, trans_pcie->pci_dev);
                return -ETIMEDOUT;
        }
 
@@ -2460,7 +2367,7 @@ bool __iwl_trans_pcie_grab_nic_access(struct iwl_trans *trans, bool silent)
                          "Timeout waiting for hardware access (CSR_GP_CNTRL 0x%08x)\n",
                          cntrl);
 
-               iwl_trans_pcie_dump_regs(trans);
+               iwl_trans_pcie_dump_regs(trans, trans_pcie->pci_dev);
 
                if (iwlwifi_mod_params.remove_when_gone && cntrl == ~0U)
                        iwl_trans_pcie_reset(trans,
@@ -4057,7 +3964,7 @@ int iwl_trans_pcie_copy_imr(struct iwl_trans *trans,
                                 IMR_D2S_REQUESTED, 5 * HZ);
        if (!ret || trans_pcie->imr_status == IMR_D2S_ERROR) {
                IWL_ERR(trans, "Failed to copy IMR Memory chunk!\n");
-               iwl_trans_pcie_dump_regs(trans);
+               iwl_trans_pcie_dump_regs(trans, trans_pcie->pci_dev);
                return -ETIMEDOUT;
        }
        trans_pcie->imr_status = IMR_D2S_IDLE;
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/utils.c b/drivers/net/wireless/intel/iwlwifi/pcie/utils.c
new file mode 100644 (file)
index 0000000..1bb274d
--- /dev/null
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2025 Intel Corporation
+ */
+
+#include <linux/pci.h>
+#include <linux/gfp.h>
+
+#include "iwl-io.h"
+#include "pcie/utils.h"
+
+void iwl_trans_pcie_dump_regs(struct iwl_trans *trans, struct pci_dev *pdev)
+{
+#define PCI_DUMP_SIZE          352
+#define PCI_MEM_DUMP_SIZE      64
+#define PCI_PARENT_DUMP_SIZE   524
+#define PREFIX_LEN             32
+
+       static bool pcie_dbg_dumped_once = 0;
+       u32 i, pos, alloc_size, *ptr, *buf;
+       char *prefix;
+
+       if (pcie_dbg_dumped_once)
+               return;
+
+       /* Should be a multiple of 4 */
+       BUILD_BUG_ON(PCI_DUMP_SIZE > 4096 || PCI_DUMP_SIZE & 0x3);
+       BUILD_BUG_ON(PCI_MEM_DUMP_SIZE > 4096 || PCI_MEM_DUMP_SIZE & 0x3);
+       BUILD_BUG_ON(PCI_PARENT_DUMP_SIZE > 4096 || PCI_PARENT_DUMP_SIZE & 0x3);
+
+       /* Alloc a max size buffer */
+       alloc_size = PCI_ERR_ROOT_ERR_SRC +  4 + PREFIX_LEN;
+       alloc_size = max_t(u32, alloc_size, PCI_DUMP_SIZE + PREFIX_LEN);
+       alloc_size = max_t(u32, alloc_size, PCI_MEM_DUMP_SIZE + PREFIX_LEN);
+       alloc_size = max_t(u32, alloc_size, PCI_PARENT_DUMP_SIZE + PREFIX_LEN);
+
+       buf = kmalloc(alloc_size, GFP_ATOMIC);
+       if (!buf)
+               return;
+       prefix = (char *)buf + alloc_size - PREFIX_LEN;
+
+       IWL_ERR(trans, "iwlwifi transaction failed, dumping registers\n");
+
+       /* Print wifi device registers */
+       sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
+       IWL_ERR(trans, "iwlwifi device config registers:\n");
+       for (i = 0, ptr = buf; i < PCI_DUMP_SIZE; i += 4, ptr++)
+               if (pci_read_config_dword(pdev, i, ptr))
+                       goto err_read;
+       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
+
+       IWL_ERR(trans, "iwlwifi device memory mapped registers:\n");
+       for (i = 0, ptr = buf; i < PCI_MEM_DUMP_SIZE; i += 4, ptr++)
+               *ptr = iwl_read32(trans, i);
+       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
+
+       pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
+       if (pos) {
+               IWL_ERR(trans, "iwlwifi device AER capability structure:\n");
+               for (i = 0, ptr = buf; i < PCI_ERR_ROOT_COMMAND; i += 4, ptr++)
+                       if (pci_read_config_dword(pdev, pos + i, ptr))
+                               goto err_read;
+               print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET,
+                              32, 4, buf, i, 0);
+       }
+
+       /* Print parent device registers next */
+       if (!pdev->bus->self)
+               goto out;
+
+       pdev = pdev->bus->self;
+       sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
+
+       IWL_ERR(trans, "iwlwifi parent port (%s) config registers:\n",
+               pci_name(pdev));
+       for (i = 0, ptr = buf; i < PCI_PARENT_DUMP_SIZE; i += 4, ptr++)
+               if (pci_read_config_dword(pdev, i, ptr))
+                       goto err_read;
+       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
+
+       /* Print root port AER registers */
+       pos = 0;
+       pdev = pcie_find_root_port(pdev);
+       if (pdev)
+               pos = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_ERR);
+       if (pos) {
+               IWL_ERR(trans, "iwlwifi root port (%s) AER cap structure:\n",
+                       pci_name(pdev));
+               sprintf(prefix, "iwlwifi %s: ", pci_name(pdev));
+               for (i = 0, ptr = buf; i <= PCI_ERR_ROOT_ERR_SRC; i += 4, ptr++)
+                       if (pci_read_config_dword(pdev, pos + i, ptr))
+                               goto err_read;
+               print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32,
+                              4, buf, i, 0);
+       }
+       goto out;
+
+err_read:
+       print_hex_dump(KERN_ERR, prefix, DUMP_PREFIX_OFFSET, 32, 4, buf, i, 0);
+       IWL_ERR(trans, "Read failed at 0x%X\n", i);
+out:
+       pcie_dbg_dumped_once = 1;
+       kfree(buf);
+}
diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/utils.h b/drivers/net/wireless/intel/iwlwifi/pcie/utils.h
new file mode 100644 (file)
index 0000000..af2a2ee
--- /dev/null
@@ -0,0 +1,11 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/*
+ * Copyright (C) 2025 Intel Corporation
+ */
+
+#ifndef __iwl_pcie_utils_h__
+#define __iwl_pcie_utils_h__
+
+void iwl_trans_pcie_dump_regs(struct iwl_trans *trans, struct pci_dev *pdev);
+
+#endif /* __iwl_pcie_utils_h__ */