Browse Source

qcacld-3.0: Defer SB disconnect if link switch in progress

Link switch request received on assoc VDEV(V0) and to process it
MLO manager will change this to link VDEV and another VDEV(V1) to
assoc VDEV. If AP sends deauth while link switch is in progress
then it will gets serialized first on partner VDEV (V0 - which is
the VDEV on which link switch is in progress) and then on
assoc VDEV(V1).

Upon link switch completion MLO manager will restore the VDEV
flags to original state and disconnect queued to serialization
will be activated and it first processes assoc VDEV(V0) as
when it is queued to serialization flags are not restored.

As part of disconnect complete on assoc VDEV(V0) kernel is notified
and this leads to framework sending set MAC address. Though assoc
VDEV(V0) is disconnected, partner VDEV (V1) is still not in INIT
state. So sending set MAC address while in non-INIT state will lead
to FW assert.

Defer any SB disconnects while link switch in progress, MLO manager
will queue these disconnects when link switch is completed and flags
are properly restored so that assoc VDEV is not serialized first.

Change-Id: Idd8afbdc74177eda429256b4761512e0d1caa949
CRs-Fixed: 3601964
Vinod Kumar Pirla 1 year ago
parent
commit
46288c20e1

+ 10 - 3
components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c

@@ -36,6 +36,7 @@
 #include "wlan_mlo_mgr_roam.h"
 #include "wlan_t2lm_api.h"
 #include "wlan_mlo_link_force.h"
+#include <wlan_mlo_mgr_public_api.h>
 
 static void cm_abort_connect_request_timers(struct wlan_objmgr_vdev *vdev)
 {
@@ -326,9 +327,15 @@ QDF_STATUS cm_send_sb_disconnect_req(struct scheduler_msg *msg)
 		return QDF_STATUS_E_INVAL;
 	}
 
-	status = mlo_disconnect(vdev, ind->disconnect_param.source,
-				ind->disconnect_param.reason_code,
-				&ind->disconnect_param.bssid);
+	status = wlan_mlo_mgr_link_switch_defer_disconnect_req(vdev,
+							       ind->disconnect_param.source,
+							       ind->disconnect_param.reason_code);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		status = mlo_disconnect(vdev, ind->disconnect_param.source,
+					ind->disconnect_param.reason_code,
+					&ind->disconnect_param.bssid);
+	}
+
 	qdf_mem_free(ind);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_MLME_CM_ID);