Browse Source

qcacld-3.0: Disable legacy rates in 6 GHz frequency band

Disable 11a support on 6 GHz band and change default rate of 6 GHz
frequency band by using WMI_PDEV_PARAM_DEFAULT_6GHZ_RATE.

Change-Id: I2db2dd54c03cf71e1b697796fa3dc58d2646a8b5
CRs-Fixed: 3251997
Aravind Kishore Sukla 2 years ago
parent
commit
5d328ac791

+ 2 - 0
components/mlme/core/src/wlan_mlme_main.c

@@ -593,6 +593,8 @@ static void mlme_init_generic_cfg(struct wlan_objmgr_psoc *psoc,
 	gen->monitor_mode_concurrency =
 		cfg_get(psoc, CFG_MONITOR_MODE_CONCURRENCY);
 	gen->tx_retry_multiplier = cfg_get(psoc, CFG_TX_RETRY_MULTIPLIER);
+	gen->enable_he_mcs0_for_6ghz_mgmt =
+		cfg_get(psoc, CFG_ENABLE_HE_MCS0_MGMT_6GHZ);
 	mlme_init_wds_config_cfg(psoc, gen);
 	mlme_init_mgmt_hw_tx_retry_count_cfg(psoc, gen);
 	mlme_init_relaxed_6ghz_conn_policy(psoc, gen);

+ 21 - 0
components/mlme/dispatcher/inc/cfg_mlme_generic.h

@@ -747,6 +747,26 @@ enum debug_packet_log_type {
 	CFG_VALUE_OR_DEFAULT, \
 	"Max retries for mgmt frames")
 
+/*
+ * <ini>
+ * enable_he_mcs0_for_mgmt_6ghz- if disabled FW will use 6Mbps 11A rate
+ * @Min: 0
+ * @Max: 1
+ * @Default: 0
+ *
+ * If this ini is disabled firmware will use 6Mbps 11A rate
+ *
+ * Supported Feature: STA/SAP
+ *
+ * Usage: External
+ *
+ * </ini>
+ */
+#define CFG_ENABLE_HE_MCS0_MGMT_6GHZ CFG_INI_BOOL( \
+	"enable_he_mcs0_for_mgmt_6ghz", \
+	0, \
+	"MCS0 rate for 6ghz mgmt frames")
+
 /*
  * <ini>
  * bmiss_skip_full_scan - To decide whether firmware does channel map based
@@ -1030,6 +1050,7 @@ enum debug_packet_log_type {
 	CFG(CFG_ITO_REPEAT_COUNT) \
 	CFG(CFG_ENABLE_BEACON_RECEPTION_STATS) \
 	CFG(CFG_MGMT_RETRY_MAX) \
+	CFG(CFG_ENABLE_HE_MCS0_MGMT_6GHZ) \
 	CFG(CFG_BMISS_SKIP_FULL_SCAN) \
 	CFG(CFG_ENABLE_RING_BUFFER) \
 	CFG(CFG_DFS_CHAN_AGEOUT_TIME) \

+ 12 - 0
components/mlme/dispatcher/inc/wlan_mlme_api.h

@@ -2828,6 +2828,18 @@ QDF_STATUS
 wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc,
 			     uint8_t *max_retry);
 
+/**
+ * wlan_mlme_get_mgmt_6ghz_rate_support() - Get status of HE rates for
+ * 6GHz mgmt frames
+ * @psoc: pointer to psoc object
+ * @enable_he_mcs0_for_6ghz_mgmt: pointer to check for HE rates support
+ *
+ * Return: QDF Status
+ */
+QDF_STATUS
+wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc,
+				     bool *enable_he_mcs0_for_6ghz_mgmt);
+
 /**
  * wlan_mlme_get_status_ring_buffer() - Get the
  * status of ring buffer

+ 2 - 0
components/mlme/dispatcher/inc/wlan_mlme_public_struct.h

@@ -1339,6 +1339,7 @@ struct wlan_user_mcc_quota {
  * @disable_4way_hs_offload: enable/disable 4 way handshake offload to firmware
  * @as_enabled: antenna sharing enabled or not (FW capability)
  * @mgmt_retry_max: maximum retries for management frame
+ * @enable_he_mcs0_for_6ghz_mgmt: HE MCS0 rate for mgmt frames in 6GHz band
  * @bmiss_skip_full_scan: Decide if full scan can be skipped in firmware if no
  * candidate is found in partial scan based on channel map
  * @enable_ring_buffer: Decide to enable/disable ring buffer for bug report
@@ -1392,6 +1393,7 @@ struct wlan_mlme_generic {
 	uint32_t disable_4way_hs_offload;
 	bool as_enabled;
 	uint8_t mgmt_retry_max;
+	bool enable_he_mcs0_for_6ghz_mgmt;
 	bool bmiss_skip_full_scan;
 	bool enable_ring_buffer;
 	bool enable_peer_unmap_conf_support;

+ 19 - 0
components/mlme/dispatcher/src/wlan_mlme_api.c

@@ -4559,6 +4559,25 @@ wlan_mlme_get_mgmt_max_retry(struct wlan_objmgr_psoc *psoc,
 	return QDF_STATUS_SUCCESS;
 }
 
+QDF_STATUS
+wlan_mlme_get_mgmt_6ghz_rate_support(struct wlan_objmgr_psoc *psoc,
+				     bool *enable_he_mcs0_for_6ghz_mgmt)
+{
+	struct wlan_mlme_psoc_ext_obj *mlme_obj;
+
+	mlme_obj = mlme_get_psoc_ext_obj(psoc);
+
+	if (!mlme_obj) {
+		*enable_he_mcs0_for_6ghz_mgmt =
+			cfg_default(CFG_ENABLE_HE_MCS0_MGMT_6GHZ);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	*enable_he_mcs0_for_6ghz_mgmt =
+		mlme_obj->cfg.gen.enable_he_mcs0_for_6ghz_mgmt;
+	return QDF_STATUS_SUCCESS;
+}
+
 QDF_STATUS
 wlan_mlme_get_status_ring_buffer(struct wlan_objmgr_psoc *psoc,
 				 bool *enable_ring_buffer)

+ 16 - 0
core/hdd/src/wlan_hdd_main.c

@@ -337,6 +337,7 @@ static qdf_wake_lock_t wlan_wake_lock;
 #define WOW_MAX_FILTERS_PER_LIST 4
 #define WOW_MIN_PATTERN_SIZE 6
 #define WOW_MAX_PATTERN_SIZE 64
+#define MGMT_DEFAULT_DATA_RATE_6GHZ 0x400 /* This maps to 8.6Mbps data rate */
 
 #define IS_IDLE_STOP (!cds_is_driver_unloading() && \
 		      !cds_is_driver_recovering() && !cds_is_driver_loading())
