Browse Source

qcacld-3.0: Call enable/disable link APIs from connect/disconnect/roam

Call enable/disable link APIs from connect/disconnect/roam etc.

Cleanup policy_mgr_handle_sap_mlo_sta_concurrency and
policy_mgr_handle_sap_plus_ml_sta_connect API as
policy_mgr_handle_sap_cli_go_ml_sta_up_csa and
policy_mgr_re_enable_ml_sta_on_p2p_sap_down will take care of
ML STA + SAP/P2P cases.

Also optimize policy_mgr_handle_ml_sta_link_concurrency to consider
only ML STA+STA cases and called from connect/disconnect/roam etc.

Change-Id: Ib8b9b2a490832ea5cbe1d86e58009e1437b331b9
CRs-Fixed: 3189685
Abhishek Singh 2 years ago
parent
commit
12e3558871

+ 5 - 9
components/cmn_services/interface_mgr/src/wlan_if_mgr_sta.c

@@ -112,6 +112,7 @@ QDF_STATUS if_mgr_connect_complete(struct wlan_objmgr_vdev *vdev,
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_objmgr_pdev *pdev;
 	QDF_STATUS status = event_data->status;
+	uint8_t vdev_id;
 
 	pdev = wlan_vdev_get_pdev(vdev);
 	if (!pdev)
@@ -121,6 +122,7 @@ QDF_STATUS if_mgr_connect_complete(struct wlan_objmgr_vdev *vdev,
 	if (!psoc)
 		return QDF_STATUS_E_FAILURE;
 
+	vdev_id = wlan_vdev_get_id(vdev);
 	if (QDF_IS_STATUS_SUCCESS(status)) {
 		/*
 		 * Due to audio share glitch with P2P clients caused by roam
@@ -134,9 +136,9 @@ QDF_STATUS if_mgr_connect_complete(struct wlan_objmgr_vdev *vdev,
 			ifmgr_debug("p2p client active, keep roam disabled");
 		} else {
 			ifmgr_debug("set pcl when connection on vdev id:%d",
-				     vdev->vdev_objmgr.vdev_id);
-			policy_mgr_set_pcl_for_connected_vdev(psoc,
-					      vdev->vdev_objmgr.vdev_id, false);
+				     vdev_id);
+			policy_mgr_set_pcl_for_connected_vdev(psoc, vdev_id,
+							      false);
 			/*
 			 * Enable roaming on other STA iface except this one.
 			 * Firmware doesn't support connection on one STA iface
@@ -144,9 +146,6 @@ QDF_STATUS if_mgr_connect_complete(struct wlan_objmgr_vdev *vdev,
 			 */
 			if_mgr_enable_roaming(pdev, vdev, RSO_CONNECT_START);
 		}
-		if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
-			policy_mgr_handle_ml_sta_link_concurrency(psoc, vdev,
-								  true);
 	} else {
 		/* notify connect failure on final failure */
 		ucfg_tdls_notify_connect_failure(psoc);
@@ -216,8 +215,5 @@ QDF_STATUS if_mgr_disconnect_complete(struct wlan_objmgr_vdev *vdev,
 		return status;
 	}
 
-	if (wlan_vdev_mlme_get_opmode(vdev) == QDF_STA_MODE)
-		policy_mgr_handle_ml_sta_link_concurrency(psoc, vdev, false);
-
 	return QDF_STATUS_SUCCESS;
 }

+ 16 - 46
components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h

@@ -4267,48 +4267,30 @@ bool policy_mgr_is_mlo_in_mode_sbs(struct wlan_objmgr_psoc *psoc,
 				   uint8_t *mlo_vdev_lst, uint8_t *num_mlo);
 
 /*
- * policy_mgr_handle_sap_mlo_sta_concurrency() - Handle SAP MLO STA concurrency
- *                                             such as:
- *       1) If MLO STA is present with both links in 5/6 Ghz then SAP comes up
- *          on 2.4 Ghz, then Disable one of the links
- *       2) If MLO STA is present with both links in 5/6 Ghz and SAP, which was
- *          present on 2.4 ghz, stops then renable both the as one of the links
- *          were disabled because of sap on 2.4 ghz.
- *
- * @vdev: vdev mlme object
- * @is_ap_up: bool to represent sap state
- *
- * Return: Void
- */
-void policy_mgr_handle_sap_mlo_sta_concurrency(struct wlan_objmgr_psoc *psoc,
-					       struct wlan_objmgr_vdev *vdev,
-					       bool is_ap_up);
-
-void policy_mgr_handle_ml_sta_link_concurrency(struct wlan_objmgr_psoc *psoc,
-					       struct wlan_objmgr_vdev *vdev,
-					       bool is_connect);
-
-/*
- * policy_mgr_handle_sap_cli_go_ml_sta_up_csa() - Handle enable/disable
- * link on CLI/GO/SAP/ML_STA vdev UP and channel change
+ * policy_mgr_handle_ml_sta_links_on_vdev_up_csa() - Handle enable/disable
+ * link on vdev UP and channel change
  * @psoc: objmgr psoc
+ * @mode: mode of vdev that went UP or changed channel
  * @vdev_id: vdev_id which went UP or changed channel
  *
  * Return: void
  */
 void
-policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
-					   uint8_t vdev_id);
+policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
+					      enum QDF_OPMODE mode,
+					      uint8_t vdev_id);
 
 /*
- * policy_mgr_re_enable_ml_sta_on_p2p_sap_down() - Handle enable
- * link on CLI/GO/SAP/ML_STA down
+ * policy_mgr_handle_ml_sta_links_on_vdev_down() - Handle enable
+ * link on any vdev down
  * @psoc: objmgr psoc
+ * @mode: mode of vdev that went down
  * @vdev_id: vdev_id which went down
  *
  * Return: void
  */
