提交 50632092 编写于 作者: X Xinming Hu 提交者: Kalle Valo

mwifiex: use an extensible framework for firmware dump solution

This patch apply an extensible firmware dump framework,
so that other chipset can be easily added as needed.
Signed-off-by: NXinming Hu <huxm@marvell.com>
Signed-off-by: NCathy Luo <cluo@marvell.com>
Signed-off-by: NAmitkumar Karwar <akarwar@marvell.com>
Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
上级 9a862322
...@@ -37,17 +37,6 @@ static struct mwifiex_if_ops pcie_ops; ...@@ -37,17 +37,6 @@ static struct mwifiex_if_ops pcie_ops;
static struct semaphore add_remove_card_sem; static struct semaphore add_remove_card_sem;
static struct memory_type_mapping mem_type_mapping_tbl[] = {
{"ITCM", NULL, 0, 0xF0},
{"DTCM", NULL, 0, 0xF1},
{"SQRAM", NULL, 0, 0xF2},
{"IRAM", NULL, 0, 0xF3},
{"APU", NULL, 0, 0xF4},
{"CIU", NULL, 0, 0xF5},
{"ICU", NULL, 0, 0xF6},
{"MAC", NULL, 0, 0xF7},
};
static int static int
mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb, mwifiex_map_pci_memory(struct mwifiex_adapter *adapter, struct sk_buff *skb,
size_t size, int flags) size_t size, int flags)
...@@ -206,6 +195,8 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev, ...@@ -206,6 +195,8 @@ static int mwifiex_pcie_probe(struct pci_dev *pdev,
card->pcie.blksz_fw_dl = data->blksz_fw_dl; card->pcie.blksz_fw_dl = data->blksz_fw_dl;
card->pcie.tx_buf_size = data->tx_buf_size; card->pcie.tx_buf_size = data->tx_buf_size;
card->pcie.can_dump_fw = data->can_dump_fw; card->pcie.can_dump_fw = data->can_dump_fw;
card->pcie.mem_type_mapping_tbl = data->mem_type_mapping_tbl;
card->pcie.num_mem_types = data->num_mem_types;
card->pcie.can_ext_scan = data->can_ext_scan; card->pcie.can_ext_scan = data->can_ext_scan;
} }
...@@ -2373,7 +2364,8 @@ mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag) ...@@ -2373,7 +2364,8 @@ mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status)) if (mwifiex_read_reg(adapter, reg->fw_status, &fw_status))
return RDWR_STATUS_FAILURE; return RDWR_STATUS_FAILURE;
ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, FW_DUMP_HOST_READY); ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
reg->fw_dump_host_ready);
if (ret) { if (ret) {
mwifiex_dbg(adapter, ERROR, mwifiex_dbg(adapter, ERROR,
"PCIE write err\n"); "PCIE write err\n");
...@@ -2386,11 +2378,11 @@ mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag) ...@@ -2386,11 +2378,11 @@ mwifiex_pcie_rdwr_firmware(struct mwifiex_adapter *adapter, u8 doneflag)
return RDWR_STATUS_SUCCESS; return RDWR_STATUS_SUCCESS;
if (doneflag && ctrl_data == doneflag) if (doneflag && ctrl_data == doneflag)
return RDWR_STATUS_DONE; return RDWR_STATUS_DONE;
if (ctrl_data != FW_DUMP_HOST_READY) { if (ctrl_data != reg->fw_dump_host_ready) {
mwifiex_dbg(adapter, WARN, mwifiex_dbg(adapter, WARN,
"The ctrl reg was changed, re-try again!\n"); "The ctrl reg was changed, re-try again!\n");
ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl, ret = mwifiex_write_reg(adapter, reg->fw_dump_ctrl,
FW_DUMP_HOST_READY); reg->fw_dump_host_ready);
if (ret) { if (ret) {
mwifiex_dbg(adapter, ERROR, mwifiex_dbg(adapter, ERROR,
"PCIE write err\n"); "PCIE write err\n");
...@@ -2418,8 +2410,9 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter) ...@@ -2418,8 +2410,9 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
if (!card->pcie.can_dump_fw) if (!card->pcie.can_dump_fw)
return; return;
for (idx = 0; idx < ARRAY_SIZE(mem_type_mapping_tbl); idx++) { for (idx = 0; idx < adapter->num_mem_types; idx++) {
struct memory_type_mapping *entry = &mem_type_mapping_tbl[idx]; struct memory_type_mapping *entry =
&adapter->mem_type_mapping_tbl[idx];
if (entry->mem_ptr) { if (entry->mem_ptr) {
vfree(entry->mem_ptr); vfree(entry->mem_ptr);
...@@ -2440,8 +2433,8 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter) ...@@ -2440,8 +2433,8 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
/* 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 = &mem_type_mapping_tbl[idx]; struct memory_type_mapping *entry =
&adapter->mem_type_mapping_tbl[idx];
stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag); stat = mwifiex_pcie_rdwr_firmware(adapter, doneflag);
if (stat == RDWR_STATUS_FAILURE) if (stat == RDWR_STATUS_FAILURE)
return; return;
...@@ -2457,7 +2450,7 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter) ...@@ -2457,7 +2450,7 @@ static void mwifiex_pcie_fw_dump(struct mwifiex_adapter *adapter)
if (memory_size == 0) { if (memory_size == 0) {
mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n"); mwifiex_dbg(adapter, MSG, "Firmware dump Finished!\n");
ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl, ret = mwifiex_write_reg(adapter, creg->fw_dump_ctrl,
FW_DUMP_READ_DONE); creg->fw_dump_read_done);
if (ret) { if (ret) {
mwifiex_dbg(adapter, ERROR, "PCIE write err\n"); mwifiex_dbg(adapter, ERROR, "PCIE write err\n");
return; return;
...@@ -2762,8 +2755,8 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter) ...@@ -2762,8 +2755,8 @@ static int mwifiex_register_dev(struct mwifiex_adapter *adapter)
return -1; return -1;
adapter->tx_buf_size = card->pcie.tx_buf_size; adapter->tx_buf_size = card->pcie.tx_buf_size;
adapter->mem_type_mapping_tbl = mem_type_mapping_tbl; adapter->mem_type_mapping_tbl = card->pcie.mem_type_mapping_tbl;
adapter->num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl); adapter->num_mem_types = card->pcie.num_mem_types;
strcpy(adapter->fw_name, card->pcie.firmware); strcpy(adapter->fw_name, card->pcie.firmware);
adapter->ext_scan = card->pcie.can_ext_scan; adapter->ext_scan = card->pcie.can_ext_scan;
......
...@@ -136,6 +136,8 @@ struct mwifiex_pcie_card_reg { ...@@ -136,6 +136,8 @@ struct mwifiex_pcie_card_reg {
u16 fw_dump_ctrl; u16 fw_dump_ctrl;
u16 fw_dump_start; u16 fw_dump_start;
u16 fw_dump_end; u16 fw_dump_end;
u8 fw_dump_host_ready;
u8 fw_dump_read_done;
u8 msix_support; u8 msix_support;
}; };
...@@ -203,6 +205,8 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = { ...@@ -203,6 +205,8 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8897 = {
.fw_dump_ctrl = 0xcf4, .fw_dump_ctrl = 0xcf4,
.fw_dump_start = 0xcf8, .fw_dump_start = 0xcf8,
.fw_dump_end = 0xcff, .fw_dump_end = 0xcff,
.fw_dump_host_ready = 0xee,
.fw_dump_read_done = 0xfe,
.msix_support = 0, .msix_support = 0,
}; };
...@@ -238,12 +242,25 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = { ...@@ -238,12 +242,25 @@ static const struct mwifiex_pcie_card_reg mwifiex_reg_8997 = {
.msix_support = 1, .msix_support = 1,
}; };
static struct memory_type_mapping mem_type_mapping_tbl_w8897[] = {
{"ITCM", NULL, 0, 0xF0},
{"DTCM", NULL, 0, 0xF1},
{"SQRAM", NULL, 0, 0xF2},
{"IRAM", NULL, 0, 0xF3},
{"APU", NULL, 0, 0xF4},
{"CIU", NULL, 0, 0xF5},
{"ICU", NULL, 0, 0xF6},
{"MAC", NULL, 0, 0xF7},
};
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;
u16 blksz_fw_dl; u16 blksz_fw_dl;
u16 tx_buf_size; u16 tx_buf_size;
bool can_dump_fw; bool can_dump_fw;
struct memory_type_mapping *mem_type_mapping_tbl;
u8 num_mem_types;
bool can_ext_scan; bool can_ext_scan;
}; };
...@@ -262,6 +279,8 @@ static const struct mwifiex_pcie_device mwifiex_pcie8897 = { ...@@ -262,6 +279,8 @@ static const struct mwifiex_pcie_device mwifiex_pcie8897 = {
.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 = true, .can_dump_fw = true,
.mem_type_mapping_tbl = mem_type_mapping_tbl_w8897,
.num_mem_types = ARRAY_SIZE(mem_type_mapping_tbl_w8897),
.can_ext_scan = true, .can_ext_scan = true,
}; };
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册