Browse Source

qcacld-3.0: Add concurrency check with SR

Add check for concurrency with SR, if SR with concurrency
is not enabled then disable the SR on existing VDEV as soon as
new VDEV is up.
When this new VDEV is disconnected, then enable back the SR on
the previous VDEV.

Change-Id: Id6aee592b889bb7006efb44420e6d272212e13ba
CRs-Fixed: 3306181
Rachit Kankane 2 years ago
parent
commit
45f42c90a8

+ 22 - 0
components/spatial_reuse/dispatcher/inc/spatial_reuse_ucfg_api.h

@@ -50,6 +50,28 @@ void ucfg_spatial_reuse_get_sr_config(struct wlan_objmgr_vdev *vdev,
 void ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev *vdev,
 				      uint8_t sr_ctrl,
 				      uint8_t non_srg_max_pd_offset);
+
+/**
+ * ucfg_spatial_reuse_is_sr_disabled_due_conc() - Spatial reuse get concurrency
+ *						  status
+ *
+ * @vdev: object manager vdev
+ *
+ * Return: True when SR is disabled due to concurrency or else False
+ */
+bool ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev *vdev);
+
+/**
+ * ucfg_spatial_reuse_set_sr_conc_stat() - Spatial reuse disable config set
+ *
+ * @vdev: object manager vdev
+ * @sr_conc_disabled: spatial reuse disabled due to concurrency
+ *
+ * Return: void
+ */
+void ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev *vdev,
+					 bool sr_conc_disabled);
+
 /**
  * ucfg_spatial_reuse_send_sr_config() - Send spatial reuse config to fw
  *

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

@@ -39,6 +39,17 @@ void ucfg_spatial_reuse_set_sr_config(struct wlan_objmgr_vdev *vdev,
 	wlan_vdev_mlme_set_pd_offset(vdev, non_srg_max_pd_offset);
 }
 
+bool ucfg_spatial_reuse_is_sr_disabled_due_conc(struct wlan_objmgr_vdev *vdev)
+{
+	return wlan_vdev_mlme_is_sr_disable_due_conc(vdev);
+}
+
+void ucfg_spatial_reuse_set_sr_conc_stat(struct wlan_objmgr_vdev *vdev,
+					 bool sr_conc_disabled)
+{
+	wlan_vdev_mlme_set_sr_disable_due_conc(vdev, sr_conc_disabled);
+}
+
 void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev,
 				       bool enable)
 {
@@ -49,6 +60,9 @@ void ucfg_spatial_reuse_send_sr_config(struct wlan_objmgr_vdev *vdev,
 	/* SR feature itself is disabled by user */
 	if (!wlan_vdev_mlme_get_he_spr_enabled(vdev))
 		return;
+	/* SR is disabled due to conccurrency */
+	if (ucfg_spatial_reuse_is_sr_disabled_due_conc(vdev))
+		return;
 
 	if (enable) {
 		sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);

+ 9 - 1
core/mac/src/pe/lim/lim_send_sme_rsp_messages.c

@@ -2339,9 +2339,17 @@ lim_update_spatial_reuse(struct pe_session *session)
 								    vdev_id,
 								    mac_id);
 		if (conc_vdev_id == WLAN_INVALID_VDEV_ID ||
-		    policy_mgr_sr_same_mac_conc_enabled(psoc))
+		    policy_mgr_sr_same_mac_conc_enabled(psoc)) {
+			wlan_vdev_mlme_set_sr_disable_due_conc(session->vdev,
+							       false);
 			wlan_spatial_reuse_config_set(session->vdev, sr_ctrl,
 						      non_srg_pd_max_offset);
+		} else {
+			wlan_vdev_mlme_set_sr_disable_due_conc(session->vdev,
+							       true);
+			wlan_spatial_reuse_config_set(session->vdev, sr_ctrl,
+						      0x80);
+		}
 	}
 }
 #else

+ 70 - 26
core/wma/src/wma_features.c

@@ -667,13 +667,46 @@ static void wma_sr_send_pd_threshold(tp_wma_handle wma,
 	}
 }
 