@@ -13768,6 +13769,7 @@ static int hdd_pre_enable_configure(struct hdd_context *hdd_ctx)
 	int ret;
 	uint8_t val = 0;
 	uint8_t max_retry = 0;
+	bool enable_he_mcs0_for_6ghz_mgmt = false;
 	uint32_t tx_retry_multiplier;
 	QDF_STATUS status;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
@@ -13819,6 +13821,20 @@ static int hdd_pre_enable_configure(struct hdd_context *hdd_ctx)
 		goto out;
 	}
 
+	wlan_mlme_get_mgmt_6ghz_rate_support(hdd_ctx->psoc,
+					     &enable_he_mcs0_for_6ghz_mgmt);
+	if (enable_he_mcs0_for_6ghz_mgmt) {
+		hdd_debug("HE rates for 6GHz mgmt frames are supported");
+		ret = sme_cli_set_command(0, WMI_PDEV_PARAM_DEFAULT_6GHZ_RATE,
+					  MGMT_DEFAULT_DATA_RATE_6GHZ,
+					  PDEV_CMD);
+		if (0 != ret) {
+			hdd_err("WMI_PDEV_PARAM_DEFAULT_6GHZ_RATE failed %d",
+				ret);
+			goto out;
+		}
+	}
+
 	wlan_mlme_get_tx_retry_multiplier(hdd_ctx->psoc,
 					  &tx_retry_multiplier);
 	ret = sme_cli_set_command(0, WMI_PDEV_PARAM_PDEV_STATS_TX_XRETRY_EXT,

+ 16 - 0
core/mac/src/pe/lim/lim_utils.c

@@ -9254,9 +9254,25 @@ enum rateid lim_get_min_session_txrate(struct pe_session *session)
 	enum rateid rid = RATEID_DEFAULT;
 	uint8_t min_rate = SIR_MAC_RATE_54, curr_rate, i;
 	tSirMacRateSet *rateset = &session->rateSet;
+	bool enable_he_mcs0_for_6ghz_mgmt = false;
+	qdf_freq_t op_freq;
 
 	if (!session)
 		return rid;
+	else {
+		op_freq = wlan_get_operation_chan_freq(session->vdev);
+		/*
+		 * For 6GHz freq and if enable_he_mcs0_for_mgmt_6ghz INI is
+		 * enabled then FW will use rate of MCS0 for 11AX and configured
+		 * via WMI_MGMT_TX_SEND_CMDID
+		 */
+		wlan_mlme_get_mgmt_6ghz_rate_support(
+				session->mac_ctx->psoc,
+				&enable_he_mcs0_for_6ghz_mgmt);
+		if (op_freq && wlan_reg_is_6ghz_chan_freq(op_freq) &&
+		    enable_he_mcs0_for_6ghz_mgmt)
+			return rid;
+	}
 
 	for (i = 0; i < rateset->numRates; i++) {
 		/* Ignore MSB - set to indicate basic rate */