diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index 582ff6555f..9c06ccdb05 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -1558,6 +1558,20 @@ mlme_init_product_details_cfg(struct wlan_mlme_product_details_cfg sizeof(product_details->model_number)); } +#ifdef WLAN_FEATURE_11BE_MLO +static void mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_sta_cfg *sta) +{ + sta->single_link_mlo_conn = + cfg_default(CFG_SINGLE_LINK_MLO_CONN); +} +#else +static void mlme_init_sta_mlo_cfg(struct wlan_objmgr_psoc *psoc, + struct wlan_mlme_sta_cfg *sta) +{ +} +#endif + static void mlme_init_sta_cfg(struct wlan_objmgr_psoc *psoc, struct wlan_mlme_sta_cfg *sta) { @@ -1597,6 +1611,7 @@ static void mlme_init_sta_cfg(struct wlan_objmgr_psoc *psoc, sta->allow_tpc_from_ap = cfg_get(psoc, CFG_TX_POWER_CTRL); sta->sta_keepalive_method = cfg_get(psoc, CFG_STA_KEEPALIVE_METHOD); + mlme_init_sta_mlo_cfg(psoc, sta); } static void mlme_init_stats_cfg(struct wlan_objmgr_psoc *psoc, diff --git a/components/mlme/dispatcher/inc/cfg_mlme_sta.h b/components/mlme/dispatcher/inc/cfg_mlme_sta.h index 4c36be6ffd..db543ea8d6 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_sta.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_sta.h @@ -512,6 +512,34 @@ CFG_VALUE_OR_DEFAULT, \ "Max modulated dtim") +#ifdef WLAN_FEATURE_11BE_MLO +/* + * + * single_link_mlo_conn - Set single link mlo connection for sta + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This cfg is used to enable single link mlo connection + * + * Related: None + * + * Supported Feature: STA + * + * Usage: Internal + * + * + */ +#define CFG_SINGLE_LINK_MLO_CONN CFG_BOOL( \ + "single_link_mlo_conn", \ + 0, \ + "Enable single link mlo connection") + +#define CFG_SINGLE_LINK_MLO_CONN_CFG CFG(CFG_SINGLE_LINK_MLO_CONN) +#else +#define CFG_SINGLE_LINK_MLO_CONN_CFG +#endif + #define CFG_STA_ALL \ CFG(CFG_INFRA_STA_KEEP_ALIVE_PERIOD) \ CFG(CFG_STA_BSS_MAX_IDLE_PERIOD) \ @@ -531,6 +559,7 @@ CFG(CFG_STA_KEEPALIVE_METHOD) \ CFG(CFG_WT_CNF_TIMEOUT) \ CFG(CFG_CURRENT_RSSI) \ - CFG(CFG_TX_POWER_CTRL) + CFG(CFG_TX_POWER_CTRL) \ + CFG_SINGLE_LINK_MLO_CONN_CFG #endif /* CFG_MLME_STA_H__ */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index f732ef949d..3231ad4236 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -3339,6 +3339,27 @@ wlan_mlme_is_data_stall_recovery_fw_supported(struct wlan_objmgr_psoc *psoc); QDF_STATUS mlme_cfg_get_eht_caps(struct wlan_objmgr_psoc *psoc, tDot11fIEeht_cap *eht_cap); +#ifdef WLAN_FEATURE_11BE_MLO +/** + * wlan_mlme_is_sta_single_mlo_conn() - Is single mlo connection for sta + * set or not + * @psoc: pointer to psoc object + * + * Return: True if single mlo connection for sta is set + */ +bool wlan_mlme_is_sta_single_mlo_conn(struct wlan_objmgr_psoc *psoc); + +/** + * wlan_mlme_set_sta_single_mlo_conn() - Set single mlo connection for sta + * @psoc: pointer to psoc object + * @value: value to set + * + * Return: QDF Status + */ +QDF_STATUS wlan_mlme_set_sta_single_mlo_conn(struct wlan_objmgr_psoc *psoc, + bool value); +#endif + /** * wlan_mlme_set_ba_2k_jump_iot_ap() - Set a flag if ba 2k jump IOT AP is found * @vdev: vdev pointer diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 6cd2529b7c..4c7e9b848b 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -1639,6 +1639,7 @@ enum station_prefer_bw { * @allow_tpc_from_ap: Support for AP power constraint * @usr_disabled_roaming: User config for roaming disable * @usr_scan_probe_unicast_ra: User config unicast probe req in scan + * @single_link_mlo_conn: Single link mlo connection is configured */ struct wlan_mlme_sta_cfg { uint32_t sta_keep_alive_period; @@ -1665,6 +1666,9 @@ struct wlan_mlme_sta_cfg { #ifdef FEATURE_WLAN_DIAG_SUPPORT_CSR host_event_wlan_status_payload_type event_payload; #endif +#ifdef WLAN_FEATURE_11BE_MLO + bool single_link_mlo_conn; +#endif }; /** diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index fb84221eb9..87dc9ad032 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -1036,6 +1036,33 @@ QDF_STATUS mlme_update_tgt_eht_caps_in_cfg(struct wlan_objmgr_psoc *psoc, } #endif +#ifdef WLAN_FEATURE_11BE_MLO +bool wlan_mlme_is_sta_single_mlo_conn(struct wlan_objmgr_psoc *psoc) +{ + struct wlan_mlme_psoc_ext_obj *mlme_obj; + + mlme_obj = mlme_get_psoc_ext_obj(psoc); + if (!mlme_obj) + return false; + + return mlme_obj->cfg.sta.single_link_mlo_conn; +} + +QDF_STATUS wlan_mlme_set_sta_single_mlo_conn(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.sta.single_link_mlo_conn = value; + + return QDF_STATUS_SUCCESS; +} +#endif + QDF_STATUS wlan_mlme_get_num_11b_tx_chains(struct wlan_objmgr_psoc *psoc, uint16_t *value) { 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 59e34d30a8..3687a33d82 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 @@ -8660,6 +8660,11 @@ QDF_STATUS populate_dot11f_assoc_req_mlo_ie(struct mac_context *mac_ctx, /* find out number of links from bcn or prb rsp */ total_sta_prof = 1; + if (wlan_mlme_is_sta_single_mlo_conn( + wlan_vdev_get_psoc(pe_session->vdev))) { + pe_debug("Single link mlo connection is enabled for mlo sta"); + total_sta_prof = 0; + } partner_info = &pe_session->lim_join_req->partner_info; mlo_dev_ctx = pe_session->vdev->mlo_dev_ctx;