Browse Source

qcacld-3.0: Abort RSO enable for not all mlo links up

While mlo wlan0 sta connecting with vdev0 up and vdev1 not up yet, wlan1
vdev2 disconnected, enabled roaming on other connected sta, then vdev0 RSO
enabled before vdev1 up, mlme session for vdev1 wasn't created in F/W. When
roaming happened, vdev1 peer wasn't deleted, F/W asserted.

To fix it, for mlo sta, follow legacy sta,  if not all of requested links
are up, abort RSO operation except deinit on it.

Change-Id: I7026614ab91cf0a603c97e962433dc5139b210dd
CRs-Fixed: 3471655
Jianmin Zhu 1 year ago
parent
commit
d3bd22dfe0

+ 6 - 2
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -4627,13 +4627,16 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 	if (!vdev)
 		return status;
 
-	is_up = QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
+	if (wlan_vdev_mlme_is_mlo_vdev(vdev))
+		is_up = mlo_check_if_all_links_up(vdev);
+	else
+		is_up = QDF_IS_STATUS_SUCCESS(wlan_vdev_is_up(vdev));
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
 
 	cur_state = mlme_get_roam_state(psoc, vdev_id);
 
 	if (requested_state != WLAN_ROAM_DEINIT && !is_up) {
-		mlme_debug("ROAM: roam state change requested in disconnected state");
+		mlme_debug("ROAM: roam state change requested in non-connected state");
 		goto end;
 	}
 
@@ -4648,6 +4651,7 @@ cm_roam_state_change(struct wlan_objmgr_pdev *pdev,
 		mlme_err("Invalid vdev");
 		goto end;
 	}
+
 	status = cm_roam_acquire_lock(vdev);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("Fail to acquire lock, status: %d", status);