Parcourir la source

qcacld-3.0: Wait HO_FAIL event when roam sync failed

Host received deauth and roam sync back-to-back after WoW, sent vdev
RSO_DISABLE before RSO_STATUS event, F/W assert.
1. Host received deauth event, limSmeState went out of link est state, sent
async event of cm_send_sb_disconnect_req.
2. Host received and handled roam_sync, CM_RSO: vdev0:
[ROAM_RSO_ENABLED(2)] --> [ROAM_SYNCH_IN_PROG(5)], roam sync failed since
not in link est state.
3. Host aborted roaming, ent back to CM-VDEV-0: CONNECTED, removed roaming
cmd from serialization queue.
4. Host sent RSO stop to F/W.
5. Host handled cm_send_sb_disconnect_req, dropped RSO stop during roam
sync, called cm_disconnect_continue_after_rso_stop without waiting for
RSO_STATUS event.
6. Host sent vdev RSO_DISABLE and vdev stop before received RSO_STATUS
event, F/W asserted.

To fix it, if host roam sync failed, need wait for HO_FAIL event and handle
it before handling other cmd, can't remove roaming cmd from assoc vdev
serialization queue to unblock other pending cmd before handling
HO_FAIL, just send assoc link RSO stop to F/W one time with
REASON_ROAM_SYNCH_FAILED, then wait for 2 events: FW_ROAM_EVT RSO status
and HO_FAIL. then handle HO_FAIL, at last remove roaming cmd, unblock other
cmd and trigger disconnect.

Change-Id: I03dd3ed21007ee67613c2d90b5567348c240f375
CRs-Fixed: 3445233
Jianmin Zhu il y a 2 ans
Parent
commit
9228383500

+ 1 - 13
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_fw_sync.c

@@ -79,7 +79,6 @@ QDF_STATUS cm_fw_roam_sync_req(struct wlan_objmgr_psoc *psoc, uint8_t vdev_id,
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("Roam sync was not handled");
-		cm_fw_roam_abort_req(psoc, vdev_id);
 		cm_roam_stop_req(psoc, vdev_id, REASON_ROAM_SYNCH_FAILED,
 				 NULL, false);
 	}
@@ -121,14 +120,7 @@ cm_fw_send_vdev_roam_event(struct cnx_mgr *cm_ctx, uint16_t data_len,
 					       data_len,
 					       data);
 
-	if (QDF_IS_STATUS_ERROR(status))
-		cm_roam_stop_req(psoc, roam_req->req.vdev_id,
-				 REASON_ROAM_SYNCH_FAILED,
-				 NULL, false);
-
 error:
-	if (QDF_IS_STATUS_ERROR(status))
-		cm_abort_fw_roam(cm_ctx, cm_id);
 
 	return status;
 }
@@ -1034,12 +1026,8 @@ error:
 	if (rsp)
 		wlan_cm_free_connect_rsp(rsp);
 
-	if (QDF_IS_STATUS_ERROR(status)) {
-		cm_roam_stop_req(psoc, vdev_id, REASON_ROAM_SYNCH_FAILED,
-				 NULL, false);
-		cm_abort_fw_roam(cm_ctx, cm_id);
+	if (QDF_IS_STATUS_ERROR(status))
 		mlo_update_connected_links(vdev, 0);
-	}
 rel_ref:
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_SB_ID);
 

+ 3 - 11
components/umac/mlme/connection_mgr/core/src/wlan_cm_roam_offload_event.c

@@ -584,19 +584,11 @@ QDF_STATUS cm_roam_sync_event_handler_cb(struct wlan_objmgr_vdev *vdev,
 	 */
 	cm_update_phymode_on_roam(vdev_id,
 				  sync_ind);
-	cm_fw_roam_sync_propagation(psoc,
-				    vdev_id,
-				    sync_ind);
+	status = cm_fw_roam_sync_propagation(psoc,
+					     vdev_id,
+					     sync_ind);
 
 err:
-	if (QDF_IS_STATUS_ERROR(status)) {
-		wlan_mlo_roam_abort_on_link(psoc, event,
-					    sync_ind->roamed_vdev_id);
-		cm_fw_roam_abort_req(psoc, sync_ind->roamed_vdev_id);
-		cm_roam_stop_req(psoc, sync_ind->roamed_vdev_id,
-				 REASON_ROAM_SYNCH_FAILED,
-				 NULL, false);
-	}
 	return status;
 }
 

+ 1 - 4
components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c

@@ -162,10 +162,7 @@ mlo_roam_abort_req(struct wlan_objmgr_psoc *psoc,
 		return QDF_STATUS_E_NULL_VALUE;
 	}
 
-	wlan_mlo_roam_abort_on_link(psoc, event, vdev_id);
-	cm_roam_stop_req(psoc, sync_ind->roamed_vdev_id,
-			 REASON_ROAM_SYNCH_FAILED,
-			 NULL, false);
+	wlan_mlo_roam_abort_on_link(psoc, event, sync_ind->roamed_vdev_id);
 
 	return QDF_STATUS_SUCCESS;
 }

+ 0 - 1
components/wmi/src/wmi_unified_roam_tlv.c

@@ -2661,7 +2661,6 @@ end:
 abort_roam:
 	if (QDF_IS_STATUS_ERROR(status)) {
 		wmi_err("%d Failed to extract roam sync ind", status);
-		wlan_cm_fw_roam_abort_req(psoc, synch_event->vdev_id);
 		wlan_cm_roam_stop_req(psoc, synch_event->vdev_id,
 				      REASON_ROAM_SYNCH_FAILED);
 	}