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
This commit is contained in:
Abhinav Kumar
2024-05-15 02:58:06 -07:00
committed by Ravindra Konda
parent 200d4d359b
commit f1b52bf46a

View File

@@ -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); struct wlan_objmgr_psoc *psoc = wlan_pdev_get_psoc(pdev);
enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id); enum roam_offload_state cur_state = mlme_get_roam_state(psoc, vdev_id);
QDF_STATUS status;
switch (cur_state) { switch (cur_state) {
case WLAN_ROAM_RSO_ENABLED: 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); WLAN_ROAM_SYNCH_IN_PROG);
break; break;
} }
mlme_debug("ROAM: ROAM_SYNCH received in state: %d", cur_state);
/* /*
* transition to WLAN_ROAM_SYNCH_IN_PROG not allowed otherwise * If ROAM SYNC come to host in below scenario:
* if we're already RSO stopped, fall through to return failure * 1. HOST sends RSO stop command with scan mode 4, in order
*/ * to process supplicant disabled roaming request
fallthrough; * 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_INIT:
case WLAN_ROAM_DEINIT: case WLAN_ROAM_DEINIT:
case WLAN_ROAM_SYNCH_IN_PROG: case WLAN_ROAM_SYNCH_IN_PROG: