From ad0d63a599e870bd275f846215dfd338b1ac1dea Mon Sep 17 00:00:00 2001 From: Gururaj Pandurangi Date: Mon, 21 Aug 2023 03:26:15 -0700 Subject: [PATCH] qcacld-3.0: Change TPE IE parsing logic for Client mode Currently, if the AP advertises both Local and Regulatory TPE IEs in the beacons, STA uses an INI to choose one over the other. Vendor ask is to change this logic and allow STA to use the minimum of the two TPE power limits. Also, deprecate the INI that sets the preference between local and regulatory TPE IEs. CRs-Fixed: 3574510 Change-Id: Ibf19020d59621efa72cf290ef34c825fdb50e3e7 --- components/mlme/core/src/wlan_mlme_main.c | 1 - .../mlme/dispatcher/inc/cfg_mlme_power.h | 23 +---- .../mlme/dispatcher/inc/wlan_mlme_api.h | 10 --- .../dispatcher/inc/wlan_mlme_public_struct.h | 2 - .../mlme/dispatcher/src/wlan_mlme_api.c | 11 --- .../src/pe/lim/lim_process_sme_req_messages.c | 84 +++++++++++++------ 6 files changed, 61 insertions(+), 70 deletions(-) diff --git a/components/mlme/core/src/wlan_mlme_main.c b/components/mlme/core/src/wlan_mlme_main.c index cbfd47f595..4fbd51ecae 100644 --- a/components/mlme/core/src/wlan_mlme_main.c +++ b/components/mlme/core/src/wlan_mlme_main.c @@ -3056,7 +3056,6 @@ static void mlme_init_power_cfg(struct wlan_objmgr_psoc *psoc, (uint8_t)cfg_default(CFG_CURRENT_TX_POWER_LEVEL); power->local_power_constraint = (uint8_t)cfg_default(CFG_LOCAL_POWER_CONSTRAINT); - power->use_local_tpe = cfg_get(psoc, CFG_USE_LOCAL_TPE); power->skip_tpe = cfg_get(psoc, CFG_SKIP_TPE_CONSIDERATION); } diff --git a/components/mlme/dispatcher/inc/cfg_mlme_power.h b/components/mlme/dispatcher/inc/cfg_mlme_power.h index 888b59eaad..14f06d4a91 100644 --- a/components/mlme/dispatcher/inc/cfg_mlme_power.h +++ b/components/mlme/dispatcher/inc/cfg_mlme_power.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved. + * Copyright (c) 2023 Qualcomm Innovation Center, Inc. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -146,27 +147,6 @@ CFG_VALUE_OR_DEFAULT, \ "local power constraint") -/* - * - * use_local_tpe - use local or regulatory TPE - * @Min: 0 - * @Max: 1 - * @Default: 0 - * - * This ini is used to set the preference of local or regulatory TPE. If the - * preferred choice is not available, it will fall back on the other choice. - * - * Related: None - * - * Supported Feature: 6GHz channel transmit power - * - * Usage: External - * - * - */ -#define CFG_USE_LOCAL_TPE CFG_INI_BOOL("use_local_tpe", false, \ - "use local or regulatory TPE") - /* * * skip_tpe_consideration - Skip TPE IE value in tx power calculation for @@ -200,7 +180,6 @@ CFG(CFG_SET_TXPOWER_LIMIT5G) \ CFG(CFG_CURRENT_TX_POWER_LEVEL) \ CFG(CFG_LOCAL_POWER_CONSTRAINT) \ - CFG(CFG_USE_LOCAL_TPE) \ CFG(CFG_SKIP_TPE_CONSIDERATION) #endif /* __CFG_MLME_POWER_H */ diff --git a/components/mlme/dispatcher/inc/wlan_mlme_api.h b/components/mlme/dispatcher/inc/wlan_mlme_api.h index 79fd682e08..d9b74ef8d2 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_api.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_api.h @@ -4022,16 +4022,6 @@ mlme_is_twt_enabled(struct wlan_objmgr_psoc *psoc) } #endif /* WLAN_SUPPORT_TWT */ -/** - * wlan_mlme_is_local_tpe_pref() - Get preference to use local TPE or - * regulatory TPE values - * @psoc: pointer to psoc object - * - * Return: True if there is local preference, false if there is regulatory - * preference - */ -bool wlan_mlme_is_local_tpe_pref(struct wlan_objmgr_psoc *psoc); - /** * wlan_mlme_skip_tpe() - Get preference to not consider TPE in 2G/5G case * diff --git a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h index efd3e3face..6088db2139 100644 --- a/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h +++ b/components/mlme/dispatcher/inc/wlan_mlme_public_struct.h @@ -2461,7 +2461,6 @@ struct mlme_power_usage { * @tx_power_5g: limit tx power in 5 ghz * @current_tx_power_level: current tx power level * @local_power_constraint: local power constraint - * @use_local_tpe: preference to use local or regulatory TPE * @skip_tpe: option to not consider TPE values in 2.4G/5G bands */ struct wlan_mlme_power { @@ -2474,7 +2473,6 @@ struct wlan_mlme_power { uint8_t tx_power_5g; uint8_t current_tx_power_level; uint8_t local_power_constraint; - bool use_local_tpe; bool skip_tpe; }; diff --git a/components/mlme/dispatcher/src/wlan_mlme_api.c b/components/mlme/dispatcher/src/wlan_mlme_api.c index c40d5a7123..ad01059b20 100644 --- a/components/mlme/dispatcher/src/wlan_mlme_api.c +++ b/components/mlme/dispatcher/src/wlan_mlme_api.c @@ -6197,17 +6197,6 @@ bool wlan_mlme_is_sta_mon_conc_supported(struct wlan_objmgr_psoc *psoc) return false; } -bool wlan_mlme_is_local_tpe_pref(struct wlan_objmgr_psoc *psoc) -{ - struct wlan_mlme_psoc_ext_obj *mlme_obj; - - mlme_obj = mlme_get_psoc_ext_obj(psoc); - if (!mlme_obj) - return false; - - return mlme_obj->cfg.power.use_local_tpe; -} - bool wlan_mlme_skip_tpe(struct wlan_objmgr_psoc *psoc) { struct wlan_mlme_psoc_ext_obj *mlme_obj; 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 60f05e5f22..0651cfe80e 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 @@ -5589,12 +5589,18 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session, qdf_freq_t curr_op_freq, curr_freq; enum reg_6g_client_type client_mobility_type; struct ch_params ch_params = {0}; - tDot11fIEtransmit_power_env single_tpe; + tDot11fIEtransmit_power_env single_tpe, local_tpe, reg_tpe; /* * PSD is power spectral density, incoming TPE could contain * non PSD info, or PSD info, or both, so need to keep track of them */ bool use_local_tpe, non_psd_set = false, psd_set = false; + bool both_tpe_present = false; + bool local_eirp_set = false, local_psd_set = false; + bool reg_eirp_set = false, reg_psd_set = false; + uint8_t local_eirp_idx = 0, local_psd_idx = 0; + uint8_t reg_eirp_idx = 0, reg_psd_idx = 0; + uint8_t min_count = 0; vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(session->vdev); if (!vdev_mlme) @@ -5632,34 +5638,35 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session, else if (!local_tpe_count) use_local_tpe = false; else - use_local_tpe = wlan_mlme_is_local_tpe_pref(mac->psoc); + both_tpe_present = true; for (i = 0; i < num_tpe_ies; i++) { single_tpe = tpe_ies[i]; if (single_tpe.present && (single_tpe.max_tx_pwr_category == client_mobility_type)) { - if (use_local_tpe) { - if (single_tpe.max_tx_pwr_interpret == - LOCAL_EIRP) { - non_psd_index = i; - non_psd_set = true; - } - if (single_tpe.max_tx_pwr_interpret == - LOCAL_EIRP_PSD) { - psd_index = i; - psd_set = true; - } - } else { - if (single_tpe.max_tx_pwr_interpret == - REGULATORY_CLIENT_EIRP) { - non_psd_index = i; - non_psd_set = true; - } - if (single_tpe.max_tx_pwr_interpret == - REGULATORY_CLIENT_EIRP_PSD) { - psd_index = i; - psd_set = true; - } + if (single_tpe.max_tx_pwr_interpret == LOCAL_EIRP) { + non_psd_index = i; + non_psd_set = true; + local_eirp_idx = non_psd_index; + local_eirp_set = non_psd_set; + } else if (single_tpe.max_tx_pwr_interpret == + LOCAL_EIRP_PSD) { + psd_index = i; + psd_set = true; + local_psd_idx = psd_index; + local_psd_set = psd_set; + } else if (single_tpe.max_tx_pwr_interpret == + REGULATORY_CLIENT_EIRP) { + non_psd_index = i; + non_psd_set = true; + reg_eirp_idx = non_psd_index; + reg_eirp_set = non_psd_set; + } else if (single_tpe.max_tx_pwr_interpret == + REGULATORY_CLIENT_EIRP_PSD) { + psd_index = i; + psd_set = true; + reg_psd_idx = psd_index; + reg_psd_set = psd_set; } } } @@ -5761,6 +5768,35 @@ void lim_parse_tpe_ie(struct mac_context *mac, struct pe_session *session, single_tpe.tx_power[single_tpe.max_tx_pwr_count]; vdev_mlme->reg_tpc_obj.is_psd_power = false; } + + if (both_tpe_present) { + pe_debug("Local: eirp: %d psd: %d, Regulatory: eirp: %d psd %d", + local_eirp_set, local_psd_set, reg_eirp_set, + reg_psd_set); + if (local_eirp_set && reg_eirp_set) { + local_tpe = tpe_ies[local_eirp_idx]; + reg_tpe = tpe_ies[reg_eirp_idx]; + } else if (local_psd_set && reg_psd_set) { + local_tpe = tpe_ies[local_psd_idx]; + reg_tpe = tpe_ies[reg_psd_idx]; + } else { + return; + } + + min_count = QDF_MIN(local_tpe.max_tx_pwr_count, + reg_tpe.max_tx_pwr_count); + for (i = 0; i < min_count + 1; i++) { + if (vdev_mlme->reg_tpc_obj.tpe[i] != + QDF_MIN(local_tpe.tx_power[i], reg_tpe.tx_power[i])) + *has_tpe_updated = true; + vdev_mlme->reg_tpc_obj.tpe[i] = + QDF_MIN(local_tpe.tx_power[i], + reg_tpe.tx_power[i]); + pe_debug("TPE: Local: %d, Reg: %d, power updated: %d", + local_tpe.tx_power[i], reg_tpe.tx_power[i], + *has_tpe_updated); + } + } } void lim_process_tpe_ie_from_beacon(struct mac_context *mac,