qcacld-3.0: Sessionize VHT Capability

Sessionize VHT Capability by updating the session
entry at join request or start bss and read the same
capablities at LIM instead of reading from global VHT
CFG items.

Following CFG items are taken care as part of this change.
WNI_CFG_VHT_SU_BEAMFORMER_CAP,
WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
WNI_CFG_VHT_CSN_BEAMFORMEE_ANT_SUPPORTED,
WNI_CFG_VHT_MU_BEAMFORMER_CAP,
WNI_CFG_VHT_MU_BEAMFORMEE_CAP

Change-Id: I7c33de1180416db0027b4690170060549847dd9a
CRs-Fixed: 1029145
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 5582524..2aa2318 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -653,8 +653,6 @@
 	uint8_t center_freq_seg0;
 	uint8_t center_freq_seg1;
 	uint8_t sec_ch_offset;
-	bool txbf_ini_enabled;
-	uint8_t txbf_csn_val;
 
 	uint8_t privacy;
 	uint8_t apUapsdEnable;
@@ -1140,9 +1138,6 @@
 	uint8_t txLdpcIniFeatureEnabled;
 	tSirHTConfig htConfig;
 	struct sir_vht_config vht_config;
-	uint8_t txBFIniFeatureEnabled;
-	uint8_t txBFCsnValue;
-	uint8_t txMuBformee;
 	uint8_t enableVhtpAid;
 	uint8_t enableVhtGid;
 	uint8_t enableAmpduPs;
diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h
index 2bc7246..407c6b1 100644
--- a/core/mac/src/pe/include/lim_session.h
+++ b/core/mac/src/pe/include/lim_session.h
@@ -314,12 +314,8 @@
 	uint8_t ch_center_freq_seg0;
 	enum phy_ch_width ch_width;
 	uint8_t ch_center_freq_seg1;
-	uint8_t txBFIniFeatureEnabled;
-	uint8_t txbf_csn_value;
-	uint8_t txMuBformee;
 	uint8_t enableVhtpAid;
 	uint8_t enableVhtGid;
-	uint8_t enable_su_tx_bformer;
 	tLimWiderBWChannelSwitchInfo gLimWiderBWChannelSwitch;
 	uint8_t enableAmpduPs;
 	uint8_t enableHtSmps;
diff --git a/core/mac/src/pe/lim/lim_assoc_utils.c b/core/mac/src/pe/lim/lim_assoc_utils.c
index e26a2e9..6ec3e19 100644
--- a/core/mac/src/pe/lim/lim_assoc_utils.c
+++ b/core/mac/src/pe/lim/lim_assoc_utils.c
@@ -2269,12 +2269,12 @@
 #ifdef FEATURE_WLAN_TDLS
 			((STA_ENTRY_PEER == sta_ds->staType)
 			 || (STA_ENTRY_TDLS_PEER == sta_ds->staType)) ?
-					 sta_ds->vhtBeamFormerCapable :
-					 session_entry->txBFIniFeatureEnabled;
+				 sta_ds->vhtBeamFormerCapable :
+				 session_entry->vht_config.su_beam_formee;
 #else
 			(STA_ENTRY_PEER == sta_ds->staType) ?
-					 sta_ds->vhtBeamFormerCapable :
-					 session_entry->txBFIniFeatureEnabled;
+				 sta_ds->vhtBeamFormerCapable :
+				 session_entry->vht_config.su_beam_formee;
 #endif
 		add_sta_params->enable_su_tx_bformer =
 			sta_ds->vht_su_bfee_capable;
@@ -2793,9 +2793,10 @@
 		lim_log(pMac, LOG1, FL("VHT WIDTH SET %d"),
 			pAddStaParams->ch_width);
 	}
-	pAddStaParams->vhtTxBFCapable = psessionEntry->txBFIniFeatureEnabled;
+	pAddStaParams->vhtTxBFCapable =
+		psessionEntry->vht_config.su_beam_formee;
 	pAddStaParams->enable_su_tx_bformer =
