Procházet zdrojové kódy

qcacld-3.0: Handle ROAM_SYNC in RSO_STOPPED state

Currently if Host receives ROAM SYNC event in
RSO STOPPED state, Host drops ROAM_SYNC event and
fails to send ROAM COMPLETE response to FW. This
results assert in fw with reason ROAM COMPLETE
response timeout.

If ROAM SYNC come to host in below scenario:
1. HOST sends RSO stop command with scan mode 4,
   in order to process supplicant disabled roaming
   request
2. FW already queued the roam sync event before
   RSO STOP command receive from host
In this case host should send RSO STOP with
scan mode = 0 to FW. So that FW can stop roam sync
timer and change roam state to RSO STOP state
along with other internal cleanup in FW.

Change-Id: I8b25be98b30d7f8185d5f8dcd67a4b52f502fd37
CRs-Fixed: 3810436
Abhinav Kumar před 1 rokem
rodič
revize
f1b52bf46a

+ 17 - 4
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload.c

@@ -4598,6 +4598,7 @@ cm_roam_switch_to_roam_sync(struct wlan_objmgr_pdev *pdev,
 {
 	struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
 	enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
+	QDF_STATUS status;
 
 	switch (cur_state) {
 	case WLAN_ROAM_RSO_ENABLED:
@@ -4626,11 +4627,23 @@ cm_roam_switch_to_roam_sync(struct wlan_objmgr_pdev *pdev,
 					    WLAN_ROAM_SYNCH_IN_PROG);
 			break;
 		}
+
+		mlme_debug("ROAM: ROAM_SYNCH received in state: %d", cur_state);
 		/*
-		 * transition to WLAN_ROAM_SYNCH_IN_PROG not allowed otherwise
-		 * if we're already RSO stopped, fall through to return failure
-		 */
-		fallthrough;
+		* If ROAM SYNC come to host in below scenario:
+		* 1. HOST sends RSO stop command with scan mode 4, in order
+		*    to process supplicant disabled roaming request
+		* 2. FW already queued the roam sync event before RSO STOP
+		*    command receive from host
+		* In this case host should send RSO STOP with scan mode = 0
+		* to allow FW to move into RSO STOP state
+		*/
+		status = cm_roam_stop_req(psoc, vdev_id, REASON_ROAM_ABORT,
+					  NULL, false);
+		if (QDF_IS_STATUS_ERROR(status))
+			mlme_err("ROAM: Unable to process RSO STOP req");
+
+		return QDF_STATUS_E_FAILURE;
 	case WLAN_ROAM_INIT:
 	case WLAN_ROAM_DEINIT:
 	case WLAN_ROAM_SYNCH_IN_PROG: