diff --git a/Kbuild b/Kbuild index 299b95daa0..fe77e0129e 100644 --- a/Kbuild +++ b/Kbuild @@ -2600,7 +2600,7 @@ SR_UCFG_INC := -I$(WLAN_ROOT)/components/spatial_reuse/dispatcher/inc SR_TGT_DIR := $(WLAN_COMMON_ROOT)/target_if/spatial_reuse/src SR_TGT_INC := -I$(WLAN_COMMON_INC)/target_if/spatial_reuse/inc/ -ifeq ($(CONFIG_WLAN_FEATURE_11AX), y) +ifeq ($(CONFIG_WLAN_FEATURE_SR), y) WLAN_SR_OBJS := $(SR_UCFG_DIR)/spatial_reuse_ucfg_api.o \ $(SR_UCFG_DIR)/spatial_reuse_api.o \ $(SR_TGT_DIR)/target_if_spatial_reuse.o diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index 0e310893f6..5f5585be44 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -688,6 +688,29 @@ static inline void policy_mgr_check_concurrent_intf_and_restart_sap( */ uint32_t policy_mgr_get_conc_vdev_on_same_mac(struct wlan_objmgr_psoc *psoc, uint32_t vdev_id, uint8_t mac_id); + +#ifdef WLAN_FEATURE_SR +/** + * policy_mgr_sr_same_mac_conc_enabled() - Function to check same MAC + * concurrency support in Spatial Reuse + * @psoc: PSOC object information + * + * This function is used to check whether concurrency is supported + * on same mac or not with Spatial Reuse enabled. + * + * Return: True if same MAC concurrency is supported with Spatial Reuse + * else False. + */ +bool policy_mgr_sr_same_mac_conc_enabled(struct wlan_objmgr_psoc *psoc); +#else +static inline +bool policy_mgr_sr_same_mac_conc_enabled(struct wlan_objmgr_psoc *psoc) +{ + return false; +} + +#endif + /** * policy_mgr_is_mcc_in_24G() - Function to check for MCC in 2.4GHz * @psoc: PSOC object information diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c index 4c158f6157..b9fabe265a 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c @@ -8839,3 +8839,28 @@ QDF_STATUS policy_mgr_get_sbs_cfg(struct wlan_objmgr_psoc *psoc, bool *sbs) return QDF_STATUS_SUCCESS; } + +#ifdef WLAN_FEATURE_SR +bool policy_mgr_sr_same_mac_conc_enabled(struct wlan_objmgr_psoc *psoc) +{ + struct wmi_unified *wmi_handle; + bool sr_conc_enabled; + + if (!psoc) { + mlme_err("PSOC is NULL"); + return false; + } + + wmi_handle = get_wmi_unified_hdl_from_psoc(psoc); + if (!wmi_handle) { + mlme_err("wmi_handle is null"); + return false; + } + + sr_conc_enabled = policy_mgr_get_same_mac_conc_sr_status(psoc); + + return (sr_conc_enabled && + wmi_service_enabled(wmi_handle, + wmi_service_obss_per_packet_sr_support)); +} +#endif diff --git a/components/spatial_reuse/dispatcher/inc/spatial_reuse_api.h b/components/spatial_reuse/dispatcher/inc/spatial_reuse_api.h index 3f98c0f300..1b016e33ea 100644 --- a/components/spatial_reuse/dispatcher/inc/spatial_reuse_api.h +++ b/components/spatial_reuse/dispatcher/inc/spatial_reuse_api.h @@ -25,6 +25,7 @@ #include #include +#ifdef WLAN_FEATURE_SR /** * wlan_spatial_reuse_config_set() - Set spatial reuse config * @vdev: objmgr manager vdev @@ -36,6 +37,15 @@ QDF_STATUS wlan_spatial_reuse_config_set(struct wlan_objmgr_vdev *vdev, uint8_t sr_ctrl, uint8_t non_srg_max_pd_offset); +#else +static inline +QDF_STATUS wlan_spatial_reuse_config_set(struct wlan_objmgr_vdev *vdev, + uint8_t sr_ctrl, + uint8_t non_srg_max_pd_offset) +{ + return QDF_STATUS_SUCCESS; +} +#endif /** * wlan_spatial_reuse_he_siga_val15_allowed_set() - Set spatial reuse config diff --git a/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c b/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c index 200dd5e29a..11719103f8 100644 --- a/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c +++ b/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c @@ -43,20 +43,22 @@ void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev, bool enable) { uint8_t sr_ctrl = 0; - uint8_t non_srg_max_pd_offset = 0; + /* Disabled PD Threshold */ + uint8_t non_srg_max_pd_offset = 0x80; - if (enable && (!wlan_vdev_mlme_get_he_spr_enabled(vdev))) { + /* SR feature itself is disabled by user */ + if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) + return; + + if (enable) { sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); non_srg_max_pd_offset = wlan_vdev_mlme_get_pd_offset(vdev); - if (sr_ctrl && non_srg_max_pd_offset) { + if (sr_ctrl && non_srg_max_pd_offset) wlan_spatial_reuse_config_set(vdev, sr_ctrl, non_srg_max_pd_offset); - wlan_vdev_mlme_set_he_spr_enabled(vdev, true); - } - } else if (!enable && wlan_vdev_mlme_get_he_spr_enabled(vdev)) { + } else { wlan_spatial_reuse_config_set(vdev, sr_ctrl, non_srg_max_pd_offset); - wlan_vdev_mlme_set_he_spr_enabled(vdev, false); } } diff --git a/core/hdd/src/wlan_hdd_assoc.c b/core/hdd/src/wlan_hdd_assoc.c index 6d8e4f8d9b..55028b1043 100644 --- a/core/hdd/src/wlan_hdd_assoc.c +++ b/core/hdd/src/wlan_hdd_assoc.c @@ -2091,7 +2091,6 @@ static void hdd_roam_channel_switch_handler(struct hdd_adapter *adapter, policy_mgr_check_concurrent_intf_and_restart_sap(hdd_ctx->psoc); wlan_twt_concurrency_update(hdd_ctx); - hdd_update_he_obss_pd(adapter, NULL, true); } #ifdef WLAN_FEATURE_HOST_ROAM diff --git a/core/hdd/src/wlan_hdd_cm_connect.c b/core/hdd/src/wlan_hdd_cm_connect.c index 6bdfeac84a..b5efa8acc1 100644 --- a/core/hdd/src/wlan_hdd_cm_connect.c +++ b/core/hdd/src/wlan_hdd_cm_connect.c @@ -724,7 +724,6 @@ hdd_cm_connect_failure_post_user_update(struct wlan_objmgr_vdev *vdev, WLAN_CONTROL_PATH); ucfg_dp_periodic_sta_stats_start(vdev); wlan_twt_concurrency_update(hdd_ctx); - hdd_update_he_obss_pd(adapter, NULL, false); } static void hdd_cm_connect_failure(struct wlan_objmgr_vdev *vdev, @@ -1389,7 +1388,6 @@ hdd_cm_connect_success_post_user_update(struct wlan_objmgr_vdev *vdev, } ucfg_dp_periodic_sta_stats_start(vdev); wlan_twt_concurrency_update(hdd_ctx); - hdd_update_he_obss_pd(adapter, NULL, true); } static void hdd_cm_connect_success(struct wlan_objmgr_vdev *vdev, diff --git a/core/hdd/src/wlan_hdd_cm_disconnect.c b/core/hdd/src/wlan_hdd_cm_disconnect.c index ed36429f87..a6023eb325 100644 --- a/core/hdd/src/wlan_hdd_cm_disconnect.c +++ b/core/hdd/src/wlan_hdd_cm_disconnect.c @@ -464,7 +464,6 @@ hdd_cm_disconnect_complete_post_user_update(struct wlan_objmgr_vdev *vdev, hdd_cm_set_default_wlm_mode(adapter); __hdd_cm_disconnect_handler_post_user_update(adapter, vdev); wlan_twt_concurrency_update(hdd_ctx); - hdd_update_he_obss_pd(adapter, NULL, false); hdd_cm_reset_udp_qos_upgrade_config(adapter); return QDF_STATUS_SUCCESS; diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index 8ce6c1b6ae..fdbc9311b8 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -6688,7 +6688,6 @@ error: free: wlan_twt_concurrency_update(hdd_ctx); - hdd_update_he_obss_pd(adapter, NULL, true); if (deliver_start_evt) { status = ucfg_if_mgr_deliver_event( vdev, @@ -6856,7 +6855,6 @@ static int __wlan_hdd_cfg80211_stop_ap(struct wiphy *wiphy, false); wlan_twt_concurrency_update(hdd_ctx); wlan_set_sap_user_config_freq(adapter->vdev, 0); - hdd_update_he_obss_pd(adapter, NULL, false); status = ucfg_if_mgr_deliver_event(adapter->vdev, WLAN_IF_MGR_EV_AP_STOP_BSS_COMPLETE, NULL); @@ -7369,62 +7367,45 @@ wlan_util_get_centre_freq(struct wireless_dev *wdev, unsigned int link_id) } #endif -#ifdef WLAN_FEATURE_SR -void hdd_update_he_obss_pd(struct hdd_adapter *adapter, - struct cfg80211_ap_settings *params, - bool iface_start) +#if defined(WLAN_FEATURE_SR) && \ + (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) +/** + * hdd_update_he_obss_pd() - Enable or disable spatial reuse + * based on user space input and concurrency combination. + * @adapter: Pointer to hostapd adapter + * @params: Pointer to AP configuration from cfg80211 + * @iface_start: Interface start or not + * + * Return: void + */ +static void hdd_update_he_obss_pd(struct hdd_adapter *adapter, + struct cfg80211_ap_settings *params) { - struct wlan_objmgr_vdev *vdev, *conc_vdev; - uint8_t vdev_id = adapter->vdev_id; - uint8_t mac_id; - struct wlan_objmgr_psoc *psoc; - uint32_t conc_vdev_id; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \ - defined(CFG80211_SPATIAL_REUSE_EXT_BACKPORT) + struct wlan_objmgr_vdev *vdev; struct ieee80211_he_obss_pd *obss_pd; -#endif vdev = hdd_objmgr_get_vdev_by_user(adapter, WLAN_OSIF_ID); if (!vdev) return; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 10, 0)) || \ - defined(CFG80211_SPATIAL_REUSE_EXT_BACKPORT) if (params && params->he_obss_pd.enable) { obss_pd = ¶ms->he_obss_pd; ucfg_spatial_reuse_set_sr_config(vdev, obss_pd->sr_ctrl, obss_pd->non_srg_max_offset); + ucfg_spatial_reuse_set_sr_enable(vdev, obss_pd->enable); hdd_debug("obss_pd_enable: %d, sr_ctrl: %d, non_srg_max_offset: %d", obss_pd->enable, obss_pd->sr_ctrl, obss_pd->non_srg_max_offset); } -#endif - - psoc = wlan_vdev_get_psoc(vdev); - policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id); - conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id, - mac_id); - if (conc_vdev_id != WLAN_INVALID_VDEV_ID) { - conc_vdev = - wlan_objmgr_get_vdev_by_id_from_psoc( - psoc, conc_vdev_id, - WLAN_HDD_ID_OBJ_MGR); - if (!conc_vdev) - goto release_ref; - if (iface_start) { - ucfg_spatial_reuse_send_sr_config(conc_vdev, false); - hdd_debug("disable obss pd for vdev:%d", conc_vdev_id); - } else { - ucfg_spatial_reuse_send_sr_config(conc_vdev, true); - hdd_debug("enable obss pd for vdev:%d", conc_vdev_id); - } - wlan_objmgr_vdev_release_ref(conc_vdev, WLAN_HDD_ID_OBJ_MGR); - } - -release_ref: hdd_objmgr_put_vdev_by_user(vdev, WLAN_OSIF_ID); } +#else +static inline +void hdd_update_he_obss_pd(struct hdd_adapter *adapter, + struct cfg80211_ap_settings *params) +{ +} #endif /** @@ -7742,7 +7723,7 @@ static int __wlan_hdd_cfg80211_start_ap(struct wiphy *wiphy, wlan_hdd_update_twt_responder(hdd_ctx, params); /* Enable/disable non-srg obss pd spatial reuse */ - hdd_update_he_obss_pd(adapter, params, true); + hdd_update_he_obss_pd(adapter, params); hdd_place_marker(adapter, "TRY TO START", NULL); status = diff --git a/core/hdd/src/wlan_hdd_hostapd.h b/core/hdd/src/wlan_hdd_hostapd.h index 6df10558c4..c92ef9315d 100644 --- a/core/hdd/src/wlan_hdd_hostapd.h +++ b/core/hdd/src/wlan_hdd_hostapd.h @@ -449,27 +449,6 @@ void hdd_stop_sap_due_to_invalid_channel(struct work_struct *work); */ bool hdd_is_any_sta_connecting(struct hdd_context *hdd_ctx); -#ifdef WLAN_FEATURE_11AX -/** - * hdd_update_he_obss_pd() - Enable or disable spatial reuse - * based on user space input and concurrency combination. - * @adapter: Pointer to hostapd adapter - * @params: Pointer to AP configuration from cfg80211 - * @iface_start: Interface start or not - * - * Return: void - */ -void hdd_update_he_obss_pd(struct hdd_adapter *adapter, - struct cfg80211_ap_settings *params, - bool iface_start); -#else -static inline void hdd_update_he_obss_pd(struct hdd_adapter *adapter, - struct cfg80211_ap_settings *params, - bool iface_start) -{ -} -#endif - #ifdef WLAN_FEATURE_11BE_MLO /** * wlan_hdd_mlo_reset() - reset mlo configuration if start bss fails diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c index 659e1b48f9..63312d2bc5 100644 --- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c +++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c @@ -9527,6 +9527,8 @@ void lim_process_set_he_bss_color(struct mac_context *mac_ctx, uint32_t *msg_buf struct sir_set_he_bss_color *bss_color; struct pe_session *session_entry = NULL; tUpdateBeaconParams beacon_params; + /* PD threshold -128 to disable SR */ + uint8_t non_srg_pd_threshold_disabled = 0x80; if (!msg_buf) { pe_err("Buffer is Pointing to NULL"); @@ -9562,11 +9564,10 @@ void lim_process_set_he_bss_color(struct mac_context *mac_ctx, uint32_t *msg_buf beacon_params.bss_color = session_entry->he_op.bss_color; session_entry->bss_color_changing = 1; - if (wlan_vdev_mlme_get_he_spr_enabled(session_entry->vdev)) { + if (wlan_vdev_mlme_get_he_spr_enabled(session_entry->vdev)) /* Disable spatial reuse during BSS color change */ - wlan_spatial_reuse_config_set(session_entry->vdev, 0, 0); - wlan_vdev_mlme_set_he_spr_enabled(session_entry->vdev, false); - } + wlan_spatial_reuse_config_set(session_entry->vdev, 0, + non_srg_pd_threshold_disabled); if (sch_set_fixed_beacon_fields(mac_ctx, session_entry) != QDF_STATUS_SUCCESS) { diff --git a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c index e0cd4275ca..be58cc7ce2 100644 --- a/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c +++ b/core/mac/src/pe/lim/lim_send_sme_rsp_messages.c @@ -2318,6 +2318,7 @@ lim_send_bss_color_change_ie_update(struct mac_context *mac_ctx, session->he_bss_color_change.countdown); } +#ifdef WLAN_FEATURE_SR static void lim_update_spatial_reuse(struct pe_session *session) { @@ -2329,7 +2330,7 @@ lim_update_spatial_reuse(struct pe_session *session) sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(session->vdev); non_srg_pd_max_offset = wlan_vdev_mlme_get_pd_offset(session->vdev); if (non_srg_pd_max_offset && sr_ctrl && - !wlan_vdev_mlme_get_he_spr_enabled(session->vdev)) { + wlan_vdev_mlme_get_he_spr_enabled(session->vdev)) { psoc = wlan_vdev_get_psoc(session->vdev); policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, @@ -2337,17 +2338,18 @@ lim_update_spatial_reuse(struct pe_session *session) conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id, mac_id); - if (conc_vdev_id == WLAN_INVALID_VDEV_ID) { - /* - * Enable spatial reuse only if no concurrent - * vdev running on same mac - */ + if (conc_vdev_id == WLAN_INVALID_VDEV_ID || + policy_mgr_sr_same_mac_conc_enabled(psoc)) wlan_spatial_reuse_config_set(session->vdev, sr_ctrl, non_srg_pd_max_offset); - wlan_vdev_mlme_set_he_spr_enabled(session->vdev, true); - } } } +#else +static void +lim_update_spatial_reuse(struct pe_session *session) +{ +} +#endif static void lim_handle_bss_color_change_ie(struct mac_context *mac_ctx, 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 deea80b2ae..e826e03e61 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 @@ -7167,6 +7167,7 @@ populate_dot11f_sr_info(struct mac_context *mac_ctx, sr_info->srg_info_present = 0; sr_info->non_srg_offset_present = 1; sr_info->srg_info_present = 0; + sr_info->sr_value15_allow = (sr_ctrl & WLAN_HE_SIGA_SR_VAL15_ALLOWED); sr_info->non_srg_offset.info.non_srg_pd_max_offset = non_srg_pd_offset; return QDF_STATUS_SUCCESS; diff --git a/core/wma/inc/wma_internal.h b/core/wma/inc/wma_internal.h index 90b934b232..3f4ff3f966 100644 --- a/core/wma/inc/wma_internal.h +++ b/core/wma/inc/wma_internal.h @@ -1323,19 +1323,19 @@ static inline QDF_STATUS wma_set_tsf_gpio_pin(WMA_HANDLE handle, uint32_t pin) } #endif -#ifdef WLAN_FEATURE_11AX +#ifdef WLAN_FEATURE_SR /** - * wma_spr_update() - enable/disable spatial reuse + * wma_sr_update() - enable/disable spatial reuse * @wma: wma handle * @vdev_id: vdev id * @enable: indicates spatial reuse enable/disable * * Return: QDF_STATUS_SUCCESS for success or error code */ -QDF_STATUS wma_spr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable); +QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable); #else -static inline QDF_STATUS wma_spr_update(tp_wma_handle wma, uint8_t vdev_id, - bool enable) +static inline QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, + bool enable) { return QDF_STATUS_SUCCESS; } diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c index c53980e13c..89a2e870c9 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -1282,7 +1282,6 @@ QDF_STATUS wma_vdev_start_resp_handler(struct vdev_mlme_obj *vdev_mlme, wma_dcs_clear_vdev_starting(mac_ctx, rsp->vdev_id); wma_dcs_wlan_interference_mitigation_enable(mac_ctx, iface->mac_id, rsp); - wma_spr_update(wma, rsp->vdev_id, true); } #ifdef FEATURE_AP_MCC_CH_AVOIDANCE @@ -2311,7 +2310,6 @@ void wma_send_del_bss_response(tp_wma_handle wma, struct del_bss_resp *resp) vdev_id); cdp_fc_vdev_unpause(soc, vdev_id, OL_TXQ_PAUSE_REASON_VDEV_STOP, 0); wma_vdev_clear_pause_bit(vdev_id, PAUSE_TYPE_HOST); - wma_spr_update(wma, vdev_id, false); qdf_atomic_set(&iface->bss_status, WMA_BSS_STATUS_STOPPED); wma_debug("(type %d subtype %d) BSS is stopped", iface->type, iface->sub_type); diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index fd77243958..03136ce337 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -645,25 +645,36 @@ QDF_STATUS wma_process_dhcp_ind(WMA_HANDLE handle, &peer_set_param_fp); } -#if defined WLAN_FEATURE_11AX +#ifdef WLAN_FEATURE_SR -#define NON_SRG_PD_SR_DISALLOWED 0x02 -#define NON_SRG_OFFSET_PRESENT 0x04 -#define NON_SRG_SPR_ENABLE_POS 24 -#define NON_SRG_PARAM_VAL_DBM_UNIT 0x20 -#define NON_SRG_SPR_ENABLE 0x80 - -QDF_STATUS wma_spr_update(tp_wma_handle wma, - uint8_t vdev_id, - bool enable) +static void wma_sr_send_pd_threshold(tp_wma_handle wma, + uint8_t vdev_id, + uint32_t val) { - struct pdev_params pparam; - uint32_t val = 0; + struct vdev_set_params vparam; wmi_unified_t wmi_handle = wma->wmi_handle; + bool sr_supported = + wmi_service_enabled(wmi_handle, + wmi_service_srg_srp_spatial_reuse_support); + + if (sr_supported) { + vparam.vdev_id = vdev_id; + vparam.param_id = WMI_VDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD; + vparam.param_value = val; + wmi_unified_vdev_set_param_send(wmi_handle, &vparam); + } else { + wma_debug("Target doesn't support SR operations"); + } +} + +QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable) +{ + uint32_t val = 0; uint8_t mac_id; uint32_t conc_vdev_id; struct wlan_objmgr_vdev *vdev; uint8_t sr_ctrl, non_srg_pd_max_offset; + QDF_STATUS status = QDF_STATUS_SUCCESS; vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id, WLAN_LEGACY_WMA_ID); @@ -671,9 +682,16 @@ QDF_STATUS wma_spr_update(tp_wma_handle wma, wma_err("Can't get vdev by vdev_id:%d", vdev_id); return QDF_STATUS_E_INVAL; } + if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) { + wma_err("Spatial Reuse disabled"); + status = QDF_STATUS_E_NOSUPPORT; + goto release_ref; + } sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); non_srg_pd_max_offset = wlan_vdev_mlme_get_pd_offset(vdev); + wma_debug("SR Control: %x pd_max_offset: %x", + sr_ctrl, non_srg_pd_max_offset); if (!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) && (sr_ctrl & NON_SRG_OFFSET_PRESENT)) { policy_mgr_get_mac_id_by_session_id(wma->psoc, @@ -683,36 +701,28 @@ QDF_STATUS wma_spr_update(tp_wma_handle wma, policy_mgr_get_conc_vdev_on_same_mac(wma->psoc, vdev_id, mac_id); - if (conc_vdev_id != WLAN_INVALID_VDEV_ID) { + if (conc_vdev_id != WLAN_INVALID_VDEV_ID && + !policy_mgr_sr_same_mac_conc_enabled(wma->psoc)) { wma_debug("Concurrent intf present,SR PD not enabled"); goto release_ref; } - qdf_mem_zero(&pparam, sizeof(pparam)); - pparam.param_id = WMI_PDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD; if (enable) { - val = NON_SRG_SPR_ENABLE; - val |= NON_SRG_PARAM_VAL_DBM_UNIT; - val = val << NON_SRG_SPR_ENABLE_POS; - val |= non_srg_pd_max_offset; - wlan_vdev_mlme_set_he_spr_enabled(vdev, true); - } else { - wlan_vdev_mlme_set_he_spr_enabled(vdev, false); + val |= 1 << NON_SRG_SPR_ENABLE_POS; + val |= SR_PARAM_VAL_DBM_UNIT << SR_PARAM_VAL_DBM_POS; + val |= (uint8_t)((non_srg_pd_max_offset + + NON_SR_PD_THRESHOLD_MIN) << + NON_SRG_MAX_PD_OFFSET_POS); } - pparam.param_value = val; - - wma_debug("non-srg param val: %u, enable: %d", - pparam.param_value, enable); - - wmi_unified_pdev_param_send(wmi_handle, &pparam, - WMA_WILDCARD_PDEV_ID); + wma_debug("non-srg param val: %x, enable: %x", val, enable); + wma_sr_send_pd_threshold(wma, vdev_id, val); } else { - wma_debug("Spatial reuse not enabled"); + wma_debug("Spatial reuse is disabled in ctrl"); } release_ref: wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID); - return QDF_STATUS_SUCCESS; + return status; } #endif diff --git a/core/wma/src/wma_mgmt.c b/core/wma/src/wma_mgmt.c index 976e3766e7..8756fc0e4c 100644 --- a/core/wma/src/wma_mgmt.c +++ b/core/wma/src/wma_mgmt.c @@ -2544,6 +2544,7 @@ QDF_STATUS wma_set_ap_vdev_up(tp_wma_handle wma, uint8_t vdev_id) } wma_set_sap_keepalive(wma, vdev_id); wma_set_vdev_mgmt_rate(wma, vdev_id); + wma_sr_update(wma, vdev_id, true); return status; } diff --git a/core/wma/src/wma_utils.c b/core/wma/src/wma_utils.c index bd5df1be11..29254b3dd5 100644 --- a/core/wma/src/wma_utils.c +++ b/core/wma/src/wma_utils.c @@ -4110,6 +4110,8 @@ QDF_STATUS wma_send_vdev_down_to_fw(t_wma_handle *wma, uint8_t vdev_id) } status = vdev_mgr_down_send(vdev_mlme); + if (QDF_IS_STATUS_SUCCESS(status)) + wma_sr_update(wma, vdev_id, false); return status; } @@ -4434,6 +4436,7 @@ QDF_STATUS wma_sta_vdev_up_send(struct vdev_mlme_obj *vdev_mlme, status = QDF_STATUS_E_FAILURE; } else { wma_set_vdev_mgmt_rate(wma, vdev_id); + wma_sr_update(wma, vdev_id, true); if (iface->beacon_filter_enabled) wma_add_beacon_filter( wma,