-		psessionEntry->enable_su_tx_bformer;
+		psessionEntry->vht_config.su_beam_former;
 	lim_log(pMac, LOG2, FL("vhtCapable: %d vhtTxBFCapable %d, su_bfer %d"),
 		pAddStaParams->vhtCapable, pAddStaParams->vhtTxBFCapable,
 		pAddStaParams->enable_su_tx_bformer);
@@ -2811,7 +2812,8 @@
 		}
 		pAddStaParams->maxAmpduSize = (uint8_t) ampduLenExponent;
 	}
-	pAddStaParams->vhtTxMUBformeeCapable = psessionEntry->txMuBformee;
+	pAddStaParams->vhtTxMUBformeeCapable =
+				psessionEntry->vht_config.mu_beam_formee;
 	pAddStaParams->enableVhtpAid = psessionEntry->enableVhtpAid;
 	pAddStaParams->enableAmpduPs = psessionEntry->enableAmpduPs;
 	pAddStaParams->enableHtSmps = (psessionEntry->enableHtSmps &&
@@ -3749,15 +3751,16 @@
 			}
 
 			if ((vht_caps != NULL) && (vht_caps->suBeamFormerCap ||
-						vht_caps->muBeamformerCap) &&
-					psessionEntry->txBFIniFeatureEnabled)
+				vht_caps->muBeamformerCap) &&
+				psessionEntry->vht_config.su_beam_formee)
 				sta_context->vhtTxBFCapable = 1;
 
 			if ((vht_caps != NULL) && vht_caps->muBeamformerCap &&
-					psessionEntry->txMuBformee)
+				psessionEntry->vht_config.mu_beam_formee)
 				sta_context->vhtTxMUBformeeCapable = 1;
+
 			if ((vht_caps != NULL) && vht_caps->suBeamformeeCap &&
-					psessionEntry->enable_su_tx_bformer)
+				psessionEntry->vht_config.su_beam_former)
 				sta_context->enable_su_tx_bformer = 1;
 		}
 
@@ -4286,18 +4289,20 @@
 				vht_caps = &pBeaconStruct->vendor2_ie.VHTCaps;
 
 			if ((vht_caps != NULL) && (vht_caps->suBeamFormerCap ||
-						vht_caps->muBeamformerCap) &&
-					psessionEntry->txBFIniFeatureEnabled)
+				vht_caps->muBeamformerCap) &&
+				psessionEntry->vht_config.su_beam_formee)
 				pAddBssParams->staContext.vhtTxBFCapable = 1;
 
 			if ((vht_caps != NULL) && vht_caps->muBeamformerCap &&
-					psessionEntry->txMuBformee)
+				psessionEntry->vht_config.mu_beam_formee)
 				pAddBssParams->staContext.vhtTxMUBformeeCapable
 						= 1;
+
 			if ((vht_caps != NULL) && vht_caps->suBeamformeeCap &&
-					psessionEntry->enable_su_tx_bformer)
+				psessionEntry->vht_config.su_beam_former)
 				pAddBssParams->staContext.enable_su_tx_bformer
 						= 1;
+
 			lim_log(pMac, LOG2, FL("StaContext: su_tx_bfer %d"),
 				pAddBssParams->staContext.enable_su_tx_bformer);
 		}
