Bladeren bron

qcacld-3.0: Set LPI power when safe mode is enabled

i.) Keep rf test mode ini disabled by default due to which
6G security check will be true.

ii.) while calculating TPC power, check safe mode & RF test
mode enabled or not and set power mode to LPI if
safe mode or Rf test mode is enabled.

iii.) During HE ops IE extarct set power type to VLP, if
6 G Hz info is not present in HE ops IE. So that power
type can be VLP in case ap_ctry is non US.
To get safe mode value, a new member is_safe_mode_enabled
is added in mlme private object and is set whenever
WIFI_TEST_CONFIG_6GHZ_SECURITY_TEST_MODE command is triggered
via userspace.

Change-Id: I4fc2a231f8e7d18e68b92af3f381456113668779
CRs-Fixed: 3192967
Sheenam Monga 2 jaren geleden
bovenliggende
commit
d933925871

+ 4 - 2
components/mlme/dispatcher/inc/cfg_mlme_generic.h

@@ -182,9 +182,11 @@ enum debug_packet_log_type {
  * rf_test_mode_enabled - Enable rf test mode support
  * @Min: 0
  * @Max: 1
- * @Default: 1
+ * @Default: 0
  *
  * This cfg is used to set rf test mode support flag
+ * by default 6 G Hz security check will be enabled
+ * with rf test mode as disabled.
  *
  * Related: None
  *
@@ -192,7 +194,7 @@ enum debug_packet_log_type {
  */
 #define CFG_RF_TEST_MODE_SUPP_ENABLED CFG_BOOL( \
 		"rf_test_mode_enabled", \
-		1, \
+		0, \
 		"rf test mode Enable Flag")
 
 #ifdef CONFIG_BAND_6GHZ

+ 24 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -3600,4 +3600,28 @@ QDF_STATUS mlme_save_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev,
  */
 uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev);
 #endif /* WLAN_FEATURE_SON */
+/**
+ * wlan_mlme_set_safe_mode_enable() - set safe_mode_enable flag
+ * based on value set by user space.
+ *
+ * @psoc: psoc context
+ * @safe_mode_enable: safe mode enabled or not
+ *
+ * Return: none
+ */
+void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
+				    bool safe_mode_enable);
+
+/**
+ * wlan_mlme_get_safe_mode_enable() - get safe_mode_enable set by user
+ * space
+ *
+ * @psoc: psoc context
+ * @safe_mode_enable: safe mode enabled or not
+ *
+ * Return: none
+ */
+void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
+				    bool *safe_mode_enable);
+
 #endif /* _WLAN_MLME_API_H_ */

+ 3 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1358,6 +1358,8 @@ struct wlan_user_mcc_quota {
  * @tx_retry_multiplier: TX xretry extension parameter
  * @mgmt_hw_tx_retry_count: MGMT HW tx retry count for frames
  * @relaxed_6ghz_conn_policy: 6GHz relaxed connection policy
+ * @safe_mode_enable: safe mode to bypass some strict 6 GHz checks for
+ * connection, bypass strict power levels
  */
 struct wlan_mlme_generic {
 	uint32_t band_capability;
@@ -1411,6 +1413,7 @@ struct wlan_mlme_generic {
 #ifdef WLAN_FEATURE_MCC_QUOTA
 	struct wlan_user_mcc_quota user_mcc_quota;
 #endif
+	bool safe_mode_enable;
 };
 
 /*

+ 32 - 1
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -3045,8 +3045,10 @@ 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)
+	if (!mlme_obj) {
+		*value = false;
 		return QDF_STATUS_E_FAILURE;
+	}
 
 	*value = mlme_obj->cfg.gen.enabled_rf_test_mode;
 
@@ -5744,3 +5746,32 @@ uint8_t mlme_get_vdev_max_mcs_idx(struct wlan_objmgr_vdev *vdev)
 	return mlme_priv->max_mcs_index;
 }
 #endif /* WLAN_FEATURE_SON */
+
+void wlan_mlme_get_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
+				    bool *safe_mode_enable)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		mlme_legacy_err("invalid mlme obj");
+		*safe_mode_enable = false;
+		return;
+	}
+
+	*safe_mode_enable = mlme_obj->cfg.gen.safe_mode_enable;
+}
+
+void wlan_mlme_set_safe_mode_enable(struct wlan_objmgr_psoc *psoc,
+				    bool safe_mode_enable)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+	if (!mlme_obj) {
+		mlme_legacy_err("invalid mlme obj");
+		return;
+	}
+
+	mlme_obj->cfg.gen.safe_mode_enable = safe_mode_enable;
+}