+static void wma_sr_handle_conc(tp_wma_handle wma,
+			       struct wlan_objmgr_vdev *vdev,
+			       struct wlan_objmgr_vdev *conc_vdev,
+			       bool en_sr_curr_vdev)
+{
+	uint32_t val = 0;
+	uint8_t sr_ctrl;
+	uint8_t conc_vdev_id = wlan_vdev_get_id(conc_vdev);
+
+	if (en_sr_curr_vdev) {
+		wlan_vdev_mlme_set_sr_disable_due_conc(vdev, true);
+		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, true);
+		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
+			return;
+
+		wma_sr_send_pd_threshold(wma, conc_vdev_id, val);
+	} else if (wlan_vdev_mlme_is_sr_disable_due_conc(conc_vdev)) {
+		wlan_vdev_mlme_set_sr_disable_due_conc(conc_vdev, false);
+		if (!wlan_vdev_mlme_get_he_spr_enabled(conc_vdev))
+			return;
+
+		sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(conc_vdev);
+		if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
+		     (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
+		    (sr_ctrl & SRG_INFO_PRESENT)) {
+			wlan_mlme_update_sr_data(conc_vdev, &val, 0, true);
+			wma_sr_send_pd_threshold(wma, conc_vdev_id, val);
+		} else {
+			wma_debug("SR Disabled in SR Control");
+		}
+	}
+}
+
 QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable)
 {
 	uint32_t val = 0;
 	uint8_t mac_id;
 	uint32_t conc_vdev_id;
-	struct wlan_objmgr_vdev *vdev;
-	uint8_t sr_ctrl, non_srg_pd_max_offset;
+	struct wlan_objmgr_vdev *vdev, *conc_vdev;
+	uint8_t sr_ctrl;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
 	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, vdev_id,
@@ -682,39 +715,50 @@ QDF_STATUS wma_sr_update(tp_wma_handle wma, uint8_t vdev_id, bool enable)
 		wma_err("Can't get vdev by vdev_id:%d", vdev_id);
 		return QDF_STATUS_E_INVAL;
 	}
+	policy_mgr_get_mac_id_by_session_id(wma->psoc, vdev_id, &mac_id);
+	conc_vdev_id = policy_mgr_get_conc_vdev_on_same_mac(wma->psoc, vdev_id,
+							    mac_id);
+	if (conc_vdev_id != WLAN_INVALID_VDEV_ID &&
+	    !policy_mgr_sr_same_mac_conc_enabled(wma->psoc)) {
+		/*
+		 * Single MAC concurrency is not supoprted for SR,
+		 * Disable SR if it is enable on other VDEV and enable
+		 * it back once the once the concurrent vdev is down.
+		 */
+		wma_debug("SR with concurrency is not allowed");
+		conc_vdev =
+		wlan_objmgr_get_vdev_by_id_from_psoc(wma->psoc, conc_vdev_id,
+						     WLAN_LEGACY_WMA_ID);
+		if (!conc_vdev) {
+			wma_err("Can't get vdev by vdev_id:%d", conc_vdev_id);
+		} else {
+			wma_sr_handle_conc(wma, vdev, conc_vdev, enable);
+			wlan_objmgr_vdev_release_ref(conc_vdev,
+						     WLAN_LEGACY_WMA_ID);
+			goto release_ref;
+		}
+	}
+
 	if (!wlan_vdev_mlme_get_he_spr_enabled(vdev)) {
-		wma_err("Spatial Reuse disabled");
+		wma_err("Spatial Reuse disabled for vdev_id: %u", vdev_id);
 		status = QDF_STATUS_E_NOSUPPORT;
 		goto release_ref;
 	}
 
 	sr_ctrl = wlan_vdev_mlme_get_sr_ctrl(vdev);
-	non_srg_pd_max_offset = wlan_vdev_mlme_get_pd_offset(vdev);
-	wma_debug("SR Control: %x pd_max_offset: %x",
-		  sr_ctrl, non_srg_pd_max_offset);
-	if (!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
-	    (sr_ctrl & NON_SRG_OFFSET_PRESENT)) {
-		policy_mgr_get_mac_id_by_session_id(wma->psoc,
-						    vdev_id,
-						    &mac_id);
-		conc_vdev_id =
-			policy_mgr_get_conc_vdev_on_same_mac(wma->psoc,
-							     vdev_id,
-							     mac_id);
-		if (conc_vdev_id != WLAN_INVALID_VDEV_ID &&
-		    !policy_mgr_sr_same_mac_conc_enabled(wma->psoc)) {
-			wma_debug("Concurrent intf present,SR PD not enabled");
-			goto release_ref;
-		}
+	wma_debug("SR Control: %x", sr_ctrl);
+	if ((!(sr_ctrl & NON_SRG_PD_SR_DISALLOWED) &&
+	     (sr_ctrl & NON_SRG_OFFSET_PRESENT)) ||
+	    (sr_ctrl & SRG_INFO_PRESENT)) {
 		if (enable) {
-			val |= 1 << NON_SRG_SPR_ENABLE_POS;
-			val |= SR_PARAM_VAL_DBM_UNIT << SR_PARAM_VAL_DBM_POS;
-			val |= (uint8_t)((non_srg_pd_max_offset +
-						NON_SR_PD_THRESHOLD_MIN) <<
-						NON_SRG_MAX_PD_OFFSET_POS);
+			wlan_mlme_update_sr_data(vdev, &val, 0, true);
+		} else {
+			/* VDEV down, disable SR */
+			wlan_vdev_mlme_set_sr_ctrl(vdev, 0);
+			wlan_vdev_mlme_set_pd_offset(vdev, 0);
 		}
 
-		wma_debug("non-srg param val: %x, enable: %x", val, enable);
+		wma_debug("SR param val: %x, Enable: %x", val, enable);
 		wma_sr_send_pd_threshold(wma, vdev_id, val);
 	} else {
 		wma_debug("Spatial reuse is disabled in ctrl");