diff --git a/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h b/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h index 04dba550b5..00548ec8a0 100644 --- a/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h +++ b/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h @@ -50,6 +50,28 @@ void ucfg_spatial_reuse_get_sr_config(struct wlan_objmgr_vdev *vdev, void ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev *vdev, uint8_t sr_ctrl, uint8_t non_srg_max_pd_offset); + +/** + * ucfg_spatial_reuse_is_sr_disabled_due_conc() - Spatial reuse get concurrency + * status + * + * @vdev: object manager vdev + * + * Return: True when SR is disabled due to concurrency or else False + */ +bool ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev *vdev); + +/** + * ucfg_spatial_reuse_set_sr_conc_stat() - Spatial reuse disable config set + * + * @vdev: object manager vdev + * @sr_conc_disabled: spatial reuse disabled due to concurrency + * + * Return: void + */ +void ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev *vdev, + bool sr_conc_disabled); + /** * ucfg_spatial_reuse_send_sr_config() - Send spatial reuse config to fw * 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 11719103f8..e2503b3e3b 100644 --- a/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c +++ b/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c @@ -39,6 +39,17 @@ void ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev *vdev, wlan_vdev_mlme_set_pd_offset(vdev, non_srg_max_pd_offset); } +bool ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev *vdev) +{ + return wlan_vdev_mlme_is_sr_disable_due_conc(vdev); +} + +void ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev *vdev, + bool sr_conc_disabled) +{ + wlan_vdev_mlme_set_sr_disable_due_conc(vdev, sr_conc_disabled); +} + void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev, bool enable) { @@ -49,6 +60,9 @@ void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev, /* SR feature itself is disabled by user */ if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) return; + /* SR is disabled due to conccurrency */ + if (ucfg_spatial_reuse_is_sr_disabled_due_conc(vdev)) + return; if (enable) { sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev); 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 be58cc7ce2..510dd5b016 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 @@ -2339,9 +2339,17 @@ lim_update_spatial_reuse(struct pe_session *session) vdev_id, mac_id); if (conc_vdev_id == WLAN_INVALID_VDEV_ID || - policy_mgr_sr_same_mac_conc_enabled(psoc)) + policy_mgr_sr_same_mac_conc_enabled(psoc)) { + wlan_vdev_mlme_set_sr_disable_due_conc(session->vdev, + false); wlan_spatial_reuse_config_set(session->vdev, sr_ctrl, non_srg_pd_max_offset); + } else { + wlan_vdev_mlme_set_sr_disable_due_conc(session->vdev, + true); + wlan_spatial_reuse_config_set(session->vdev, sr_ctrl, + 0x80); + } } } #else diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c index 03136ce337..c30e47a727 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -667,13 +667,46 @@ static void wma_sr_send_pd_threshold(tp_wma_handle wma, } } +static void wma_sr_handle_conc(tp_wma_handle wma, + struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_vdev *conc_vdev, + bool en_sr_curr_vdev) +{ + uint32_t val = 0; + uint8_t sr_ctrl; + uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev); + + if (en_sr_curr_vdev) { + wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true); + wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true); + if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev)) + return; + + wma_sr_send_pd_threshold(wma, conc_vdev_id, val); + } else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) { + wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false); + if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev)) + return; + + sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(conc_vdev); + if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) && + (sr_ctrl & NON_SRG_OFFSET_PRESENT)) || + (sr_ctrl & SRG_INFO_PRESENT)) { + wlan_mlme_update_sr_data(conc_vdev, &val, 0, true); + wma_sr_send_pd_threshold(wma, conc_vdev_id, val); + } else { + wma_debug("SR Disabled in SR Control"); + } + } +} + 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; + struct wlan_objmgr_vdev *vdev, *conc_vdev; + uint8_t sr_ctrl; QDF_STATUS status = QDF_STATUS_SUCCESS; vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id, @@ -682,39 +715,50 @@ QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable) wma_err("Can't get vdev by vdev_id:%d", vdev_id); return QDF_STATUS_E_INVAL; } + policy_mgr_get_mac_id_by_session_id(wma->psoc, vdev_id, &mac_id); + conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(wma->psoc, vdev_id, + mac_id); + if (conc_vdev_id != WLAN_INVALID_VDEV_ID && + !policy_mgr_sr_same_mac_conc_enabled(wma->psoc)) { + /* + * Single MAC concurrency is not supoprted for SR, + * Disable SR if it is enable on other VDEV and enable + * it back once the once the concurrent vdev is down. + */ + wma_debug("SR with concurrency is not allowed"); + conc_vdev = + wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, conc_vdev_id, + WLAN_LEGACY_WMA_ID); + if (!conc_vdev) { + wma_err("Can't get vdev by vdev_id:%d", conc_vdev_id); + } else { + wma_sr_handle_conc(wma, vdev, conc_vdev, enable); + wlan_objmgr_vdev_release_ref(conc_vdev, + WLAN_LEGACY_WMA_ID); + goto release_ref; + } + } + if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) { - wma_err("Spatial Reuse disabled"); + wma_err("Spatial Reuse disabled for vdev_id: %u", vdev_id); 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, - vdev_id, - &mac_id); - conc_vdev_id = - policy_mgr_get_conc_vdev_on_same_mac(wma->psoc, - vdev_id, - mac_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; - } + wma_debug("SR Control: %x", sr_ctrl); + if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) && + (sr_ctrl & NON_SRG_OFFSET_PRESENT)) || + (sr_ctrl & SRG_INFO_PRESENT)) { if (enable) { - 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); + wlan_mlme_update_sr_data(vdev, &val, 0, true); + } else { + /* VDEV down, disable SR */ + wlan_vdev_mlme_set_sr_ctrl(vdev, 0); + wlan_vdev_mlme_set_pd_offset(vdev, 0); } - wma_debug("non-srg param val: %x, enable: %x", val, enable); + wma_debug("SR param val: %x, Enable: %x", val, enable); wma_sr_send_pd_threshold(wma, vdev_id, val); } else { wma_debug("Spatial reuse is disabled in ctrl");