Browse Source

qcacld-3.0: Add configuration support to enable/disable Tx BF

Add support to dynamically enable/disable the tx beamformee
support.

Change-Id: I205fd352d731e9b26654b8bbbbc459d2798b03be
CRs-Fixed: 2241816
Kiran Kumar Lokere 7 năm trước cách đây
mục cha
commit
6c7f3fae12

+ 14 - 0
core/hdd/src/wlan_hdd_cfg80211.c

@@ -6206,6 +6206,8 @@ wlan_hdd_wifi_test_config_policy[
 			.type = NLA_U8},
 		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_HE_LTF] = {
 			.type = NLA_U8},
+		[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE] = {
+			.type = NLA_U8},
 };
 
 /**
@@ -7400,6 +7402,18 @@ __wlan_hdd_cfg80211_set_wifi_test_config(struct wiphy *wiphy,
 			goto send_err;
 	}
 
+	if (tb[QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]) {
+		cfg_val = nla_get_u8(tb[
+			QCA_WLAN_VENDOR_ATTR_WIFI_TEST_CONFIG_ENABLE_TX_BEAMFORMEE]);
+		hdd_debug("Set Tx beamformee to %d", cfg_val);
+		ret_val = sme_update_tx_bfee_supp(hdd_ctx->hHal,
+						  adapter->session_id,
+						  cfg_val);
+		if (ret_val)
+			sme_err("Failed to set Tx beamformee cap");
+
+	}
+
 	if (update_sme_cfg)
 		sme_update_config(hdd_ctx->hHal, sme_config);
 

+ 28 - 0
core/sme/inc/sme_api.h

@@ -1058,6 +1058,17 @@ QDF_STATUS sme_update_roam_scan_hi_rssi_scan_params(tHalHandle hal_handle,
 	uint32_t notify_id,
 	int32_t val);
 
+/**
+ * sme_update_tx_bfee_supp() - sets the Tx Bfee support
+ * @hal: Pointer to HAL
+ * @session_id: SME session id
+ * @cfg_val: Tx Bfee config value
+ *
+ * Return: 0 on success else err code
+ */
+int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
+		uint8_t cfg_val);
+
 void wlan_sap_enable_phy_error_logs(tHalHandle hal, uint32_t enable_log);
 #ifdef WLAN_FEATURE_DSRC
 void sme_set_dot11p_config(tHalHandle hal, bool enable_dot11p);
@@ -2118,6 +2129,16 @@ int sme_set_auto_rate_he_ltf(tHalHandle hal, uint8_t session_id,
 void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id,
 		uint8_t nss);
 
+/**
+ * sme_update_he_tx_bfee_supp() - sets the HE Tx Bfee support
+ * @hal: Pointer to HAL
+ * @session_id: SME session id
+ * @cfg_val: Tx Bfee config value
+ *
+ * Return: 0 on success else err code
+ */
+int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
+		uint8_t cfg_val);
 /**
  * sme_update_he_mcs() - sets the HE MCS based on user request
  * @hal: Pointer to HAL
@@ -2194,11 +2215,18 @@ static inline int sme_update_he_frag_supp(tHalHandle hal, uint8_t session_id,
 {
 	return 0;
 }
+
 static inline int sme_update_he_ldpc_supp(tHalHandle hal, uint8_t session_id,
 					  uint16_t he_ldpc)
 {
 	return 0;
 }
+
+static inline int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
+		uint8_t cfg_val)
+{
+	return 0;
+}
 #endif
 
 /**

+ 21 - 0
core/sme/src/common/sme_api.c

@@ -12934,6 +12934,20 @@ void sme_update_user_configured_nss(tHalHandle hal, uint8_t nss)
 	mac_ctx->user_configured_nss = nss;
 }
 
+int sme_update_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
+			    uint8_t cfg_val)
+{
+	tpAniSirGlobal mac_ctx = PMAC_STRUCT(hal);
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	status = sme_cfg_set_int(mac_ctx, WNI_CFG_VHT_SU_BEAMFORMEE_CAP,
+				 cfg_val);
+	if (status != QDF_STATUS_SUCCESS) {
+		sme_err("Failed to set SU BFEE CFG");
+		return -EFAULT;
+	}
+
+	return sme_update_he_tx_bfee_supp(hal, session_id, cfg_val);
+}
 #ifdef WLAN_FEATURE_11AX
 void sme_update_he_cap_nss(tHalHandle hal, uint8_t session_id,
 		uint8_t nss)
@@ -13043,6 +13057,13 @@ static int sme_update_he_cap(tHalHandle hal, uint8_t session_id,
 	return 0;
 }
 
+int sme_update_he_tx_bfee_supp(tHalHandle hal, uint8_t session_id,
+			       uint8_t cfg_val)
+{
+	return sme_update_he_cap(hal, session_id, WNI_CFG_HE_SU_BEAMFORMEE,
+				 cfg_val);
+}
+
 int sme_update_he_tx_stbc_cap(tHalHandle hal, uint8_t session_id, int value)
 {
 	int ret;

+ 23 - 12
core/sme/src/csr/csr_api_roam.c

@@ -2502,20 +2502,31 @@ void csr_update_session_he_cap(tpAniSirGlobal mac_ctx,
 	he_cap->dcm_enc_rx = value;
 	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_PPDU, &value);
 	he_cap->ul_he_mu = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMER, &value);
-	he_cap->su_beamformer = value;
 	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMEE, &value);
 	he_cap->su_beamformee = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_BEAMFORMER, &value);
-	he_cap->mu_beamformer = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_LT80, &value);
-	he_cap->bfee_sts_lt_80 = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_GT80, &value);
-	he_cap->bfee_sts_gt_80 = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_LT80, &value);
-	he_cap->num_sounding_lt_80 = value;
-	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_GT80, &value);
-	he_cap->num_sounding_gt_80 = value;
+	if (he_cap->su_beamformee) {
+		sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_LT80, &value);
+		he_cap->bfee_sts_lt_80 = value;
+		sme_cfg_get_int(mac_ctx, WNI_CFG_HE_BFEE_STS_GT80, &value);
+		he_cap->bfee_sts_gt_80 = value;
+	} else {
+		he_cap->bfee_sts_lt_80 = 0;
+		he_cap->bfee_sts_gt_80 = 0;
+	}
+	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_BEAMFORMER, &value);
+	he_cap->su_beamformer = value;
+	if (he_cap->su_beamformer) {
+		sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_BEAMFORMER, &value);
+		he_cap->mu_beamformer = value;
+		sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_LT80, &value);
+		he_cap->num_sounding_lt_80 = value;
+		sme_cfg_get_int(mac_ctx, WNI_CFG_HE_NUM_SOUND_GT80, &value);
+		he_cap->num_sounding_gt_80 = value;
+	} else {
+		he_cap->mu_beamformer = 0;
+		he_cap->num_sounding_lt_80 = 0;
+		he_cap->num_sounding_gt_80 = 0;
+	}
 	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_SU_FEED_TONE16, &value);
 	he_cap->su_feedback_tone16 = value;
 	sme_cfg_get_int(mac_ctx, WNI_CFG_HE_MU_FEED_TONE16, &value);