diff --git a/core/mac/src/pe/lim/lim_ft.c b/core/mac/src/pe/lim/lim_ft.c
index 770ff88..c8abf32 100644
--- a/core/mac/src/pe/lim/lim_ft.c
+++ b/core/mac/src/pe/lim/lim_ft.c
@@ -371,11 +371,11 @@
 				pAddBssParams->staContext.vhtCapable = 1;
 				if ((pBeaconStruct->VHTCaps.suBeamFormerCap ||
 				     pBeaconStruct->VHTCaps.muBeamformerCap) &&
-				    pftSessionEntry->txBFIniFeatureEnabled)
+				    pftSessionEntry->vht_config.su_beam_formee)
 					sta_ctx->vhtTxBFCapable
 						= 1;
 				if (pBeaconStruct->VHTCaps.suBeamformeeCap &&
-				    pftSessionEntry->enable_su_tx_bformer)
+				    pftSessionEntry->vht_config.su_beam_former)
 					sta_ctx->enable_su_tx_bformer = 1;
 			}
 			if ((pBeaconStruct->HTCaps.supportedChannelWidthSet) &&
diff --git a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
index 2aebb6f..ee6c338 100644
--- a/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
+++ b/core/mac/src/pe/lim/lim_process_assoc_req_frame.c
@@ -1373,12 +1373,12 @@
 		sta_ds->mlmStaContext.vhtCapability = 0;
 	}
 	if (sta_ds->mlmStaContext.vhtCapability) {
-		if (session->txBFIniFeatureEnabled &&
+		if (session->vht_config.su_beam_formee &&
 				assoc_req->VHTCaps.suBeamFormerCap)
 			sta_ds->vhtBeamFormerCapable = 1;
 		else
 			sta_ds->vhtBeamFormerCapable = 0;
-		if (session->enable_su_tx_bformer &&
+		if (session->vht_config.su_beam_former &&
 				assoc_req->VHTCaps.suBeamformeeCap)
 			sta_ds->vht_su_bfee_capable = 1;
 		else
diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
index 1bf4471..88629e7 100644
--- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
@@ -426,10 +426,11 @@
 	if (session_entry->vhtCapability) {
 		sta_param->vhtCapable = true;
 		sta_param->vhtTxBFCapable =
-				session_entry->txBFIniFeatureEnabled;
-		sta_param->vhtTxMUBformeeCapable = session_entry->txMuBformee;
+				session_entry->vht_config.su_beam_formee;
+		sta_param->vhtTxMUBformeeCapable =
+				session_entry->vht_config.mu_beam_formee;
 		sta_param->enable_su_tx_bformer =
-				session_entry->enable_su_tx_bformer;
+				session_entry->vht_config.su_beam_former;
 	}
 	/*
 	 * Since this is Self-STA, need to populate Self MAX_AMPDU_SIZE
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index 46de9dc3..7a7e324 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -826,15 +826,10 @@
 		case eSIR_INFRA_AP_MODE:
 			lim_configure_ap_start_bss_session(mac_ctx, session,
 				sme_start_bss_req);
-			if (session->pePersona == QDF_SAP_MODE) {
-				session->txBFIniFeatureEnabled =
-					sme_start_bss_req->txbf_ini_enabled;
-				session->txbf_csn_value =
-					sme_start_bss_req->txbf_csn_val;
+			if (session->pePersona == QDF_SAP_MODE)
 				session->vdev_nss = vdev_type_nss->sap;
-			} else {
+			else
 				session->vdev_nss = vdev_type_nss->p2p_go;
-			}
 			break;
 		case eSIR_IBSS_MODE:
 			session->limSystemRole = eLIM_STA_IN_IBSS_ROLE;
@@ -930,22 +925,23 @@
 		}
 
 		if (session->vhtCapability &&
-				(CH_WIDTH_160MHZ > session->ch_width)) {
-			if (wlan_cfg_get_int(mac_ctx,
-					WNI_CFG_VHT_SU_BEAMFORMER_CAP, &val) !=
-				eSIR_SUCCESS)
-				lim_log(mac_ctx, LOGE, FL(
-					"cfg get vht su bformer failed"));
-
-			session->enable_su_tx_bformer = val;
-		} else {
+				(session->ch_width > CH_WIDTH_80MHZ)) {
 			session->nss = 1;
+			lim_log(mac_ctx, LOG1, FL("nss set to [%d]"),
+							session->nss);
 		}
-		lim_log(mac_ctx, LOG1, FL("vht su tx bformer %d"), val);
+		lim_log(mac_ctx, LOG1, FL("vht su tx bformer %d"),
+			session->vht_config.su_beam_former);
 
 		/* Delete pre-auth list if any */
 		lim_delete_pre_auth_list(mac_ctx);
 
+		if (session->nss == 1) {
+			session->vht_config.su_beam_former = 0;
+			session->vht_config.tx_stbc = 0;
+			session->vht_config.num_soundingdim = 0;
+			session->ht_caps.txSTBC = 0;
+		}
 		/*
 		 * keep the RSN/WPA IE information in PE Session Entry
 		 * later will be using this to check when received (Re)Assoc req
@@ -1784,46 +1780,25 @@
 			IS_DOT11_MODE_VHT(session->dot11mode);
 		if (session->vhtCapability) {
 			if (session->pePersona == QDF_STA_MODE) {
-				session->txBFIniFeatureEnabled =
-					sme_join_req->txBFIniFeatureEnabled;
+				session->vht_config.su_beam_formee =
+					sme_join_req->vht_config.su_beam_formee;
 			} else {
-				session->txBFIniFeatureEnabled = 0;
+				session->vht_config.su_beam_formee = 0;
 			}
-			session->txMuBformee = sme_join_req->txMuBformee;
 			session->enableVhtpAid =
 				sme_join_req->enableVhtpAid;
 			session->enableVhtGid =
 				sme_join_req->enableVhtGid;
-
-			if (wlan_cfg_get_int(mac_ctx,
-					WNI_CFG_VHT_SU_BEAMFORMER_CAP, &val) !=
-				eSIR_SUCCESS)
-				lim_log(mac_ctx, LOGE, FL(
-					"cfg get vht su bformer failed"));
-
-			session->enable_su_tx_bformer = val;
+			lim_log(mac_ctx, LOG1, FL("vht su bformer [%d]"),
+					session->vht_config.su_beam_former);
 		}
-		if (session->vhtCapability && session->txBFIniFeatureEnabled) {
-			if (cfg_set_int(mac_ctx, WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
-				session->txBFIniFeatureEnabled) !=
-				eSIR_SUCCESS) {
-				/*
-				 * Set failed for
-				 * CFG_VHT_SU_BEAMFORMEE_CAP
-				 */
-				lim_log(mac_ctx, LOGP,
-					FL("Failed CFG_VHT_SU_BEAMFORMEE_CAP"));
-				ret_code = eSIR_LOGP_EXCEPTION;
-				goto end;
-			}
-			session->txbf_csn_value = sme_join_req->txBFCsnValue;
-		}
+
 		lim_log(mac_ctx, LOG1,
-				FL("vhtCapability: %d txBFIniFeatureEnabled: %d txbf_csn_value: %d su_tx_bformer %d"),
+				FL("vhtCapability: %d su_beam_formee: %d txbf_csn_value: %d su_tx_bformer %d"),
 				session->vhtCapability,
-				session->txBFIniFeatureEnabled,
-				session->txbf_csn_value,
-				session->enable_su_tx_bformer);
+				session->vht_config.su_beam_formee,
+				session->vht_config.csnof_beamformer_antSup,
+				session->vht_config.su_beam_former);
 		/*Phy mode */
 		session->gLimPhyMode = bss_desc->nwType;
 		handle_ht_capabilityand_ht_info(mac_ctx, session);
