Bladeren bron

qcacld-3.0: Handle RSO SM for ML concurrency cases

In ML-STA + STA concurrency currently, when legacy STA is being
brought up the RSO of existing ML-STA is stopped and not re-enabled
later. Therefore, ML-STA cannot roam after concurrent STA bringup.

Modify the RSO enable logic for ML-STA as follows:
1. All the links should be up.
2. The vdev should be an assoc vdev
3. The if_mgr_enable_roaming should happen on an interface other
than ML-STA links.

The condition-3 prevents enabling RSO for the assoc vdevs when the
link vdev connect complete event is processed.

Change-Id: If86a81b99d18eaa99a25e419c85197d9d0d826ac
CRs-Fixed: 3493333
Surya Prakash Sivaraj 1 jaar geleden
bovenliggende
commit
da7b96abf5
1 gewijzigde bestanden met toevoegingen van 38 en 3 verwijderingen
  1. 38 3
      components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c

+ 38 - 3
components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c

@@ -36,6 +36,38 @@
 #include "wlan_cm_api.h"
 #include "wlan_scan_api.h"
 #include "wlan_mlo_mgr_roam.h"
+#include "wlan_mlo_mgr_sta.h"
+
+#ifdef WLAN_FEATURE_11BE_MLO
+static inline bool
+if_mgr_is_assoc_link_of_vdev(struct wlan_objmgr_pdev *pdev,
+			     struct wlan_objmgr_vdev *vdev,
+			     uint8_t cur_vdev_id)
+{
+	struct wlan_objmgr_vdev *cur_vdev, *assoc_vdev;
+
+	cur_vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, cur_vdev_id,
+							WLAN_IF_MGR_ID);
+	if (!cur_vdev)
+		return false;
+
+	assoc_vdev = wlan_mlo_get_assoc_link_vdev(cur_vdev);
+
+	wlan_objmgr_vdev_release_ref(cur_vdev, WLAN_IF_MGR_ID);
+	if (vdev == assoc_vdev)
+		return true;
+
+	return false;
+}
+#else
+static inline bool
+if_mgr_is_assoc_link_of_vdev(struct wlan_objmgr_pdev *pdev,
+			     struct wlan_objmgr_vdev *vdev,
+			     uint8_t cur_vdev_id)
+{
+	return true;
+}
+#endif
 
 static void if_mgr_enable_roaming_on_vdev(struct wlan_objmgr_pdev *pdev,
 					  void *object, void *arg)
@@ -47,13 +79,16 @@ static void if_mgr_enable_roaming_on_vdev(struct wlan_objmgr_pdev *pdev,
 	vdev_id = wlan_vdev_get_id(vdev);
 	curr_vdev_id = roam_arg->curr_vdev_id;
 
-	if (wlan_vdev_mlme_is_mlo_vdev(vdev))
+	if (wlan_vdev_mlme_get_opmode(vdev) != QDF_STA_MODE)
+		return;
+
+	if (wlan_vdev_mlme_is_mlo_link_vdev(vdev) ||
+	    if_mgr_is_assoc_link_of_vdev(pdev, vdev, curr_vdev_id))
 		return;
 
 	if (curr_vdev_id != vdev_id &&
-	    vdev->vdev_mlme.vdev_opmode == QDF_STA_MODE &&
 	    vdev->vdev_mlme.mlme_state == WLAN_VDEV_S_UP) {
-		ifmgr_debug("Roaming enabled on vdev_id %d", vdev_id);
+		ifmgr_debug("Enable roaming for vdev_id %d", vdev_id);
 		wlan_cm_enable_rso(pdev, vdev_id,
 				   roam_arg->requestor,
 				   REASON_DRIVER_ENABLED);