diff --git a/target_if/spatial_reuse/src/target_if_spatial_reuse.c b/target_if/spatial_reuse/src/target_if_spatial_reuse.c index 613a51f5ab..ebb90dc90f 100644 --- a/target_if/spatial_reuse/src/target_if_spatial_reuse.c +++ b/target_if/spatial_reuse/src/target_if_spatial_reuse.c @@ -20,6 +20,7 @@ #include #include #include +#include #include static QDF_STATUS spatial_reuse_send_cfg(struct wlan_objmgr_vdev *vdev, @@ -53,8 +54,28 @@ static QDF_STATUS spatial_reuse_send_cfg(struct wlan_objmgr_vdev *vdev, WILDCARD_PDEV_ID); } +static QDF_STATUS +spatial_reuse_send_sr_prohibit_cfg(struct wlan_objmgr_vdev *vdev, + bool he_siga_va15_allowed) +{ + struct sr_prohibit_param srp_param; + wmi_unified_t wmi_handle; + + wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev); + if (!wmi_handle) { + mlme_err("Failed to get WMI handle!"); + return QDF_STATUS_E_INVAL; + } + + srp_param.vdev_id = wlan_vdev_get_id(vdev); + srp_param.sr_he_siga_val15_allowed = he_siga_va15_allowed; + + return wmi_unified_vdev_param_sr_prohibit_send(wmi_handle, &srp_param); +} + 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; } - diff --git a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h index ed7b6fae12..7d3baf622d 100644 --- a/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h +++ b/umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h @@ -1474,10 +1474,12 @@ struct wlan_lmac_if_twt_rx_ops { }; #endif -#if defined WLAN_FEATURE_11AX +#if defined WLAN_FEATURE_SR struct wlan_lmac_if_spatial_reuse_tx_ops { QDF_STATUS (*send_cfg)(struct wlan_objmgr_vdev *vdev, uint8_t sr_ctrl, uint8_t non_srg_max_pd_offset); + QDF_STATUS (*send_sr_prohibit_cfg)(struct wlan_objmgr_vdev *vdev, + bool he_siga_val15_allowed); }; #endif @@ -1619,7 +1621,7 @@ struct wlan_lmac_if_tx_ops { struct wlan_lmac_if_twt_tx_ops twt_tx_ops; #endif -#if defined WLAN_FEATURE_11AX +#if defined WLAN_FEATURE_SR struct wlan_lmac_if_spatial_reuse_tx_ops spatial_reuse_tx_ops; #endif diff --git a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h index 0f7981ad59..d4a1dcf343 100644 --- a/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h +++ b/umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_tx_defs.h @@ -883,4 +883,15 @@ struct rtt_channel_info { uint16_t num_bssids; struct rtt_bssid_info bssid_info[RTT_MAX_BSSIDS_TO_SCAN]; }; + +/** + * struct sr_prohibit_param - SR prohibit command parameter + * + * @vdev_id: vdev id + * @sr_he_siga_val15_allowed: HE_SIG_A_VAL15_ALLOWED is enabled/disabled + */ +struct sr_prohibit_param { + uint8_t vdev_id; + bool sr_he_siga_val15_allowed; +}; #endif /* __WLAN_VDEV_MGR_TX_OPS_DEFS_H__ */ diff --git a/wmi/inc/wmi_unified_priv.h b/wmi/inc/wmi_unified_priv.h index 1d6edf90ea..62173c863d 100644 --- a/wmi/inc/wmi_unified_priv.h +++ b/wmi/inc/wmi_unified_priv.h @@ -2857,6 +2857,11 @@ QDF_STATUS (*extract_smart_monitor_event)( QDF_STATUS (*multisoc_tbtt_sync_cmd)(wmi_unified_t wmi_handle, struct rnr_tbtt_multisoc_sync_param *param); +#ifdef WLAN_FEATURE_SR +QDF_STATUS (*vdev_param_sr_prohibit_send)(wmi_unified_t wmi_handle, + struct sr_prohibit_param *param); +#endif + #ifdef FEATURE_WLAN_TIME_SYNC_FTM QDF_STATUS (*send_wlan_time_sync_ftm_trigger_cmd)(wmi_unified_t wmi_handle, uint32_t vdev_id, diff --git a/wmi/inc/wmi_unified_vdev_api.h b/wmi/inc/wmi_unified_vdev_api.h index 36ff39795f..c5bebe3fce 100644 --- a/wmi/inc/wmi_unified_vdev_api.h +++ b/wmi/inc/wmi_unified_vdev_api.h @@ -200,4 +200,24 @@ QDF_STATUS wmi_extract_multi_vdev_restart_resp_event( QDF_STATUS wmi_unified_multisoc_tbtt_sync_cmd(wmi_unified_t wmi_handle, struct rnr_tbtt_multisoc_sync_param *param); + +#ifdef WLAN_FEATURE_SR +/** + * wmi_unified_vdev_param_sr_prohibit_send() - send vdev SR prohibit command + * @wmi: wmi handle + * @srp_param: SR Prohibit parameters + * + * Return: QDF_STATUS_SUCCESS for success or error code + */ +QDF_STATUS +wmi_unified_vdev_param_sr_prohibit_send(wmi_unified_t wmi_hdl, + struct sr_prohibit_param *srp_param); +#else +static inline QDF_STATUS +wmi_unified_vdev_param_sr_prohibit_send(wmi_unified_t wmi_hdl, + struct sr_prohibit_param *srp_param) +{ + return QDF_STATUS_SUCCESS; +} +#endif #endif diff --git a/wmi/src/wmi_unified_vdev_api.c b/wmi/src/wmi_unified_vdev_api.c index f8dbffd4bb..6d1c523ce3 100644 --- a/wmi/src/wmi_unified_vdev_api.c +++ b/wmi/src/wmi_unified_vdev_api.c @@ -205,3 +205,16 @@ QDF_STATUS wmi_unified_multisoc_tbtt_sync_cmd(wmi_unified_t wmi_handle, return QDF_STATUS_E_FAILURE; } + +#ifdef WLAN_FEATURE_SR +QDF_STATUS +wmi_unified_vdev_param_sr_prohibit_send(wmi_unified_t wmi_hdl, + struct sr_prohibit_param *srp_param) +{ + if (wmi_hdl->ops->vdev_param_sr_prohibit_send) + return wmi_hdl->ops->vdev_param_sr_prohibit_send(wmi_hdl, + srp_param); + + return QDF_STATUS_E_FAILURE; +} +#endif diff --git a/wmi/src/wmi_unified_vdev_tlv.c b/wmi/src/wmi_unified_vdev_tlv.c index c54bdec6a9..dd7b51b388 100644 --- a/wmi/src/wmi_unified_vdev_tlv.c +++ b/wmi/src/wmi_unified_vdev_tlv.c @@ -424,6 +424,56 @@ static QDF_STATUS extract_muedca_params_tlv(wmi_unified_t wmi_hdl, return QDF_STATUS_SUCCESS; } +#ifdef WLAN_FEATURE_SR +static QDF_STATUS +vdev_param_sr_prohibit_send_tlv(struct wmi_unified *wmi_handle, + struct sr_prohibit_param *param) +{ + wmi_vdev_param_enable_sr_prohibit_fixed_param *cmd; + wmi_buf_t buf; + int32_t len = sizeof(*cmd); + + buf = wmi_buf_alloc(wmi_handle, len); + if (!buf) { + wmi_err("wmi_buf_alloc failed"); + return QDF_STATUS_E_FAILURE; + } + cmd = (wmi_vdev_param_enable_sr_prohibit_fixed_param *) + wmi_buf_data(buf); + WMITLV_SET_HDR + (&cmd->tlv_header, + WMITLV_TAG_STRUC_wmi_vdev_param_enable_sr_prohibit_fixed_param, + WMITLV_GET_STRUCT_TLVLEN + (wmi_vdev_param_enable_sr_prohibit_fixed_param)); + cmd->vdev_id = param->vdev_id; + cmd->tidmap = 0; + cmd->prohibit_enable = param->sr_he_siga_val15_allowed; + + wmi_mtrace(WMI_VDEV_PARAM_ENABLE_SR_PROHIBIT_CMDID, cmd->vdev_id, 0); + if (wmi_unified_cmd_send(wmi_handle, buf, len, + WMI_VDEV_PARAM_ENABLE_SR_PROHIBIT_CMDID)) { + wmi_err("Failed to set neighbour rx param"); + wmi_buf_free(buf); + return QDF_STATUS_E_FAILURE; + } + + return QDF_STATUS_SUCCESS; +} + +static void wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops *wmi_ops) +{ + if (!wmi_ops) + return; + + wmi_ops->vdev_param_sr_prohibit_send = + vdev_param_sr_prohibit_send_tlv; +} +#else +static inline void wmi_vdev_attach_sr_cmds_tlv(struct wmi_ops *wmi_ops) +{ +} +#endif + void wmi_vdev_attach_tlv(struct wmi_unified *wmi_handle) { struct wmi_ops *wmi_ops; @@ -455,4 +505,5 @@ void wmi_vdev_attach_tlv(struct wmi_unified *wmi_handle) wmi_ops->send_vdev_config_ratemask_cmd = send_vdev_config_ratemask_cmd_tlv; wmi_ops->send_peer_filter_set_tx_cmd = send_peer_filter_set_tx_cmd_tlv; + wmi_vdev_attach_sr_cmds_tlv(wmi_ops); }