Loading drivers/soc/qcom/icnss2/main.c +19 −0 Original line number Diff line number Diff line Loading @@ -3207,6 +3207,8 @@ static int icnss_msa_dt_parse(struct icnss_priv *priv) icnss_pr_dbg("MSA pa: %pa, MSA va: 0x%pK MSA Memory Size: 0x%x\n", &priv->msa_pa, (void *)priv->msa_va, priv->msa_mem_size); priv->use_prefix_path = of_property_read_bool(priv->pdev->dev.of_node, "qcom,fw-prefix"); return 0; out: Loading Loading @@ -3292,6 +3294,23 @@ int icnss_get_iova_ipa(struct icnss_priv *priv, u64 *addr, u64 *size) return 0; } void icnss_add_fw_prefix_name(struct icnss_priv *priv, char *prefix_name, char *name) { if (!priv) return; if (!priv->use_prefix_path) { scnprintf(prefix_name, ICNSS_MAX_FILE_NAME, "%s", name); return; } scnprintf(prefix_name, ICNSS_MAX_FILE_NAME, QCA6750_PATH_PREFIX "%s", name); icnss_pr_dbg("File added with prefix: %s\n", prefix_name); } static const struct platform_device_id icnss_platform_id_table[] = { { .name = "wcn6750", .driver_data = WCN6750_DEVICE_ID, }, { .name = "adrastea", .driver_data = ADRASTEA_DEVICE_ID, }, Loading drivers/soc/qcom/icnss2/main.h +5 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ #define THERMAL_NAME_LENGTH 20 #define ICNSS_SMEM_VALUE_MASK 0xFFFFFFFF #define ICNSS_SMEM_SEQ_NO_POS 16 #define QCA6750_PATH_PREFIX "qca6750/" #define ICNSS_MAX_FILE_NAME 20 extern uint64_t dynamic_feature_mask; Loading Loading @@ -336,6 +338,7 @@ struct icnss_priv { u32 msi_base_data; struct icnss_control_params ctrl_params; u8 cal_done; u8 use_prefix_path; u32 ce_irqs[ICNSS_MAX_IRQ_REGISTRATIONS]; u32 srng_irqs[IWCN_MAX_IRQ_REGISTRATIONS]; phys_addr_t mem_base_pa; Loading Loading @@ -453,5 +456,7 @@ int icnss_get_iova(struct icnss_priv *priv, u64 *addr, u64 *size); int icnss_get_iova_ipa(struct icnss_priv *priv, u64 *addr, u64 *size); int icnss_get_cpr_info(struct icnss_priv *priv); int icnss_update_cpr_info(struct icnss_priv *priv); void icnss_add_fw_prefix_name(struct icnss_priv *priv, char *prefix_name, char *name); #endif drivers/soc/qcom/icnss2/qmi.c +16 −12 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ #define WLFW_CLIENT_ID 0x4b4e454c #define QMI_ERR_PLAT_CCPM_CLK_INIT_FAILED 0x77 #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" Loading Loading @@ -715,42 +714,43 @@ static int icnss_get_bdf_file_name(struct icnss_priv *priv, u32 bdf_type, char *filename, u32 filename_len) { char filename_tmp[ICNSS_MAX_FILE_NAME]; int ret = 0; switch (bdf_type) { case ICNSS_BDF_ELF: if (priv->board_id == 0xFF) snprintf(filename, filename_len, ELF_BDF_FILE_NAME); snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME); else if (priv->board_id < 0xFF) snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME_PREFIX "%02x", priv->board_id); else snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.e%02x", priv->board_id >> 8 & 0xFF, priv->board_id & 0xFF); break; case ICNSS_BDF_BIN: if (priv->board_id == 0xFF) snprintf(filename, filename_len, BIN_BDF_FILE_NAME); snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME); else if (priv->board_id < 0xFF) snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME_PREFIX "%02x", priv->board_id); else snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.b%02x", priv->board_id >> 8 & 0xFF, priv->board_id & 0xFF); break; case ICNSS_BDF_REGDB: snprintf(filename, filename_len, REGDB_FILE_NAME); snprintf(filename_tmp, filename_len, REGDB_FILE_NAME); break; case ICNSS_BDF_DUMMY: icnss_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 = ICNSS_MAX_FILE_NAME; break; default: icnss_pr_err("Invalid BDF type: %d\n", Loading @@ -758,6 +758,10 @@ static int icnss_get_bdf_file_name(struct icnss_priv *priv, ret = -EINVAL; break; } if (ret >= 0) icnss_add_fw_prefix_name(priv, filename, filename_tmp); return ret; } Loading @@ -766,7 +770,7 @@ int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type) 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[ICNSS_MAX_FILE_NAME]; const struct firmware *fw_entry = NULL; const u8 *temp; unsigned int remaining; Loading @@ -789,7 +793,7 @@ int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type) filename, sizeof(filename)); if (ret > 0) { temp = DUMMY_BDF_FILE_NAME; remaining = MAX_BDF_FILE_NAME; remaining = ICNSS_MAX_FILE_NAME; goto bypass_bdf; } else if (ret < 0) { goto err_req_fw; Loading Loading
drivers/soc/qcom/icnss2/main.c +19 −0 Original line number Diff line number Diff line Loading @@ -3207,6 +3207,8 @@ static int icnss_msa_dt_parse(struct icnss_priv *priv) icnss_pr_dbg("MSA pa: %pa, MSA va: 0x%pK MSA Memory Size: 0x%x\n", &priv->msa_pa, (void *)priv->msa_va, priv->msa_mem_size); priv->use_prefix_path = of_property_read_bool(priv->pdev->dev.of_node, "qcom,fw-prefix"); return 0; out: Loading Loading @@ -3292,6 +3294,23 @@ int icnss_get_iova_ipa(struct icnss_priv *priv, u64 *addr, u64 *size) return 0; } void icnss_add_fw_prefix_name(struct icnss_priv *priv, char *prefix_name, char *name) { if (!priv) return; if (!priv->use_prefix_path) { scnprintf(prefix_name, ICNSS_MAX_FILE_NAME, "%s", name); return; } scnprintf(prefix_name, ICNSS_MAX_FILE_NAME, QCA6750_PATH_PREFIX "%s", name); icnss_pr_dbg("File added with prefix: %s\n", prefix_name); } static const struct platform_device_id icnss_platform_id_table[] = { { .name = "wcn6750", .driver_data = WCN6750_DEVICE_ID, }, { .name = "adrastea", .driver_data = ADRASTEA_DEVICE_ID, }, Loading
drivers/soc/qcom/icnss2/main.h +5 −0 Original line number Diff line number Diff line Loading @@ -24,6 +24,8 @@ #define THERMAL_NAME_LENGTH 20 #define ICNSS_SMEM_VALUE_MASK 0xFFFFFFFF #define ICNSS_SMEM_SEQ_NO_POS 16 #define QCA6750_PATH_PREFIX "qca6750/" #define ICNSS_MAX_FILE_NAME 20 extern uint64_t dynamic_feature_mask; Loading Loading @@ -336,6 +338,7 @@ struct icnss_priv { u32 msi_base_data; struct icnss_control_params ctrl_params; u8 cal_done; u8 use_prefix_path; u32 ce_irqs[ICNSS_MAX_IRQ_REGISTRATIONS]; u32 srng_irqs[IWCN_MAX_IRQ_REGISTRATIONS]; phys_addr_t mem_base_pa; Loading Loading @@ -453,5 +456,7 @@ int icnss_get_iova(struct icnss_priv *priv, u64 *addr, u64 *size); int icnss_get_iova_ipa(struct icnss_priv *priv, u64 *addr, u64 *size); int icnss_get_cpr_info(struct icnss_priv *priv); int icnss_update_cpr_info(struct icnss_priv *priv); void icnss_add_fw_prefix_name(struct icnss_priv *priv, char *prefix_name, char *name); #endif
drivers/soc/qcom/icnss2/qmi.c +16 −12 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ #define WLFW_CLIENT_ID 0x4b4e454c #define QMI_ERR_PLAT_CCPM_CLK_INIT_FAILED 0x77 #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" Loading Loading @@ -715,42 +714,43 @@ static int icnss_get_bdf_file_name(struct icnss_priv *priv, u32 bdf_type, char *filename, u32 filename_len) { char filename_tmp[ICNSS_MAX_FILE_NAME]; int ret = 0; switch (bdf_type) { case ICNSS_BDF_ELF: if (priv->board_id == 0xFF) snprintf(filename, filename_len, ELF_BDF_FILE_NAME); snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME); else if (priv->board_id < 0xFF) snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, ELF_BDF_FILE_NAME_PREFIX "%02x", priv->board_id); else snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.e%02x", priv->board_id >> 8 & 0xFF, priv->board_id & 0xFF); break; case ICNSS_BDF_BIN: if (priv->board_id == 0xFF) snprintf(filename, filename_len, BIN_BDF_FILE_NAME); snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME); else if (priv->board_id < 0xFF) snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BIN_BDF_FILE_NAME_PREFIX "%02x", priv->board_id); else snprintf(filename, filename_len, snprintf(filename_tmp, filename_len, BDF_FILE_NAME_PREFIX "%02x.b%02x", priv->board_id >> 8 & 0xFF, priv->board_id & 0xFF); break; case ICNSS_BDF_REGDB: snprintf(filename, filename_len, REGDB_FILE_NAME); snprintf(filename_tmp, filename_len, REGDB_FILE_NAME); break; case ICNSS_BDF_DUMMY: icnss_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 = ICNSS_MAX_FILE_NAME; break; default: icnss_pr_err("Invalid BDF type: %d\n", Loading @@ -758,6 +758,10 @@ static int icnss_get_bdf_file_name(struct icnss_priv *priv, ret = -EINVAL; break; } if (ret >= 0) icnss_add_fw_prefix_name(priv, filename, filename_tmp); return ret; } Loading @@ -766,7 +770,7 @@ int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type) 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[ICNSS_MAX_FILE_NAME]; const struct firmware *fw_entry = NULL; const u8 *temp; unsigned int remaining; Loading @@ -789,7 +793,7 @@ int icnss_wlfw_bdf_dnld_send_sync(struct icnss_priv *priv, u32 bdf_type) filename, sizeof(filename)); if (ret > 0) { temp = DUMMY_BDF_FILE_NAME; remaining = MAX_BDF_FILE_NAME; remaining = ICNSS_MAX_FILE_NAME; goto bypass_bdf; } else if (ret < 0) { goto err_req_fw; Loading