diff --git a/drivers/net/wireless/cnss2/bus.c b/drivers/net/wireless/cnss2/bus.c index be9047f7dbde..211451e536ee 100644 --- a/drivers/net/wireless/cnss2/bus.c +++ b/drivers/net/wireless/cnss2/bus.c @@ -95,6 +95,23 @@ void cnss_bus_deinit(struct cnss_plat_data *plat_priv) } } +void cnss_bus_add_fw_prefix_name(struct cnss_plat_data *plat_priv, + char *prefix_name, char *name) +{ + if (!plat_priv) + return; + + switch (plat_priv->bus_type) { + case CNSS_BUS_PCI: + return cnss_pci_add_fw_prefix_name(plat_priv->bus_priv, + prefix_name, name); + default: + cnss_pr_err("Unsupported bus type: %d\n", + plat_priv->bus_type); + return; + } +} + int cnss_bus_load_m3(struct cnss_plat_data *plat_priv) { if (!plat_priv) diff --git a/drivers/net/wireless/cnss2/bus.h b/drivers/net/wireless/cnss2/bus.h index 82c463c34d29..2be106881ad2 100644 --- a/drivers/net/wireless/cnss2/bus.h +++ b/drivers/net/wireless/cnss2/bus.h @@ -24,6 +24,8 @@ void *cnss_bus_dev_to_bus_priv(struct device *dev); struct cnss_plat_data *cnss_bus_dev_to_plat_priv(struct device *dev); int cnss_bus_init(struct cnss_plat_data *plat_priv); void cnss_bus_deinit(struct cnss_plat_data *plat_priv); +void cnss_bus_add_fw_prefix_name(struct cnss_plat_data *plat_priv, + char *prefix_name, char *name); int cnss_bus_load_m3(struct cnss_plat_data *plat_priv); int cnss_bus_alloc_fw_mem(struct cnss_plat_data *plat_priv); int cnss_bus_alloc_qdss_mem(struct cnss_plat_data *plat_priv); diff --git a/drivers/net/wireless/cnss2/main.c b/drivers/net/wireless/cnss2/main.c index 349c0a9917c6..e7f2c25ea243 100644 --- a/drivers/net/wireless/cnss2/main.c +++ b/drivers/net/wireless/cnss2/main.c @@ -2434,6 +2434,12 @@ static void cnss_get_wlaon_pwr_ctrl_info(struct cnss_plat_data *plat_priv) plat_priv->set_wlaon_pwr_ctrl); } +static bool cnss_use_fw_path_with_prefix(struct cnss_plat_data *plat_priv) +{ + return of_property_read_bool(plat_priv->plat_dev->dev.of_node, + "qcom,converged-dt"); +} + static const struct platform_device_id cnss_platform_id_table[] = { { .name = "qca6174", .driver_data = QCA6174_DEVICE_ID, }, { .name = "qca6290", .driver_data = QCA6290_DEVICE_ID, }, @@ -2499,6 +2505,8 @@ 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->use_fw_path_with_prefix = + cnss_use_fw_path_with_prefix(plat_priv); cnss_set_plat_priv(plat_dev, plat_priv); platform_set_drvdata(plat_dev, plat_priv); INIT_LIST_HEAD(&plat_priv->vreg_list); diff --git a/drivers/net/wireless/cnss2/main.h b/drivers/net/wireless/cnss2/main.h index 1ebe33c1e79d..9c9219d50127 100644 --- a/drivers/net/wireless/cnss2/main.h +++ b/drivers/net/wireless/cnss2/main.h @@ -34,6 +34,7 @@ #define TIME_CLOCK_FREQ_HZ 19200000 #define CNSS_RAMDUMP_MAGIC 0x574C414E #define CNSS_RAMDUMP_VERSION 0 +#define MAX_FIRMWARE_NAME_LEN 20 #define CNSS_EVENT_SYNC BIT(0) #define CNSS_EVENT_UNINTERRUPTIBLE BIT(1) @@ -401,7 +402,8 @@ struct cnss_plat_data { u8 *diag_reg_read_buf; u8 cal_done; u8 powered_on; - char firmware_name[13]; + u8 use_fw_path_with_prefix; + char firmware_name[MAX_FIRMWARE_NAME_LEN]; struct completion rddm_complete; struct completion recovery_complete; struct cnss_control_params ctrl_params; diff --git a/drivers/net/wireless/cnss2/pci.c b/drivers/net/wireless/cnss2/pci.c index 72251614208b..71ba0fb07d91 100644 --- a/drivers/net/wireless/cnss2/pci.c +++ b/drivers/net/wireless/cnss2/pci.c @@ -37,7 +37,8 @@ #define MHI_NODE_NAME "qcom,mhi" #define MHI_MSI_NAME "MHI" -#define MAX_M3_FILE_NAME_LENGTH 13 +#define QCA6390_PATH_PREFIX "qca6390/" +#define QCA6490_PATH_PREFIX "qca6490/" #define DEFAULT_M3_FILE_NAME "m3.bin" #define DEFAULT_FW_FILE_NAME "amss.bin" #define FW_V2_FILE_NAME "amss20.bin" @@ -3325,12 +3326,13 @@ int cnss_pci_load_m3(struct cnss_pci_data *pci_priv) { struct cnss_plat_data *plat_priv = pci_priv->plat_priv; struct cnss_fw_mem *m3_mem = &plat_priv->m3_mem; - char filename[MAX_M3_FILE_NAME_LENGTH]; + char filename[MAX_FIRMWARE_NAME_LEN]; const struct firmware *fw_entry; int ret = 0; if (!m3_mem->va && !m3_mem->size) { - snprintf(filename, sizeof(filename), DEFAULT_M3_FILE_NAME); + cnss_pci_add_fw_prefix_name(pci_priv, filename, + DEFAULT_M3_FILE_NAME); ret = request_firmware(&fw_entry, filename, &pci_priv->pci_dev->dev); @@ -4282,6 +4284,38 @@ static void cnss_mhi_pm_runtime_put_noidle(struct mhi_controller *mhi_ctrl, cnss_pci_pm_runtime_put_noidle(pci_priv); } +void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv, + char *prefix_name, char *name) +{ + struct cnss_plat_data *plat_priv; + + if (!pci_priv) + return; + + plat_priv = pci_priv->plat_priv; + + if (!plat_priv->use_fw_path_with_prefix) { + scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, "%s", name); + return; + } + + switch (pci_priv->device_id) { + case QCA6390_DEVICE_ID: + scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, + QCA6390_PATH_PREFIX "%s", name); + break; + case QCA6490_DEVICE_ID: + scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, + QCA6490_PATH_PREFIX "%s", name); + break; + default: + scnprintf(prefix_name, MAX_FIRMWARE_NAME_LEN, "%s", name); + break; + } + + cnss_pr_dbg("FW name added with prefix: %s\n", prefix_name); +} + static char *cnss_mhi_notify_status_to_str(enum MHI_CB status) { switch (status) { @@ -4434,23 +4468,26 @@ static int cnss_pci_update_fw_name(struct cnss_pci_data *pci_priv) plat_priv->device_version.major_version); return -EINVAL; } - scnprintf(plat_priv->firmware_name, - sizeof(plat_priv->firmware_name), FW_V2_FILE_NAME); - mhi_ctrl->fw_image = plat_priv->firmware_name; + cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name, + FW_V2_FILE_NAME); break; case QCA6490_DEVICE_ID: switch (plat_priv->device_version.major_version) { case FW_V2_NUMBER: - scnprintf(plat_priv->firmware_name, - sizeof(plat_priv->firmware_name), - FW_V2_FILE_NAME); + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + FW_V2_FILE_NAME); break; default: + cnss_pci_add_fw_prefix_name(pci_priv, + plat_priv->firmware_name, + DEFAULT_FW_FILE_NAME); break; } - break; default: + cnss_pci_add_fw_prefix_name(pci_priv, plat_priv->firmware_name, + DEFAULT_FW_FILE_NAME); break; } @@ -4642,8 +4679,6 @@ static int cnss_pci_probe(struct pci_dev *pci_dev, cnss_set_pci_priv(pci_dev, pci_priv); plat_priv->device_id = pci_dev->device; plat_priv->bus_priv = pci_priv; - snprintf(plat_priv->firmware_name, sizeof(plat_priv->firmware_name), - DEFAULT_FW_FILE_NAME); mutex_init(&pci_priv->bus_lock); ret = of_reserved_mem_device_init(dev); diff --git a/drivers/net/wireless/cnss2/pci.h b/drivers/net/wireless/cnss2/pci.h index c53036104ad7..8bd024575528 100644 --- a/drivers/net/wireless/cnss2/pci.h +++ b/drivers/net/wireless/cnss2/pci.h @@ -168,6 +168,8 @@ int cnss_resume_pci_link(struct cnss_pci_data *pci_priv); int cnss_pci_recover_link_down(struct cnss_pci_data *pci_priv); int cnss_pci_init(struct cnss_plat_data *plat_priv); void cnss_pci_deinit(struct cnss_plat_data *plat_priv); +void cnss_pci_add_fw_prefix_name(struct cnss_pci_data *pci_priv, + char *prefix_name, char *name); int cnss_pci_alloc_fw_mem(struct cnss_pci_data *pci_priv); int cnss_pci_alloc_qdss_mem(struct cnss_pci_data *pci_priv); void cnss_pci_free_qdss_mem(struct cnss_pci_data *pci_priv); diff --git a/drivers/net/wireless/cnss2/qmi.c b/drivers/net/wireless/cnss2/qmi.c index 7477a496748a..89ddb98d10ed 100644 --- a/drivers/net/wireless/cnss2/qmi.c +++ b/drivers/net/wireless/cnss2/qmi.c @@ -12,7 +12,6 @@ #define WLFW_SERVICE_INS_ID_V01 1 #define WLFW_CLIENT_ID 0x4b4e454c -#define MAX_BDF_FILE_NAME 13 #define BDF_FILE_NAME_PREFIX "bdwlan" #define ELF_BDF_FILE_NAME "bdwlan.elf" #define ELF_BDF_FILE_NAME_PREFIX "bdwlan.e" @@ -480,42 +479,43 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv, u32 bdf_type, char *filename, u32 filename_len) { + char filename_tmp[MAX_FIRMWARE_NAME_LEN]; int ret = 0; switch (bdf_type) { case CNSS_BDF_ELF: if (plat_priv->board_info.board_id == 0xFF) - snprintf(filename, filename_len, ELF_BDF_FILE_NAME); + snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME); else if (plat_priv->board_info.board_id < 0xFF) - snprintf(filename, filename_len, + snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME_PREFIX "%02x", plat_priv->board_info.board_id); else - snprintf(filename, filename_len, + 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, filename_len, BIN_BDF_FILE_NAME); + snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME); else if (plat_priv->board_info.board_id < 0xFF) - snprintf(filename, filename_len, + snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME_PREFIX "%02x", plat_priv->board_info.board_id); else - snprintf(filename, filename_len, + 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, filename_len, REGDB_FILE_NAME); + snprintf(filename_tmp, filename_len, REGDB_FILE_NAME); break; case CNSS_BDF_DUMMY: cnss_pr_dbg("CNSS_BDF_DUMMY is set, sending dummy BDF\n"); - snprintf(filename, filename_len, DUMMY_BDF_FILE_NAME); - ret = MAX_BDF_FILE_NAME; + snprintf(filename_tmp, filename_len, DUMMY_BDF_FILE_NAME); + ret = MAX_FIRMWARE_NAME_LEN; break; default: cnss_pr_err("Invalid BDF type: %d\n", @@ -523,6 +523,10 @@ static int cnss_get_bdf_file_name(struct cnss_plat_data *plat_priv, ret = -EINVAL; break; } + + if (ret >= 0) + cnss_bus_add_fw_prefix_name(plat_priv, filename, filename_tmp); + return ret; } @@ -532,7 +536,7 @@ int cnss_wlfw_bdf_dnld_send_sync(struct cnss_plat_data *plat_priv, struct wlfw_bdf_download_req_msg_v01 *req; struct wlfw_bdf_download_resp_msg_v01 *resp; struct qmi_txn txn; - char filename[MAX_BDF_FILE_NAME]; + char filename[MAX_FIRMWARE_NAME_LEN]; const struct firmware *fw_entry = NULL; const u8 *temp; unsigned int remaining; @@ -555,7 +559,7 @@ int cnss_wlfw_bdf_dnld_send_sync(struct cnss_plat_data *plat_priv, filename, sizeof(filename)); if (ret > 0) { temp = DUMMY_BDF_FILE_NAME; - remaining = MAX_BDF_FILE_NAME; + remaining = MAX_FIRMWARE_NAME_LEN; goto bypass_bdf; } else if (ret < 0) { goto err_req_fw;