+ 1 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -10786,6 +10786,7 @@ static int hdd_test_config_6ghz_security_test_mode(struct hdd_context *hdd_ctx,
 
 	cfg_val = nla_get_u8(attr);
 	hdd_debug("safe mode setting %d", cfg_val);
+	wlan_mlme_set_safe_mode_enable(hdd_ctx->psoc, 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,

+ 4 - 3
core/hdd/src/wlan_hdd_main.c

@@ -14965,10 +14965,11 @@ static int hdd_features_init(struct hdd_context *hdd_ctx)
 		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);
+
+	if (rf_test_mode) {
+		wlan_cm_set_check_6ghz_security(hdd_ctx->psoc, false);
 		wlan_cm_set_6ghz_key_mgmt_mask(hdd_ctx->psoc,
-					       ALLOWED_KEYMGMT_6G_MASK);
+					       DEFAULT_KEYMGMT_6G_MASK);
 	}
 
 	status = ucfg_mlme_is_relaxed_6ghz_conn_policy_enabled(hdd_ctx->psoc,

+ 19 - 5
core/mac/src/pe/lim/lim_process_sme_req_messages.c

@@ -5275,6 +5275,8 @@ void lim_calculate_tpc(struct mac_context *mac,
 	struct vdev_mlme_obj *mlme_obj;
 	uint8_t tpe_power;
 	bool skip_tpe = false;
+	bool rf_test_mode = false;
+	bool safe_mode_enable = false;
 
 	mlme_obj = wlan_vdev_mlme_get_cmpt_obj(session->vdev);
 	if (!mlme_obj) {
@@ -5304,13 +5306,25 @@ void lim_calculate_tpc(struct mac_context *mac,
 		/* Power mode calculation for 6G*/
 		ap_power_type_6g = session->ap_power_type;
 		if (LIM_IS_STA_ROLE(session)) {
-			if (!session->lim_join_req) {
-				if (!ctry_code_match)
-					ap_power_type_6g = ap_pwr_type;
+			wlan_mlme_get_safe_mode_enable(mac->psoc,
+						       &safe_mode_enable);
+			wlan_mlme_is_rf_test_mode_enabled(mac->psoc,
+							  &rf_test_mode);
+			/*
+			 * set LPI power if safe mode is enabled OR RF test
+			 * mode is enabled.
+			 */
+			if (rf_test_mode || safe_mode_enable) {
+				ap_power_type_6g = REG_INDOOR_AP;
 			} else {
-				if (!session->same_ctry_code)
-					ap_power_type_6g =
+				if (!session->lim_join_req) {
+					if (!ctry_code_match)
+						ap_power_type_6g = ap_pwr_type;
+				} else {
+					if (!session->same_ctry_code)
+						ap_power_type_6g =
 						session->ap_power_type_6g;
+				}
 			}
 		}
 	}

+ 1 - 0
core/mac/src/pe/lim/lim_prop_exts_utils.c

@@ -121,6 +121,7 @@ static void lim_extract_he_op(struct pe_session *session,
 		return;
 	if (!session->he_op.oper_info_6g_present) {
 		pe_debug("6GHz op not present in 6G beacon");
+		session->ap_power_type = REG_VERY_LOW_POWER_AP;
 		return;
 	}
 	session->ch_width = session->he_op.oper_info_6g.info.ch_width;