-void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
+void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,
+						 enum QDF_OPMODE mode,
 						 uint8_t vdev_id);
 #else
 
@@ -4338,28 +4320,16 @@ bool policy_mgr_is_mlo_in_mode_sbs(struct wlan_objmgr_psoc *psoc,
 	return false;
 }
 
-static inline
-void policy_mgr_handle_sap_mlo_sta_concurrency(struct wlan_objmgr_psoc *psoc,
-					       struct wlan_objmgr_vdev *vdev,
-					       bool is_ap_up)
-{
-}
-
-static inline
-void policy_mgr_handle_ml_sta_link_concurrency(struct wlan_objmgr_psoc *psoc,
-					       struct wlan_objmgr_vdev *vdev,
-					       bool is_connect)
-{
-}
-
 static inline void
-policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
-					   uint8_t vdev_id)
+policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
+					      enum QDF_OPMODE mode,
+					      uint8_t vdev_id)
 {
 }
 
 static inline
-void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
+void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,
+						 enum QDF_OPMODE mode,
 						 uint8_t vdev_id)
 {
 }

+ 2 - 0
components/cmn_services/policy_mgr/src/wlan_policy_mgr_action.c

@@ -406,6 +406,8 @@ QDF_STATUS policy_mgr_update_connection_info(struct wlan_objmgr_psoc *psoc,
 	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
 	/* do we need to change the HW mode */
 	policy_mgr_check_n_start_opportunistic_timer(psoc);
+	policy_mgr_handle_ml_sta_links_on_vdev_up_csa(psoc,
+				policy_mgr_get_qdf_mode_from_pm(mode), vdev_id);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 99 - 152
components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c

@@ -3455,6 +3455,7 @@ void policy_mgr_incr_active_session(struct wlan_objmgr_psoc *psoc,
 	policy_mgr_dump_current_concurrency(psoc);
 
 	qdf_mutex_release(&pm_ctx->qdf_conc_list_lock);
+	policy_mgr_handle_ml_sta_links_on_vdev_up_csa(psoc, mode, session_id);
 }
 
 /**
@@ -4451,79 +4452,6 @@ bool policy_mgr_is_mlo_in_mode_sbs(struct wlan_objmgr_psoc *psoc,
 	return is_sbs_link;
 }
 
-void policy_mgr_handle_sap_mlo_sta_concurrency(struct wlan_objmgr_psoc *psoc,
-					       struct wlan_objmgr_vdev *vdev,
-					       bool is_ap_up)
-{
-	uint8_t num_mlo = 0;
-	qdf_freq_t sap_chan = 0;
-	struct wlan_channel *bss_chan = NULL;
-	uint8_t mlo_vdev_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	bool is_mlo_sbs;
-	struct mac_context *mac_ctx = cds_get_context(QDF_MODULE_ID_SME);
-
-	if (!mac_ctx)
-		return;
-
-	is_mlo_sbs = policy_mgr_is_mlo_in_mode_sbs(psoc, PM_STA_MODE,
-						   mlo_vdev_lst, &num_mlo);
-
-	if (num_mlo < 2) {
-		policy_mgr_debug("vdev %d AP_state %d MLO Sta links %d",
-				 wlan_vdev_get_id(vdev), is_ap_up, num_mlo);
-		return;
-	}
-
-	bss_chan = wlan_vdev_mlme_get_bss_chan(vdev);
-	if (bss_chan)
-		sap_chan = bss_chan->ch_freq;
-	if (!sap_chan) {
-		policy_mgr_debug("Invalid SAP Chan");
-		return;
-	}
-
-	policy_mgr_debug("vdev %d: is_ap_up %d num_mlo %d is_mlo_sbs %d sap_chan %d",
-			 wlan_vdev_get_id(vdev), is_ap_up, num_mlo, is_mlo_sbs,
-			 sap_chan);
-
-	if (!is_mlo_sbs)
-		return;
-
-	if (is_ap_up) {
-		/*
-		 * During 2.4Ghz SAP up, If SBS MLO STA is present,
-		 * then Disable one of the links.
-		 */
-		if (wlan_reg_is_24ghz_ch_freq(sap_chan))
-			wlan_mlo_sta_mlo_concurency_set_link(vdev,
-						MLO_LINK_FORCE_REASON_CONNECT,
-						MLO_LINK_FORCE_MODE_ACTIVE_NUM,
-						num_mlo, mlo_vdev_lst);
-		/*
-		 * During 2.4Ghz SAP up, If there is channel switch for sap from
-		 * 2.4 ghz to 5 ghz, enable both the links, as one of them was
-		 * disabled by previous up operations when sap was on 2.4 ghz
-		 */
-		else
-			wlan_mlo_sta_mlo_concurency_set_link(vdev,
-						MLO_LINK_FORCE_REASON_CONNECT,
-						MLO_LINK_FORCE_MODE_NO_FORCE,
-						num_mlo, mlo_vdev_lst);
-
-		return;
-	}
-
-	/*
-	 * During 2.4Ghz SAP down, if SBS MLO STA is present, renable both the
-	 * links, as one of them was disabled during up.
-	 */
-	if (wlan_reg_is_24ghz_ch_freq(sap_chan))
-		wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					MLO_LINK_FORCE_REASON_DISCONNECT,
-					MLO_LINK_FORCE_MODE_NO_FORCE,
-					num_mlo, mlo_vdev_lst);
-}
-
 static uint8_t
 policy_mgr_get_affected_links_for_sbs(struct wlan_objmgr_psoc *psoc,
 				      uint8_t num_ml, qdf_freq_t *freq_list,
@@ -4706,58 +4634,6 @@ policy_mgr_get_concurrent_num_links(struct wlan_objmgr_vdev *vdev,
 	return i;
 }
 
-static void
-policy_mgr_handle_sap_plus_ml_sta_connect(struct wlan_objmgr_psoc *psoc,
-					  struct wlan_objmgr_vdev *vdev)
-{
-	uint32_t sap_num = 0;
-	qdf_freq_t sap_freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	uint8_t sap_vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	bool is_ml_sbs;
-	uint8_t ml_vdev_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	uint8_t num_ml;
-	uint8_t vdev_id = wlan_vdev_get_id(vdev);
-
-	sap_num = policy_mgr_get_mode_specific_conn_info(psoc, sap_freq_list,
-							 sap_vdev_id_list,
-							 PM_SAP_MODE);
-
-	policy_mgr_debug("vdev %d: sap_num %d sap_chan %d", vdev_id, sap_num,
-			 sap_freq_list[0]);
-	if (sap_num != 1)
-		return;
-
-	if (!wlan_reg_is_24ghz_ch_freq(sap_freq_list[0]))
-		return;
-	is_ml_sbs = policy_mgr_is_mlo_in_mode_sbs(psoc, PM_STA_MODE,
-						  ml_vdev_lst, &num_ml);
-	if (num_ml < 2)
-		return;
-
-	policy_mgr_debug("vdev %d: num_ml %d is_ml_sbs %d sap_chan %d", vdev_id,
-			 num_ml, is_ml_sbs, sap_freq_list[0]);
-
-	if (!is_ml_sbs) {
-		/*
-		 * re-enable both link in case if this was roaming from sbs to
-		 * dbs ML STA, with sap on 2.4Ghz.
-		 */
-		if (wlan_cm_is_vdev_roaming(vdev))
-			wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					MLO_LINK_FORCE_REASON_DISCONNECT,
-					MLO_LINK_FORCE_MODE_NO_FORCE,
-					num_ml, ml_vdev_lst);
-
-		return;
-	}
-
-	/* If ML STA is SBS and SAP is 2.4Ghz, Disable one of the links. */
-	wlan_mlo_sta_mlo_concurency_set_link(vdev,
-					     MLO_LINK_FORCE_REASON_CONNECT,
-					     MLO_LINK_FORCE_MODE_ACTIVE_NUM,
-					     num_ml, ml_vdev_lst);
-}
-
 static void
 policy_mgr_ml_sta_concurency_on_connect(struct wlan_objmgr_psoc *psoc,
 				    struct wlan_objmgr_vdev *vdev,
@@ -4774,11 +4650,8 @@ policy_mgr_ml_sta_concurency_on_connect(struct wlan_objmgr_psoc *psoc,
 	enum mlo_link_force_mode mode = MLO_LINK_FORCE_MODE_ACTIVE_NUM;
 
 	/* non ML STA doesn't exist, no need to change to link.*/
-	if (!num_non_ml) {
-		/* Check if SAP exist and any link change is required */
-		policy_mgr_handle_sap_plus_ml_sta_connect(psoc, vdev);
+	if (!num_non_ml)
 		return;
-	}
 
 	if (wlan_vdev_mlme_is_mlo_vdev(vdev)) {
 		freq = freq_list[non_ml_idx[0]];
@@ -4860,10 +4733,18 @@ policy_mgr_ml_sta_concurency_on_disconnect(struct wlan_objmgr_vdev *vdev,
 					     num_ml, ml_vdev_list);
 }
 
-void
+/**
+ * policy_mgr_handle_ml_sta_link_concurrency() - Handle STA+ML_STA concurrency
+ * @psoc: PSOC object information
+ * @vdev: vdev of the changed interface caller
+ * @is_connect: checnged interface connected or disconnected
+ *
+ * Return: void
+ */
+static void
 policy_mgr_handle_ml_sta_link_concurrency(struct wlan_objmgr_psoc *psoc,
-				      struct wlan_objmgr_vdev *vdev,
-				      bool is_connect)
+					  struct wlan_objmgr_vdev *vdev,
+					  bool is_connect)
 {
 	uint8_t num_ml = 0, num_non_ml = 0;
 	uint8_t ml_idx[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
@@ -4871,10 +4752,30 @@ policy_mgr_handle_ml_sta_link_concurrency(struct wlan_objmgr_psoc *psoc,
 	qdf_freq_t freq_list[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 	uint8_t vdev_id_list[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 
+	/*
+	 * Skip this in case of SAP/P2P Concurrencies, to avoid renable of
+	 * the link, disabled by SAP/P2P logic, as this API only consider
+	 * STA specific counts and ignore other counts.
+	 */
+	if (policy_mgr_mode_specific_connection_count(psoc,
+						      PM_SAP_MODE, NULL) ||
+	    policy_mgr_mode_specific_connection_count(psoc,
+					      PM_P2P_CLIENT_MODE, NULL) ||
+	    policy_mgr_mode_specific_connection_count(psoc,
+						      PM_P2P_GO_MODE, NULL)) {
+		policy_mgr_debug("SAP/GO/CLI exist ignore this check");
+		return;
+	}
 	policy_mgr_get_ml_and_non_ml_sta_count(psoc, &num_ml, ml_idx,
 					       &num_non_ml, non_ml_idx,
 					       freq_list, vdev_id_list);
-
+	/*
+	 * TODO: Get disable link info as well and add it in num_ml, ml_idx,
+	 * freq_list and vdev_id_list and if a link is disabled and
+	 * its called with is_connect, avoid disabling again.
+	 * also policy_mgr_ml_sta_concurency_on_disconnect should be called
+	 * only if diabled link is present.
+	 */
 	policy_mgr_debug("vdev %d: num_ml %d num_non_ml %d is_connect %d",
 			 wlan_vdev_get_id(vdev), num_ml, num_non_ml,
 			 is_connect);
@@ -5107,9 +5008,17 @@ policy_mgr_sta_ml_link_enable_allowed(struct wlan_objmgr_psoc *psoc,
 					    conc_ext_flags.value);
 }
 
-void
+/*
+ * policy_mgr_re_enable_ml_sta_on_p2p_sap_down() - Handle enable
+ * link on P2P/SAP/ML_STA vdev UP or channel change
+ * @psoc: objmgr psoc
+ * @vdev: vdev which went UP or changed chan
+ *
+ * Return: void
+ */
+static void
 policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
-					   uint8_t vdev_id)
+					   struct wlan_objmgr_vdev *vdev)
 {
 	uint8_t num_ml_sta = 0, num_p2p_sap = 0, num_disabled_ml_sta = 0;
 	uint8_t num_affected_link;
@@ -5117,7 +5026,7 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
 	uint8_t p2p_sap_vdev_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 	qdf_freq_t ml_freq_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 	qdf_freq_t p2p_sap_freq_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	struct wlan_objmgr_vdev *vdev;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
 
 	pm_ctx = policy_mgr_get_context(psoc);
@@ -5143,13 +5052,6 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
 		return;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_POLICY_MGR_ID);
-	if (!vdev) {
-		policy_mgr_err("vdev %d: invalid vdev", vdev_id);
-		return;
-	}
-
 	num_affected_link = policy_mgr_get_affected_links_for_go_sap_cli(psoc,
 						num_ml_sta, ml_sta_vdev_lst,
 						ml_freq_lst, num_p2p_sap,
@@ -5165,7 +5067,6 @@ policy_mgr_handle_sap_cli_go_ml_sta_up_csa(struct wlan_objmgr_psoc *psoc,
 					     MLO_LINK_FORCE_REASON_CONNECT,
 					     MLO_LINK_FORCE_MODE_ACTIVE_NUM,
 					     num_ml_sta, ml_sta_vdev_lst);
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
 
 	return;
 enable_link:
@@ -5181,11 +5082,42 @@ enable_link:
 					MLO_LINK_FORCE_REASON_DISCONNECT,
 					MLO_LINK_FORCE_MODE_NO_FORCE,
 					num_ml_sta, ml_sta_vdev_lst);
+}
+
+void
+policy_mgr_handle_ml_sta_links_on_vdev_up_csa(struct wlan_objmgr_psoc *psoc,
+					      enum QDF_OPMODE mode,
+					      uint8_t vdev_id)
+{
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_POLICY_MGR_ID);
+	if (!vdev) {
+		policy_mgr_err("vdev %d: invalid vdev", vdev_id);
+		return;
+	}
+
+	if (mode == QDF_STA_MODE || mode == QDF_SAP_MODE ||
+	    mode == QDF_P2P_CLIENT_MODE || mode == QDF_P2P_GO_MODE)
+		policy_mgr_handle_sap_cli_go_ml_sta_up_csa(psoc, vdev);
+	if (mode == QDF_STA_MODE)
+		policy_mgr_handle_ml_sta_link_concurrency(psoc, vdev, true);
+
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
 }
 
+/*
+ * policy_mgr_re_enable_ml_sta_on_p2p_sap_down() - Handle enable
+ * link on P2P/SAP/ML_STA vdev down
+ * @psoc: objmgr psoc
+ * @vdev: vdev which went down
+ *
+ * Return: void
+ */
+static
 void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
-						 uint8_t vdev_id)
+						 struct wlan_objmgr_vdev *vdev)
 {
 	uint8_t num_ml_sta = 0, num_p2p_sap = 0, num_disabled_ml_sta = 0;
 	uint8_t num_affected_link = 0;
@@ -5193,7 +5125,7 @@ void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
 	uint8_t p2p_sap_vdev_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 	qdf_freq_t ml_freq_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
 	qdf_freq_t p2p_sap_freq_lst[MAX_NUMBER_OF_CONC_CONNECTIONS] = {0};
-	struct wlan_objmgr_vdev *vdev;
+	uint8_t vdev_id = wlan_vdev_get_id(vdev);
 	struct policy_mgr_psoc_priv_obj *pm_ctx;
 
 	pm_ctx = policy_mgr_get_context(psoc);
@@ -5226,12 +5158,6 @@ void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
 						   ml_sta_vdev_lst))
 		return;
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
-						    WLAN_POLICY_MGR_ID);
-	if (!vdev) {
-		policy_mgr_err("vdev %d: invalid vdev", vdev_id);
-		return;
-	}
 	/*
 	 * If num_p2p_sap is non zero, ie p2p or sap still present check if
 	 * disable link is still required, if not enable the link.
@@ -5254,6 +5180,27 @@ void policy_mgr_re_enable_ml_sta_on_p2p_sap_down(struct wlan_objmgr_psoc *psoc,
 					MLO_LINK_FORCE_REASON_DISCONNECT,
 					MLO_LINK_FORCE_MODE_NO_FORCE,
 					num_ml_sta, ml_sta_vdev_lst);
+}
+
+void policy_mgr_handle_ml_sta_links_on_vdev_down(struct wlan_objmgr_psoc *psoc,
+						 enum QDF_OPMODE mode,
+						 uint8_t vdev_id)
+{
+	struct wlan_objmgr_vdev *vdev;
+
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+							    WLAN_POLICY_MGR_ID);
+	if (!vdev) {
+		policy_mgr_err("vdev %d: invalid vdev", vdev_id);
+		return;
+	}
+
+	if (mode == QDF_STA_MODE || mode == QDF_SAP_MODE ||
+	    mode == QDF_P2P_CLIENT_MODE || mode == QDF_P2P_GO_MODE)
+		policy_mgr_re_enable_ml_sta_on_p2p_sap_down(psoc, vdev);
+	if (mode == QDF_STA_MODE)
+		policy_mgr_handle_ml_sta_link_concurrency(psoc, vdev, false);
+
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_POLICY_MGR_ID);
 }
 

+ 5 - 3
components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c

@@ -386,9 +386,11 @@ void policy_mgr_decr_session_set_pcl(struct wlan_objmgr_psoc *psoc,
 	}
 
 	/* do we need to change the HW mode */
