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 8290233b0d..c306a416d1 100644 --- a/target_if/spatial_reuse/src/target_if_spatial_reuse.c +++ b/target_if/spatial_reuse/src/target_if_spatial_reuse.c @@ -74,6 +74,75 @@ spatial_reuse_send_sr_prohibit_cfg(struct wlan_objmgr_vdev *vdev, return wmi_unified_vdev_param_sr_prohibit_send(wmi_handle, &srp_param); } +#ifdef OBSS_PD +static QDF_STATUS +spatial_reuse_send_bss_color_bit_map(struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_pdev *pdev) +{ + uint64_t srg_color_bit_map = 0; + uint32_t bit_map_0 = 0; + uint32_t bit_map_1 = 0; + struct wmi_unified *wmi_handle; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + wmi_handle = lmac_get_pdev_wmi_handle(pdev); + if (!wmi_handle) + return QDF_STATUS_E_INVAL; + + wlan_vdev_obj_lock(vdev); + wlan_vdev_mlme_get_srg_bss_color_bit_map(vdev, &srg_color_bit_map); + wlan_vdev_obj_unlock(vdev); + bit_map_0 = (uint32_t) srg_color_bit_map; + bit_map_1 = (uint32_t) (srg_color_bit_map >> 32); + + status = wmi_unified_send_self_srg_bss_color_bitmap_set_cmd( + wmi_handle, bit_map_0, bit_map_1, + pdev->pdev_objmgr.wlan_pdev_id); + return status; +} + +static QDF_STATUS +spatial_reuse_send_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_pdev *pdev) +{ + uint64_t partial_bssid_bit_map = 0; + uint32_t bit_map_0 = 0; + uint32_t bit_map_1 = 0; + struct wmi_unified *wmi_handle; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + wmi_handle = lmac_get_pdev_wmi_handle(pdev); + if (!wmi_handle) + return QDF_STATUS_E_INVAL; + + wlan_vdev_obj_lock(vdev); + wlan_vdev_mlme_get_srg_partial_bssid_bit_map(vdev, + &partial_bssid_bit_map); + wlan_vdev_obj_unlock(vdev); + bit_map_0 = (uint32_t) partial_bssid_bit_map; + bit_map_1 = (uint32_t) (partial_bssid_bit_map >> 32); + + status = wmi_unified_send_self_srg_partial_bssid_bitmap_set_cmd( + wmi_handle, bit_map_0, bit_map_1, + pdev->pdev_objmgr.wlan_pdev_id); + return status; +} +#else +static QDF_STATUS +spatial_reuse_send_bss_color_bit_map(struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_pdev *pdev) +{ + return QDF_STATUS_SUCCESS; +} + +static QDF_STATUS +spatial_reuse_send_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev, + struct wlan_objmgr_pdev *pdev) +{ + return QDF_STATUS_SUCCESS; +} +#endif + static QDF_STATUS spatial_reuse_send_pd_threshold(struct wlan_objmgr_pdev *pdev, uint8_t vdev_id, @@ -143,11 +212,23 @@ spatial_reuse_set_sr_enable_disable(struct wlan_objmgr_vdev *vdev, wlan_vdev_obj_unlock(vdev); } - mlme_debug("non-srg param val: %u, enable: %d", + mlme_debug("srp param val: %u, enable: %d", val, is_sr_enable); + if (is_sr_enable) { + status = spatial_reuse_send_bss_color_bit_map(vdev, + pdev); + if (status != QDF_STATUS_SUCCESS) + return status; + status = spatial_reuse_send_partial_bssid_bit_map(vdev, + pdev); + if (status != QDF_STATUS_SUCCESS) + return status; + } status = spatial_reuse_send_pd_threshold(pdev, vdev->vdev_objmgr.vdev_id, val); + if (status != QDF_STATUS_SUCCESS) + return status; } else { mlme_debug("Spatial reuse not enabled"); } diff --git a/umac/mlme/include/wlan_vdev_mlme.h b/umac/mlme/include/wlan_vdev_mlme.h index 679aa67329..acc38998a9 100644 --- a/umac/mlme/include/wlan_vdev_mlme.h +++ b/umac/mlme/include/wlan_vdev_mlme.h @@ -348,6 +348,8 @@ struct vdev_mlme_proto { * @he_spr_enabled: Spatial reuse enabled or not * @pd_threshold: pd threshold sent by userspace * @he_spr_disabled_due_conc: spr disabled due to concurrency + * @srg_bss_color: srg bss color + * @srg_partial_bssid: srg partial bssid */ struct vdev_mlme_mgmt_generic { uint32_t rts_threshold; @@ -382,6 +384,8 @@ struct vdev_mlme_mgmt_generic { bool he_spr_enabled; int32_t pd_threshold; bool he_spr_disabled_due_conc; + uint64_t srg_bss_color; + uint64_t srg_partial_bssid; #endif }; @@ -1416,6 +1420,106 @@ void wlan_vdev_mlme_get_srg_pd_offset(struct wlan_objmgr_vdev *vdev, *srg_max_pd_offset = vdev_mlme->mgmt.generic.he_spr_srg_max_pd_offset; *srg_min_pd_offset = vdev_mlme->mgmt.generic.he_spr_srg_min_pd_offset; } + +/** + * wlan_vdev_mlme_set_srg_bss_color() - set spatial reuse bss + * colorbitmap + * @vdev: VDEV object + * @srg_bss_color: SRG BSS color bitmap + * + * API to set the spatial reuse bss color bit map + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: void + */ +static inline +void wlan_vdev_mlme_set_srg_bss_color_bit_map(struct wlan_objmgr_vdev *vdev, + uint64_t srg_bss_color) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return; + + vdev_mlme->mgmt.generic.srg_bss_color = srg_bss_color; +} + +/** + * wlan_vdev_mlme_set_srg_partial_bssid_bit_map() - set spatial reuse + * srg partial bitmap + * @vdev: VDEV object + * @srg_partial_bssid: SRG partial BSSID bitmap + * + * API to set the spatial reuse partial bssid bitmap + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: void + */ +static inline +void wlan_vdev_mlme_set_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev, + uint64_t srg_partial_bssid) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return; + + vdev_mlme->mgmt.generic.srg_partial_bssid = srg_partial_bssid; +} + +/** + * wlan_vdev_mlme_get_srg_bss_color_bit_map() - get spatial reuse bss + * colorbitmap + * @vdev: VDEV object + * @srg_bss_color: SRG BSS color bitmap + * + * API to get the spatial reuse bss color bit map + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: void + */ +static inline +void wlan_vdev_mlme_get_srg_bss_color_bit_map(struct wlan_objmgr_vdev *vdev, + uint64_t *srg_bss_color) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return; + + *srg_bss_color = vdev_mlme->mgmt.generic.srg_bss_color; +} + +/** + * wlan_vdev_mlme_get_srg_partial_bssid_bit_map() - get spatial reuse + * srg partial bitmap + * @vdev: VDEV object + * @srg_partial_bssid: SRG partial BSSID bitmap + * + * API to get the spatial reuse partial bssid bitmap + * + * Caller need to acquire lock with wlan_vdev_obj_lock() + * + * Return: void + */ +static inline void +wlan_vdev_mlme_get_srg_partial_bssid_bit_map(struct wlan_objmgr_vdev *vdev, + uint64_t *srg_partial_bssid) +{ + struct vdev_mlme_obj *vdev_mlme; + + vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev); + if (!vdev_mlme) + return; + + *srg_partial_bssid = vdev_mlme->mgmt.generic.srg_partial_bssid; +} #else static inline uint8_t wlan_vdev_mlme_get_sr_ctrl(struct wlan_objmgr_vdev *vdev) {