qcacld-3.0: Add concurrency check with SR

Add check for concurrency with SR, if SR with concurrency
is not enabled then disable the SR on existing VDEV as soon as
new VDEV is up.
When this new VDEV is disconnected, then enable back the SR on
the previous VDEV.

Change-Id: Id6aee592b889bb7006efb44420e6d272212e13ba
CRs-Fixed: 3306181
Esse commit está contido em:
Rachit Kankane
2022-09-27 14:53:29 +05:30
commit de Madan Koyyalamudi
commit 45f42c90a8
4 arquivos alterados com 115 adições e 27 exclusões

Ver arquivo

@@ -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");