Ver Fonte

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
Naveen Rawat há 7 anos atrás
pai
commit
746a90b284

+ 1 - 0
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

+ 10 - 4
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 +

+ 10 - 0
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() ***/
 

+ 3 - 1
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);