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 f4d2cbd808..d06a816fa5 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 @@ -1,6 +1,6 @@ /* * Copyright (c) 2012-2015, 2020-2021, The Linux Foundation. All rights reserved. - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -35,6 +35,7 @@ #include "cfg_ucfg_api.h" #include "wlan_roam_debug.h" #include "wlan_mlo_mgr_sta.h" +#include "wlan_mlo_mgr_roam.h" #ifdef WLAN_FEATURE_FILS_SK void cm_update_hlp_info(struct wlan_objmgr_vdev *vdev, @@ -1377,7 +1378,8 @@ static void cm_process_connect_complete(struct wlan_objmgr_psoc *psoc, QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP_104) || QDF_HAS_PARAM(ucast_cipher, WLAN_CRYPTO_CIPHER_WEP))) { cm_csr_set_ss_none(vdev_id); - cm_roam_start_init_on_connect(pdev, vdev_id); + if (!wlan_vdev_mlme_is_mlo_vdev(vdev)) + cm_roam_start_init_on_connect(pdev, vdev_id); } else { if (rsp->is_wps_connection) key_interval = @@ -1398,6 +1400,7 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev, struct wlan_objmgr_pdev *pdev; struct wlan_objmgr_psoc *psoc; enum QDF_OPMODE op_mode; + QDF_STATUS status; if (!vdev || !rsp) { mlme_err("vdev or rsp is NULL"); @@ -1435,10 +1438,15 @@ cm_connect_complete_ind(struct wlan_objmgr_vdev *vdev, wlan_p2p_status_connect(vdev); } - if (op_mode == QDF_STA_MODE) + if (op_mode == QDF_STA_MODE && + !wlan_vdev_mlme_is_mlo_vdev(vdev)) wlan_cm_roam_state_change(pdev, vdev_id, WLAN_ROAM_INIT, REASON_CONNECT); + status = mlo_enable_rso(pdev, vdev); + if (QDF_IS_STATUS_ERROR(status)) + return status; + 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 3517c31230..fdea5272b5 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -88,6 +88,19 @@ mlo_get_sta_link_mac_addr(uint8_t vdev_id, bool is_multi_link_roam(struct roam_offload_synch_ind *sync_ind); +/** + * mlo_enable_rso - Enable rso on assoc vdev + * + * @pdev: pdev pointer + * @vdev: assoc vdev pointer + * + * This api will be called to enable RSO for MLO connection. + * + * Return: qdf_status success or fail + */ +QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev); + #else static inline QDF_STATUS mlo_get_sta_link_mac_addr(uint8_t vdev_id, @@ -103,5 +116,11 @@ is_multi_link_roam(struct roam_offload_synch_ind *sync_ind) return false; } +static inline +QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev) +{ + return QDF_STATUS_SUCCESS; +} #endif /* WLAN_FEATURE_11BE_MLO */ #endif 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 8bea65fba6..fb525ffa0a 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -69,3 +69,23 @@ bool is_multi_link_roam(struct roam_offload_synch_ind *sync_ind) return false; } + +QDF_STATUS mlo_enable_rso(struct wlan_objmgr_pdev *pdev, + struct wlan_objmgr_vdev *vdev) +{ + struct wlan_objmgr_vdev *assoc_vdev; + + if (wlan_vdev_mlme_is_mlo_link_vdev(vdev)) { + assoc_vdev = wlan_mlo_get_assoc_link_vdev(vdev); + if (!assoc_vdev) { + mlo_err("Assoc vdev is null"); + return QDF_STATUS_E_NULL_VALUE; + } + + cm_roam_start_init_on_connect(pdev, + wlan_vdev_get_id(assoc_vdev)); + } + + return QDF_STATUS_SUCCESS; +} + diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c index 728a535531..d87533436f 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -4120,7 +4120,8 @@ csr_roam_chk_lnk_set_ctx_rsp(struct mac_context *mac_ctx, tSirSmeRsp *msg_ptr) csr_roam_substate_change(mac_ctx, eCSR_ROAM_SUBSTATE_NONE, sessionId); cm_stop_wait_for_key_timer(mac_ctx->psoc, sessionId); - cm_roam_start_init_on_connect(mac_ctx->pdev, sessionId); + if (!wlan_vdev_mlme_get_is_mlo_vdev(mac_ctx->psoc, sessionId)) + cm_roam_start_init_on_connect(mac_ctx->pdev, sessionId); } if (eSIR_SME_SUCCESS == pRsp->status_code) { qdf_copy_macaddr(&roam_info->peerMac, &pRsp->peer_macaddr);