Browse Source

qcacmn: Handle ho failure for STA + STA roaming

Currently for STA + STA case, consider the below scenario:
1. Roam start received on vdev 2 & vdev 0. Vdev 2 roam
   serialization command becomes active and vdev 0 roam
   command is on the pending queue.
2. HO failure with AP0 received on vdev 2. This dequeues
   the vdev2 roam serialization command. Vdev0 roam command
   becomes active.
3. Roam synch indication received on vdev0 with peer AP as
   AP0 (which is the peer on vdev 2). So duplicate detection
   logic prevents same peer creation, so roam synch fails but
   its not indicated properly to firmware. This leads to
   disconnection of both the STAs.

To address the issue, first enqueue disconnect with high
priority set before removing roam command from serialization
so disconnect gets activated if roam was active for the
vdev.
Also while processing roam synch indication, check if peer is
found on different STA and send roam stop to fw so fw also
cleans up and initiates HO failure.

Change-Id: I379c03138b70580f44c2b96489ada030ec6fc20e
CRs-Fixed: 3686660
Asutosh Mohapatra 1 year ago
parent
commit
f4b53caa2a
1 changed files with 14 additions and 2 deletions
  1. 14 2
      umac/mlme/connection_mgr/core/src/wlan_cm_disconnect.c

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

@@ -231,6 +231,12 @@ static QDF_STATUS cm_ser_disconnect_req(struct wlan_objmgr_pdev *pdev,
 	cmd.cmd_cb = cm_ser_disconnect_cb;
 	cmd.source = WLAN_UMAC_COMP_MLME;
 	cmd.is_high_priority = false;
+	/* Set high priority if queueing disconnect as part of
+	 * ho failure
+	 */
+	if (req->req.reason_code == REASON_FW_TRIGGERED_ROAM_FAILURE &&
+	    req->req.source == CM_MLME_DISCONNECT)
+		cmd.is_high_priority = true;
 	cmd.cmd_timeout_duration = DISCONNECT_TIMEOUT;
 	cmd.vdev = cm_ctx->vdev;
 	cmd.is_blocking = cm_ser_get_blocking_cmd();
@@ -723,8 +729,14 @@ cm_handle_discon_req_in_non_connected_state(struct cnx_mgr *cm_ctx,
 						 true);
 		break;
 	case WLAN_CM_S_ROAMING:
-		/* for FW roam/LFR3 remove the req from the list */
-		if (cm_roam_offload_enabled(wlan_vdev_get_psoc(cm_ctx->vdev)))
+		/* for FW roam/LFR3 remove the req from the list but
+		 * for ho failure don't flush pending requests as disconnect
+		 * should be queued in serialization queue before
+		 * dequeueing roam.
+		 */
+		if (cm_roam_offload_enabled(wlan_vdev_get_psoc(cm_ctx->vdev)) &&
+		    !(cm_req->req.source == CM_MLME_DISCONNECT &&
+		      cm_req->req.reason_code == REASON_FW_TRIGGERED_ROAM_FAILURE))
 			cm_flush_pending_request(cm_ctx, ROAM_REQ_PREFIX,
 						 false);
 		fallthrough;