Merge "cnss2: loads different fw binary per running mode"
This commit is contained in:

committed by
Gerrit - the friendly Code Review server

commit
1d52f7bde7
@@ -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);
|
||||
|
@@ -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)
|
||||
|
@@ -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:
|
||||
|
@@ -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 {
|
||||
|
Reference in New Issue
Block a user