Merge "cnss2: loads different fw binary per running mode"

This commit is contained in:
qctecmdr
2022-06-15 03:14:46 -07:00
committed by Gerrit - the friendly Code Review server
4 changed files with 78 additions and 3 deletions

View File

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

View File

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

View File

@@ -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:

View File

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