diff --git a/os_if/linux/mlme/src/osif_cm_connect_rsp.c b/os_if/linux/mlme/src/osif_cm_connect_rsp.c index f1f768f18c..6a6d3da17e 100644 --- a/os_if/linux/mlme/src/osif_cm_connect_rsp.c +++ b/os_if/linux/mlme/src/osif_cm_connect_rsp.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 @@ -380,6 +380,24 @@ osif_populate_fils_params(struct cfg80211_connect_resp_params *rsp_params, #endif #if defined(CFG80211_IFTYPE_MLO_LINK_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO) +#ifdef WLAN_FEATURE_11BE_MLO_ADV_FEATURE +static struct wlan_objmgr_vdev *osif_get_partner_vdev( + struct wlan_objmgr_vdev *vdev, + struct mlo_link_info rsp_partner_info) +{ + return wlan_objmgr_get_vdev_by_id_from_pdev( + vdev->vdev_objmgr.wlan_pdev, + rsp_partner_info.vdev_id, + WLAN_MLO_MGR_ID); +} +#else +static struct wlan_objmgr_vdev *osif_get_partner_vdev( + struct wlan_objmgr_vdev *vdev, + struct mlo_link_info rsp_partner_info) +{ + return mlo_get_vdev_by_link_id(vdev, rsp_partner_info.link_id); +} +#endif static void osif_fill_connect_resp_mlo_params( struct wlan_objmgr_vdev *vdev, struct wlan_cm_connect_resp *rsp, @@ -431,15 +449,16 @@ static void osif_fill_connect_resp_mlo_params( if (i == rsp->ml_parnter_info.num_partner_links) break; - ml_vdev = mlo_get_vdev_by_link_id( - ml_vdev, rsp_partner_info[i].link_id); + ml_vdev = osif_get_partner_vdev(vdev, + rsp_partner_info[i]); if (ml_vdev) { osif_priv = wlan_vdev_get_ospriv(ml_vdev); wlan_objmgr_vdev_release_ref(ml_vdev, WLAN_MLO_MGR_ID); } else { - osif_err("Partner vdev not found"); + osif_err("Partner vdev not found with vdev_id:%d", + rsp_partner_info[i].vdev_id); goto end; } } diff --git a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h index 9b0d9d0ac6..f7499a7ab9 100644 --- a/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h +++ b/umac/mlo_mgr/inc/wlan_mlo_mgr_public_structs.h @@ -421,6 +421,7 @@ struct wlan_mlo_peer_context { * @link_id: link index * @chan_freq: Operating channel frequency * @nawds_config: peer's NAWDS configurarion + * @vdev_id: VDEV ID */ struct mlo_link_info { struct qdf_mac_addr link_addr; @@ -429,6 +430,7 @@ struct mlo_link_info { #ifdef UMAC_SUPPORT_MLNAWDS struct mlnawds_config nawds_config; #endif + uint8_t vdev_id; }; /* diff --git a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c index 6b014f4e24..4f290b03da 100644 --- a/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c +++ b/umac/mlo_mgr/src/wlan_mlo_mgr_sta.c @@ -507,7 +507,7 @@ static void mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, struct wlan_mlo_dev_context *mlo_dev_ctx, struct element_info *assoc_rsp, - struct mlo_partner_info ml_parnter_info) + struct mlo_partner_info *ml_parnter_info) { /* Create the secondary interface, Send keys if the last link */ uint8_t i, partner_idx = 0; @@ -518,7 +518,7 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, vdev, ssid.ssid, &ssid.length); - if (!ml_parnter_info.num_partner_links) { + if (!ml_parnter_info->num_partner_links) { mlo_err("No patner info in connect resp"); return; } @@ -535,12 +535,14 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, wlan_vdev_mlme_feat_ext2_cap_set(mlo_dev_ctx->wlan_vdev_list[i], WLAN_VDEV_FEXT2_MLO_STA_LINK); wlan_vdev_set_link_id( - mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info.partner_link_info[partner_idx].link_id); + mlo_dev_ctx->wlan_vdev_list[i], + ml_parnter_info->partner_link_info[partner_idx].link_id); + ml_parnter_info->partner_link_info[partner_idx].vdev_id = + wlan_vdev_get_id(mlo_dev_ctx->wlan_vdev_list[i]); mlo_prepare_and_send_connect( mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info, - ml_parnter_info.partner_link_info[partner_idx], + *ml_parnter_info, + ml_parnter_info->partner_link_info[partner_idx], ssid); partner_idx++; } @@ -550,13 +552,13 @@ static void mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, struct wlan_mlo_dev_context *mlo_dev_ctx, struct element_info *assoc_rsp, - struct mlo_partner_info ml_parnter_info) + struct mlo_partner_info *ml_parnter_info) { struct wlan_ssid ssid = {0}; uint8_t i = 0; uint8_t j = 0; - if (!ml_parnter_info.num_partner_links) { + if (!ml_parnter_info->num_partner_links) { mlo_err("No patner info in connect resp"); return; } @@ -573,19 +575,19 @@ mlo_send_link_connect(struct wlan_objmgr_vdev *vdev, if (qdf_test_bit(i, mlo_dev_ctx->sta_ctx->wlan_connected_links)) { if (wlan_cm_is_vdev_disconnected( mlo_dev_ctx->wlan_vdev_list[i])) { - for (j = 0; j < ml_parnter_info.num_partner_links; j++) { + for (j = 0; j < ml_parnter_info->num_partner_links; j++) { if (mlo_dev_ctx->wlan_vdev_list[i]->vdev_mlme.mlo_link_id == - ml_parnter_info.partner_link_info[j].link_id) + ml_parnter_info->partner_link_info[j].link_id) break; } - if (j < ml_parnter_info.num_partner_links) { + if (j < ml_parnter_info->num_partner_links) { wlan_vdev_mlme_get_ssid( vdev, ssid.ssid, &ssid.length); mlo_prepare_and_send_connect( mlo_dev_ctx->wlan_vdev_list[i], - ml_parnter_info, - ml_parnter_info.partner_link_info[j], + *ml_parnter_info, + ml_parnter_info->partner_link_info[j], ssid); } mlo_dev_lock_release(mlo_dev_ctx); @@ -773,7 +775,7 @@ void mlo_sta_link_connect_notify(struct wlan_objmgr_vdev *vdev, } mlo_send_link_connect(vdev, mlo_dev_ctx, &rsp->connect_ies.assoc_rsp, - rsp->ml_parnter_info); + &rsp->ml_parnter_info); } }