diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index d9b9981017..8d89905c1d 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/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); diff --git a/components/mlme/dispatcher/inc/cfg_mlme_generic.h b/components/mlme/dispatcher/inc/cfg_mlme_generic.h index 624923c3c3..cb908ad50a 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_generic.h +++ b/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") +/* + * + * 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 + * + * + */ +#define CFG_ENABLE_HE_MCS0_MGMT_6GHZ CFG_INI_BOOL( \ + "enable_he_mcs0_for_mgmt_6ghz", \ + 0, \ + "MCS0 rate for 6ghz mgmt frames") + /* * * 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) \ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 16af8d0af7..82b3029569 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/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 diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index 08825cd1d5..34f4e38553 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/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; diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index db2a474bd1..b3ef6de367 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/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) diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index 676bb7a884..5745959e65 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/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, diff --git a/core/mac/src/pe/lim/lim_utils.c b/core/mac/src/pe/lim/lim_utils.c index 1444419e89..7bf57d7c9a 100644 --- a/core/mac/src/pe/lim/lim_utils.c +++ b/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 */