|
@@ -16,12 +16,13 @@
|
|
|
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
|
* PERFORMANCE OF THIS SOFTWARE.
|
|
|
*/
|
|
|
-
|
|
|
#include <target_if_spatial_reuse.h>
|
|
|
#include <wlan_lmac_if_def.h>
|
|
|
#include <wmi_unified_api.h>
|
|
|
#include <wmi_unified_vdev_api.h>
|
|
|
#include <target_if_vdev_mgr_tx_ops.h>
|
|
|
+#include <init_deinit_lmac.h>
|
|
|
+#include <wlan_vdev_mlme_api.h>
|
|
|
|
|
|
static QDF_STATUS spatial_reuse_send_cfg(struct wlan_objmgr_vdev *vdev,
|
|
|
uint8_t sr_ctrl,
|
|
@@ -42,9 +43,9 @@ static QDF_STATUS spatial_reuse_send_cfg(struct wlan_objmgr_vdev *vdev,
|
|
|
(sr_ctrl & NON_SRG_OFFSET_PRESENT)) {
|
|
|
QDF_SET_BITS(pparam.param_value, NON_SRG_SPR_ENABLE_POS,
|
|
|
NON_SRG_SPR_ENABLE_SIZE, NON_SRG_SPR_ENABLE);
|
|
|
- QDF_SET_BITS(pparam.param_value, NON_SRG_PARAM_VAL_DBM_POS,
|
|
|
+ QDF_SET_BITS(pparam.param_value, SR_PARAM_VAL_DBM_POS,
|
|
|
NON_SRG_PARAM_VAL_DBM_SIZE,
|
|
|
- NON_SRG_PARAM_VAL_DBM_UNIT);
|
|
|
+ SR_PARAM_VAL_DBM_UNIT);
|
|
|
QDF_SET_BITS(pparam.param_value, NON_SRG_MAX_PD_OFFSET_POS,
|
|
|
NON_SRG_MAX_PD_OFFSET_SIZE,
|
|
|
non_srg_max_pd_offset);
|
|
@@ -73,9 +74,92 @@ spatial_reuse_send_sr_prohibit_cfg(struct wlan_objmgr_vdev *vdev,
|
|
|
return wmi_unified_vdev_param_sr_prohibit_send(wmi_handle, &srp_param);
|
|
|
}
|
|
|
|
|
|
+static QDF_STATUS
|
|
|
+spatial_reuse_send_pd_threshold(struct wlan_objmgr_pdev *pdev,
|
|
|
+ uint8_t vdev_id,
|
|
|
+ uint32_t val)
|
|
|
+{
|
|
|
+ struct vdev_set_params vdev_param;
|
|
|
+ struct wmi_unified *wmi_handle;
|
|
|
+ bool sr_supported;
|
|
|
+
|
|
|
+ wmi_handle = lmac_get_pdev_wmi_handle(pdev);
|
|
|
+ if (!wmi_handle)
|
|
|
+ return QDF_STATUS_E_INVAL;
|
|
|
+
|
|
|
+ sr_supported =
|
|
|
+ wmi_service_enabled(wmi_handle,
|
|
|
+ wmi_service_srg_srp_spatial_reuse_support);
|
|
|
+
|
|
|
+ if (sr_supported) {
|
|
|
+ qdf_mem_zero(&vdev_param, sizeof(vdev_param));
|
|
|
+ vdev_param.vdev_id = vdev_id;
|
|
|
+ vdev_param.param_id = WMI_VDEV_PARAM_SET_CMD_OBSS_PD_THRESHOLD;
|
|
|
+ vdev_param.param_value = val;
|
|
|
+ return wmi_unified_vdev_set_param_send(wmi_handle, &vdev_param);
|
|
|
+ } else {
|
|
|
+ mlme_debug("Target doesn't support SR operations");
|
|
|
+ }
|
|
|
+ return QDF_STATUS_SUCCESS;
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * spatial_reuse_set_sr_enable_disable: To send wmi command to enable/disable SR
|
|
|
+ *
|
|
|
+ * @vdev: object manager vdev
|
|
|
+ * @pdev: object manager pdev
|
|
|
+ * @is_sr_enable: sr enable/disable
|
|
|
+ * @pd_threshold: pd threshold
|
|
|
+ *
|
|
|
+ * Return: Success/Failure
|
|
|
+ */
|
|
|
+static QDF_STATUS
|
|
|
+spatial_reuse_set_sr_enable_disable(struct wlan_objmgr_vdev *vdev,
|
|
|
+ struct wlan_objmgr_pdev *pdev,
|
|
|
+ bool is_sr_enable, int32_t pd_threshold)
|
|
|
+{
|
|
|
+ uint32_t val = 0;
|
|
|
+ uint8_t sr_ctrl;
|
|
|
+ struct wlan_objmgr_psoc *psoc;
|
|
|
+ QDF_STATUS status = QDF_STATUS_SUCCESS;
|
|
|
+
|
|
|
+ psoc = wlan_pdev_get_psoc(pdev);
|
|
|
+ if (!psoc)
|
|
|
+ return QDF_STATUS_E_NOENT;
|
|
|
+
|
|
|
+ sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
|
|
|
+ if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
|
|
|
+ (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
|
|
|
+ (sr_ctrl & SRG_INFO_PRESENT)) {
|
|
|
+ if (is_sr_enable) {
|
|
|
+ wlan_mlme_update_sr_data(vdev, &val, pd_threshold,
|
|
|
+ is_sr_enable);
|
|
|
+ wlan_vdev_obj_lock(vdev);
|
|
|
+ wlan_vdev_mlme_set_he_spr_enabled(vdev, true);
|
|
|
+ wlan_vdev_obj_unlock(vdev);
|
|
|
+ } else {
|
|
|
+ wlan_vdev_obj_lock(vdev);
|
|
|
+ wlan_vdev_mlme_set_he_spr_enabled(vdev, false);
|
|
|
+ wlan_vdev_obj_unlock(vdev);
|
|
|
+ }
|
|
|
+
|
|
|
+ mlme_debug("non-srg param val: %u, enable: %d",
|
|
|
+ val, is_sr_enable);
|
|
|
+ status =
|
|
|
+ spatial_reuse_send_pd_threshold(pdev, vdev->vdev_objmgr.vdev_id,
|
|
|
+ val);
|
|
|
+ } else {
|
|
|
+ mlme_debug("Spatial reuse not enabled");
|
|
|
+ }
|
|
|
+
|
|
|
+ return status;
|
|
|
+}
|
|
|
+
|
|
|
void target_if_spatial_reuse_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
|
|
|
{
|
|
|
tx_ops->spatial_reuse_tx_ops.send_cfg = spatial_reuse_send_cfg;
|
|
|
tx_ops->spatial_reuse_tx_ops.send_sr_prohibit_cfg =
|
|
|
spatial_reuse_send_sr_prohibit_cfg;
|
|
|
+ tx_ops->spatial_reuse_tx_ops.target_if_set_sr_enable_disable =
|
|
|
+ spatial_reuse_set_sr_enable_disable;
|
|
|
}
|