-	if (policy_mgr_is_hw_dbs_capable(psoc))
-		policy_mgr_check_n_start_opportunistic_timer(psoc);
-	return;
+	if (!policy_mgr_is_hw_dbs_capable(psoc))
+		return;
+
+	policy_mgr_check_n_start_opportunistic_timer(psoc);
+	policy_mgr_handle_ml_sta_links_on_vdev_down(psoc, mode, vdev_id);
 }
 
 /**

+ 1 - 26
components/mlme/core/src/wlan_mlme_vdev_mgr_interface.c

@@ -464,28 +464,6 @@ static QDF_STATUS ap_mlme_vdev_up_send(struct vdev_mlme_obj *vdev_mlme,
 	return lim_ap_mlme_vdev_up_send(vdev_mlme, data_len, data);
 }
 
-#ifdef WLAN_FEATURE_11BE_MLO
-static inline void
-wlan_handle_sap_mlo_sta_concurrency(struct wlan_objmgr_vdev *vdev,
-				    bool is_ap_up)
-{
-	struct wlan_objmgr_psoc *psoc = wlan_vdev_get_psoc(vdev);
-
-	if (!psoc) {
-		mlme_legacy_debug("psoc Null");
-		return;
-	}
-
-	policy_mgr_handle_sap_mlo_sta_concurrency(psoc, vdev, is_ap_up);
-}
-#else
-static inline void
-wlan_handle_sap_mlo_sta_concurrency(struct wlan_objmgr_vdev *vdev,
-				    bool is_ap_up)
-{
-}
-#endif
-
 /**
  * ap_mlme_vdev_notify_up_complete() - callback to notify up completion
  * @vdev_mlme: vdev mlme object
@@ -506,8 +484,6 @@ ap_mlme_vdev_notify_up_complete(struct vdev_mlme_obj *vdev_mlme,
 	}
 
 	pe_debug("Vdev %d is up", wlan_vdev_get_id(vdev_mlme->vdev));
-	if (wlan_vdev_mlme_get_opmode(vdev_mlme->vdev) == QDF_SAP_MODE)
-		wlan_handle_sap_mlo_sta_concurrency(vdev_mlme->vdev, true);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -608,8 +584,7 @@ static QDF_STATUS vdevmgr_notify_down_complete(struct vdev_mlme_obj *vdev_mlme,
 {
 	mlme_legacy_debug("vdev id = %d ",
 			  vdev_mlme->vdev->vdev_objmgr.vdev_id);
-	if (wlan_vdev_mlme_get_opmode(vdev_mlme->vdev) == QDF_SAP_MODE)
-		wlan_handle_sap_mlo_sta_concurrency(vdev_mlme->vdev, false);
+
 	return wma_mlme_vdev_notify_down_complete(vdev_mlme, data_len, data);
 }