diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h index bb52482fba78..e421312b911b 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -3959,6 +3959,7 @@ typedef struct sSirSmeRoamOffloadSynchInd { tpSirSmeJoinRsp join_rsp; uint16_t aid; struct sir_hw_mode_trans_ind hw_mode_trans_ind; + uint8_t nss; } roam_offload_synch_ind; #ifdef WLAN_FEATURE_ROAM_OFFLOAD diff --git a/core/mac/src/pe/lim/lim_api.c b/core/mac/src/pe/lim/lim_api.c index d4ecf2830595..0987902b891e 100644 --- a/core/mac/src/pe/lim/lim_api.c +++ b/core/mac/src/pe/lim/lim_api.c @@ -2031,7 +2031,6 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx, tpDphHashNode curr_sta_ds; uint16_t aid; tpAddBssParams add_bss_params; - uint8_t local_nss; QDF_STATUS status = QDF_STATUS_E_FAILURE; uint16_t join_rsp_len; @@ -2088,6 +2087,14 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx, ft_session_ptr->csaOffloadEnable = session_ptr->csaOffloadEnable; lim_fill_ft_session(mac_ctx, bss_desc, ft_session_ptr, session_ptr); + + if (IS_5G_CH(ft_session_ptr->currentOperChannel)) + ft_session_ptr->vdev_nss = mac_ctx->vdev_type_nss_5g.sta; + else + ft_session_ptr->vdev_nss = mac_ctx->vdev_type_nss_2g.sta; + + ft_session_ptr->nss = ft_session_ptr->vdev_nss; + lim_ft_prepare_add_bss_req(mac_ctx, false, ft_session_ptr, bss_desc); roam_sync_ind_ptr->add_bss_params = (tpAddBssParams) ft_session_ptr->ftPEContext.pAddBssReq; @@ -2100,14 +2107,12 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx, ft_session_ptr->bRoamSynchInProgress = false; return status; } - local_nss = curr_sta_ds->nss; session_ptr->limSmeState = eLIM_SME_IDLE_STATE; lim_cleanup_rx_path(mac_ctx, curr_sta_ds, session_ptr); lim_delete_dph_hash_entry(mac_ctx, curr_sta_ds->staAddr, aid, session_ptr); pe_delete_session(mac_ctx, session_ptr); session_ptr = NULL; - ft_session_ptr->nss = local_nss; curr_sta_ds = dph_add_hash_entry(mac_ctx, roam_sync_ind_ptr->bssid.bytes, DPH_STA_HASH_INDEX_PEER, &ft_session_ptr->dph.dphHashTable); @@ -2152,7 +2157,8 @@ QDF_STATUS pe_roam_synch_callback(tpAniSirGlobal mac_ctx, roam_sync_ind_ptr->aid = ft_session_ptr->limAID; curr_sta_ds->mlmStaContext.mlmState = eLIM_MLM_LINK_ESTABLISHED_STATE; - curr_sta_ds->nss = local_nss; + curr_sta_ds->nss = ft_session_ptr->nss; + roam_sync_ind_ptr->nss = ft_session_ptr->nss; ft_session_ptr->limMlmState = eLIM_MLM_LINK_ESTABLISHED_STATE; lim_init_tdls_data(mac_ctx, ft_session_ptr); join_rsp_len = ft_session_ptr->RICDataLen + diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c index 684770ed9aaf..a38bcd5df4da 100644 --- a/core/mac/src/pe/lim/lim_assoc_utils.c +++ b/core/mac/src/pe/lim/lim_assoc_utils.c @@ -1762,9 +1762,19 @@ lim_populate_peer_rate_set(tpAniSirGlobal pMac, } lim_populate_vht_mcs_set(pMac, pRates, pVHTCaps, psessionEntry, psessionEntry->nss); + lim_populate_he_mcs_set(pMac, pRates, he_caps, psessionEntry, psessionEntry->nss); + if (IS_DOT11_MODE_HE(psessionEntry->dot11mode)) { + psessionEntry->nss = he_caps->nss_supported; + } else if (IS_DOT11_MODE_VHT(psessionEntry->dot11mode)) { + if ((pRates->vhtRxMCSMap & MCSMAPMASK2x2) == MCSMAPMASK2x2) + psessionEntry->nss = NSS_1x1_MODE; + } else if (pRates->supportedMCSSet[1] == 0) { + psessionEntry->nss = NSS_1x1_MODE; + } + return eSIR_SUCCESS; } /*** lim_populate_peer_rate_set() ***/ diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c index 3236274ee648..de3cc289f921 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2243,6 +2243,8 @@ static void wma_roam_update_vdev(tp_wma_handle wma, tAddStaParams *add_sta_params; uint8_t vdev_id; + vdev_id = roam_synch_ind_ptr->roamedVdevId; + wma->interfaces[vdev_id].nss = roam_synch_ind_ptr->nss; del_bss_params = qdf_mem_malloc(sizeof(*del_bss_params)); del_sta_params = qdf_mem_malloc(sizeof(*del_sta_params)); set_link_params = qdf_mem_malloc(sizeof(*set_link_params)); @@ -2252,7 +2254,6 @@ static void wma_roam_update_vdev(tp_wma_handle wma, WMA_LOGE("%s: failed to allocate memory", __func__); return; } - vdev_id = roam_synch_ind_ptr->roamedVdevId; qdf_mem_zero(del_bss_params, sizeof(*del_bss_params)); qdf_mem_zero(del_sta_params, sizeof(*del_sta_params)); qdf_mem_zero(set_link_params, sizeof(*set_link_params)); @@ -2385,6 +2386,7 @@ int wma_roam_synch_event_handler(void *handle, uint8_t *event, status = -EBUSY; goto cleanup_label; } + wma_roam_update_vdev(wma, roam_synch_ind_ptr); wma->csr_roam_synch_cb((tpAniSirGlobal)wma->mac_context, roam_synch_ind_ptr, bss_desc_ptr, SIR_ROAM_SYNCH_PROPAGATION);