diff --git a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c index 25e34b5462..21e7eb4c48 100644 --- a/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c +++ b/umac/mlme/connection_mgr/core/src/wlan_cm_connect.c @@ -2090,6 +2090,64 @@ cm_resume_connect_after_peer_create(struct cnx_mgr *cm_ctx, wlan_cm_id *cm_id) return status; } +#if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_FEATURE_11BE_MLO_ADV_FEATURE) +static void cm_inform_bcn_probe_handler(struct cnx_mgr *cm_ctx, + struct scan_cache_entry *bss, + wlan_cm_id cm_id) +{ + struct element_info *bcn_probe_rsp; + int32_t rssi; + qdf_freq_t freq; + + bcn_probe_rsp = &bss->raw_frame; + rssi = bss->rssi_raw; + freq = util_scan_entry_channel_frequency(bss); + + cm_inform_bcn_probe(cm_ctx, bcn_probe_rsp->ptr, bcn_probe_rsp->len, + freq, rssi, cm_id); +} + +static void cm_update_partner_link_scan_db(struct cnx_mgr *cm_ctx, + wlan_cm_id cm_id, + qdf_list_t *candidate_list, + struct scan_cache_entry *cur_bss) +{ + qdf_list_node_t *cur_node = NULL, *next_node = NULL; + struct scan_cache_node *candidate; + struct scan_cache_entry *bss; + + qdf_list_peek_front(candidate_list, &cur_node); + + while (cur_node) { + qdf_list_peek_next(candidate_list, cur_node, &next_node); + candidate = qdf_container_of(cur_node, struct scan_cache_node, + node); + bss = candidate->entry; + /* + * If BSS is ML and not current bss and BSS mld mac is same as + * cur bss then inform it to scan cache to avoid scan cache + * ageing out. + */ + if (!qdf_is_macaddr_equal(&bss->bssid, &cur_bss->bssid) && + bss->ml_info.num_links && + cur_bss->ml_info.num_links && + qdf_is_macaddr_equal(&bss->ml_info.mld_mac_addr, + &cur_bss->ml_info.mld_mac_addr)) + cm_inform_bcn_probe_handler(cm_ctx, bss, cm_id); + cur_node = next_node; + next_node = NULL; + } +} +#else +static +inline void cm_update_partner_link_scan_db(struct cnx_mgr *cm_ctx, + wlan_cm_id cm_id, + qdf_list_t *candidate_list, + struct scan_cache_entry *cur_bss) +{ +} +#endif + /** * cm_update_scan_db_on_connect_success() - update scan db with beacon or * probe resp @@ -2141,6 +2199,15 @@ cm_update_scan_db_on_connect_success(struct cnx_mgr *cm_ctx, cm_inform_bcn_probe(cm_ctx, bcn_probe_rsp->ptr, bcn_probe_rsp->len, resp->freq, rssi, resp->cm_id); + + /* + * If vdev is an MLO vdev and not reassoc then use partner link info to + * inform partner link scan entry to kernel. + */ + if (!resp->is_reassoc && wlan_vdev_mlme_is_mlo_vdev(cm_ctx->vdev)) + cm_update_partner_link_scan_db(cm_ctx, resp->cm_id, + cm_req->connect_req.candidate_list, + cur_candidate->entry); } #ifdef WLAN_FEATURE_11BE_MLO