From f5b2eeb7f684f9d935474c3d321ba907c2cf93b1 Mon Sep 17 00:00:00 2001 From: Rachit Kankane Date: Mon, 21 Nov 2022 12:50:44 +0530 Subject: [PATCH] qcacld-3.0: Fail SR commands in concurrency Fail all the Spatial Reuse commands if SR in concurrency is not supported. Change-Id: Ifcee0cfb6f52bcde5bcb4193f4f8bb336ba6b191 CRs-Fixed: 3338582 --- .../dispatcher/inc/spatial_reuse_ucfg_api.h | 20 ++++++++++++---- .../dispatcher/src/spatial_reuse_ucfg_api.c | 24 +++++++++++++++++++ core/hdd/src/wlan_hdd_he.c | 6 +++++ 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h b/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h index c672bdb8dc..cff6d2d51f 100644 --- a/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h +++ b/components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h @@ -120,11 +120,11 @@ void ucfg_spatial_reuse_send_sr_prohibit(struct wlan_objmgr_vdev *vdev, /** * ucfg_spatial_reuse_setup_req() - To enable/disable SR (Spatial Reuse) - * vdev: object manager vdev - * pdev: object manager pdev - * is_sr_enable: SR enable/disable - * srg_pd_threshold: SRG pd threshold - * non_srg_pd_threshold: NON SRG pd threshold + * @vdev: object manager vdev + * @pdev: object manager pdev + * @is_sr_enable: SR enable/disable + * @srg_pd_threshold: SRG pd threshold + * @non_srg_pd_threshold: NON SRG pd threshold * * Return: Success/Failure */ @@ -134,6 +134,16 @@ ucfg_spatial_reuse_setup_req(struct wlan_objmgr_vdev *vdev, bool is_sr_enable, int32_t srg_pd_threshold, int32_t non_srg_pd_threshold); +/** + * ucfg_spatial_reuse_operation_allowed() - Checks whether SR is allowed or not + * @psoc: Object manager psoc + * @vdev: object manager vdev + * + * Return: QDF_STATUS_SUCCESS when SR is allowed else Failure + */ +QDF_STATUS +ucfg_spatial_reuse_operation_allowed(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_vdev *vdev); #else static inline void ucfg_spatial_reuse_register_cb(struct wlan_objmgr_psoc *psoc, diff --git a/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c b/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c index 2f72714f59..7132df1d67 100644 --- a/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c +++ b/components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c @@ -20,6 +20,7 @@ #include #include #include +#include void ucfg_spatial_reuse_register_cb(struct wlan_objmgr_psoc *psoc, sr_osif_event_cb cb) @@ -122,3 +123,26 @@ ucfg_spatial_reuse_setup_req(struct wlan_objmgr_vdev *vdev, return wlan_sr_setup_req(vdev, pdev, is_sr_enable, srg_pd_threshold, non_srg_pd_threshold); } + +QDF_STATUS ucfg_spatial_reuse_operation_allowed(struct wlan_objmgr_psoc *psoc, + struct wlan_objmgr_vdev *vdev) +{ + uint32_t conc_vdev_id; + uint8_t vdev_id, mac_id; + QDF_STATUS status; + + if (!vdev || !psoc) + return QDF_STATUS_E_NULL_VALUE; + + vdev_id = wlan_vdev_get_id(vdev); + status = policy_mgr_get_mac_id_by_session_id(psoc, vdev_id, &mac_id); + if (QDF_IS_STATUS_ERROR(status)) + return status; + conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(psoc, vdev_id, + mac_id); + if (conc_vdev_id != WLAN_INVALID_VDEV_ID && + !policy_mgr_sr_same_mac_conc_enabled(psoc)) + return QDF_STATUS_E_NOSUPPORT; + + return status; +} diff --git a/core/hdd/src/wlan_hdd_he.c b/core/hdd/src/wlan_hdd_he.c index 0fbdf0eddf..ed2bbb8428 100644 --- a/core/hdd/src/wlan_hdd_he.c +++ b/core/hdd/src/wlan_hdd_he.c @@ -702,6 +702,12 @@ static int __wlan_hdd_cfg80211_sr_operations(struct wiphy *wiphy, hdd_err("11AX is not supported"); return -EINVAL; } + status = ucfg_spatial_reuse_operation_allowed(hdd_ctx->psoc, + adapter->vdev); + if (QDF_IS_STATUS_ERROR(status)) { + hdd_err("SR operations not allowed status: %u", status); + return qdf_status_to_os_return(status); + } if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_SR_MAX, data, data_len, wlan_hdd_sr_policy)) { hdd_err("invalid attr");