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<board ID>. 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 <yuem@codeaurora.org>
This commit is contained in:
Yue Ma 2021-02-05 15:33:16 -08:00 • committed by Gerrit - the friendly Code Review server
commit 537b4dfdef
2 changed files with 46 additions and 14 deletions

View file

@ -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) {

View file

@ -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);