diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index a5ea115e7b..6a88b5bf3e 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -5319,6 +5319,10 @@ static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, hdd_err("MLO SAP attach fails"); return QDF_STATUS_E_INVAL; } + + config->mlo_sap = true; + config->link_id = link_id; + config->num_link = num_link; } if (!policy_mgr_is_mlo_sap_concurrency_allowed( @@ -5330,16 +5334,14 @@ static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, return QDF_STATUS_SUCCESS; } -/** - * wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails - * @adapter: Pointer to hostapd adapter - * - * Return: void - */ -static void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) +void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) { - if (wlan_vdev_mlme_is_mlo_ap(adapter->vdev)) + if (wlan_vdev_mlme_is_mlo_ap(adapter->vdev)) { + adapter->session.ap.sap_config.mlo_sap = false; + adapter->session.ap.sap_config.link_id = 0; + adapter->session.ap.sap_config.num_link = 0; mlo_ap_vdev_detach(adapter->vdev); + } } #else static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, @@ -5349,10 +5351,6 @@ static QDF_STATUS wlan_hdd_mlo_update(struct hdd_context *hdd_ctx, { return QDF_STATUS_SUCCESS; } - -static void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) -{ -} #endif /** diff --git a/core/hdd/src/wlan_hdd_hostapd.h b/core/hdd/src/wlan_hdd_hostapd.h index 9efc5a07c2..0b207f7f55 100644 --- a/core/hdd/src/wlan_hdd_hostapd.h +++ b/core/hdd/src/wlan_hdd_hostapd.h @@ -368,4 +368,18 @@ void hdd_stop_sap_due_to_invalid_channel(struct work_struct *work); * Return: true if any sta is connecting */ bool hdd_is_any_sta_connecting(struct hdd_context *hdd_ctx); + +#ifdef WLAN_FEATURE_11BE_MLO +/** + * wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails + * @adapter: Pointer to hostapd adapter + * + * Return: void + */ +void wlan_hdd_mlo_reset(struct hdd_adapter *adapter); +#else +static inline void wlan_hdd_mlo_reset(struct hdd_adapter *adapter) +{ +} +#endif /* end WLAN_FEATURE_11BE_MLO */ #endif /* end #if !defined(WLAN_HDD_HOSTAPD_H) */ diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 38587a55f0..6ae4b796fb 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -211,7 +211,9 @@ #include #include "wlan_hdd_mlo.h" #include - +#ifdef WLAN_FEATURE_11BE_MLO +#include +#endif #ifdef MODULE #define WLAN_MODULE_NAME module_name(THIS_MODULE) #else @@ -15859,6 +15861,43 @@ void wlan_hdd_stop_sap(struct hdd_adapter *ap_adapter) mutex_unlock(&hdd_ctx->sap_lock); } +#ifdef WLAN_FEATURE_11BE_MLO +/** + * wlan_hdd_mlo_sap_reinit() - handle mlo scenario for ssr + * @hdd_ctx: Pointer to hdd context + * @config: Pointer to sap config + * @adapter: Pointer to hostapd adapter + * + * Return: QDF_STATUS + */ +static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx, + struct sap_config *config, + struct hdd_adapter *adapter) +{ + if (config->mlo_sap) { + if (!mlo_ap_vdev_attach(adapter->vdev, config->link_id, + config->num_link)) { + hdd_err("SAP mlo mgr attach fail"); + return QDF_STATUS_E_INVAL; + } + } + + if (!policy_mgr_is_mlo_sap_concurrency_allowed( + hdd_ctx->psoc, wlan_vdev_mlme_is_mlo_ap(adapter->vdev))) { + hdd_err("MLO SAP concurrency check fails"); + return QDF_STATUS_E_INVAL; + } + + return QDF_STATUS_SUCCESS; +} +#else +static QDF_STATUS wlan_hdd_mlo_sap_reinit(struct hdd_context *hdd_ctx, + struct sap_config *config, + struct hdd_adapter *adapter) +{ + return QDF_STATUS_SUCCESS; +} +#endif /** * wlan_hdd_start_sap() - this function starts bss of SAP. * @ap_adapter: SAP adapter @@ -15902,6 +15941,11 @@ void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit) hdd_ctx->pdev, hdd_ap_ctx->sap_config.chan_freq, 0, &hdd_ap_ctx->sap_config.ch_params); + if (QDF_IS_STATUS_ERROR(wlan_hdd_mlo_sap_reinit(hdd_ctx, sap_config, + ap_adapter))) { + hdd_err("SAP Not able to do mlo attach"); + goto end; + } qdf_event_reset(&hostapd_state->qdf_event); if (wlansap_start_bss(hdd_ap_ctx->sap_context, hdd_hostapd_sap_event_cb, @@ -15935,6 +15979,7 @@ void wlan_hdd_start_sap(struct hdd_adapter *ap_adapter, bool reinit) return; end: + wlan_hdd_mlo_reset(ap_adapter); wlansap_reset_sap_config_add_ie(sap_config, eUPDATE_IE_ALL); mutex_unlock(&hdd_ctx->sap_lock); /* SAP context and beacon cleanup will happen during driver unload diff --git a/core/sap/inc/sap_api.h b/core/sap/inc/sap_api.h index 2999b607b6..28cfc9737e 100644 --- a/core/sap/inc/sap_api.h +++ b/core/sap/inc/sap_api.h @@ -518,6 +518,11 @@ struct sap_config { struct hdd_channel_info *channel_info; uint32_t channel_info_count; bool dfs_cac_offload; +#ifdef WLAN_FEATURE_11BE_MLO + bool mlo_sap; + uint8_t link_id; + uint8_t num_link; +#endif }; #ifdef FEATURE_WLAN_AP_AP_ACS_OPTIMIZE