Преглед изворни кода

qcacld-3.0: Don't send RSO start after HO failure

When HO failure happens or roam synch failure happens due to
north bound disconnect being already processed, host
transitions to RSO STOP-> Roam Deinit as part of the disconnect.
But after this roam abort is done, which tries to reset the
state to ROAM enabled. This causes roam init to be sent
immediately and in STA + STA scenario where STA2 roaming
is also enabled, it causes fw to go to invalid state
as STA 1 vdev is deleted.

Allow roam abort to transition to RSO Enabled only in
Roam Synch in progress state or Roam in progress state
and not in RSO deinit state.

Change-Id: I1f07d4a3068f719b8d05e111bc8d45626c6a2468
CRs-Fixed: 2969507
Pragaspathi Thilagaraj пре 3 година
родитељ
комит
ce1e9e80f0
1 измењених фајлова са 14 додато и 2 уклоњено
  1. 14 2
      components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

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

@@ -3076,8 +3076,8 @@ cm_roam_switch_to_deinit(struct wlan_objmgr_pdev *pdev,
 	 */
 	if (reason != REASON_SUPPLICANT_INIT_ROAMING &&
 	    reason != REASON_ROAM_SET_PRIMARY) {
-	    mlme_debug("enable roaming on connected sta vdev_id:%d, reason:%d",
-		       vdev_id, reason);
+		mlme_debug("vdev_id:%d enable roaming on other connected sta - reason:%d",
+			   vdev_id, reason);
 		wlan_cm_enable_roaming_on_connected_sta(pdev, vdev_id);
 	}
 
@@ -3107,6 +3107,7 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 	struct wlan_mlme_psoc_ext_obj *mlme_obj;
 	struct dual_sta_policy *dual_sta_policy;
+	struct wlan_objmgr_vdev *vdev;
 	bool is_vdev_primary = false;
 
 	if (!psoc)
@@ -3194,6 +3195,17 @@ cm_roam_switch_to_init(struct wlan_objmgr_pdev *pdev,
 		return QDF_STATUS_SUCCESS;
 	}
 
+	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(psoc, vdev_id,
+						    WLAN_MLME_NB_ID);
+	if (cm_is_vdev_disconnecting(vdev) ||
+	    cm_is_vdev_disconnected(vdev)) {
+		mlme_debug("CM_RSO: RSO Init received in disconnected state");
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_NB_ID);
+
 	status = cm_roam_init_req(psoc, vdev_id, true);
 
 	if (QDF_IS_STATUS_ERROR(status))