mwifiex: firmware dump support for w8997 chipset

Current firmware dump solution support w8897 chipset, this
patch extend the exist framework with support for w8997
chipset.

Trigger firmware dump using,
cat /sys/kernel/debug/mwifiex/mlan0/device_dump,
data can be obtain by
cat /sys/class/devcoredump/devcd*/data > data.txt after that.

Signed-off-by: Xinming Hu <huxm@marvell.com>
Signed-off-by: Cathy Luo <cluo@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-02-02 22:05:09 -08:00 committed by Kalle Valo
parent 03f0f7cdeb
commit 11e70824e7
3 changed files with 33 additions and 11 deletions

View File

@ -274,6 +274,7 @@ struct mwifiex_11h_intf_state {
} __packed; } __packed;
#define MWIFIEX_FW_DUMP_IDX 0xff #define MWIFIEX_FW_DUMP_IDX 0xff
#define MWIFIEX_FW_DUMP_MAX_MEMSIZE 0x160000
#define MWIFIEX_DRV_INFO_IDX 20 #define MWIFIEX_DRV_INFO_IDX 20
#define FW_DUMP_MAX_NAME_LEN 8 #define FW_DUMP_MAX_NAME_LEN 8
#define FW_DUMP_HOST_READY 0xEE #define FW_DUMP_HOST_READY 0xEE

View File

@ -2402,7 +2402,7 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
struct pcie_service_card *card = adapter->card; struct pcie_service_card *card = adapter->card;
const struct mwifiex_pcie_card_reg *creg = card->pcie.reg; const struct mwifiex_pcie_card_reg *creg = card->pcie.reg;
unsigned int reg, reg_start, reg_end; unsigned int reg, reg_start, reg_end;
u8 *dbg_ptr, *end_ptr, *tmp_ptr, dump_num; u8 *dbg_ptr, *end_ptr, *tmp_ptr, fw_dump_num, dump_num;
u8 idx, i, read_reg, doneflag = 0; u8 idx, i, read_reg, doneflag = 0;
enum rdwr_status stat; enum rdwr_status stat;
u32 memory_size; u32 memory_size;
@ -2430,22 +2430,32 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
return; return;
reg = creg->fw_dump_start; reg = creg->fw_dump_start;
mwifiex_read_reg_byte(adapter, reg, &dump_num); mwifiex_read_reg_byte(adapter, reg, &fw_dump_num);
/* W8997 chipset firmware dump will be restore in single region*/
if (fw_dump_num == 0)
dump_num = 1;
else
dump_num = fw_dump_num;
/* Read the length of every memory which will dump */ /* Read the length of every memory which will dump */
for (idx = 0; idx < dump_num; idx++) { for (idx = 0; idx < dump_num; idx++) {
struct memory_type_mapping *entry = struct memory_type_mapping *entry =
&adapter->mem_type_mapping_tbl[idx]; &adapter->mem_type_mapping_tbl[idx];
stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
if (stat == RDWR_STATUS_FAILURE)
return;
memory_size = 0; memory_size = 0;
reg = creg->fw_dump_start; if (fw_dump_num != 0) {
for (i = 0; i < 4; i++) { stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
mwifiex_read_reg_byte(adapter, reg, &read_reg); if (stat == RDWR_STATUS_FAILURE)
memory_size |= (read_reg << (i * 8)); return;
reg = creg->fw_dump_start;
for (i = 0; i < 4; i++) {
mwifiex_read_reg_byte(adapter, reg, &read_reg);
memory_size |= (read_reg << (i * 8));
reg++; reg++;
}
} else {
memory_size = MWIFIEX_FW_DUMP_MAX_MEMSIZE;
} }
if (memory_size == 0) { if (memory_size == 0) {

View File

@ -239,6 +239,11 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = {
.ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR, .ring_tx_start_ptr = MWIFIEX_BD_FLAG_TX_START_PTR,
.pfu_enabled = 1, .pfu_enabled = 1,
.sleep_cookie = 0, .sleep_cookie = 0,
.fw_dump_ctrl = 0xcf4,
.fw_dump_start = 0xcf8,
.fw_dump_end = 0xcff,
.fw_dump_host_ready = 0xcc,
.fw_dump_read_done = 0xdd,
.msix_support = 1, .msix_support = 1,
}; };
@ -253,6 +258,10 @@ static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = {
{"MAC", NULL, 0, 0xF7}, {"MAC", NULL, 0, 0xF7},
}; };
static struct memory_type_mapping mem_type_mapping_tbl_w8997[] = {
{"DUMP", NULL, 0, 0xDD},
};
struct mwifiex_pcie_device { struct mwifiex_pcie_device {
const char *firmware; const char *firmware;
const struct mwifiex_pcie_card_reg *reg; const struct mwifiex_pcie_card_reg *reg;
@ -289,7 +298,9 @@ static const struct mwifiex_pcie_device mwifiex_pcie8997 = {
.reg = &mwifiex_reg_8997, .reg = &mwifiex_reg_8997,
.blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD, .blksz_fw_dl = MWIFIEX_PCIE_BLOCK_SIZE_FW_DNLD,
.tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K, .tx_buf_size = MWIFIEX_TX_DATA_BUF_SIZE_4K,
.can_dump_fw = false, .can_dump_fw = true,
.mem_type_mapping_tbl = mem_type_mapping_tbl_w8997,
.num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8997),
.can_ext_scan = true, .can_ext_scan = true,
}; };