From 46288c20e110abe22ca68778b68cf62f6ca11257 Mon Sep 17 00:00:00 2001 From: Vinod Kumar Pirla Date: Wed, 6 Sep 2023 05:28:48 -0700 Subject: [PATCH] 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 --- .../core/src/wlan_cm_vdev_disconnect.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c index 24cfdcac76..88088bb586 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_disconnect.c +++ b/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 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);