mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-09-18 22:14:16 +00:00
wifi: rtw89: sar: add skeleton for different configs by antenna
Some SAR sources, e.g. ACPI, may allow different SAR configs by antenna. Previously, the minimum config between antennas was taken. Because there are differences between HW design, different chips might have different solutions to achieve this. So, it cannot be done through a single common handling. Now, add the relevant skeleton for this purpose ahead. First, add a flag into chip info to describe whether it has implemented this function or not. Second, support to query SAR config for a given RF path. With it, each chip can implement its own handling. Then, if a chip declares to support this function, when it queries SAR config without a given RF path, it gets a maximum config between antennas. Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com> Signed-off-by: Ping-Ke Shih <pkshih@realtek.com> Link: https://patch.msgid.link/20250326020643.14487-10-pkshih@realtek.com
This commit is contained in:
parent
5bafc85d71
commit
c6c830b265
10 changed files with 52 additions and 1 deletions
|
@ -4284,6 +4284,7 @@ struct rtw89_chip_info {
|
|||
bool support_rnr;
|
||||
bool support_ant_gain;
|
||||
bool support_tas;
|
||||
bool support_sar_by_ant;
|
||||
bool ul_tb_waveform_ctrl;
|
||||
bool ul_tb_pwr_diff;
|
||||
bool rx_freq_frome_ie;
|
||||
|
|
|
@ -935,6 +935,20 @@ static inline s8 rtw89_phy_txpwr_dbm_to_mac(struct rtw89_dev *rtwdev, s8 dbm)
|
|||
return clamp_t(s16, dbm << chip->txpwr_factor_mac, -64, 63);
|
||||
}
|
||||
|
||||
static inline s16 rtw89_phy_txpwr_mac_to_rf(struct rtw89_dev *rtwdev, s8 txpwr_mac)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return txpwr_mac << (chip->txpwr_factor_rf - chip->txpwr_factor_mac);
|
||||
}
|
||||
|
||||
static inline s16 rtw89_phy_txpwr_mac_to_bb(struct rtw89_dev *rtwdev, s8 txpwr_mac)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
|
||||
return txpwr_mac << (chip->txpwr_factor_bb - chip->txpwr_factor_mac);
|
||||
}
|
||||
|
||||
void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct rtw89_sta_link *rtwsta_link);
|
||||
void rtw89_phy_ra_update(struct rtw89_dev *rtwdev);
|
||||
void rtw89_phy_ra_update_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
|
|
|
@ -2499,6 +2499,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
|
|||
.support_unii4 = true,
|
||||
.support_ant_gain = false,
|
||||
.support_tas = false,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.rx_freq_frome_ie = true,
|
||||
|
|
|
@ -2217,6 +2217,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
|
|||
.support_unii4 = false,
|
||||
.support_ant_gain = false,
|
||||
.support_tas = false,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.rx_freq_frome_ie = true,
|
||||
|
|
|
@ -853,6 +853,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
|
|||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.support_tas = false,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.rx_freq_frome_ie = true,
|
||||
|
|
|
@ -786,6 +786,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
|
|||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.support_tas = false,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = true,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.rx_freq_frome_ie = true,
|
||||
|
|
|
@ -3014,6 +3014,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
|
|||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.support_tas = true,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = true,
|
||||
.rx_freq_frome_ie = false,
|
||||
|
|
|
@ -2823,6 +2823,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
|
|||
.support_unii4 = true,
|
||||
.support_ant_gain = true,
|
||||
.support_tas = false,
|
||||
.support_sar_by_ant = false,
|
||||
.ul_tb_waveform_ctrl = false,
|
||||
.ul_tb_pwr_diff = false,
|
||||
.rx_freq_frome_ie = false,
|
||||
|
|
|
@ -120,6 +120,7 @@ static int rtw89_query_sar_config_acpi(struct rtw89_dev *rtwdev,
|
|||
const struct rtw89_sar_parm *sar_parm,
|
||||
s32 *cfg)
|
||||
{
|
||||
const struct rtw89_chip_info *chip = rtwdev->chip;
|
||||
const struct rtw89_sar_cfg_acpi *rtwsar = &rtwdev->sar.cfg_acpi;
|
||||
const struct rtw89_sar_entry_from_acpi *ent_a, *ent_b;
|
||||
enum rtw89_acpi_sar_subband subband_l, subband_h;
|
||||
|
@ -147,7 +148,30 @@ static int rtw89_query_sar_config_acpi(struct rtw89_dev *rtwdev,
|
|||
|
||||
cfg_a = rtw89_sar_cfg_acpi_get_min(ent_a, RF_PATH_A, subband_l, subband_h);
|
||||
cfg_b = rtw89_sar_cfg_acpi_get_min(ent_b, RF_PATH_B, subband_l, subband_h);
|
||||
*cfg = min(cfg_a, cfg_b);
|
||||
|
||||
if (chip->support_sar_by_ant) {
|
||||
/* With declaration of support_sar_by_ant, relax the general
|
||||
* SAR querying to return the maximum between paths. However,
|
||||
* expect chip has dealt with the corresponding SAR settings
|
||||
* by path. (To get SAR for a given path, chip can then query
|
||||
* with force_path.)
|
||||
*/
|
||||
if (sar_parm->force_path) {
|
||||
switch (sar_parm->path) {
|
||||
default:
|
||||
case RF_PATH_A:
|
||||
*cfg = cfg_a;
|
||||
break;
|
||||
case RF_PATH_B:
|
||||
*cfg = cfg_b;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
*cfg = max(cfg_a, cfg_b);
|
||||
}
|
||||
} else {
|
||||
*cfg = min(cfg_a, cfg_b);
|
||||
}
|
||||
|
||||
if (sar_parm->ntx == RTW89_2TX)
|
||||
*cfg -= rtwsar->downgrade_2tx;
|
||||
|
@ -285,6 +309,7 @@ s8 rtw89_query_sar(struct rtw89_dev *rtwdev, const struct rtw89_sar_parm *sar_pa
|
|||
|
||||
return rtw89_txpwr_sar_to_mac(rtwdev, fct, cfg);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw89_query_sar);
|
||||
|
||||
int rtw89_print_sar(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
|
||||
const struct rtw89_sar_parm *sar_parm)
|
||||
|
@ -322,6 +347,8 @@ int rtw89_print_sar(struct rtw89_dev *rtwdev, char *buf, size_t bufsz,
|
|||
p += scnprintf(p, end - p, "config: %d (unit: 1/%lu dBm)\n", cfg,
|
||||
BIT(fct));
|
||||
|
||||
p += scnprintf(p, end - p, "support different configs by antenna: %s\n",
|
||||
str_yes_no(rtwdev->chip->support_sar_by_ant));
|
||||
out:
|
||||
return p - buf;
|
||||
}
|
||||
|
|
|
@ -13,6 +13,9 @@
|
|||
struct rtw89_sar_parm {
|
||||
u32 center_freq;
|
||||
enum rtw89_ntx ntx;
|
||||
|
||||
bool force_path;
|
||||
enum rtw89_rf_path path;
|
||||
};
|
||||
|
||||
struct rtw89_sar_handler {
|
||||
|
|
Loading…
Add table
Reference in a new issue