From 537b4dfdef5324ebe666f698ebde21e31baa3df5 Mon Sep 17 00:00:00 2001 From: Yue Ma Date: Fri, 5 Feb 2021 15:33:16 -0800 Subject: [PATCH] cnss2: Update board data file name for certain RF chip ID If higher 4 bits of chip ID (device major version) is 1, read board data file name as bdwlang.e. The assumption is board ID will be always less than 0xFF. If board ID (0xFF) is invalid in OTP then read it as bdwlang.elf for such case. Also only use lower 4 bits of device major version as the version number to load firmware file because of above new requirement. Change-Id: I4dce528a9c389a660b19dabe4ee44e655a23570b Signed-off-by: Yue Ma --- drivers/net/wireless/cnss2/pci.c | 4 +++ drivers/net/wireless/cnss2/qmi.c | 56 ++++++++++++++++++++++++-------- 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 3a0d43e2b4ea..6f52a9555fdc 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -46,6 +46,7 @@ #define DEFAULT_M3_FILE_NAME "m3.bin" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" +#define DEVICE_MAJOR_VERSION_MASK 0xF #define WAKE_MSI_NAME "WAKE" @@ -4948,6 +4949,9 @@ static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv) plat_priv->device_version.major_version, plat_priv->device_version.minor_version); + /* Only keep lower 4 bits as real device major version */ + plat_priv->device_version.major_version &= DEVICE_MAJOR_VERSION_MASK; + switch (pci_priv->device_id) { case QCA6390_DEVICE_ID: if (plat_priv->device_version.major_version < FW_V2_NUMBER) { diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index 0e21f98a4fb1..7f8f80aed681 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -15,11 +15,16 @@ #define WLFW_CLIENT_ID 0x4b4e454c #define BDF_FILE_NAME_PREFIX "bdwlan" #define ELF_BDF_FILE_NAME "bdwlan.elf" +#define ELF_BDF_FILE_NAME_GF "bdwlang.elf" #define ELF_BDF_FILE_NAME_PREFIX "bdwlan.e" +#define ELF_BDF_FILE_NAME_GF_PREFIX "bdwlang.e" #define BIN_BDF_FILE_NAME "bdwlan.bin" +#define BIN_BDF_FILE_NAME_GF "bdwlang.bin" #define BIN_BDF_FILE_NAME_PREFIX "bdwlan.b" +#define BIN_BDF_FILE_NAME_GF_PREFIX "bdwlang.b" #define REGDB_FILE_NAME "regdb.bin" #define DUMMY_BDF_FILE_NAME "bdwlan.dmy" +#define CHIP_ID_GF_MASK 0x10 #define QDSS_TRACE_CONFIG_FILE "qdss_trace_config" #define DEBUG_STR "debug" @@ -492,30 +497,53 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv, switch (bdf_type) { case CNSS_BDF_ELF: - if (plat_priv->board_info.board_id == 0xFF) - snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME); - else if (plat_priv->board_info.board_id < 0xFF) - snprintf(filename_tmp, filename_len, - ELF_BDF_FILE_NAME_PREFIX "%02x", - plat_priv->board_info.board_id); - else + /* Board ID will be equal or less than 0xFF in GF mask case */ + if (plat_priv->board_info.board_id == 0xFF) { + if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK) + snprintf(filename_tmp, filename_len, + ELF_BDF_FILE_NAME_GF); + else + snprintf(filename_tmp, filename_len, + ELF_BDF_FILE_NAME); + } else if (plat_priv->board_info.board_id < 0xFF) { + if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK) + snprintf(filename_tmp, filename_len, + ELF_BDF_FILE_NAME_GF_PREFIX "%02x", + plat_priv->board_info.board_id); + else + snprintf(filename_tmp, filename_len, + ELF_BDF_FILE_NAME_PREFIX "%02x", + plat_priv->board_info.board_id); + } else { snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.e%02x", plat_priv->board_info.board_id >> 8 & 0xFF, plat_priv->board_info.board_id & 0xFF); + } break; case CNSS_BDF_BIN: - if (plat_priv->board_info.board_id == 0xFF) - snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME); - else if (plat_priv->board_info.board_id < 0xFF) - snprintf(filename_tmp, filename_len, - BIN_BDF_FILE_NAME_PREFIX "%02x", - plat_priv->board_info.board_id); - else + if (plat_priv->board_info.board_id == 0xFF) { + if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK) + snprintf(filename_tmp, filename_len, + BIN_BDF_FILE_NAME_GF); + else + snprintf(filename_tmp, filename_len, + BIN_BDF_FILE_NAME); + } else if (plat_priv->board_info.board_id < 0xFF) { + if (plat_priv->chip_info.chip_id & CHIP_ID_GF_MASK) + snprintf(filename_tmp, filename_len, + BIN_BDF_FILE_NAME_GF_PREFIX "%02x", + plat_priv->board_info.board_id); + else + snprintf(filename_tmp, filename_len, + BIN_BDF_FILE_NAME_PREFIX "%02x", + plat_priv->board_info.board_id); + } else { snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.b%02x", plat_priv->board_info.board_id >> 8 & 0xFF, plat_priv->board_info.board_id & 0xFF); + } break; case CNSS_BDF_REGDB: snprintf(filename_tmp, filename_len, REGDB_FILE_NAME);