ath10k: fix module load regression with iram-recovery feature
PATCH v2 1/1 ath10k: fix module load regression with iram-recovery feature
From: Abinaya Kalaiselvan <[email protected]>
Commit 9af7c32ceca8 ("ath10k: add target IRAM recovery feature support") introduced a new firmware feature flag ATH10K_FW_FEATURE_IRAM_RECOVERY. But this caused ath10k_pci module load to fail if ATH10K_FW_CRASH_DUMP_RAM_DATA bit was not enabled in the ath10k coredump_mask module parameter:
[ 2209.328190] ath10k_pci 0000:02:00.0: qca9984/qca9994 hw1.0 target 0x01000000 chip_id 0x00000000 sub 168c:cafe [ 2209.434414] ath10k_pci 0000:02:00.0: kconfig debug 1 debugfs 1 tracing 1 dfs 1 testmode 1 [ 2209.547191] ath10k_pci 0000:02:00.0: firmware ver 10.4-3.9.0.2-00099 api 5 features no-p2p,mfp,peer-flow-ctrl,btcoex-param,allows-mesh-bcast,no-ps,peer-fixed-rate,iram-recovery crc32 cbade90a [ 2210.896485] ath10k_pci 0000:02:00.0: board_file api 1 bmi_id 0:1 crc32 a040efc2 [ 2213.603339] ath10k_pci 0000:02:00.0: failed to copy target iram contents: -12 [ 2213.839027] ath10k_pci 0000:02:00.0: could not init core (-12) [ 2213.933910] ath10k_pci 0000:02:00.0: could not probe fw (-12)
And by default coredump_mask does not have ATH10K_FW_CRASH_DUMP_RAM_DATA enabled so anyone using a firmware with iram-recovery feature would fail. To my knowledge only QCA9984 firmwares starting from release 10.4-3.9.0.2-00099 enabled the feature.
The reason for regression was that ath10k_core_copy_target_iram() used ath10k_coredump_get_mem_layout() to get the memory layout, but when ATH10K_FW_CRASH_DUMP_RAM_DATA was disabled it would get just NULL and bail out with an error.
While looking at all this I noticed another bug: if CONFIG_DEV_COREDUMP is disabled but the firmware has iram-recovery enabled the module load fails with similar error messages. I fixed that by returning 0 from ath10k_core_copy_target_iram() when _ath10k_coredump_get_mem_layout() returns NULL.
Tested-on: QCA9984 hw2.0 PCI 10.4-3.9.0.2-00139
---
v2:
* rewrite the commit log
* more understandable naming for functions
* fix both the compile and runtime issues when CONFIG_DEV_COREDUMP is disabled
drivers/net/wireless/ath/ath10k/core.c | 11 +++++++++-- drivers/net/wireless/ath/ath10k/coredump.c | 11 ++++++++--- drivers/net/wireless/ath/ath10k/coredump.h | 7 +++++++ 3 files changed, 24 insertions(+), 5 deletions(-)
drivers/net/wireless/ath/ath10k/core.c +9 -2
@@ -2690,9 +2690,16 @@ static int ath10k_core_copy_target_iram(struct ath10k *ar)int i, ret;u32 len, remaining_len; - hw_mem =ath10k_coredump_get_mem_layout (ar); +/* copy target iram feature must work also when +* ATH10K_FW_CRASH_DUMP_RAM_DATA is disabled, so +* _ath10k_coredump_get_mem_layout() to accomplist that +*/ + hw_mem =_ath10k_coredump_get_mem_layout (ar);if (!hw_mem) -return -ENOMEM ; +/* if CONFIG_DEV_COREDUMP is disabled we get NULL, then +* just silently disable the feature by doing nothing +*/ +return 0 ;for (i =0 ; i < hw_mem->region_table.size; i++) { tmp = &hw_mem->region_table.regions[i];
drivers/net/wireless/ath/ath10k/coredump.c +8 -3
@@ -1447,11 +1447,17 @@ static u32 ath10k_coredump_get_ramdump_size(struct ath10k *ar)const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout (struct ath10k *ar) { -int i; -if (!test_bit (ATH10K_FW_CRASH_DUMP_RAM_DATA , &ath10k_coredump_mask))return NULL ; +return _ath10k_coredump_get_mem_layout (ar); +} +EXPORT_SYMBOL (ath10k_coredump_get_mem_layout); + +const struct ath10k_hw_mem_layout *_ath10k_coredump_get_mem_layout (struct ath10k *ar) +{ +int i; +if (WARN_ON (ar->target_version ==0 ))return NULL ;
@@ -1464,7 +1470,6 @@ const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout(struct ath10kreturn NULL ; } -EXPORT_SYMBOL (ath10k_coredump_get_mem_layout);struct ath10k_fw_crash_data *ath10k_coredump_new (struct ath10k *ar) {
drivers/net/wireless/ath/ath10k/coredump.h +7 -0
@@ -176,6 +176,7 @@ int ath10k_coredump_register(struct ath10k *ar);void ath10k_coredump_unregister (struct ath10k *ar);void ath10k_coredump_destroy (struct ath10k *ar); +const struct ath10k_hw_mem_layout *_ath10k_coredump_get_mem_layout (struct ath10k *ar);const struct ath10k_hw_mem_layout *ath10k_coredump_get_mem_layout (struct ath10k *ar);#else /* CONFIG_DEV_COREDUMP */
@@ -214,6 +215,12 @@ ath10k_coredump_get_mem_layout(struct ath10k *ar)return NULL ; } +static inline const struct ath10k_hw_mem_layout * +_ath10k_coredump_get_mem_layout (struct ath10k *ar) +{ +return NULL ; +} +#endif /* CONFIG_DEV_COREDUMP */ #endif /* _COREDUMP_H_ */
Signature · 1 line
2.20.1
Quoted 29 lines · Kalle Valo
Commit
9af7c32ceca8("ath10k: add target IRAM recovery feature support") introduced a new firmware feature flagATH10K_FW_FEATURE_IRAM_RECOVERY. But this causedath10k_pcimodule load to fail ifATH10K_FW_CRASH_DUMP_RAM_DATAbit was not enabled in the ath10kcoredump_maskmodule parameter:[ 2209.328190] ath10k_pci 0000:02:00.0: qca9984/qca9994 hw1.0 target 0x01000000 chip_id 0x00000000 sub 168c:cafe [ 2209.434414] ath10k_pci 0000:02:00.0: kconfig debug 1 debugfs 1 tracing 1 dfs 1 testmode 1 [ 2209.547191] ath10k_pci 0000:02:00.0: firmware ver 10.4-3.9.0.2-00099 api 5 features no-p2p,mfp,peer-flow-ctrl,btcoex-param,allows-mesh-bcast,no-ps,peer-fixed-rate,iram-recovery crc32 cbade90a [ 2210.896485] ath10k_pci 0000:02:00.0: board_file api 1 bmi_id 0:1 crc32 a040efc2 [ 2213.603339] ath10k_pci 0000:02:00.0: failed to copy target iram contents: -12 [ 2213.839027] ath10k_pci 0000:02:00.0: could not init core (-12) [ 2213.933910] ath10k_pci 0000:02:00.0: could not probe fw (-12)And by default
coredump_maskdoes not haveATH10K_FW_CRASH_DUMP_RAM_DATAenabled so anyone using a firmware with iram-recovery feature would fail. To my knowledge only QCA9984 firmwares starting from release 10.4-3.9.0.2-00099 enabled the feature.The reason for regression was that
ath10k_core_copy_target_iram()usedath10k_coredump_get_mem_layout()to get the memory layout, but whenATH10K_FW_CRASH_DUMP_RAM_DATAwas disabled it would get just NULL and bail out with an error.While looking at all this I noticed another bug: if
CONFIG_DEV_COREDUMPis disabled but the firmware has iram-recovery enabled the module load fails with similar error messages. I fixed that by returning 0 fromath10k_core_copy_target_iram()when_ath10k_coredump_get_mem_layout()returns NULL.
Quoted 6 lines
Tested-on: QCA9984 hw2.0 PCI 10.4-3.9.0.2-00139
Fixes 9af7c32ceca8 ("ath10k: add target IRAM recovery feature support")Signed-off-by Abinaya Kalaiselvan <[email protected]>Signed-off-by Jouni Malinen <[email protected]>Signed-off-by Kalle Valo <[email protected]>
Patch applied to ath-next branch of ath.git, thanks.
6f8c8bf4c7c9 ath10k: fix module load regression with iram-recovery feature
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches