diff --git a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c b/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c index 67a195f2cf..8c3789ec42 100644 --- a/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c +++ b/components/umac/mlme/connection_mgr/core/src/wlan_cm_vdev_connect.c @@ -1645,7 +1645,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev, cm_update_tid_mapping(vdev); } - mlo_roam_connect_complete(psoc, pdev, vdev, rsp); + mlo_roam_connect_complete(vdev); if (op_mode == QDF_STA_MODE && (wlan_vdev_mlme_is_mlo_link_vdev(vdev) || 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 fc6407d2fe..12968a03f3 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 @@ -33,6 +33,7 @@ #include "wni_api.h" #include "connection_mgr/core/src/wlan_cm_roam.h" #include +#include "wlan_mlo_mgr_roam.h" static void cm_abort_connect_request_timers(struct wlan_objmgr_vdev *vdev) { @@ -86,6 +87,11 @@ QDF_STATUS cm_disconnect_start_ind(struct wlan_objmgr_vdev *vdev, } cm_abort_connect_request_timers(vdev); + if (req->source != CM_MLO_ROAM_INTERNAL_DISCONNECT) { + mlme_debug("Free copied reassoc rsp"); + mlo_roam_free_copied_reassoc_rsp(vdev); + } + return QDF_STATUS_SUCCESS; } diff --git a/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h b/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h index 47ae138a9a..94f33d29de 100644 --- a/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h +++ b/components/umac/mlme/mlo_mgr/inc/wlan_mlo_mgr_roam.h @@ -291,19 +291,23 @@ mlo_roam_is_auth_status_connected(struct wlan_objmgr_psoc *psoc, /** * mlo_roam_connect_complete - roam connect complete api - * @psoc: psoc pointer - * @pdev: pdev pointer * @vdev: vdev pointer - * @rsp: connect rsp pointer * * This api will be called after connect complete for roam 1x case. * * Return: none */ -void mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc, - struct wlan_objmgr_pdev *pdev, - struct wlan_objmgr_vdev *vdev, - struct wlan_cm_connect_resp *rsp); +void mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev); + +/** + * mlo_roam_free_copied_reassoc_rsp - roam free copied reassoc rsp + * @vdev: vdev pointer + * + * This api will be called to free copied reassoc rsp. + * + * Return: none + */ +void mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev); #ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE /** @@ -499,10 +503,11 @@ mlo_roam_is_auth_status_connected(struct wlan_objmgr_psoc *psoc, } static inline void -mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc, - struct wlan_objmgr_pdev *pdev, - struct wlan_objmgr_vdev *vdev, - struct wlan_cm_connect_resp *rsp) +mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev) +{} + +static inline void +mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev) {} static inline QDF_STATUS diff --git a/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c b/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c index fa63829726..6ab20935ff 100644 --- a/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c +++ b/components/umac/mlme/mlo_mgr/src/wlan_mlo_mgr_roam.c @@ -294,9 +294,11 @@ QDF_STATUS mlo_cm_roam_sync_cb(struct wlan_objmgr_vdev *vdev, * 3. Roamed to AP with auth_status = ROAMED_AUTH_STATUS_CONNECTED */ if (sync_ind->num_setup_links < 2 || - sync_ind->auth_status == ROAM_AUTH_STATUS_CONNECTED) + sync_ind->auth_status == ROAM_AUTH_STATUS_CONNECTED) { + mlme_debug("Roam auth status %d", sync_ind->auth_status); mlo_update_vdev_after_roam(psoc, vdev_id, sync_ind->num_setup_links); + } /* If EAPOL is offloaded to supplicant, link vdev/s are not up * at FW, in that case complete roam sync on assoc vdev @@ -1109,10 +1111,26 @@ mlo_roam_prepare_and_send_link_connect_req(struct wlan_objmgr_vdev *assoc_vdev, return status; } -void mlo_roam_connect_complete(struct wlan_objmgr_psoc *psoc, - struct wlan_objmgr_pdev *pdev, - struct wlan_objmgr_vdev *vdev, - struct wlan_cm_connect_resp *rsp) +void mlo_roam_free_copied_reassoc_rsp(struct wlan_objmgr_vdev *vdev) +{ + struct wlan_mlo_sta *sta_ctx; + + if (!vdev) + return; + + if (!vdev->mlo_dev_ctx) + return; + + sta_ctx = vdev->mlo_dev_ctx->sta_ctx; + if (!sta_ctx || !sta_ctx->copied_reassoc_rsp || + !sta_ctx->copied_reassoc_rsp->roaming_info) + return; + + mlo_roam_free_connect_rsp(sta_ctx->copied_reassoc_rsp); + sta_ctx->copied_reassoc_rsp = NULL; +} + +void mlo_roam_connect_complete(struct wlan_objmgr_vdev *vdev) { struct wlan_mlo_sta *sta_ctx; uint8_t auth_status;