mwifiex: dump pcie scratch registers

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>
This commit is contained in:
Xinming Hu 2016-04-05 01:04:40 -07:00 committed by Kalle Valo
parent bf00dc22bc
commit 4646968b94
3 changed files with 49 additions and 3 deletions

View File

@ -1074,12 +1074,14 @@ void mwifiex_drv_info_dump(struct mwifiex_adapter *adapter)
priv->netdev->name, priv->num_tx_timeout); priv->netdev->name, priv->num_tx_timeout);
} }
if (adapter->iface_type == MWIFIEX_SDIO) { if (adapter->iface_type == MWIFIEX_SDIO ||
p += sprintf(p, "\n=== SDIO register dump===\n"); 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) if (adapter->if_ops.reg_dump)
p += adapter->if_ops.reg_dump(adapter, p); p += adapter->if_ops.reg_dump(adapter, p);
} }
p += sprintf(p, "\n=== more debug information\n"); p += sprintf(p, "\n=== more debug information\n");
debug_info = kzalloc(sizeof(*debug_info), GFP_KERNEL); debug_info = kzalloc(sizeof(*debug_info), GFP_KERNEL);
if (debug_info) { if (debug_info) {

View File

@ -2355,6 +2355,47 @@ static int mwifiex_pcie_host_to_card(struct mwifiex_adapter *adapter, u8 type,
return 0; 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 */ /* This function read/write firmware */
static enum rdwr_status static enum rdwr_status
mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag) 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, .cleanup_mpa_buf = NULL,
.init_fw_port = mwifiex_pcie_init_fw_port, .init_fw_port = mwifiex_pcie_init_fw_port,
.clean_pcie_ring = mwifiex_clean_pcie_ring_buf, .clean_pcie_ring = mwifiex_clean_pcie_ring_buf,
.reg_dump = mwifiex_pcie_reg_dump,
.device_dump = mwifiex_pcie_device_dump, .device_dump = mwifiex_pcie_device_dump,
}; };

View File

@ -73,6 +73,8 @@
#define PCIE_SCRATCH_10_REG 0xCE8 #define PCIE_SCRATCH_10_REG 0xCE8
#define PCIE_SCRATCH_11_REG 0xCEC #define PCIE_SCRATCH_11_REG 0xCEC
#define PCIE_SCRATCH_12_REG 0xCF0 #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_RD_DATA_PTR_Q0_Q1 0xC08C
#define PCIE_WR_DATA_PTR_Q0_Q1 0xC05C #define PCIE_WR_DATA_PTR_Q0_Q1 0xC05C