瀏覽代碼

qcacld-3.0: Don't allow MCC for ML links

Don't allow ML links to form MCC, if second
ML link is trying to form MCC then send disable
to FW and FW will decide which link to be disabled
to avoid MCC. Similarly if any SAP/P2P link disables
then ML STA link shouldn't enable back if it can cause
MCC with existing ML link.

Change-Id: I9bd8e257ad3fc3ee54d9e9d79c66962469b0b827
CRs-Fixed: 3313944
Sheenam Monga 2 年之前
父節點
當前提交
e1afc98144
共有 1 個文件被更改,包括 87 次插入1 次删除
  1. 87 1
      components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

+ 87 - 1
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -5826,6 +5826,87 @@ policy_mgr_get_ml_sta_and_p2p_cli_go_sap_info(
 	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 }
 
+/*
+ * policy_mgr_is_ml_sta_links_in_mcc() - Check ML links are in MCC or not
+ * @psoc: psoc ctx
+ * @ml_freq_lst: ML STA freq list
+ * @ml_vdev_lst: ML STA vdev id list
+ * @num_ml_sta: Number of total ML STA links
+ *
+ * Return: true if ML link in MCC else false
+ */
+static bool
+policy_mgr_is_ml_sta_links_in_mcc(struct wlan_objmgr_psoc *psoc,
+				  qdf_freq_t *ml_freq_lst,
+				  uint8_t *ml_vdev_lst,
+				  uint8_t num_ml_sta)
+{
+	uint8_t i, j;
+
+	for (i = 0; i < num_ml_sta; i++) {
+		for (j = i + 1; j < num_ml_sta; j++) {
+			if (ml_freq_lst[i] != ml_freq_lst[j] &&
+			    policy_mgr_2_freq_always_on_same_mac(
+					psoc, ml_freq_lst[i], ml_freq_lst[j])) {
+				policy_mgr_debug("vdev %d and %d are in MCC with freq %d and freq %d",
+						 ml_vdev_lst[i], ml_vdev_lst[j],
+						 ml_freq_lst[i],
+						 ml_freq_lst[j]);
+				return true;
+			}
+		}
+	}
+
+	return false;
+}
+
+/*
+ * policy_mgr_handle_mcc_ml_sta() - disables one ML STA link if causing MCC
+ * DBS - if ML STA links on 5 GHz + 6 GHz
+ * SBS - if both ML STA links on 5 GHz high/5 GHz low
+ * non-SBS - any combo (5/6 GHz + 5/6 GHz OR 2 GHz + 5/6 GHz)
+ * @psoc: psoc ctx
+ *
+ * Return: Success if MCC link is disabled else failure
+ */
+static QDF_STATUS
+policy_mgr_handle_mcc_ml_sta(struct wlan_objmgr_psoc *psoc,
+			     struct wlan_objmgr_vdev *vdev)
+{
+	uint8_t num_ml_sta = 0, num_disabled_ml_sta = 0;
+	uint8_t ml_sta_vdev_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
+	qdf_freq_t ml_freq_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
+	struct policy_mgr_psoc_priv_obj *pm_ctx;
+
+	if ((wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE))
+		return QDF_STATUS_E_FAILURE;
+
+	pm_ctx = policy_mgr_get_context(psoc);
+	if (!pm_ctx) {
+		policy_mgr_err("Invalid Context");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	policy_mgr_get_ml_sta_info(pm_ctx, &num_ml_sta, &num_disabled_ml_sta,
+				   ml_sta_vdev_lst, ml_freq_lst,
+				   NULL, NULL, NULL);
+	if (num_ml_sta < 2 || num_ml_sta > MAX_NUMBER_OF_CONC_CONNECTIONS ||
+	    num_disabled_ml_sta) {
+		policy_mgr_debug("num_ml_sta invalid %d or link already disabled%d",
+				 num_ml_sta, num_disabled_ml_sta);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	if (!policy_mgr_is_ml_sta_links_in_mcc(psoc, ml_freq_lst,
+					       ml_sta_vdev_lst, num_ml_sta))
+		return QDF_STATUS_E_FAILURE;
+
+	policy_mgr_mlo_sta_set_link(psoc, MLO_LINK_FORCE_REASON_CONNECT,
+				    MLO_LINK_FORCE_MODE_ACTIVE_NUM,
+				    num_ml_sta, ml_sta_vdev_lst);
+	return QDF_STATUS_SUCCESS;
+}
+
 /*
  * policy_mgr_sta_ml_link_enable_allowed() - Check with given ML links and
  * existing concurrencies, a disabled ml link can be enabled back.
@@ -5852,7 +5933,9 @@ policy_mgr_sta_ml_link_enable_allowed(struct wlan_objmgr_psoc *psoc,
 	/* If no link is disabled nothing to do */
 	if (!num_disabled_ml_sta || num_ml_sta < 2)
 		return false;
-
+	if (policy_mgr_is_ml_sta_links_in_mcc(psoc, ml_freq_lst, ml_vdev_lst,
+					      num_ml_sta))
+		return false;
 	/* Disabled link is at the last index */
 	disabled_link_vdev_id = ml_vdev_lst[num_ml_sta - 1];
 	disabled_link_freq = ml_freq_lst[num_ml_sta - 1];
@@ -5903,6 +5986,9 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
 		return;
 	}
 
+	if (QDF_IS_STATUS_SUCCESS(policy_mgr_handle_mcc_ml_sta(psoc, vdev)))
+		return;
+
 	status = policy_mgr_handle_ml_sta_link_concurrency(psoc, vdev);
 	if (QDF_IS_STATUS_SUCCESS(status))
 		return;