diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 7be387a7d5..71a9ecaa28 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/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, diff --git a/components/mlme/dispatcher/inc/cfg_mlme_generic.h b/components/mlme/dispatcher/inc/cfg_mlme_generic.h index a60c24071b..624923c3c3 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_generic.h +++ b/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 + /* * * 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 */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 51fd776938..5a59b00fb4 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/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 diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index ec3a0173be..37d126c755 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/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 diff --git a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h b/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h index aad20016d9..0f94c68ed1 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_ucfg_api.h +++ b/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 diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index 6023d3e491..6f494f5877 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/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) { diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 793e9c49ee..94a5379700 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/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); diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c index a197ebd879..141d64a1df 100644 --- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c +++ b/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;