qcacld-3.0: Initialize NSS to vdev_nss in roam_sync propagation

In roam sync propagation, initialise pe_session NSS to vdev_nss, which
will then later be updated as per ASSOC response frame received from
firmware. This allows roaming from 1x1 to 2x2.

Change-Id: I5260425c7bfdfaa09bac908ea7d8a89d5caa3f69
CRs-Fixed: 2058560
This commit is contained in:
Naveen Rawat 2017-06-07 15:16:35 -07:00 • committed by snandini
commit 746a90b284
4 changed files with 24 additions and 5 deletions

View file

@ -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

View file

@ -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 +

View file

@ -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() ***/

View file

@ -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);