diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index a53e0cccc209..3c349e20175f 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -416,7 +416,7 @@ static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc, gen->wls_6ghz_capable = cfg_get(psoc, CFG_WLS_6GHZ_CAPABLE); mlme_init_pmf_cfg(psoc, gen); mlme_init_lpass_support_cfg(psoc, gen); - + gen->enabled_rf_test_mode = cfg_default(CFG_RF_TEST_MODE_SUPP_ENABLED); gen->enabled_11h = cfg_get(psoc, CFG_11H_SUPPORT_ENABLED); gen->enabled_11d = cfg_get(psoc, CFG_11D_SUPPORT_ENABLED); gen->enable_beacon_reception_stats = diff --git a/components/mlme/dispatcher/inc/cfg_mlme_generic.h b/components/mlme/dispatcher/inc/cfg_mlme_generic.h index be1779d090ad..9bf436814daf 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_generic.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_generic.h @@ -149,6 +149,23 @@ enum monitor_mode_concurrency { 1, \ "11d Enable Flag") +/* + * rf_test_mode_enabled - Enable rf test mode support + * @Min: 0 + * @Max: 1 + * @Default: 1 + * + * This cfg is used to set rf test mode support flag + * + * Related: None + * + * Supported Feature: STA + */ +#define CFG_RF_TEST_MODE_SUPP_ENABLED CFG_BOOL( \ + "rf_test_mode_enabled", \ + 1, \ + "rf test mode Enable Flag") + /* * * BandCapability - Preferred band (0: 2.4G, 5G, and 6G, @@ -855,6 +872,7 @@ enum monitor_mode_concurrency { CFG(CFG_ENABLE_BEACON_RECEPTION_STATS) \ CFG(CFG_REMOVE_TIME_STAMP_SYNC_CMD) \ CFG(CFG_MGMT_RETRY_MAX) \ + CFG(CFG_RF_TEST_MODE_SUPP_ENABLED) \ CFG(CFG_BMISS_SKIP_FULL_SCAN) \ CFG(CFG_ENABLE_RING_BUFFER) \ CFG(CFG_DFS_CHAN_AGEOUT_TIME) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 17006da83b68..b38cd2b18440 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -2135,6 +2135,26 @@ wlan_mlme_is_11d_enabled(struct wlan_objmgr_psoc *psoc, bool *value); QDF_STATUS wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value); +/** + * wlan_mlme_is_rf_test_mode_enabled() - Get the rf test mode flag + * @psoc: psoc context + * @value: Enable/Disable value ptr. + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value); + +/** + * wlan_mlme_set_rf_test_mode_enabled() - Set the rf test mode flag + * @psoc: psoc context + * @value: Enable/Disable value. + * + * Return: QDF_STATUS + */ +QDF_STATUS +wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value); + /** * wlan_mlme_get_sta_miracast_mcc_rest_time() - Get STA/MIRACAST MCC rest time * diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index e209ae913eac..0d0200534c80 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1228,6 +1228,7 @@ struct wlan_mlme_ratemask { * @dual_sta_roam_fw_support: Firmware support for dual sta roaming feature * @sae_connect_retries: sae connect retry bitmask * @wls_6ghz_capable: wifi location service(WLS) is 6ghz capable + * @enabled_rf_test_mode: Enable/disable the RF test mode config * @monitor_mode_concurrency: Monitor mode concurrency supported * @ocv_support: FW supports OCV or not */ @@ -1271,6 +1272,7 @@ struct wlan_mlme_generic { bool dual_sta_roam_fw_support; uint32_t sae_connect_retries; bool wls_6ghz_capable; + bool enabled_rf_test_mode; enum monitor_mode_concurrency monitor_mode_concurrency; bool ocv_support; }; diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index 1899ef7fd7e2..c4a588458bfb 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h @@ -2663,6 +2663,36 @@ ucfg_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value) return wlan_mlme_set_11d_enabled(psoc, value); } +/** + * ucfg_mlme_is_rf_test_mode_enabled() - Get rf test mode flag + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Inline UCFG API to be used by HDD/OSIF callers + * + * Return: QDF Status + */ +static inline QDF_STATUS +ucfg_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) +{ + return wlan_mlme_is_rf_test_mode_enabled(psoc, value); +} + +/** + * ucfg_mlme_set_rf_test_mode_enabled() - Set rf test mode flag + * @psoc: pointer to psoc object + * @value: Value that needs to be set from the caller + * + * Inline UCFG API to be used by HDD/OSIF callers + * + * Return: QDF Status + */ +static inline QDF_STATUS +ucfg_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) +{ + return wlan_mlme_set_rf_test_mode_enabled(psoc, value); +} + /** * ucfg_mlme_get_opr_rate() - Get operational rate set * @psoc: pointer to vdev object diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index e62fb42c3f27..f2e0b3505730 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -2712,6 +2712,34 @@ wlan_mlme_set_11d_enabled(struct wlan_objmgr_psoc *psoc, bool value) return QDF_STATUS_SUCCESS; } +QDF_STATUS +wlan_mlme_is_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_FAILURE; + + *value = mlme_obj->cfg.gen.enabled_rf_test_mode; + + return QDF_STATUS_SUCCESS; +} + +QDF_STATUS +wlan_mlme_set_rf_test_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return QDF_STATUS_E_FAILURE; + + mlme_obj->cfg.gen.enabled_rf_test_mode = value; + + return QDF_STATUS_SUCCESS; +} + QDF_STATUS wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value) { diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 31aeb61d57f6..5e795c4bd19e 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -4153,6 +4153,14 @@ void hdd_unregister_notifiers(struct hdd_context *hdd_ctx); */ int hdd_dbs_scan_selection_init(struct hdd_context *hdd_ctx); +/** + * hdd_update_scan_config - API to update scan configuration parameters + * @hdd_ctx: HDD context + * + * Return: 0 if success else err + */ +int hdd_update_scan_config(struct hdd_context *hdd_ctx); + /** * hdd_start_complete()- complete the start event * @ret: return value for complete event. diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index d0feb94b333b..17de87ae01a2 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -7092,6 +7092,8 @@ wlan_hdd_wifi_test_config_policy[ .type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_IGNORE_CSA] = { .type = NLA_U8}, + [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_6GHZ_SECURITY_TEST_MODE] + = {.type = NLA_U8}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_OCI_OVERRIDE] = { .type = NLA_NESTED}, [QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_IGNORE_SA_QUERY_TIMEOUT] = { @@ -9776,6 +9778,7 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, uint8_t value = 0; uint8_t wmm_mode = 0; uint32_t cmd_id; + bool rf_test_mode = false; struct set_wfatest_params wfa_param = {0}; struct hdd_station_ctx *hdd_sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter); @@ -10289,6 +10292,30 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy, ret_val = ucfg_send_wfatest_cmd(adapter->vdev, &wfa_param); } + cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_6GHZ_SECURITY_TEST_MODE; + if (tb[cmd_id]) { + status = ucfg_mlme_is_rf_test_mode_enabled(hdd_ctx->psoc, + &rf_test_mode); + if (!QDF_IS_STATUS_SUCCESS(status)) { + hdd_err("Get rf test mode failed"); + return QDF_STATUS_E_FAILURE; + } + if (rf_test_mode) { + hdd_err("rf test mode is enabled, ignore setting"); + return 0; + } + cfg_val = nla_get_u8(tb[cmd_id]); + hdd_debug("safe mode setting %d", cfg_val); + if (cfg_val) { + wlan_cm_set_check_6ghz_security(hdd_ctx->psoc, false); + wlan_cm_set_6ghz_key_mgmt_mask(hdd_ctx->psoc, + DEFAULT_KEYMGMT_6G_MASK); + } else { + wlan_cm_set_check_6ghz_security(hdd_ctx->psoc, true); + wlan_cm_set_6ghz_key_mgmt_mask(hdd_ctx->psoc, + ALLOWED_KEYMGMT_6G_MASK); + } + } cmd_id = QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_OCI_OVERRIDE; if (tb[cmd_id]) { struct nlattr *tb2[QCA_WLAN_VENDOR_ATTR_OCI_OVERRIDE_MAX + 1]; diff --git a/core/hdd/src/wlan_hdd_ioctl.c b/core/hdd/src/wlan_hdd_ioctl.c index 4d6bb6835831..a7f1d870f976 100644 --- a/core/hdd/src/wlan_hdd_ioctl.c +++ b/core/hdd/src/wlan_hdd_ioctl.c @@ -6329,9 +6329,12 @@ static int drv_cmd_set_fcc_channel(struct hdd_adapter *adapter, struct hdd_priv_data *priv_data) { QDF_STATUS status; + QDF_STATUS status_6G = QDF_STATUS_SUCCESS; int8_t input_value; bool fcc_constraint; int err; + uint32_t band_bitmap = 0; + bool rf_test_mode; /* * This command would be called by user-space when it detects WLAN @@ -6354,9 +6357,28 @@ static int drv_cmd_set_fcc_channel(struct hdd_adapter *adapter, status = ucfg_reg_set_fcc_constraint(hdd_ctx->pdev, fcc_constraint); + status_6G = ucfg_mlme_is_rf_test_mode_enabled(hdd_ctx->psoc, + &rf_test_mode); + if (!QDF_IS_STATUS_SUCCESS(status_6G)) { + hdd_err("Get rf test mode failed"); + goto send_status; + } + + if (!rf_test_mode) { + if (fcc_constraint) + band_bitmap |= (BIT(REG_BAND_5G) | BIT(REG_BAND_2G)); + else + band_bitmap = REG_BAND_MASK_ALL; + if (hdd_reg_set_band(adapter->dev, band_bitmap)) + status_6G = QDF_STATUS_E_FAILURE; + } + +send_status: if (QDF_IS_STATUS_ERROR(status)) hdd_err("Failed to %s tx power for channels 12/13", fcc_constraint ? "restore" : "reduce"); + else + status = status_6G; return qdf_status_to_os_return(status); } diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index c50c1f8d990e..9bcc5d04d938 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -13801,6 +13801,7 @@ static int hdd_features_init(struct hdd_context *hdd_ctx) int ret; mac_handle_t mac_handle; bool b_cts2self, is_imps_enabled; + bool rf_test_mode; hdd_enter(); @@ -13888,6 +13889,18 @@ static int hdd_features_init(struct hdd_context *hdd_ctx) wlan_hdd_init_chan_info(hdd_ctx); wlan_hdd_twt_init(hdd_ctx); + status = ucfg_mlme_is_rf_test_mode_enabled(hdd_ctx->psoc, + &rf_test_mode); + if (!QDF_IS_STATUS_SUCCESS(status)) { + hdd_err("Get rf test mode failed"); + return QDF_STATUS_E_FAILURE; + } + if (!rf_test_mode) { + wlan_cm_set_check_6ghz_security(hdd_ctx->psoc, true); + wlan_cm_set_6ghz_key_mgmt_mask(hdd_ctx->psoc, + ALLOWED_KEYMGMT_6G_MASK); + } + hdd_exit(); return 0; } @@ -17901,7 +17914,7 @@ static int hdd_update_dfs_config(struct hdd_context *hdd_ctx) * * Return: 0 if success else err */ -static int hdd_update_scan_config(struct hdd_context *hdd_ctx) +int hdd_update_scan_config(struct hdd_context *hdd_ctx) { struct wlan_objmgr_psoc *psoc = hdd_ctx->psoc; struct scan_user_cfg scan_cfg;