mirror of https://gitee.com/openkylin/linux.git
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:
parent
03f0f7cdeb
commit
11e70824e7
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue