From 2a55cfcec151399e50b688b3074e509de073d3ed Mon Sep 17 00:00:00 2001 From: Kai Liu Date: Sun, 12 Jun 2022 11:22:24 +0530 Subject: [PATCH] cnss2: loads different fw binary per running mode Kiwi-v2 supports separates image for MM and FTM mode, platform driver will load difffernt binary according to the mode indicated by wlan driver. If seprate binary is not there, fall back to default binary. Change-Id: I848309440fdffd6517463e18190c03c1b7ed9269 Signed-off-by: Kai Liu --- drivers/net/wireless/cnss2/main.c | 1 + drivers/net/wireless/cnss2/main.h | 1 + drivers/net/wireless/cnss2/pci.c | 77 +++++++++++++++++++++++++++++-- include/net/cnss2.h | 2 + 4 files changed, 78 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 18deabf453ad..fa1d97c349eb 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -3574,6 +3574,7 @@ static int cnss_probe(struct platform_device *plat_dev) plat_priv->device_id = device_id->driver_data; plat_priv->bus_type = cnss_get_bus_type(plat_priv->device_id); plat_priv->use_nv_mac = cnss_use_nv_mac(plat_priv); + plat_priv->driver_mode = CNSS_DRIVER_MODE_MAX; plat_priv->use_fw_path_with_prefix = cnss_use_fw_path_with_prefix(plat_priv); cnss_set_plat_priv(plat_dev, plat_priv); diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index bba033508d53..4826e45c63a2 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -540,6 +540,7 @@ struct cnss_plat_data { u32 hang_data_addr_offset; /* bitmap to detect FEM combination */ u8 hwid_bitmap; + enum cnss_driver_mode driver_mode; }; #if IS_ENABLED(CONFIG_ARCH_QCOM) diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 10b6757ece80..fb6fc026b539 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -49,6 +49,7 @@ #define PHY_UCODE_V2_FILE_NAME "phy_ucode20.elf" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" +#define FW_V2_FTM_FILE_NAME "amss20_ftm.bin" #define DEVICE_MAJOR_VERSION_MASK 0xF #define WAKE_MSI_NAME "WAKE" @@ -555,6 +556,8 @@ static struct cnss_print_optimize print_optimize; #define WLAON_REG_SIZE ARRAY_SIZE(wlaon_reg_access_seq) #define SYSPM_REG_SIZE ARRAY_SIZE(syspm_reg_access_seq) +static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv); + #if IS_ENABLED(CONFIG_MHI_BUS_MISC) static void cnss_mhi_debug_reg_dump(struct cnss_pci_data *pci_priv) { @@ -2398,6 +2401,21 @@ static int cnss_qca6174_ramdump(struct cnss_pci_data *pci_priv) return cnss_do_ramdump(plat_priv); } +static void cnss_get_driver_mode_update_fw_name(struct cnss_plat_data *plat_priv) +{ + struct cnss_pci_data *pci_priv; + struct cnss_wlan_driver *driver_ops; + + pci_priv = plat_priv->bus_priv; + driver_ops = pci_priv->driver_ops; + + if (driver_ops && driver_ops->get_driver_mode) { + plat_priv->driver_mode = driver_ops->get_driver_mode(); + cnss_pci_update_fw_name(pci_priv); + cnss_pr_dbg("New driver mode is %d", plat_priv->driver_mode); + } +} + static int cnss_qca6290_powerup(struct cnss_pci_data *pci_priv) { int ret = 0; @@ -2418,6 +2436,8 @@ static int cnss_qca6290_powerup(struct cnss_pci_data *pci_priv) pci_priv->qmi_send_usage_count = 0; plat_priv->power_up_error = 0; + + cnss_get_driver_mode_update_fw_name(plat_priv); retry: ret = cnss_power_on_device(plat_priv); if (ret) { @@ -2850,6 +2870,7 @@ int cnss_wlan_register_driver(struct cnss_wlan_driver *driver_ops) return -ENODEV; } + cnss_get_driver_mode_update_fw_name(plat_priv); set_bit(CNSS_DRIVER_REGISTER, &plat_priv->driver_state); if (!plat_priv->cbc_enabled || @@ -4994,7 +5015,6 @@ static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv) FW_V2_FILE_NAME); break; case QCA6490_DEVICE_ID: - case KIWI_DEVICE_ID: case MANGO_DEVICE_ID: switch (plat_priv->device_version.major_version) { case FW_V2_NUMBER: @@ -5015,6 +5035,53 @@ static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv) break; } break; + case KIWI_DEVICE_ID: + switch (plat_priv->device_version.major_version) { + case FW_V2_NUMBER: + /* kiwiv2 using seprate fw binary for MM and FTM mode, + * platform driver loads corresponding binary according + * to current mode indicated by wlan driver. Otherwise + * use default binary. + * Mission mode using same binary name as before, + * if seprate binary is not there, fall back to default. + */ + if (plat_priv->driver_mode == CNSS_MISSION) { + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + FW_V2_FILE_NAME); + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->fw_fallback_name, + FW_V2_FILE_NAME); + } else if (plat_priv->driver_mode == CNSS_FTM) { + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + FW_V2_FTM_FILE_NAME); + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->fw_fallback_name, + FW_V2_FILE_NAME); + } else { + /* Since during cold boot calibration phase, + * wlan driver has not registered, so default + * fw binary will be used. + */ + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + FW_V2_FILE_NAME); + snprintf(plat_priv->fw_fallback_name, + MAX_FIRMWARE_NAME_LEN, + FW_V2_FILE_NAME); + } + default: + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + DEFAULT_FW_FILE_NAME); + snprintf(plat_priv->fw_fallback_name, + MAX_FIRMWARE_NAME_LEN, + DEFAULT_FW_FILE_NAME); + break; + } + break; + default: cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name, DEFAULT_FW_FILE_NAME); @@ -5164,8 +5231,12 @@ static void cnss_mhi_notify_status(struct mhi_controller *mhi_ctrl, break; #if IS_ENABLED(CONFIG_MHI_BUS_MISC) case MHI_CB_FALLBACK_IMG: - plat_priv->use_fw_path_with_prefix = false; - cnss_pci_update_fw_name(pci_priv); + /* for kiwi_v2 binary fallback is used, skip path fallback here */ + if (!(pci_priv->device_id == KIWI_DEVICE_ID && + plat_priv->device_version.major_version == FW_V2_NUMBER)) { + plat_priv->use_fw_path_with_prefix = false; + cnss_pci_update_fw_name(pci_priv); + } return; #endif default: diff --git a/include/net/cnss2.h b/include/net/cnss2.h index 8379d6a3dfc6..e4dcbb45f488 100644 --- a/include/net/cnss2.h +++ b/include/net/cnss2.h @@ -134,6 +134,7 @@ struct cnss_wlan_driver { struct cnss_wlan_runtime_ops *runtime_ops; const struct pci_device_id *id_table; u32 chip_version; + enum cnss_driver_mode (*get_driver_mode)(void); }; struct cnss_ce_tgt_pipe_cfg { @@ -193,6 +194,7 @@ enum cnss_driver_mode { CNSS_CCPM, CNSS_QVIT, CNSS_CALIBRATION, + CNSS_DRIVER_MODE_MAX, }; enum cnss_recovery_reason {