@@ -1971,6 +1946,17 @@
 			&session->gLimCurrentBssUapsd,
 			&local_power_constraint, session);
 
+		/*
+		 * Once the AP capabilities are available then set the
+		 * beam forming capabilities accordingly.
+		 */
+		if (session->nss == 1) {
+			session->vht_config.su_beam_former = 0;
+			session->vht_config.tx_stbc = 0;
+			session->vht_config.num_soundingdim = 0;
+			session->ht_caps.txSTBC = 0;
+		}
+
 #ifdef FEATURE_WLAN_ESE
 		session->maxTxPower = lim_get_max_tx_power(reg_max,
 					local_power_constraint,
diff --git a/core/mac/src/pe/lim/lim_prop_exts_utils.c b/core/mac/src/pe/lim/lim_prop_exts_utils.c
index 268a2c1..192fb2d 100644
--- a/core/mac/src/pe/lim/lim_prop_exts_utils.c
+++ b/core/mac/src/pe/lim/lim_prop_exts_utils.c
@@ -140,13 +140,13 @@
 			VHT_MCS_3x3_MASK) &&
 		      ((beacon_struct->VHTCaps.txMCSMap & VHT_MCS_2x2_MASK) !=
 		       VHT_MCS_2x2_MASK)))
-			session->txBFIniFeatureEnabled = 0;
+			session->vht_config.su_beam_formee = 0;
 	} else {
 		session->vhtCapabilityPresentInBeacon = 0;
 	}
 
 	if (session->vhtCapabilityPresentInBeacon == 1 &&
-			session->txBFIniFeatureEnabled == 0) {
+			session->vht_config.su_beam_formee == 0) {
 		cfg_set_status = cfg_set_int(mac_ctx,
 				WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
 				0);
@@ -161,7 +161,7 @@
 				&enable_txbf_20mhz);
 		if ((IS_SIR_STATUS_SUCCESS(cfg_get_status)) &&
 				(false == enable_txbf_20mhz))
