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