From 3257cee47e1bb80913294755df521911f2c32b8f Mon Sep 17 00:00:00 2001 From: Ashish Kumar Dhanotiya Date: Fri, 13 Dec 2019 20:30:03 +0530 Subject: [PATCH] qcacld-3.0: Update the ini for SAR version This change addresses 2 issues: 1. Currently the ini for SAR version specify the SAR version. If value of the ini is 1 it specifies the SAR version 1 and if value of ini is 2 it specifies SAR version 2 and driver converts SAR version 1 (SARV1) command to SAR version 2 (SARV2) command based on FW capability. 2. If the value of the ini is SARV1 and FW expects SARV2 command, currently driver is sending SARV1 command to FW which results in undefined behavior at FW. Since the use of this ini is to convert the SARV1 command to SARV2 command, change this ini from int type to bool type to just specify if the conversion is enabled or not to avoid any kind of confusion. If the ini is SARV1 and FW expects SARV2 command, reject the user space command to set SAR power limits. Change-Id: Ie8e3790bd8737fcb251a0481e2e6001a26295773 CRs-Fixed: 2581034 --- core/hdd/inc/hdd_config.h | 31 ++++++++++++++++--------------- core/hdd/inc/wlan_hdd_cfg.h | 2 +- core/hdd/src/wlan_hdd_cfg80211.c | 26 ++++++++++++++++++++++++-- core/hdd/src/wlan_hdd_main.c | 2 +- 4 files changed, 42 insertions(+), 19 deletions(-) diff --git a/core/hdd/inc/hdd_config.h b/core/hdd/inc/hdd_config.h index f65626cf1564..0f1c1b595d92 100644 --- a/core/hdd/inc/hdd_config.h +++ b/core/hdd/inc/hdd_config.h @@ -1295,26 +1295,27 @@ struct dhcp_server { /* * - * gSarVersion - Used to specify SAR version + * gEnableSARV1toSARV2 - Used to Enable/Disable SAR version conversion * - * @Min: 1 - * @Max: 2 - * Default: 1 + * @Min: 0 + * @Max: 1 + * Default: 0 * - * This ini is used to specify the SAR feature version. - * If value of this ini is set to 2, SAR version 2 will - * be used. + * If user space is using SARV1 and FW is using SARV2 in BDF in that case + * this ini is used to enable conversion from user specified SARV1 command + * to FW expected SARV2 command. + * If value of this ini is set to 0, SAR version 1 will + * not be converted to SARV2 and command will be rejected. + * If value of this ini is set to 1 SAR version 1 will be converted to + * SARV2 based on FW capability * Usage: External * * */ -#define CFG_SAR_VERSION CFG_INI_UINT( \ - "gSarVersion", \ - 1, \ - 2, \ - 1, \ - CFG_VALUE_OR_DEFAULT, \ - "Specify the SAR version") +#define CFG_SAR_CONVERSION CFG_INI_BOOL( \ + "gEnableSARV1toSARV2", \ + 0, \ + "Enable/Disable conversion from SARV1 to SARV2") /* * @@ -1487,7 +1488,7 @@ enum host_log_level { CFG(CFG_TIMER_MULTIPLIER) \ CFG(CFG_HDD_DOT11_MODE) \ CFG(CFG_ENABLE_DISABLE_CHANNEL) \ - CFG(CFG_SAR_VERSION) \ + CFG(CFG_SAR_CONVERSION) \ CFG(CFG_WOW_DISABLE) \ CFG(CFG_ENABLE_HOST_MODULE_LOG_LEVEL) #endif diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 1ae6718f8b10..8e3245b72ca9 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -220,7 +220,7 @@ struct hdd_config { uint32_t provisioned_intf_pool; uint32_t derived_intf_pool; uint32_t cfg_wmi_credit_cnt; - uint32_t sar_version; + uint32_t enable_sar_conversion; bool is_wow_disabled; #ifdef WLAN_FEATURE_TSF_PLUS uint8_t tsf_ptp_options; diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 626ed54ffab4..352f9370bd26 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -11746,6 +11746,7 @@ hdd_convert_sarv1_to_sarv2(struct hdd_context *hdd_ctx, uint32_t bdf_index, set; struct sar_limit_cmd_row *row; + hdd_enter(); if (hdd_ctx->sar_version != SAR_VERSION_2) { hdd_debug("SAR version: %d", hdd_ctx->sar_version); return false; @@ -11791,6 +11792,7 @@ hdd_convert_sarv1_to_sarv2(struct hdd_context *hdd_ctx, row[0].validity_bitmap = WMI_SAR_CHAIN_ID_VALID_MASK; row[1].validity_bitmap = WMI_SAR_CHAIN_ID_VALID_MASK; + hdd_exit(); return true; } @@ -11990,6 +11992,7 @@ static int __wlan_hdd_set_sar_power_limits(struct wiphy *wiphy, QDF_STATUS status; uint32_t num_limit_rows = 0; struct sar_limit_cmd_row *row; + uint32_t sar_enable; hdd_enter(); @@ -12007,12 +12010,31 @@ static int __wlan_hdd_set_sar_power_limits(struct wiphy *wiphy, return -EINVAL; } + if (tb[SAR_LIMITS_SAR_ENABLE]) { + sar_enable = nla_get_u32(tb[SAR_LIMITS_SAR_ENABLE]); + + if ((sar_enable >= + QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_BDF0 && + sar_enable <= + QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_BDF4) && + hdd_ctx->sar_version == SAR_VERSION_2 && + !hdd_ctx->config->enable_sar_conversion) { + hdd_err("SARV1 to SARV2 is disabled from ini"); + return -EINVAL; + } else if (sar_enable == + QCA_WLAN_VENDOR_ATTR_SAR_LIMITS_SELECT_V2_0 && + hdd_ctx->sar_version == SAR_VERSION_1) { + hdd_err("FW expects SARV1 given command is SARV2"); + return -EINVAL; + } + } + sar_limit_cmd = qdf_mem_malloc(sizeof(struct sar_limit_cmd_params)); if (!sar_limit_cmd) return -ENOMEM; /* is special SAR V1 => SAR V2 logic enabled and applicable? */ - if (hdd_ctx->config->sar_version == 2 && + if (hdd_ctx->config->enable_sar_conversion && (hdd_convert_sarv1_to_sarv2(hdd_ctx, tb, sar_limit_cmd))) goto send_sar_limits; @@ -12020,9 +12042,9 @@ static int __wlan_hdd_set_sar_power_limits(struct wiphy *wiphy, sar_limit_cmd->commit_limits = 1; sar_limit_cmd->sar_enable = WMI_SAR_FEATURE_NO_CHANGE; if (tb[SAR_LIMITS_SAR_ENABLE]) { - uint32_t sar_enable = nla_get_u32(tb[SAR_LIMITS_SAR_ENABLE]); uint32_t *sar_ptr = &sar_limit_cmd->sar_enable; + sar_enable = nla_get_u32(tb[SAR_LIMITS_SAR_ENABLE]); ret = wlan_hdd_cfg80211_sar_convert_limit_set(sar_enable, sar_ptr); if (ret) { diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index a3c255590c87..73d0773f8d4e 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -10276,7 +10276,7 @@ static void hdd_cfg_params_init(struct hdd_context *hdd_ctx) config->is_unit_test_framework_enabled = cfg_get(psoc, CFG_ENABLE_UNIT_TEST_FRAMEWORK); config->disable_channel = cfg_get(psoc, CFG_ENABLE_DISABLE_CHANNEL); - config->sar_version = cfg_get(psoc, CFG_SAR_VERSION); + config->enable_sar_conversion = cfg_get(psoc, CFG_SAR_CONVERSION); config->is_wow_disabled = cfg_get(psoc, CFG_WOW_DISABLE); hdd_init_vc_mode_cfg_bitmap(config, psoc);