瀏覽代碼

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
Rachit Kankane 2 年之前
父節點
當前提交
f5b2eeb7f6

+ 15 - 5
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,

+ 24 - 0
components/spatial_reuse/dispatcher/src/spatial_reuse_ucfg_api.c

@@ -20,6 +20,7 @@
 #include <qdf_trace.h>
 #include <spatial_reuse_ucfg_api.h>
 #include <spatial_reuse_api.h>
+#include <wlan_policy_mgr_api.h>
 
 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;
+}

+ 6 - 0
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");