Prechádzať zdrojové kódy

qcacld-3.0: Add cfg item to enable eMLSR mode

Add cfg item to enable/disable eMLSR mode for ML STA
under 802.11be op mode. The cfg value 0 corresponds
to default MLMR mode, 1 corresponds to eMLSR mode.

Change-Id: Ib02516aac8ac44aee6b40a572a9f7469b10d0ac2
CRs-Fixed: 3184745
Gururaj Pandurangi 3 rokov pred
rodič
commit
55f3afd6bf

+ 21 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -511,6 +511,26 @@ static void mlme_init_mgmt_hw_tx_retry_count_cfg(
 	}
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * mlme_init_emlsr_mode() - initialize emlsr mode enable flag
+ * @psoc: Pointer to PSOC
+ * @gen: pointer to generic CFG items
+ *
+ * Return: None
+ */
+static void mlme_init_emlsr_mode(struct wlan_objmgr_psoc *psoc,
+				 struct wlan_mlme_generic *gen)
+{
+	gen->enable_emlsr_mode = cfg_default(CFG_EMLSR_MODE_ENABLE);
+}
+#else
+static void mlme_init_emlsr_mode(struct wlan_objmgr_psoc *psoc,
+				 struct wlan_mlme_generic *gen)
+{
+}
+#endif
+
 static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
 				  struct wlan_mlme_generic *gen)
 {
@@ -576,6 +596,7 @@ static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
 	mlme_init_wds_config_cfg(psoc, gen);
 	mlme_init_mgmt_hw_tx_retry_count_cfg(psoc, gen);
 	mlme_init_relaxed_6ghz_conn_policy(psoc, gen);
+	mlme_init_emlsr_mode(psoc, gen);
 }
 
 static void mlme_init_edca_ani_cfg(struct wlan_objmgr_psoc *psoc,

+ 26 - 1
components/mlme/dispatcher/inc/cfg_mlme_generic.h

@@ -221,6 +221,30 @@ enum debug_packet_log_type {
 #define CFG_RELAX_6GHZ_CONN_POLICY
 #endif
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/*
+ * emlsr_mode_enable - Enable eMLSR mode support
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * This cfg is used to enable eMLSR mode
+ * If 0 - MLMR mode (Default mode)
+ * If 1 - eMLSR mode
+ *
+ * Related: None
+ *
+ * Supported Feature: STA
+ */
+#define CFG_EMLSR_MODE_ENABLE CFG_BOOL( \
+		"emlsr_mode_enable", \
+		0, \
+		"eMLSR mode enable flag")
+#define CFG_EMLSR_MODE_ENABLED	CFG(CFG_EMLSR_MODE_ENABLE)
+#else
+#define CFG_EMLSR_MODE_ENABLED
+#endif
+
 /*
  * <ini>
  * BandCapability - Preferred band (0: 2.4G, 5G, and 6G,
@@ -1016,5 +1040,6 @@ enum debug_packet_log_type {
 	CFG_WDS_MODE_ALL \
 	CFG(CFG_TX_RETRY_MULTIPLIER) \
 	CFG(CFG_MGMT_FRAME_HW_TX_RETRY_COUNT) \
-	CFG_RELAX_6GHZ_CONN_POLICY
+	CFG_RELAX_6GHZ_CONN_POLICY \
+	CFG_EMLSR_MODE_ENABLED
 #endif /* __CFG_MLME_GENERIC_H */

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

@@ -2310,6 +2310,41 @@ wlan_mlme_set_relaxed_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
+#ifdef WLAN_FEATURE_11BE_MLO
+/**
+ * wlan_mlme_get_emlsr_mode_enabled() - Get the eMLSR mode flag
+ * @psoc: psoc context
+ * @value: Enable/Disable value ptr.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value);
+
+/**
+ * wlan_mlme_set_emlsr_mode_enabled() - Set the eMLSR mode flag
+ * @psoc: psoc context
+ * @value: Enable/Disable value.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS
+wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value);
+#else
+static inline QDF_STATUS
+wlan_mlme_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
+{
+	*value = false;
+	return QDF_STATUS_SUCCESS;
+}
+
+static inline QDF_STATUS
+wlan_mlme_set_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
+{
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 /**
  * wlan_mlme_get_sta_miracast_mcc_rest_time() - Get STA/MIRACAST MCC rest time
  * @psoc: pointer to psoc object

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

@@ -1358,6 +1358,7 @@ 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
+ * @enable_emlsr_mode: 11BE eMLSR mode support
  * @safe_mode_enable: safe mode to bypass some strict 6 GHz checks for
  * connection, bypass strict power levels
  */
@@ -1410,6 +1411,9 @@ struct wlan_mlme_generic {
 #ifdef CONFIG_BAND_6GHZ
 	bool relaxed_6ghz_conn_policy;
 #endif
+#ifdef WLAN_FEATURE_11BE_MLO
+	bool enable_emlsr_mode;
+#endif
 #ifdef WLAN_FEATURE_MCC_QUOTA
 	struct wlan_user_mcc_quota user_mcc_quota;
 #endif

+ 30 - 0
components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h

@@ -2830,6 +2830,36 @@ ucfg_mlme_set_relaxed_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
 	return wlan_mlme_set_relaxed_6ghz_conn_policy(psoc, value);
 }
 
+/**
+ * ucfg_mlme_get_emlsr_mode_enabled() - Get eMLSR 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_get_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool *value)
+{
+	return wlan_mlme_get_emlsr_mode_enabled(psoc, value);
+}
+
+/**
+ * ucfg_mlme_set_emlsr_mode_enabled() - Set eMLSR 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_emlsr_mode_enabled(struct wlan_objmgr_psoc *psoc, bool value)
+{
+	return wlan_mlme_set_emlsr_mode_enabled(psoc, value);
+}
+
 /**
  * ucfg_mlme_get_opr_rate() - Get operational rate set
  * @psoc: pointer to vdev object

+ 30 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -3167,6 +3167,36 @@ wlan_mlme_set_relaxed_6ghz_conn_policy(struct wlan_objmgr_psoc *psoc,
 }
 #endif
 
+#ifdef WLAN_FEATURE_11BE_MLO
+QDF_STATUS
+wlan_mlme_get_emlsr_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.enable_emlsr_mode;
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS
+wlan_mlme_set_emlsr_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.enable_emlsr_mode = value;
+
+	return QDF_STATUS_SUCCESS;
+}
+#endif
+
 QDF_STATUS
 wlan_mlme_cfg_set_vht_chan_width(struct wlan_objmgr_psoc *psoc, uint8_t value)
 {

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

@@ -7582,6 +7582,8 @@ wlan_hdd_wifi_test_config_policy[
 			= {.type = NLA_U8},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_IGNORE_H2E_RSNXE]
 			= {.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_11BE_EMLSR_MODE] = {
+			.type = NLA_U8},
 };
 
 /**
@@ -10877,6 +10879,32 @@ static int hdd_test_config_6ghz_security_test_mode(struct hdd_context *hdd_ctx,
 	return 0;
 }
 
+#ifdef WLAN_FEATURE_11BE_MLO
+static int hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx,
+				      struct nlattr *attr)
+
+{
+	uint8_t cfg_val;
+
+	cfg_val = nla_get_u8(attr);
+	hdd_info("11be op mode setting %d", cfg_val);
+	if (cfg_val) {
+		hdd_debug("eMLSR mode is enabled");
+		ucfg_mlme_set_emlsr_mode_enabled(hdd_ctx->psoc, cfg_val);
+	} else {
+		hdd_debug("Default mode: MLMR, no action required");
+	}
+
+	return 0;
+}
+#else
+static inline int
+hdd_test_config_emlsr_mode(struct hdd_context *hdd_ctx, struct nlattr *attr)
+{
+	return 0;
+}
+#endif
+
 /**
  * __wlan_hdd_cfg80211_set_wifi_test_config() - Wifi test configuration
  * vendor command
@@ -11759,6 +11787,14 @@ __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_11BE_EMLSR_MODE;
+	if (tb[cmd_id] && adapter->device_mode == QDF_STA_MODE) {
+		wfa_param.vdev_id = adapter->vdev_id;
+		wfa_param.value = nla_get_u8(tb[cmd_id]);
+
+		ret_val = hdd_test_config_emlsr_mode(hdd_ctx, tb[cmd_id]);
+	}
+
 	if (update_sme_cfg)
 		sme_update_config(mac_handle, sme_config);
 

+ 5 - 3
core/mac/src/sys/legacy/src/utils/src/parser_api.c

@@ -10768,7 +10768,7 @@ QDF_STATUS populate_dot11f_assoc_req_mlo_ie(struct mac_context *mac_ctx,
 	uint32_t len_consumed;
 	uint16_t len_remaining, len;
 	QDF_STATUS status;
-	bool emlsr_cap = false;
+	bool emlsr_cap, emlsr_enabled = false;
 	struct wlan_objmgr_psoc *psoc;
 	tDot11fIEnon_inheritance sta_prof_non_inherit;
 	tDot11fFfCapabilities mlo_cap;
@@ -10820,9 +10820,11 @@ QDF_STATUS populate_dot11f_assoc_req_mlo_ie(struct mac_context *mac_ctx,
 	}
 
 	emlsr_cap = policy_mgr_is_hw_emlsr_capable(psoc);
-	pe_session->is_emlsr_capable = emlsr_cap;
 
-	if (emlsr_cap) {
+	wlan_mlme_get_emlsr_mode_enabled(psoc, &emlsr_enabled);
+	pe_session->is_emlsr_capable = emlsr_cap && emlsr_enabled;
+
+	if (pe_session->is_emlsr_capable) {
 		mlo_ie->eml_capab_present = 1;
 		presence_bitmap |= WLAN_ML_BV_CTRL_PBM_EMLCAP_P;
 		mlo_ie->common_info_length += WLAN_ML_BV_CINFO_EMLCAP_SIZE;