QCA6698AQ uses different firmware/bdf/regdb with existing WCN6855 firmware, which is customized for IoE platforms. And the 'pci-device-id + soc-hw-version + soc-hw-sub-version' may not be enough to identify the correct firmware directory path. The device tree allows "firmware-name" to define the firmware path, wifi@c000000 { firmware-name = "QCA6698AQ"; status = "okay"; }; Tested-on: QCA6698AQ hw2.1 PCI WLAN.HSP.1.1-04402-QCAHSPSWPL_V1_V2_SILICONZ_IOE-1 Signed-off-by: Miaoqing Pan <quic_miaoqing@xxxxxxxxxxx> --- drivers/net/wireless/ath/ath11k/core.c | 12 ++++++++++++ drivers/net/wireless/ath/ath11k/core.h | 11 +++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/core.c b/drivers/net/wireless/ath/ath11k/core.c index be67382c00f6..7720f467b11b 100644 --- a/drivers/net/wireless/ath/ath11k/core.c +++ b/drivers/net/wireless/ath/ath11k/core.c @@ -1178,6 +1178,18 @@ static int ath11k_core_create_chip_id_board_name(struct ath11k_base *ab, char *n ATH11K_BDF_NAME_CHIP_ID); } +void ath11k_core_create_firmware_path(struct ath11k_base *ab, + const char *filename, + void *buf, size_t buf_len) +{ const char *variant = NULL; + + of_property_read_string(ab->dev->of_node, "firmware-name", &variant); + + snprintf(buf, buf_len, "%s/%s/%s", ATH11K_FW_DIR, + variant ? : ab->hw_params.fw.dir, filename); +} +EXPORT_SYMBOL(ath11k_core_create_firmware_path); + const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, const char *file) { diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h index 09c37e19a168..ce4102cfed4d 100644 --- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -1249,6 +1249,9 @@ bool ath11k_core_coldboot_cal_support(struct ath11k_base *ab); const struct firmware *ath11k_core_firmware_request(struct ath11k_base *ab, const char *filename); +void ath11k_core_create_firmware_path(struct ath11k_base *ab, + const char *filename, + void *buf, size_t buf_len); static inline const char *ath11k_scan_state_str(enum ath11k_scan_state state) { @@ -1295,14 +1298,6 @@ static inline struct ath11k *ath11k_ab_to_ar(struct ath11k_base *ab, return ab->pdevs[ath11k_hw_mac_id_to_pdev_id(&ab->hw_params, mac_id)].ar; } -static inline void ath11k_core_create_firmware_path(struct ath11k_base *ab, - const char *filename, - void *buf, size_t buf_len) -{ - snprintf(buf, buf_len, "%s/%s/%s", ATH11K_FW_DIR, - ab->hw_params.fw.dir, filename); -} - static inline const char *ath11k_bus_str(enum ath11k_bus bus) { switch (bus) { -- 2.25.1