Lines Matching +full:freq +full:- +full:track +full:- +full:enable

1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
27 "center freq: %u to SAR subband is unhandled\n", in rtw89_sar_get_subband()
49 /* freq 6875 (ch 185, 20MHz) spans RTW89_SAR_6GHZ_SUBBAND_7_H in rtw89_sar_get_subband()
63 struct rtw89_sar_cfg_common *rtwsar = &rtwdev->sar.cfg_common; in rtw89_query_sar_config_common()
65 u32 center_freq = sar_parm->center_freq; in rtw89_query_sar_config_common()
71 subband_l = span->sar_subband_low; in rtw89_query_sar_config_common()
72 subband_h = span->sar_subband_high; in rtw89_query_sar_config_common()
82 if (!rtwsar->set[subband_l] && !rtwsar->set[subband_h]) in rtw89_query_sar_config_common()
83 return -ENODATA; in rtw89_query_sar_config_common()
85 if (!rtwsar->set[subband_l]) in rtw89_query_sar_config_common()
86 *cfg = rtwsar->cfg[subband_h]; in rtw89_query_sar_config_common()
87 else if (!rtwsar->set[subband_h]) in rtw89_query_sar_config_common()
88 *cfg = rtwsar->cfg[subband_l]; in rtw89_query_sar_config_common()
90 *cfg = min(rtwsar->cfg[subband_l], rtwsar->cfg[subband_h]); in rtw89_query_sar_config_common()
100 const struct rtw89_sar_indicator_from_acpi *ind = &rtwsar->indicator; in rtw89_sar_cfg_acpi_get_ent()
104 sel = ind->tblsel[path]; in rtw89_sar_cfg_acpi_get_ent()
105 tbl = &rtwsar->tables[sel]; in rtw89_sar_cfg_acpi_get_ent()
107 return &tbl->entries[regd]; in rtw89_sar_cfg_acpi_get_ent()
116 return min(ent->v[subband_low][path], ent->v[subband_high][path]); in rtw89_sar_cfg_acpi_get_min()
123 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_query_sar_config_acpi()
124 const struct rtw89_sar_cfg_acpi *rtwsar = &rtwdev->sar.cfg_acpi; in rtw89_query_sar_config_acpi()
127 u32 center_freq = sar_parm->center_freq; in rtw89_query_sar_config_acpi()
136 subband_l = span->acpi_sar_subband_low; in rtw89_query_sar_config_acpi()
137 subband_h = span->acpi_sar_subband_high; in rtw89_query_sar_config_acpi()
152 if (chip->support_sar_by_ant) { in rtw89_query_sar_config_acpi()
159 if (sar_parm->force_path) { in rtw89_query_sar_config_acpi()
160 switch (sar_parm->path) { in rtw89_query_sar_config_acpi()
176 if (sar_parm->ntx == RTW89_2TX) in rtw89_query_sar_config_acpi()
177 *cfg -= rtwsar->downgrade_2tx; in rtw89_query_sar_config_acpi()
202 if (test_bit(RTW89_FLAG_PROBE_DONE, _d->flags)) \
203 lockdep_assert_wiphy(_d->hw->wiphy); \
204 _d->sar._cfg_name = *(_cfg_data); \
205 _d->sar.src = _s; \
210 const u8 fct_mac = rtwdev->chip->txpwr_factor_mac; in rtw89_txpwr_sar_to_mac()
214 cfg >> (fct - fct_mac) : cfg << (fct_mac - fct); in rtw89_txpwr_sar_to_mac()
224 const u8 fct = sar_hdl->txpwr_factor_sar; in rtw89_txpwr_tas_to_sar()
227 return cfg << (fct - RTW89_TAS_FACTOR); in rtw89_txpwr_tas_to_sar()
229 return cfg >> (RTW89_TAS_FACTOR - fct); in rtw89_txpwr_tas_to_sar()
235 const u8 fct = sar_hdl->txpwr_factor_sar; in rtw89_txpwr_sar_to_tas()
238 return cfg >> (fct - RTW89_TAS_FACTOR); in rtw89_txpwr_sar_to_tas()
240 return cfg << (RTW89_TAS_FACTOR - fct); in rtw89_txpwr_sar_to_tas()
245 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_is_active()
248 if (!tas->enable) in rtw89_tas_is_active()
275 const enum rtw89_sar_sources src = rtwdev->sar.src; in rtw89_query_sar()
278 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_query_sar()
284 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_query_sar()
289 ret = sar_hdl->query_sar_config(rtwdev, sar_parm, &cfg); in rtw89_query_sar()
294 switch (tas->state) { in rtw89_query_sar()
301 cfg -= offset; in rtw89_query_sar()
309 fct = sar_hdl->txpwr_factor_sar; in rtw89_query_sar()
318 const enum rtw89_sar_sources src = rtwdev->sar.src; in rtw89_print_sar()
321 const u8 fct_mac = rtwdev->chip->txpwr_factor_mac; in rtw89_print_sar()
327 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_print_sar()
330 p += scnprintf(p, end - p, "no SAR is applied\n"); in rtw89_print_sar()
334 p += scnprintf(p, end - p, "source: %d (%s)\n", src, in rtw89_print_sar()
335 sar_hdl->descr_sar_source); in rtw89_print_sar()
337 ret = sar_hdl->query_sar_config(rtwdev, sar_parm, &cfg); in rtw89_print_sar()
339 p += scnprintf(p, end - p, "config: return code: %d\n", ret); in rtw89_print_sar()
340 p += scnprintf(p, end - p, in rtw89_print_sar()
346 fct = sar_hdl->txpwr_factor_sar; in rtw89_print_sar()
348 p += scnprintf(p, end - p, "config: %d (unit: 1/%lu dBm)\n", cfg, in rtw89_print_sar()
351 p += scnprintf(p, end - p, "support different configs by antenna: %s\n", in rtw89_print_sar()
352 str_yes_no(rtwdev->chip->support_sar_by_ant)); in rtw89_print_sar()
354 return p - buf; in rtw89_print_sar()
359 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_print_tas()
363 p += scnprintf(p, end - p, "no TAS is applied\n"); in rtw89_print_tas()
367 p += scnprintf(p, end - p, "State: %s\n", in rtw89_print_tas()
368 rtw89_tas_state_str(tas->state)); in rtw89_print_tas()
369 p += scnprintf(p, end - p, "Average time: %d\n", in rtw89_print_tas()
370 tas->window_size * 2); in rtw89_print_tas()
371 p += scnprintf(p, end - p, "SAR gap: %d dBm\n", in rtw89_print_tas()
373 p += scnprintf(p, end - p, "DPR gap: %d dBm\n", in rtw89_print_tas()
375 p += scnprintf(p, end - p, "DPR ON offset: %d dBm\n", in rtw89_print_tas()
377 p += scnprintf(p, end - p, "DPR OFF offset: %d dBm\n", in rtw89_print_tas()
381 return p - buf; in rtw89_print_tas()
424 struct rtw89_dev *rtwdev = hw->priv; in rtw89_ops_set_sar_specs()
432 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_ops_set_sar_specs()
434 if (sar->type != NL80211_SAR_TYPE_POWER) in rtw89_ops_set_sar_specs()
435 return -EINVAL; in rtw89_ops_set_sar_specs()
439 for (i = 0; i < sar->num_sub_specs; i++) { in rtw89_ops_set_sar_specs()
440 idx = sar->sub_specs[i].freq_range_index; in rtw89_ops_set_sar_specs()
442 return -EINVAL; in rtw89_ops_set_sar_specs()
446 power = sar->sub_specs[i].power; in rtw89_ops_set_sar_specs()
449 "On freq %u to %u, set SAR limit %d (unit: 1/%lu dBm)\n", in rtw89_ops_set_sar_specs()
467 src = rtwdev->sar.src; in rtw89_apply_sar_acpi()
474 "SAR-ACPI downgrade 2TX: %u (unit: 1/%lu dBm)\n", in rtw89_apply_sar_acpi()
475 sar->downgrade_2tx, BIT(TXPWR_FACTOR_OF_RTW89_ACPI_SAR)); in rtw89_apply_sar_acpi()
477 for (i = 0; i < sar->valid_num; i++) { in rtw89_apply_sar_acpi()
478 tbl = &sar->tables[i]; in rtw89_apply_sar_acpi()
481 ent = &tbl->entries[j]; in rtw89_apply_sar_acpi()
484 "SAR-ACPI-[%u] REGD-%s (unit: 1/%lu dBm)\n", in rtw89_apply_sar_acpi()
491 ent->v[k][RF_PATH_A], ent->v[k][RF_PATH_B]); in rtw89_apply_sar_acpi()
518 if (unlikely(!cfg->valid_num)) { in rtw89_set_sar_from_acpi()
532 const enum rtw89_sar_sources src = rtwdev->sar.src; in rtw89_tas_query_sar_config()
541 sar_parm.center_freq = chan->freq; in rtw89_tas_query_sar_config()
542 ret = sar_hdl->query_sar_config(rtwdev, &sar_parm, cfg); in rtw89_tas_query_sar_config()
554 struct rtw89_tas_info *tas = &rtwdev->tas; in __rtw89_tas_state_update()
556 if (tas->state == state) in __rtw89_tas_state_update()
559 rtw89_debug(rtwdev, RTW89_DBG_SAR, "tas: switch state: %s -> %s\n", in __rtw89_tas_state_update()
560 rtw89_tas_state_str(tas->state), rtw89_tas_state_str(state)); in __rtw89_tas_state_update()
562 tas->state = state; in __rtw89_tas_state_update()
578 u8 band = chan->band_type; in rtw89_tas_get_window_size()
606 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_window_update()
611 WARN_ON_ONCE(tas->window_size > RTW89_TAS_TXPWR_WINDOW); in rtw89_tas_window_update()
613 if (tas->window_size == window_size) in rtw89_tas_window_update()
616 rtw89_debug(rtwdev, RTW89_DBG_SAR, "tas: window update: %u -> %u\n", in rtw89_tas_window_update()
617 tas->window_size, window_size); in rtw89_tas_window_update()
619 head_idx = (tas->txpwr_tail_idx - window_size + 1 + RTW89_TAS_TXPWR_WINDOW) % in rtw89_tas_window_update()
623 total_txpwr += tas->txpwr_history[j]; in rtw89_tas_window_update()
626 tas->window_size = window_size; in rtw89_tas_window_update()
627 tas->total_txpwr = total_txpwr; in rtw89_tas_window_update()
628 tas->txpwr_head_idx = head_idx; in rtw89_tas_window_update()
634 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_tas_history_update()
635 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_history_update()
636 u8 tx_ratio = env->ifs_clm_tx_ratio; in rtw89_tas_history_update()
642 * use -40 dBm * 100 tx ratio in rtw89_tas_history_update()
644 instant_txpwr = rtw89_db_to_linear(-40); in rtw89_tas_history_update()
647 instant_txpwr = tas->instant_txpwr; in rtw89_tas_history_update()
651 tas->total_txpwr += txpwr - tas->txpwr_history[tas->txpwr_head_idx]; in rtw89_tas_history_update()
652 tas->total_tx_ratio += tx_ratio - tas->tx_ratio_history[tas->tx_ratio_idx]; in rtw89_tas_history_update()
653 tas->tx_ratio_history[tas->tx_ratio_idx] = tx_ratio; in rtw89_tas_history_update()
655 tas->txpwr_head_idx = (tas->txpwr_head_idx + 1) % RTW89_TAS_TXPWR_WINDOW; in rtw89_tas_history_update()
656 tas->txpwr_tail_idx = (tas->txpwr_tail_idx + 1) % RTW89_TAS_TXPWR_WINDOW; in rtw89_tas_history_update()
657 tas->tx_ratio_idx = (tas->tx_ratio_idx + 1) % RTW89_TAS_TX_RATIO_WINDOW; in rtw89_tas_history_update()
658 tas->txpwr_history[tas->txpwr_tail_idx] = txpwr; in rtw89_tas_history_update()
668 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_rolling_average()
675 linear = DIV_ROUND_DOWN_ULL(tas->total_txpwr, tas->window_size * PERCENT); in rtw89_tas_rolling_average()
677 tx_ratio_avg = tas->total_tx_ratio / RTW89_TAS_TX_RATIO_WINDOW; in rtw89_tas_rolling_average()
678 dpr_on_threshold = tas->dpr_on_threshold; in rtw89_tas_rolling_average()
679 dpr_off_threshold = tas->dpr_off_threshold; in rtw89_tas_rolling_average()
699 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_tas_init()
700 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_init()
705 if (!chip->support_tas) in rtw89_tas_init()
717 switch (ptr->enable) { in rtw89_tas_init()
719 tas->enable = false; in rtw89_tas_init()
722 tas->enable = true; in rtw89_tas_init()
728 if (!tas->enable) { in rtw89_tas_init()
729 rtw89_debug(rtwdev, RTW89_DBG_SAR, "TAS not enable\n"); in rtw89_tas_init()
733 tas->enabled_countries = ptr->enabled_countries; in rtw89_tas_init()
742 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_reset()
753 tas->dpr_on_threshold = cfg - RTW89_TAS_SAR_GAP; in rtw89_tas_reset()
754 tas->dpr_off_threshold = cfg - RTW89_TAS_SAR_GAP - RTW89_TAS_DPR_GAP; in rtw89_tas_reset()
757 if (!force && tas->keep_history) in rtw89_tas_reset()
762 tas->txpwr_history[i] = linear; in rtw89_tas_reset()
765 tas->tx_ratio_history[i] = RTW89_TAS_DFLT_TX_RATIO; in rtw89_tas_reset()
767 tas->total_tx_ratio = RTW89_TAS_DFLT_TX_RATIO * RTW89_TAS_TX_RATIO_WINDOW; in rtw89_tas_reset()
768 tas->total_txpwr = linear * RTW89_TAS_TXPWR_WINDOW; in rtw89_tas_reset()
769 tas->window_size = RTW89_TAS_TXPWR_WINDOW; in rtw89_tas_reset()
770 tas->txpwr_head_idx = 0; in rtw89_tas_reset()
771 tas->txpwr_tail_idx = RTW89_TAS_TXPWR_WINDOW - 1; in rtw89_tas_reset()
772 tas->tx_ratio_idx = 0; in rtw89_tas_reset()
773 tas->state = RTW89_TAS_STATE_DPR_OFF; in rtw89_tas_reset()
774 tas->backup_state = RTW89_TAS_STATE_DPR_OFF; in rtw89_tas_reset()
775 tas->keep_history = true; in rtw89_tas_reset()
778 "tas: band: %u, freq: %u\n", chan->band_type, chan->freq); in rtw89_tas_reset()
783 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_track()
784 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_tas_track()
787 if (hal->disabled_dm_bitmap & BIT(RTW89_DM_TAS)) in rtw89_tas_track()
793 if (!rtw89_tas_query_sar_config(rtwdev, &cfg) || tas->block_regd) in rtw89_tas_track()
796 if (tas->pause) in rtw89_tas_track()
807 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_scan()
817 tas->backup_state = tas->state; in rtw89_tas_scan()
820 rtw89_tas_state_update(rtwdev, tas->backup_state); in rtw89_tas_scan()
827 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_tas_chanctx_cb()
838 tas->pause = true; in rtw89_tas_chanctx_cb()
842 tas->pause = false; in rtw89_tas_chanctx_cb()
858 struct rtw89_sar_cfg_acpi *cfg = &rtwdev->sar.cfg_acpi; in rtw89_sar_track_acpi()
859 struct rtw89_sar_indicator_from_acpi *ind = &cfg->indicator; in rtw89_sar_track_acpi()
860 const enum rtw89_sar_sources src = rtwdev->sar.src; in rtw89_sar_track_acpi()
864 lockdep_assert_wiphy(rtwdev->hw->wiphy); in rtw89_sar_track_acpi()
869 if (!ind->enable_sync) in rtw89_sar_track_acpi()
877 "%s: failed to track indicator: %d; reset and disable\n", in rtw89_sar_track_acpi()
880 memset(ind->tblsel, 0, sizeof(ind->tblsel)); in rtw89_sar_track_acpi()
881 ind->enable_sync = false; in rtw89_sar_track_acpi()