mwifiex: dump pcie scratch registers
authorXinming Hu <huxm@marvell.com>
Tue, 5 Apr 2016 08:04:40 +0000 (01:04 -0700)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 7 Apr 2016 16:42:26 +0000 (19:42 +0300)
This patch prints pcie scratch registers during firmware dump. They
will be useful for analysing firmware status.

Signed-off-by: Xinming Hu <huxm@marvell.com>
Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/main.c
drivers/net/wireless/marvell/mwifiex/pcie.c
drivers/net/wireless/marvell/mwifiex/pcie.h

index 3cfa946..04b975c 100644 (file)
@@ -1074,12 +1074,14 @@ void mwifiex_drv_info_dump(struct mwifiex_adapter *adapter)
                             priv->netdev->name, priv->num_tx_timeout);
        }
 
-       if (adapter->iface_type == MWIFIEX_SDIO) {
-               p += sprintf(p, "\n=== SDIO register dump===\n");
+       if (adapter->iface_type == MWIFIEX_SDIO ||
+           adapter->iface_type == MWIFIEX_PCIE) {
+               p += sprintf(p, "\n=== %s register dump===\n",
+                            adapter->iface_type == MWIFIEX_SDIO ?
+                                                       "SDIO" : "PCIE");
                if (adapter->if_ops.reg_dump)
                        p += adapter->if_ops.reg_dump(adapter, p);
        }
-
        p += sprintf(p, "\n=== more debug information\n");
        debug_info = kzalloc(sizeof(*debug_info), GFP_KERNEL);
        if (debug_info) {
index 6a06ca5..edf8b07 100644 (file)
@@ -2355,6 +2355,47 @@ static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
        return 0;
 }
 
+/* Function to dump PCIE scratch registers in case of FW crash
+ */
+static int
+mwifiex_pcie_reg_dump(struct mwifiex_adapter *adapter, char *drv_buf)
+{
+       char *p = drv_buf;
+       char buf[256], *ptr;
+       int i;
+       u32 value;
+       struct pcie_service_card *card = adapter->card;
+       const struct mwifiex_pcie_card_reg *reg = card->pcie.reg;
+       int pcie_scratch_reg[] = {PCIE_SCRATCH_12_REG,
+                                 PCIE_SCRATCH_13_REG,
+                                 PCIE_SCRATCH_14_REG};
+
+       if (!p)
+               return 0;
+
+       mwifiex_dbg(adapter, MSG, "PCIE register dump start\n");
+
+       if (mwifiex_read_reg(adapter, reg->fw_status, &value)) {
+               mwifiex_dbg(adapter, ERROR, "failed to read firmware status");
+               return 0;
+       }
+
+       ptr = buf;
+       mwifiex_dbg(adapter, MSG, "pcie scratch register:");
+       for (i = 0; i < ARRAY_SIZE(pcie_scratch_reg); i++) {
+               mwifiex_read_reg(adapter, pcie_scratch_reg[i], &value);
+               ptr += sprintf(ptr, "reg:0x%x, value=0x%x\n",
+                              pcie_scratch_reg[i], value);
+       }
+
+       mwifiex_dbg(adapter, MSG, "%s\n", buf);
+       p += sprintf(p, "%s\n", buf);
+
+       mwifiex_dbg(adapter, MSG, "PCIE register dump end\n");
+
+       return p - drv_buf;
+}
+
 /* This function read/write firmware */
 static enum rdwr_status
 mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
@@ -2899,6 +2940,7 @@ static struct mwifiex_if_ops pcie_ops = {
        .cleanup_mpa_buf =              NULL,
        .init_fw_port =                 mwifiex_pcie_init_fw_port,
        .clean_pcie_ring =              mwifiex_clean_pcie_ring_buf,
+       .reg_dump =                     mwifiex_pcie_reg_dump,
        .device_dump =                  mwifiex_pcie_device_dump,
 };
 
index 4455d19..cc7a5df 100644 (file)
@@ -73,6 +73,8 @@
 #define PCIE_SCRATCH_10_REG                            0xCE8
 #define PCIE_SCRATCH_11_REG                            0xCEC
 #define PCIE_SCRATCH_12_REG                            0xCF0
+#define PCIE_SCRATCH_13_REG                            0xCF8
+#define PCIE_SCRATCH_14_REG                            0xCFC
 #define PCIE_RD_DATA_PTR_Q0_Q1                          0xC08C
 #define PCIE_WR_DATA_PTR_Q0_Q1                          0xC05C