-			session->txBFIniFeatureEnabled = 0;
+			session->vht_config.su_beam_formee = 0;
 	} else if (session->vhtCapabilityPresentInBeacon &&
 			vht_op->chanWidth) {
 		/* If VHT is supported min 80 MHz support is must */
@@ -242,13 +242,13 @@
 				session->ch_center_freq_seg1,
 				session->ch_width);
 		if (CH_WIDTH_80MHZ < session->ch_width) {
-			session->enable_su_tx_bformer = 0;
+			session->vht_config.su_beam_former = 0;
 			session->nss = 1;
 		}
 	}
 	if (session->vhtCapabilityPresentInBeacon == 1 &&
 			!session->htSupportedChannelWidthSet &&
-			session->txBFIniFeatureEnabled == 0) {
+			session->vht_config.su_beam_formee == 0) {
 		cfg_set_status = cfg_set_int(mac_ctx,
 				WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
 				0);
diff --git a/core/mac/src/sys/legacy/src/utils/src/parser_api.c b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
index 95382cf..b586c0f 100644
--- a/core/mac/src/sys/legacy/src/utils/src/parser_api.c
+++ b/core/mac/src/sys/legacy/src/utils/src/parser_api.c
@@ -971,6 +971,7 @@
 
 		if (psessionEntry->ch_width < CH_WIDTH_160MHZ) {
 			pDot11f->shortGI160and80plus80MHz = 0;
+			pDot11f->supportedChannelWidthSet = 0;
 		} else {
 			pDot11f->shortGI160and80plus80MHz =
 				psessionEntry->vht_config.shortgi160and80plus80;
@@ -982,18 +983,20 @@
 		if (psessionEntry->htConfig.ht_rx_stbc)
 			pDot11f->rxSTBC = psessionEntry->vht_config.rx_stbc;
 
-		pDot11f->suBeamformeeCap = psessionEntry->txBFIniFeatureEnabled;
-		if (psessionEntry->txBFIniFeatureEnabled) {
+		pDot11f->suBeamformeeCap =
+			psessionEntry->vht_config.su_beam_formee;
+		if (psessionEntry->vht_config.su_beam_formee) {
 			nCfgValue = 0;
 			CFG_GET_INT(nStatus, pMac,
 				    WNI_CFG_VHT_MU_BEAMFORMEE_CAP, nCfgValue);
 			pDot11f->muBeamformeeCap = (nCfgValue & 0x0001);
 			pDot11f->csnofBeamformerAntSup =
-				psessionEntry->txbf_csn_value;
+			      psessionEntry->vht_config.csnof_beamformer_antSup;
 		} else {
 			pDot11f->muBeamformeeCap = 0;
 		}
-		pDot11f->suBeamFormerCap = psessionEntry->enable_su_tx_bformer;
+		pDot11f->suBeamFormerCap =
+			psessionEntry->vht_config.su_beam_former;
 
 		pDot11f->vhtTXOPPS = psessionEntry->vht_config.vht_txops;