Lines Matching +full:xtal +full:- +full:trim
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020 Realtek Corporation
20 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy0_phy1_offset()
22 return phy->phy0_phy1_offset(rtwdev, addr); in rtw89_phy0_phy1_offset()
28 u32 bit_rate = report->bit_rate; in get_max_amsdu_len()
35 if (report->might_fallback_legacy) in get_max_amsdu_len()
50 return rtwdev->chip->max_amsdu_limit; in get_max_amsdu_len()
66 ra_mask |= GENMASK_ULL(highest_mcs - gap, 0) << nss; in get_mcs_ra_mask()
69 ra_mask |= GENMASK_ULL(highest_mcs - gap * 2, 0) << nss; in get_mcs_ra_mask()
81 struct ieee80211_sta_he_cap cap = link_sta->he_cap; in get_he_ra_mask()
84 switch (link_sta->bandwidth) { in get_he_ra_mask()
127 struct ieee80211_sta_eht_cap *eht_cap = &link_sta->eht_cap; in get_eht_ra_mask()
129 u8 *he_phy_cap = link_sta->he_cap.he_cap_elem.phy_cap_info; in get_eht_ra_mask()
131 switch (link_sta->bandwidth) { in get_eht_ra_mask()
133 mcs_nss = &eht_cap->eht_mcs_nss_supp.bw._320; in get_eht_ra_mask()
135 return get_eht_mcs_ra_mask(mcs_nss->rx_tx_max_nss, 9, 3); in get_eht_ra_mask()
137 mcs_nss = &eht_cap->eht_mcs_nss_supp.bw._160; in get_eht_ra_mask()
139 return get_eht_mcs_ra_mask(mcs_nss->rx_tx_max_nss, 9, 3); in get_eht_ra_mask()
141 if (vif->type == NL80211_IFTYPE_AP && in get_eht_ra_mask()
143 mcs_nss_20mhz = &eht_cap->eht_mcs_nss_supp.only_20mhz; in get_eht_ra_mask()
145 return get_eht_mcs_ra_mask(mcs_nss_20mhz->rx_tx_max_nss, 7, 4); in get_eht_ra_mask()
150 mcs_nss = &eht_cap->eht_mcs_nss_supp.bw._80; in get_eht_ra_mask()
152 return get_eht_mcs_ra_mask(mcs_nss->rx_tx_max_nss, 9, 3); in get_eht_ra_mask()
206 struct cfg80211_bitrate_mask *mask = &rtwsta_link->mask; in rtw89_phy_ra_mask_cfg()
210 if (!rtwsta_link->use_cfg_mask) in rtw89_phy_ra_mask_cfg()
211 return -1; in rtw89_phy_ra_mask_cfg()
213 switch (chan->band_type) { in rtw89_phy_ra_mask_cfg()
216 cfg_mask = u64_encode_bits(mask->control[NL80211_BAND_2GHZ].legacy, in rtw89_phy_ra_mask_cfg()
221 cfg_mask = u64_encode_bits(mask->control[NL80211_BAND_5GHZ].legacy, in rtw89_phy_ra_mask_cfg()
226 cfg_mask = u64_encode_bits(mask->control[NL80211_BAND_6GHZ].legacy, in rtw89_phy_ra_mask_cfg()
230 rtw89_warn(rtwdev, "unhandled band type %d\n", chan->band_type); in rtw89_phy_ra_mask_cfg()
231 return -1; in rtw89_phy_ra_mask_cfg()
234 if (link_sta->he_cap.has_he) { in rtw89_phy_ra_mask_cfg()
235 cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[0], in rtw89_phy_ra_mask_cfg()
237 cfg_mask |= u64_encode_bits(mask->control[band].he_mcs[1], in rtw89_phy_ra_mask_cfg()
239 } else if (link_sta->vht_cap.vht_supported) { in rtw89_phy_ra_mask_cfg()
240 cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[0], in rtw89_phy_ra_mask_cfg()
242 cfg_mask |= u64_encode_bits(mask->control[band].vht_mcs[1], in rtw89_phy_ra_mask_cfg()
244 } else if (link_sta->ht_cap.ht_supported) { in rtw89_phy_ra_mask_cfg()
245 cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[0], in rtw89_phy_ra_mask_cfg()
247 cfg_mask |= u64_encode_bits(mask->control[band].ht_mcs[1], in rtw89_phy_ra_mask_cfg()
276 struct cfg80211_bitrate_mask *mask = &rtwsta_link->mask; in rtw89_phy_ra_gi_ltf()
277 u8 band = chan->band_type; in rtw89_phy_ra_gi_ltf()
279 u8 he_ltf = mask->control[nl_band].he_ltf; in rtw89_phy_ra_gi_ltf()
280 u8 he_gi = mask->control[nl_band].he_gi; in rtw89_phy_ra_gi_ltf()
284 if (rtwdev->chip->chip_id == RTL8852C && in rtw89_phy_ra_gi_ltf()
285 chan->band_width == RTW89_CHANNEL_WIDTH_160 && in rtw89_phy_ra_gi_ltf()
291 if (!(rtwsta_link->use_cfg_mask && link_sta->he_cap.has_he)) in rtw89_phy_ra_gi_ltf()
315 struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif_link->rate_pattern; in rtw89_phy_ra_sta_update()
316 struct rtw89_ra_info *ra = &rtwsta_link->ra; in rtw89_phy_ra_sta_update()
318 rtwvif_link->chanctx_idx); in rtw89_phy_ra_sta_update()
320 u8 rssi = ewma_rssi_read(&rtwsta_link->avg_rssi); in rtw89_phy_ra_sta_update()
335 if (link_sta->eht_cap.has_eht) { in rtw89_phy_ra_sta_update()
339 if (rtwdev->hal.no_mcs_12_13) in rtw89_phy_ra_sta_update()
346 } else if (link_sta->he_cap.has_he) { in rtw89_phy_ra_sta_update()
351 if (link_sta->he_cap.he_cap_elem.phy_cap_info[2] & in rtw89_phy_ra_sta_update()
354 if (link_sta->he_cap.he_cap_elem.phy_cap_info[1] & in rtw89_phy_ra_sta_update()
359 } else if (link_sta->vht_cap.vht_supported) { in rtw89_phy_ra_sta_update()
360 u16 mcs_map = le16_to_cpu(link_sta->vht_cap.vht_mcs.rx_mcs_map); in rtw89_phy_ra_sta_update()
364 /* MCS9 (non-20MHz), MCS8, MCS7 */ in rtw89_phy_ra_sta_update()
365 if (link_sta->bandwidth == IEEE80211_STA_RX_BW_20) in rtw89_phy_ra_sta_update()
370 if (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK) in rtw89_phy_ra_sta_update()
372 if (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC) in rtw89_phy_ra_sta_update()
374 } else if (link_sta->ht_cap.ht_supported) { in rtw89_phy_ra_sta_update()
377 ra_mask |= ((u64)link_sta->ht_cap.mcs.rx_mask[3] << 48) | in rtw89_phy_ra_sta_update()
378 ((u64)link_sta->ht_cap.mcs.rx_mask[2] << 36) | in rtw89_phy_ra_sta_update()
379 ((u64)link_sta->ht_cap.mcs.rx_mask[1] << 24) | in rtw89_phy_ra_sta_update()
380 ((u64)link_sta->ht_cap.mcs.rx_mask[0] << 12); in rtw89_phy_ra_sta_update()
382 if (link_sta->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC) in rtw89_phy_ra_sta_update()
384 if (link_sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING) in rtw89_phy_ra_sta_update()
388 switch (chan->band_type) { in rtw89_phy_ra_sta_update()
390 ra_mask |= link_sta->supp_rates[NL80211_BAND_2GHZ]; in rtw89_phy_ra_sta_update()
391 if (link_sta->supp_rates[NL80211_BAND_2GHZ] & 0xf) in rtw89_phy_ra_sta_update()
393 if (link_sta->supp_rates[NL80211_BAND_2GHZ] & 0xff0) in rtw89_phy_ra_sta_update()
397 ra_mask |= (u64)link_sta->supp_rates[NL80211_BAND_5GHZ] << 4; in rtw89_phy_ra_sta_update()
401 ra_mask |= (u64)link_sta->supp_rates[NL80211_BAND_6GHZ] << 4; in rtw89_phy_ra_sta_update()
413 for (i = 0; i < rtwdev->hal.tx_nss; i++) in rtw89_phy_ra_sta_update()
430 switch (link_sta->bandwidth) { in rtw89_phy_ra_sta_update()
433 sgi = link_sta->vht_cap.vht_supported && in rtw89_phy_ra_sta_update()
434 (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_160); in rtw89_phy_ra_sta_update()
438 sgi = link_sta->vht_cap.vht_supported && in rtw89_phy_ra_sta_update()
439 (link_sta->vht_cap.cap & IEEE80211_VHT_CAP_SHORT_GI_80); in rtw89_phy_ra_sta_update()
443 sgi = link_sta->ht_cap.ht_supported && in rtw89_phy_ra_sta_update()
444 (link_sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_40); in rtw89_phy_ra_sta_update()
448 sgi = link_sta->ht_cap.ht_supported && in rtw89_phy_ra_sta_update()
449 (link_sta->ht_cap.cap & IEEE80211_HT_CAP_SGI_20); in rtw89_phy_ra_sta_update()
453 if (link_sta->he_cap.he_cap_elem.phy_cap_info[3] & in rtw89_phy_ra_sta_update()
455 ra->dcm_cap = 1; in rtw89_phy_ra_sta_update()
457 if (rate_pattern->enable && !p2p) { in rtw89_phy_ra_sta_update()
459 ra_mask &= rate_pattern->ra_mask; in rtw89_phy_ra_sta_update()
460 mode = rate_pattern->ra_mode; in rtw89_phy_ra_sta_update()
463 ra->bw_cap = bw_mode; in rtw89_phy_ra_sta_update()
464 ra->er_cap = rtwsta_link->er_cap; in rtw89_phy_ra_sta_update()
465 ra->mode_ctrl = mode; in rtw89_phy_ra_sta_update()
466 ra->macid = rtwsta_link->mac_id; in rtw89_phy_ra_sta_update()
467 ra->stbc_cap = stbc_en; in rtw89_phy_ra_sta_update()
468 ra->ldpc_cap = ldpc_en; in rtw89_phy_ra_sta_update()
469 ra->ss_num = min(link_sta->rx_nss, rtwdev->hal.tx_nss) - 1; in rtw89_phy_ra_sta_update()
470 ra->en_sgi = sgi; in rtw89_phy_ra_sta_update()
471 ra->ra_mask = ra_mask; in rtw89_phy_ra_sta_update()
472 ra->fix_giltf_en = fix_giltf_en; in rtw89_phy_ra_sta_update()
473 ra->fix_giltf = fix_giltf; in rtw89_phy_ra_sta_update()
478 ra->fixed_csi_rate_en = false; in rtw89_phy_ra_sta_update()
479 ra->ra_csi_rate_en = true; in rtw89_phy_ra_sta_update()
480 ra->cr_tbl_sel = false; in rtw89_phy_ra_sta_update()
481 ra->band_num = rtwvif_link->phy_idx; in rtw89_phy_ra_sta_update()
482 ra->csi_bw = bw_mode; in rtw89_phy_ra_sta_update()
483 ra->csi_gi_ltf = RTW89_GILTF_LGI_4XHE32; in rtw89_phy_ra_sta_update()
484 ra->csi_mcs_ss_idx = 5; in rtw89_phy_ra_sta_update()
485 ra->csi_mode = csi_mode; in rtw89_phy_ra_sta_update()
492 struct rtw89_vif_link *rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_phy_ra_update_sta_link()
494 struct rtw89_ra_info *ra = &rtwsta_link->ra; in rtw89_phy_ra_update_sta_link()
501 link_sta, vif->p2p, false); in rtw89_phy_ra_update_sta_link()
506 ra->upd_mask = 1; in rtw89_phy_ra_update_sta_link()
508 ra->upd_bw_nss_mask = 1; in rtw89_phy_ra_update_sta_link()
512 ra->macid, in rtw89_phy_ra_update_sta_link()
513 ra->bw_cap, in rtw89_phy_ra_update_sta_link()
514 ra->ss_num, in rtw89_phy_ra_update_sta_link()
515 ra->en_sgi, in rtw89_phy_ra_update_sta_link()
516 ra->giltf); in rtw89_phy_ra_update_sta_link()
548 if (next->enable) in __check_rate_pattern()
552 next->rate = rate_base + c; in __check_rate_pattern()
553 next->ra_mode = ra_mode; in __check_rate_pattern()
554 next->ra_mask = ra_mask; in __check_rate_pattern()
555 next->enable = true; in __check_rate_pattern()
574 rtwvif_link->chanctx_idx); in __rtw89_phy_rate_pattern_vif()
593 u8 band = chan->band_type; in __rtw89_phy_rate_pattern_vif()
595 enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen; in __rtw89_phy_rate_pattern_vif()
596 u8 tx_nss = rtwdev->hal.tx_nss; in __rtw89_phy_rate_pattern_vif()
602 mask->control[nl_band].he_mcs[i], in __rtw89_phy_rate_pattern_vif()
609 mask->control[nl_band].vht_mcs[i], in __rtw89_phy_rate_pattern_vif()
616 mask->control[nl_band].ht_mcs[i], in __rtw89_phy_rate_pattern_vif()
624 sband = rtwdev->hw->wiphy->bands[nl_band]; in __rtw89_phy_rate_pattern_vif()
629 mask->control[nl_band].legacy, in __rtw89_phy_rate_pattern_vif()
630 BIT(sband->n_bitrates) - 1, false)) in __rtw89_phy_rate_pattern_vif()
635 mask->control[nl_band].legacy, in __rtw89_phy_rate_pattern_vif()
636 BIT(sband->n_bitrates) - 1, false)) in __rtw89_phy_rate_pattern_vif()
643 rtwvif_link->rate_pattern = next_pattern; in __rtw89_phy_rate_pattern_vif()
652 rtwvif_link->rate_pattern.enable = false; in __rtw89_phy_rate_pattern_vif()
677 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_ra_update()
684 struct rtw89_vif_link *rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_phy_ra_assoc()
686 struct rtw89_ra_info *ra = &rtwsta_link->ra; in rtw89_phy_ra_assoc()
687 u8 rssi = ewma_rssi_read(&rtwsta_link->avg_rssi) >> RSSI_FACTOR; in rtw89_phy_ra_assoc()
697 link_sta, vif->p2p, csi); in rtw89_phy_ra_assoc()
702 ra->init_rate_lv = 1; in rtw89_phy_ra_assoc()
704 ra->init_rate_lv = 2; in rtw89_phy_ra_assoc()
706 ra->init_rate_lv = 3; in rtw89_phy_ra_assoc()
708 ra->init_rate_lv = 0; in rtw89_phy_ra_assoc()
709 ra->upd_all = 1; in rtw89_phy_ra_assoc()
712 ra->macid, in rtw89_phy_ra_assoc()
713 ra->mode_ctrl, in rtw89_phy_ra_assoc()
714 ra->bw_cap, in rtw89_phy_ra_assoc()
715 ra->ss_num, in rtw89_phy_ra_assoc()
716 ra->init_rate_lv); in rtw89_phy_ra_assoc()
719 ra->dcm_cap, in rtw89_phy_ra_assoc()
720 ra->er_cap, in rtw89_phy_ra_assoc()
721 ra->ldpc_cap, in rtw89_phy_ra_assoc()
722 ra->stbc_cap, in rtw89_phy_ra_assoc()
723 ra->en_sgi, in rtw89_phy_ra_assoc()
724 ra->giltf); in rtw89_phy_ra_assoc()
733 enum rtw89_bandwidth cbw = chan->band_width; in rtw89_phy_get_txsc()
734 u8 pri_ch = chan->primary_channel; in rtw89_phy_get_txsc()
735 u8 central_ch = chan->channel; in rtw89_phy_get_txsc()
749 txsc_idx = (pri_ch - central_ch) >> 1; in rtw89_phy_get_txsc()
751 txsc_idx = ((central_ch - pri_ch) >> 1) + 1; in rtw89_phy_get_txsc()
758 tmp = (pri_ch - central_ch) >> 1; in rtw89_phy_get_txsc()
760 tmp = ((central_ch - pri_ch) >> 1) + 1; in rtw89_phy_get_txsc()
782 txsc_idx = (10 - (pri_ch - central_ch)) >> 1; in rtw89_phy_get_txsc()
784 txsc_idx = ((central_ch - pri_ch) >> 1) + 5; in rtw89_phy_get_txsc()
802 enum rtw89_bandwidth cbw = chan->band_width; in rtw89_phy_get_txsb()
803 u8 pri_ch = chan->primary_channel; in rtw89_phy_get_txsb()
804 u8 central_ch = chan->channel; in rtw89_phy_get_txsb()
816 txsb_idx = (pri_ch - central_ch + 6) / 4; in rtw89_phy_get_txsb()
822 txsb_idx = (pri_ch - central_ch + 14) / 4; in rtw89_phy_get_txsb()
824 txsb_idx = (pri_ch - central_ch + 12) / 8; in rtw89_phy_get_txsb()
830 txsb_idx = (pri_ch - central_ch + 30) / 4; in rtw89_phy_get_txsb()
832 txsb_idx = (pri_ch - central_ch + 28) / 8; in rtw89_phy_get_txsb()
834 txsb_idx = (pri_ch - central_ch + 24) / 16; in rtw89_phy_get_txsb()
855 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_read_rf()
856 const u32 *base_addr = chip->rf_base_addr; in rtw89_phy_read_rf()
859 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_read_rf()
900 if (!test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags)) in rtw89_phy_read_rf_a()
913 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_read_rf_v1()
978 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_read_rf_v2()
993 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_write_rf()
994 const u32 *base_addr = chip->rf_base_addr; in rtw89_phy_write_rf()
997 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_write_rf()
1057 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_write_rf_v1()
1117 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_write_rf_v2()
1131 return rtwdev->chip->ops->write_rf == rtw89_phy_write_rf_v1; in rtw89_chip_rf_v1()
1137 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_phy_bb_reset()
1139 chip->ops->bb_reset(rtwdev, phy_idx); in __rtw89_phy_bb_reset()
1145 if (rtwdev->dbcc_en) in rtw89_phy_bb_reset()
1156 if (reg->addr == 0xfe) { in rtw89_phy_config_bb_reg()
1158 } else if (reg->addr == 0xfd) { in rtw89_phy_config_bb_reg()
1160 } else if (reg->addr == 0xfc) { in rtw89_phy_config_bb_reg()
1162 } else if (reg->addr == 0xfb) { in rtw89_phy_config_bb_reg()
1164 } else if (reg->addr == 0xfa) { in rtw89_phy_config_bb_reg()
1166 } else if (reg->addr == 0xf9) { in rtw89_phy_config_bb_reg()
1168 } else if (reg->data == BYPASS_CR_DATA) { in rtw89_phy_config_bb_reg()
1169 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "Bypass CR 0x%x\n", reg->addr); in rtw89_phy_config_bb_reg()
1171 addr = reg->addr; in rtw89_phy_config_bb_reg()
1174 addr += rtw89_phy0_phy1_offset(rtwdev, reg->addr); in rtw89_phy_config_bb_reg()
1176 rtw89_phy_write32(rtwdev, addr, reg->data); in rtw89_phy_config_bb_reg()
1200 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain.ax; in rtw89_phy_cfg_bb_gain_error()
1209 gain->lna_gain[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_error()
1213 gain->lna_gain[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_error()
1217 gain->tia_gain[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_error()
1239 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain.ax; in rtw89_phy_cfg_bb_rpl_ofst()
1250 gain->rpl_ofst_20[gband][path] = (s8)data; in rtw89_phy_cfg_bb_rpl_ofst()
1254 gain->rpl_ofst_40[gband][path][0] = (s8)data; in rtw89_phy_cfg_bb_rpl_ofst()
1259 gain->rpl_ofst_40[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1265 gain->rpl_ofst_80[gband][path][0] = (s8)data; in rtw89_phy_cfg_bb_rpl_ofst()
1270 gain->rpl_ofst_80[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1276 gain->rpl_ofst_80[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1282 gain->rpl_ofst_160[gband][path][0] = (s8)data; in rtw89_phy_cfg_bb_rpl_ofst()
1287 gain->rpl_ofst_160[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1293 gain->rpl_ofst_160[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1299 gain->rpl_ofst_160[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1305 gain->rpl_ofst_160[gband][path][rxsc] = ofst; in rtw89_phy_cfg_bb_rpl_ofst()
1321 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain.ax; in rtw89_phy_cfg_bb_gain_bypass()
1330 gain->lna_gain_bypass[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_bypass()
1334 gain->lna_gain_bypass[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_bypass()
1348 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain.ax; in rtw89_phy_cfg_bb_gain_op1db()
1357 gain->lna_op1db[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_op1db()
1361 gain->lna_op1db[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_op1db()
1365 gain->tia_lna_op1db[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_op1db()
1369 gain->tia_lna_op1db[gband][path][i] = data & 0xff; in rtw89_phy_cfg_bb_gain_op1db()
1384 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_config_bb_gain_ax()
1385 union rtw89_phy_bb_gain_arg arg = { .addr = reg->addr }; in rtw89_phy_config_bb_gain_ax()
1386 struct rtw89_efuse *efuse = &rtwdev->efuse; in rtw89_phy_config_bb_gain_ax()
1391 if (arg.path >= chip->rf_path_num) in rtw89_phy_config_bb_gain_ax()
1401 rtw89_phy_cfg_bb_gain_error(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain_ax()
1404 rtw89_phy_cfg_bb_rpl_ofst(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain_ax()
1407 rtw89_phy_cfg_bb_gain_bypass(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain_ax()
1410 rtw89_phy_cfg_bb_gain_op1db(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain_ax()
1414 if (efuse->rfe_type < 50) in rtw89_phy_config_bb_gain_ax()
1420 arg.addr, reg->data, arg.cfg_type); in rtw89_phy_config_bb_gain_ax()
1431 u16 idx = info->curr_idx % RTW89_H2C_RF_PAGE_SIZE; in rtw89_phy_cofig_rf_reg_store()
1432 u8 page = info->curr_idx / RTW89_H2C_RF_PAGE_SIZE; in rtw89_phy_cofig_rf_reg_store()
1436 rf_path, info->curr_idx); in rtw89_phy_cofig_rf_reg_store()
1440 info->rtw89_phy_config_rf_h2c[page][idx] = in rtw89_phy_cofig_rf_reg_store()
1441 cpu_to_le32((reg->addr << 20) | reg->data); in rtw89_phy_cofig_rf_reg_store()
1442 info->curr_idx++; in rtw89_phy_cofig_rf_reg_store()
1448 u16 remain = info->curr_idx; in rtw89_phy_config_rf_reg_fw()
1457 ret = -EINVAL; in rtw89_phy_config_rf_reg_fw()
1461 for (i = 0; i < RTW89_H2C_RF_PAGE_NUM && remain; i++, remain -= len) { in rtw89_phy_config_rf_reg_fw()
1468 info->curr_idx = 0; in rtw89_phy_config_rf_reg_fw()
1478 u32 addr = reg->addr; in rtw89_phy_config_rf_reg_noio()
1496 if (reg->addr == 0xfe) { in rtw89_phy_config_rf_reg()
1498 } else if (reg->addr == 0xfd) { in rtw89_phy_config_rf_reg()
1500 } else if (reg->addr == 0xfc) { in rtw89_phy_config_rf_reg()
1502 } else if (reg->addr == 0xfb) { in rtw89_phy_config_rf_reg()
1504 } else if (reg->addr == 0xfa) { in rtw89_phy_config_rf_reg()
1506 } else if (reg->addr == 0xf9) { in rtw89_phy_config_rf_reg()
1509 rtw89_write_rf(rtwdev, rf_path, reg->addr, 0xfffff, reg->data); in rtw89_phy_config_rf_reg()
1520 rtw89_write_rf(rtwdev, rf_path, reg->addr, RFREG_MASK, reg->data); in rtw89_phy_config_rf_reg_v1()
1522 if (reg->addr < 0x100) in rtw89_phy_config_rf_reg_v1()
1543 for (i = 0; i < table->n_regs; i++) { in rtw89_phy_sel_headline()
1544 reg = &table->regs[i]; in rtw89_phy_sel_headline()
1545 headline = get_phy_headline(reg->addr); in rtw89_phy_sel_headline()
1556 reg = &table->regs[i]; in rtw89_phy_sel_headline()
1557 target = get_phy_target(reg->addr); in rtw89_phy_sel_headline()
1567 reg = &table->regs[i]; in rtw89_phy_sel_headline()
1568 target = get_phy_target(reg->addr); in rtw89_phy_sel_headline()
1577 reg = &table->regs[i]; in rtw89_phy_sel_headline()
1578 rfe_para = get_phy_cond_rfe(reg->addr); in rtw89_phy_sel_headline()
1579 cv_para = get_phy_cond_cv(reg->addr); in rtw89_phy_sel_headline()
1594 reg = &table->regs[i]; in rtw89_phy_sel_headline()
1595 rfe_para = get_phy_cond_rfe(reg->addr); in rtw89_phy_sel_headline()
1596 cv_para = get_phy_cond_cv(reg->addr); in rtw89_phy_sel_headline()
1609 return -EINVAL; in rtw89_phy_sel_headline()
1621 enum rtw89_rf_path rf_path = table->rf_path; in rtw89_phy_init_reg()
1622 u8 rfe = rtwdev->efuse.rfe_type; in rtw89_phy_init_reg()
1623 u8 cv = rtwdev->hal.cv; in rtw89_phy_init_reg()
1639 cfg_target = get_phy_target(table->regs[headline_idx].addr); in rtw89_phy_init_reg()
1640 for (i = headline_size; i < table->n_regs; i++) { in rtw89_phy_init_reg()
1641 reg = &table->regs[i]; in rtw89_phy_init_reg()
1642 cond = get_phy_cond(reg->addr); in rtw89_phy_init_reg()
1646 target = get_phy_target(reg->addr); in rtw89_phy_init_reg()
1652 reg->addr, reg->data); in rtw89_phy_init_reg()
1684 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_phy_init_bb_reg()
1685 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_bb_reg()
1689 bb_table = elm_info->bb_tbl ? elm_info->bb_tbl : chip->bb_table; in rtw89_phy_init_bb_reg()
1691 if (rtwdev->dbcc_en) in rtw89_phy_init_bb_reg()
1697 bb_gain_table = elm_info->bb_gain ? elm_info->bb_gain : chip->bb_gain_table; in rtw89_phy_init_bb_reg()
1700 chip->phy_def->config_bb_gain, NULL); in rtw89_phy_init_bb_reg()
1716 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_phy_init_rf_reg()
1717 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_rf_reg()
1726 for (path = RF_PATH_A; path < chip->rf_path_num; path++) { in rtw89_phy_init_rf_reg()
1727 rf_table = elm_info->rf_radio[path] ? in rtw89_phy_init_rf_reg()
1728 elm_info->rf_radio[path] : chip->rf_table[path]; in rtw89_phy_init_rf_reg()
1729 rf_reg_info->rf_path = rf_table->rf_path; in rtw89_phy_init_rf_reg()
1733 config = rf_table->config ? rf_table->config : in rtw89_phy_init_rf_reg()
1738 rf_reg_info->rf_path); in rtw89_phy_init_rf_reg()
1745 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_preinit_rf_nctl_ax()
1753 if (chip->chip_id != RTL8851B) in rtw89_phy_preinit_rf_nctl_ax()
1755 if (chip->chip_id == RTL8852B || chip->chip_id == RTL8852BT) in rtw89_phy_preinit_rf_nctl_ax()
1769 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_phy_init_rf_nctl()
1770 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_rf_nctl()
1775 nctl_table = elm_info->rf_nctl ? elm_info->rf_nctl : chip->nctl_table; in rtw89_phy_init_rf_nctl()
1778 if (chip->nctl_post_table) in rtw89_phy_init_rf_nctl()
1779 rtw89_rfk_parser(rtwdev, chip->nctl_post_table); in rtw89_phy_init_rf_nctl()
1816 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) in rtw89_phy_write32_idx()
1825 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) in rtw89_phy_write32_idx_set()
1834 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) in rtw89_phy_write32_idx_clr()
1843 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) in rtw89_phy_read32_idx()
1854 if (!rtwdev->dbcc_en) in rtw89_phy_set_phy_regs()
1867 for (i = 0; i < tbl->size; i++) { in rtw89_phy_write_reg3_tbl()
1868 reg3 = &tbl->reg3[i]; in rtw89_phy_write_reg3_tbl()
1869 rtw89_phy_write32_mask(rtwdev, reg3->addr, reg3->mask, reg3->data); in rtw89_phy_write_reg3_tbl()
1888 #define RTW89_ANT_GAIN_2GHZ_MIN -8
1890 #define RTW89_ANT_GAIN_5GHZ_MIN -8
1892 #define RTW89_ANT_GAIN_6GHZ_MIN -8
1901 struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain; in rtw89_phy_ant_gain_init()
1902 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_ant_gain_init()
1910 if (!chip->support_ant_gain) in rtw89_phy_ant_gain_init()
1935 ant_gain->regd_enabled |= BIT(regd); in rtw89_phy_ant_gain_init()
1944 val = RTW89_ANT_GAIN_REF_2GHZ - in rtw89_phy_ant_gain_init()
1953 val = RTW89_ANT_GAIN_REF_5GHZ - in rtw89_phy_ant_gain_init()
1964 val = RTW89_ANT_GAIN_REF_6GHZ - in rtw89_phy_ant_gain_init()
1969 ant_gain->offset[i][j] = val; in rtw89_phy_ant_gain_init()
2018 struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain; in rtw89_phy_ant_gain_query()
2025 subband_l = span->ant_gain_subband_low; in rtw89_phy_ant_gain_query()
2026 subband_h = span->ant_gain_subband_high; in rtw89_phy_ant_gain_query()
2036 return min(ant_gain->offset[path][subband_l], in rtw89_phy_ant_gain_query()
2037 ant_gain->offset[path][subband_h]); in rtw89_phy_ant_gain_query()
2047 if (RTW89_CHK_FW_FEATURE(NO_POWER_DIFFERENCE, &rtwdev->fw)) in rtw89_phy_ant_gain_offset()
2055 const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms; in rtw89_can_apply_ant_gain()
2056 struct rtw89_ant_gain_info *ant_gain = &rtwdev->ant_gain; in rtw89_can_apply_ant_gain()
2057 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_can_apply_ant_gain()
2060 if (!chip->support_ant_gain) in rtw89_can_apply_ant_gain()
2063 if (ant_gain->block_country || !(ant_gain->regd_enabled & BIT(regd))) in rtw89_can_apply_ant_gain()
2066 if (!rfe_parms->has_da) in rtw89_can_apply_ant_gain()
2077 if (!rtw89_can_apply_ant_gain(rtwdev, chan->band_type)) in rtw89_phy_ant_gain_pwr_offset()
2080 if (RTW89_CHK_FW_FEATURE(NO_POWER_DIFFERENCE, &rtwdev->fw)) in rtw89_phy_ant_gain_pwr_offset()
2083 offset_patha = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_A, chan->freq); in rtw89_phy_ant_gain_pwr_offset()
2084 offset_pathb = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_B, chan->freq); in rtw89_phy_ant_gain_pwr_offset()
2086 return rtw89_phy_txpwr_rf_to_bb(rtwdev, offset_patha - offset_pathb); in rtw89_phy_ant_gain_pwr_offset()
2096 if (!rtw89_can_apply_ant_gain(rtwdev, chan->band_type)) { in rtw89_print_ant_gain()
2097 p += scnprintf(p, end - p, "no DAG is applied\n"); in rtw89_print_ant_gain()
2101 offset_patha = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_A, chan->freq); in rtw89_print_ant_gain()
2102 offset_pathb = rtw89_phy_ant_gain_query(rtwdev, RF_PATH_B, chan->freq); in rtw89_print_ant_gain()
2104 p += scnprintf(p, end - p, "ChainA offset: %d dBm\n", offset_patha); in rtw89_print_ant_gain()
2105 p += scnprintf(p, end - p, "ChainB offset: %d dBm\n", offset_pathb); in rtw89_print_ant_gain()
2108 return p - buf; in rtw89_print_ant_gain()
2131 switch (desc->rs) { in rtw89_phy_raw_byr_seek()
2133 return &head->cck[desc->idx]; in rtw89_phy_raw_byr_seek()
2135 return &head->ofdm[desc->idx]; in rtw89_phy_raw_byr_seek()
2137 return &head->mcs[desc->ofdma][desc->nss][desc->idx]; in rtw89_phy_raw_byr_seek()
2139 return &head->hedcm[desc->ofdma][desc->nss][desc->idx]; in rtw89_phy_raw_byr_seek()
2141 return &head->offset[desc->idx]; in rtw89_phy_raw_byr_seek()
2143 rtw89_warn(rtwdev, "unrecognized byr rs: %d\n", desc->rs); in rtw89_phy_raw_byr_seek()
2144 return &head->trap; in rtw89_phy_raw_byr_seek()
2151 const struct rtw89_txpwr_byrate_cfg *cfg = tbl->data; in rtw89_phy_load_txpwr_byrate()
2152 const struct rtw89_txpwr_byrate_cfg *end = cfg + tbl->size; in rtw89_phy_load_txpwr_byrate()
2160 byr_head = &rtwdev->byr[cfg->band][0]; in rtw89_phy_load_txpwr_byrate()
2161 desc.rs = cfg->rs; in rtw89_phy_load_txpwr_byrate()
2162 desc.nss = cfg->nss; in rtw89_phy_load_txpwr_byrate()
2163 data = cfg->data; in rtw89_phy_load_txpwr_byrate()
2165 for (i = 0; i < cfg->len; i++, data >>= 8) { in rtw89_phy_load_txpwr_byrate()
2166 desc.idx = cfg->shf + i; in rtw89_phy_load_txpwr_byrate()
2180 dbm -= tssi_max_deviation; in rtw89_phy_txpwr_dbm_without_tolerance()
2187 struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory; in rtw89_phy_get_tpe_constraint()
2188 const struct rtw89_reg_6ghz_tpe *tpe = ®ulatory->reg_6ghz_tpe; in rtw89_phy_get_tpe_constraint()
2191 if (band == RTW89_BAND_6G && tpe->valid) in rtw89_phy_get_tpe_constraint()
2192 cstr = rtw89_phy_txpwr_dbm_without_tolerance(tpe->constraint); in rtw89_phy_get_tpe_constraint()
2203 if (rate_desc->rs == RTW89_RS_CCK) in rtw89_phy_read_txpwr_byrate()
2206 byr_head = &rtwdev->byr[band][bw]; in rtw89_phy_read_txpwr_byrate()
2216 return (channel_6g - 1) / 2; in rtw89_channel_6g_to_idx()
2218 return (channel_6g - 3) / 2; in rtw89_channel_6g_to_idx()
2220 return (channel_6g - 5) / 2; in rtw89_channel_6g_to_idx()
2222 return (channel_6g - 7) / 2; in rtw89_channel_6g_to_idx()
2224 return (channel_6g - 9) / 2; in rtw89_channel_6g_to_idx()
2226 return (channel_6g - 11) / 2; in rtw89_channel_6g_to_idx()
2228 return (channel_6g - 13) / 2; in rtw89_channel_6g_to_idx()
2230 return (channel_6g - 15) / 2; in rtw89_channel_6g_to_idx()
2244 return channel - 1; in rtw89_channel_to_idx()
2246 return (channel - 36) / 2; in rtw89_channel_to_idx()
2248 return ((channel - 100) / 2) + 15; in rtw89_channel_to_idx()
2250 return ((channel - 149) / 2) + 38; in rtw89_channel_to_idx()
2260 const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms; in rtw89_phy_read_txpwr_limit()
2261 const struct rtw89_txpwr_rule_2ghz *rule_da_2ghz = &rfe_parms->rule_da_2ghz; in rtw89_phy_read_txpwr_limit()
2262 const struct rtw89_txpwr_rule_5ghz *rule_da_5ghz = &rfe_parms->rule_da_5ghz; in rtw89_phy_read_txpwr_limit()
2263 const struct rtw89_txpwr_rule_6ghz *rule_da_6ghz = &rfe_parms->rule_da_6ghz; in rtw89_phy_read_txpwr_limit()
2264 const struct rtw89_txpwr_rule_2ghz *rule_2ghz = &rfe_parms->rule_2ghz; in rtw89_phy_read_txpwr_limit()
2265 const struct rtw89_txpwr_rule_5ghz *rule_5ghz = &rfe_parms->rule_5ghz; in rtw89_phy_read_txpwr_limit()
2266 const struct rtw89_txpwr_rule_6ghz *rule_6ghz = &rfe_parms->rule_6ghz; in rtw89_phy_read_txpwr_limit()
2267 struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory; in rtw89_phy_read_txpwr_limit()
2274 u8 reg6 = regulatory->reg_6ghz_power; in rtw89_phy_read_txpwr_limit()
2284 da_lmt = (*rule_da_2ghz->lmt)[bw][ntx][rs][bf][regd][ch_idx]; in rtw89_phy_read_txpwr_limit()
2286 lmt = (*rule_2ghz->lmt)[bw][ntx][rs][bf][regd][ch_idx]; in rtw89_phy_read_txpwr_limit()
2290 lmt = (*rule_2ghz->lmt)[bw][ntx][rs][bf][RTW89_WW][ch_idx]; in rtw89_phy_read_txpwr_limit()
2294 da_lmt = (*rule_da_5ghz->lmt)[bw][ntx][rs][bf][regd][ch_idx]; in rtw89_phy_read_txpwr_limit()
2296 lmt = (*rule_5ghz->lmt)[bw][ntx][rs][bf][regd][ch_idx]; in rtw89_phy_read_txpwr_limit()
2300 lmt = (*rule_5ghz->lmt)[bw][ntx][rs][bf][RTW89_WW][ch_idx]; in rtw89_phy_read_txpwr_limit()
2304 da_lmt = (*rule_da_6ghz->lmt)[bw][ntx][rs][bf][regd][reg6][ch_idx]; in rtw89_phy_read_txpwr_limit()
2306 lmt = (*rule_6ghz->lmt)[bw][ntx][rs][bf][regd][reg6][ch_idx]; in rtw89_phy_read_txpwr_limit()
2310 lmt = (*rule_6ghz->lmt)[bw][ntx][rs][bf][RTW89_WW] in rtw89_phy_read_txpwr_limit()
2346 __fill_txpwr_limit_nonbf_bf(lmt->cck_20m, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_20m_ax()
2348 __fill_txpwr_limit_nonbf_bf(lmt->cck_40m, band, RTW89_CHANNEL_WIDTH_40, in rtw89_phy_fill_txpwr_limit_20m_ax()
2350 __fill_txpwr_limit_nonbf_bf(lmt->ofdm, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_20m_ax()
2352 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], band, in rtw89_phy_fill_txpwr_limit_20m_ax()
2361 __fill_txpwr_limit_nonbf_bf(lmt->cck_20m, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_40m_ax()
2362 ntx, RTW89_RS_CCK, ch - 2); in rtw89_phy_fill_txpwr_limit_40m_ax()
2363 __fill_txpwr_limit_nonbf_bf(lmt->cck_40m, band, RTW89_CHANNEL_WIDTH_40, in rtw89_phy_fill_txpwr_limit_40m_ax()
2365 __fill_txpwr_limit_nonbf_bf(lmt->ofdm, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_40m_ax()
2367 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], band, in rtw89_phy_fill_txpwr_limit_40m_ax()
2369 ntx, RTW89_RS_MCS, ch - 2); in rtw89_phy_fill_txpwr_limit_40m_ax()
2370 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], band, in rtw89_phy_fill_txpwr_limit_40m_ax()
2373 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[0], band, in rtw89_phy_fill_txpwr_limit_40m_ax()
2386 __fill_txpwr_limit_nonbf_bf(lmt->ofdm, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_80m_ax()
2388 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2390 ntx, RTW89_RS_MCS, ch - 6); in rtw89_phy_fill_txpwr_limit_80m_ax()
2391 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2393 ntx, RTW89_RS_MCS, ch - 2); in rtw89_phy_fill_txpwr_limit_80m_ax()
2394 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[2], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2397 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[3], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2400 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[0], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2402 ntx, RTW89_RS_MCS, ch - 4); in rtw89_phy_fill_txpwr_limit_80m_ax()
2403 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[1], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2406 __fill_txpwr_limit_nonbf_bf(lmt->mcs_80m[0], band, in rtw89_phy_fill_txpwr_limit_80m_ax()
2411 ntx, RTW89_RS_MCS, ch - 4); in rtw89_phy_fill_txpwr_limit_80m_ax()
2416 lmt->mcs_40m_0p5[i] = min_t(s8, val_0p5_n[i], val_0p5_p[i]); in rtw89_phy_fill_txpwr_limit_80m_ax()
2430 __fill_txpwr_limit_nonbf_bf(lmt->ofdm, band, RTW89_CHANNEL_WIDTH_20, in rtw89_phy_fill_txpwr_limit_160m_ax()
2434 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[0], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2436 ntx, RTW89_RS_MCS, ch - 14); in rtw89_phy_fill_txpwr_limit_160m_ax()
2437 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[1], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2439 ntx, RTW89_RS_MCS, ch - 10); in rtw89_phy_fill_txpwr_limit_160m_ax()
2440 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[2], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2442 ntx, RTW89_RS_MCS, ch - 6); in rtw89_phy_fill_txpwr_limit_160m_ax()
2443 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[3], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2445 ntx, RTW89_RS_MCS, ch - 2); in rtw89_phy_fill_txpwr_limit_160m_ax()
2446 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[4], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2449 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[5], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2452 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[6], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2455 __fill_txpwr_limit_nonbf_bf(lmt->mcs_20m[7], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2460 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[0], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2462 ntx, RTW89_RS_MCS, ch - 12); in rtw89_phy_fill_txpwr_limit_160m_ax()
2463 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[1], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2465 ntx, RTW89_RS_MCS, ch - 4); in rtw89_phy_fill_txpwr_limit_160m_ax()
2466 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[2], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2469 __fill_txpwr_limit_nonbf_bf(lmt->mcs_40m[3], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2474 __fill_txpwr_limit_nonbf_bf(lmt->mcs_80m[0], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2476 ntx, RTW89_RS_MCS, ch - 8); in rtw89_phy_fill_txpwr_limit_160m_ax()
2477 __fill_txpwr_limit_nonbf_bf(lmt->mcs_80m[1], band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2482 __fill_txpwr_limit_nonbf_bf(lmt->mcs_160m, band, in rtw89_phy_fill_txpwr_limit_160m_ax()
2488 ntx, RTW89_RS_MCS, ch - 4); in rtw89_phy_fill_txpwr_limit_160m_ax()
2493 lmt->mcs_40m_0p5[i] = min_t(s8, val_0p5_n[i], val_0p5_p[i]); in rtw89_phy_fill_txpwr_limit_160m_ax()
2497 ntx, RTW89_RS_MCS, ch - 8); in rtw89_phy_fill_txpwr_limit_160m_ax()
2502 lmt->mcs_40m_2p5[i] = min_t(s8, val_2p5_n[i], val_2p5_p[i]); in rtw89_phy_fill_txpwr_limit_160m_ax()
2511 u8 band = chan->band_type; in rtw89_phy_fill_txpwr_limit_ax()
2512 u8 pri_ch = chan->primary_channel; in rtw89_phy_fill_txpwr_limit_ax()
2513 u8 ch = chan->channel; in rtw89_phy_fill_txpwr_limit_ax()
2514 u8 bw = chan->band_width; in rtw89_phy_fill_txpwr_limit_ax()
2540 const struct rtw89_rfe_parms *rfe_parms = rtwdev->rfe_parms; in rtw89_phy_read_txpwr_limit_ru()
2541 const struct rtw89_txpwr_rule_2ghz *rule_da_2ghz = &rfe_parms->rule_da_2ghz; in rtw89_phy_read_txpwr_limit_ru()
2542 const struct rtw89_txpwr_rule_5ghz *rule_da_5ghz = &rfe_parms->rule_da_5ghz; in rtw89_phy_read_txpwr_limit_ru()
2543 const struct rtw89_txpwr_rule_6ghz *rule_da_6ghz = &rfe_parms->rule_da_6ghz; in rtw89_phy_read_txpwr_limit_ru()
2544 const struct rtw89_txpwr_rule_2ghz *rule_2ghz = &rfe_parms->rule_2ghz; in rtw89_phy_read_txpwr_limit_ru()
2545 const struct rtw89_txpwr_rule_5ghz *rule_5ghz = &rfe_parms->rule_5ghz; in rtw89_phy_read_txpwr_limit_ru()
2546 const struct rtw89_txpwr_rule_6ghz *rule_6ghz = &rfe_parms->rule_6ghz; in rtw89_phy_read_txpwr_limit_ru()
2547 struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory; in rtw89_phy_read_txpwr_limit_ru()
2554 u8 reg6 = regulatory->reg_6ghz_power; in rtw89_phy_read_txpwr_limit_ru()
2564 da_lmt_ru = (*rule_da_2ghz->lmt_ru)[ru][ntx][regd][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2566 lmt_ru = (*rule_2ghz->lmt_ru)[ru][ntx][regd][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2570 lmt_ru = (*rule_2ghz->lmt_ru)[ru][ntx][RTW89_WW][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2574 da_lmt_ru = (*rule_da_5ghz->lmt_ru)[ru][ntx][regd][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2576 lmt_ru = (*rule_5ghz->lmt_ru)[ru][ntx][regd][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2580 lmt_ru = (*rule_5ghz->lmt_ru)[ru][ntx][RTW89_WW][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2584 da_lmt_ru = (*rule_da_6ghz->lmt_ru)[ru][ntx][regd][reg6][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2586 lmt_ru = (*rule_6ghz->lmt_ru)[ru][ntx][regd][reg6][ch_idx]; in rtw89_phy_read_txpwr_limit_ru()
2590 lmt_ru = (*rule_6ghz->lmt_ru)[ru][ntx][RTW89_WW] in rtw89_phy_read_txpwr_limit_ru()
2615 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m_ax()
2618 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m_ax()
2621 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m_ax()
2631 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2633 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2634 lmt_ru->ru26[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2637 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2639 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2640 lmt_ru->ru52[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2643 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2645 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2646 lmt_ru->ru106[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m_ax()
2656 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2658 ntx, ch - 6); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2659 lmt_ru->ru26[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2661 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2662 lmt_ru->ru26[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2665 lmt_ru->ru26[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2668 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2670 ntx, ch - 6); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2671 lmt_ru->ru52[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2673 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2674 lmt_ru->ru52[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2677 lmt_ru->ru52[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2680 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2682 ntx, ch - 6); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2683 lmt_ru->ru106[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2685 ntx, ch - 2); in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2686 lmt_ru->ru106[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2689 lmt_ru->ru106[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m_ax()
2699 static const int ofst[] = { -14, -10, -6, -2, 2, 6, 10, 14 }; in rtw89_phy_fill_txpwr_limit_ru_160m_ax()
2704 lmt_ru->ru26[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m_ax()
2708 lmt_ru->ru52[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m_ax()
2712 lmt_ru->ru106[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m_ax()
2725 u8 band = chan->band_type; in rtw89_phy_fill_txpwr_limit_ru_ax()
2726 u8 ch = chan->channel; in rtw89_phy_fill_txpwr_limit_ru_ax()
2727 u8 bw = chan->band_width; in rtw89_phy_fill_txpwr_limit_ru_ax()
2755 u8 max_nss_num = rtwdev->chip->rf_path_num; in rtw89_phy_set_txpwr_byrate_ax()
2763 u8 band = chan->band_type; in rtw89_phy_set_txpwr_byrate_ax()
2764 u8 ch = chan->channel; in rtw89_phy_set_txpwr_byrate_ax()
2816 u8 band = chan->band_type; in rtw89_phy_set_txpwr_offset_ax()
2840 u8 max_ntx_num = rtwdev->chip->rf_path_num; in rtw89_phy_set_txpwr_limit_ax()
2842 u8 ch = chan->channel; in rtw89_phy_set_txpwr_limit_ax()
2843 u8 bw = chan->band_width; in rtw89_phy_set_txpwr_limit_ax()
2875 u8 max_ntx_num = rtwdev->chip->rf_path_num; in rtw89_phy_set_txpwr_limit_ru_ax()
2877 u8 ch = chan->channel; in rtw89_phy_set_txpwr_limit_ru_ax()
2878 u8 bw = chan->band_width; in rtw89_phy_set_txpwr_limit_ru_ax()
2915 struct rtw89_dev *rtwdev = ra_data->rtwdev; in __rtw89_phy_c2h_ra_rpt_iter()
2917 (const struct rtw89_c2h_ra_rpt *)ra_data->c2h->data; in __rtw89_phy_c2h_ra_rpt_iter()
2918 struct rtw89_ra_report *ra_report = &rtwsta_link->ra_report; in __rtw89_phy_c2h_ra_rpt_iter()
2919 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_phy_c2h_ra_rpt_iter()
2920 bool format_v1 = chip->chip_gen == RTW89_CHIP_BE; in __rtw89_phy_c2h_ra_rpt_iter()
2927 mac_id = le32_get_bits(c2h->w2, RTW89_C2H_RA_RPT_W2_MACID); in __rtw89_phy_c2h_ra_rpt_iter()
2928 if (mac_id != rtwsta_link->mac_id) in __rtw89_phy_c2h_ra_rpt_iter()
2931 rate = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_MCSNSS); in __rtw89_phy_c2h_ra_rpt_iter()
2932 bw = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_BW); in __rtw89_phy_c2h_ra_rpt_iter()
2933 giltf = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_GILTF); in __rtw89_phy_c2h_ra_rpt_iter()
2934 mode = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_MD_SEL); in __rtw89_phy_c2h_ra_rpt_iter()
2937 t = le32_get_bits(c2h->w2, RTW89_C2H_RA_RPT_W2_MCSNSS_B7); in __rtw89_phy_c2h_ra_rpt_iter()
2939 t = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_BW_B2); in __rtw89_phy_c2h_ra_rpt_iter()
2941 t = le32_get_bits(c2h->w3, RTW89_C2H_RA_RPT_W3_MD_SEL_B2); in __rtw89_phy_c2h_ra_rpt_iter()
2951 memset(&ra_report->txrate, 0, sizeof(ra_report->txrate)); in __rtw89_phy_c2h_ra_rpt_iter()
2955 ra_report->txrate.legacy = legacy_bitrate; in __rtw89_phy_c2h_ra_rpt_iter()
2958 ra_report->txrate.flags |= RATE_INFO_FLAGS_MCS; in __rtw89_phy_c2h_ra_rpt_iter()
2959 if (RTW89_CHK_FW_FEATURE(OLD_HT_RA_FORMAT, &rtwdev->fw)) in __rtw89_phy_c2h_ra_rpt_iter()
2964 ra_report->txrate.mcs = rate; in __rtw89_phy_c2h_ra_rpt_iter()
2966 ra_report->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in __rtw89_phy_c2h_ra_rpt_iter()
2967 mcs = ra_report->txrate.mcs & 0x07; in __rtw89_phy_c2h_ra_rpt_iter()
2970 ra_report->txrate.flags |= RATE_INFO_FLAGS_VHT_MCS; in __rtw89_phy_c2h_ra_rpt_iter()
2971 ra_report->txrate.mcs = format_v1 ? in __rtw89_phy_c2h_ra_rpt_iter()
2974 ra_report->txrate.nss = format_v1 ? in __rtw89_phy_c2h_ra_rpt_iter()
2978 ra_report->txrate.flags |= RATE_INFO_FLAGS_SHORT_GI; in __rtw89_phy_c2h_ra_rpt_iter()
2979 mcs = ra_report->txrate.mcs; in __rtw89_phy_c2h_ra_rpt_iter()
2982 ra_report->txrate.flags |= RATE_INFO_FLAGS_HE_MCS; in __rtw89_phy_c2h_ra_rpt_iter()
2983 ra_report->txrate.mcs = format_v1 ? in __rtw89_phy_c2h_ra_rpt_iter()
2986 ra_report->txrate.nss = format_v1 ? in __rtw89_phy_c2h_ra_rpt_iter()
2990 ra_report->txrate.he_gi = NL80211_RATE_INFO_HE_GI_0_8; in __rtw89_phy_c2h_ra_rpt_iter()
2992 ra_report->txrate.he_gi = NL80211_RATE_INFO_HE_GI_1_6; in __rtw89_phy_c2h_ra_rpt_iter()
2994 ra_report->txrate.he_gi = NL80211_RATE_INFO_HE_GI_3_2; in __rtw89_phy_c2h_ra_rpt_iter()
2995 mcs = ra_report->txrate.mcs; in __rtw89_phy_c2h_ra_rpt_iter()
2998 ra_report->txrate.flags |= RATE_INFO_FLAGS_EHT_MCS; in __rtw89_phy_c2h_ra_rpt_iter()
2999 ra_report->txrate.mcs = u8_get_bits(rate, RTW89_RA_RATE_MASK_MCS_V1); in __rtw89_phy_c2h_ra_rpt_iter()
3000 ra_report->txrate.nss = u8_get_bits(rate, RTW89_RA_RATE_MASK_NSS_V1) + 1; in __rtw89_phy_c2h_ra_rpt_iter()
3002 ra_report->txrate.eht_gi = NL80211_RATE_INFO_EHT_GI_0_8; in __rtw89_phy_c2h_ra_rpt_iter()
3004 ra_report->txrate.eht_gi = NL80211_RATE_INFO_EHT_GI_1_6; in __rtw89_phy_c2h_ra_rpt_iter()
3006 ra_report->txrate.eht_gi = NL80211_RATE_INFO_EHT_GI_3_2; in __rtw89_phy_c2h_ra_rpt_iter()
3007 mcs = ra_report->txrate.mcs; in __rtw89_phy_c2h_ra_rpt_iter()
3011 ra_report->txrate.bw = rtw89_hw_to_rate_info_bw(bw); in __rtw89_phy_c2h_ra_rpt_iter()
3012 ra_report->bit_rate = cfg80211_calculate_bitrate(&ra_report->txrate); in __rtw89_phy_c2h_ra_rpt_iter()
3013 ra_report->hw_rate = format_v1 ? in __rtw89_phy_c2h_ra_rpt_iter()
3018 ra_report->might_fallback_legacy = mcs <= 2; in __rtw89_phy_c2h_ra_rpt_iter()
3019 link_sta->agg.max_rc_amsdu_len = get_max_amsdu_len(rtwdev, ra_report); in __rtw89_phy_c2h_ra_rpt_iter()
3020 rtwsta_link->max_agg_wait = link_sta->agg.max_rc_amsdu_len / 1500 - 1; in __rtw89_phy_c2h_ra_rpt_iter()
3048 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_c2h_ra_rpt()
3070 (const struct rtw89_c2h_fw_scan_rpt *)c2h->data; in rtw89_phy_c2h_fw_scan_rpt()
3073 "%s: band: %u, op_chan: %u, PD_low_bd(ofdm, cck): (-%d, %d), phy_idx: %u\n", in rtw89_phy_c2h_fw_scan_rpt()
3074 __func__, c2h_rpt->band, c2h_rpt->center_ch, in rtw89_phy_c2h_fw_scan_rpt()
3075 PD_LOWER_BOUND_BASE - (c2h_rpt->ofdm_pd_idx << 1), in rtw89_phy_c2h_fw_scan_rpt()
3076 c2h_rpt->cck_pd_idx, c2h_rpt->phy_idx); in rtw89_phy_c2h_fw_scan_rpt()
3109 "[IQK] iqk->is_iqk_init = %x\n", iqk->is_iqk_init); in rtw89_phy_c2h_rfk_rpt_log()
3111 "[IQK] iqk->is_reload = %x\n", iqk->is_reload); in rtw89_phy_c2h_rfk_rpt_log()
3113 "[IQK] iqk->is_nbiqk = %x\n", iqk->is_nbiqk); in rtw89_phy_c2h_rfk_rpt_log()
3115 "[IQK] iqk->txiqk_en = %x\n", iqk->txiqk_en); in rtw89_phy_c2h_rfk_rpt_log()
3117 "[IQK] iqk->rxiqk_en = %x\n", iqk->rxiqk_en); in rtw89_phy_c2h_rfk_rpt_log()
3119 "[IQK] iqk->lok_en = %x\n", iqk->lok_en); in rtw89_phy_c2h_rfk_rpt_log()
3121 "[IQK] iqk->iqk_xym_en = %x\n", iqk->iqk_xym_en); in rtw89_phy_c2h_rfk_rpt_log()
3123 "[IQK] iqk->iqk_sram_en = %x\n", iqk->iqk_sram_en); in rtw89_phy_c2h_rfk_rpt_log()
3125 "[IQK] iqk->iqk_fft_en = %x\n", iqk->iqk_fft_en); in rtw89_phy_c2h_rfk_rpt_log()
3127 "[IQK] iqk->is_fw_iqk = %x\n", iqk->is_fw_iqk); in rtw89_phy_c2h_rfk_rpt_log()
3129 "[IQK] iqk->is_iqk_enable = %x\n", iqk->is_iqk_enable); in rtw89_phy_c2h_rfk_rpt_log()
3131 "[IQK] iqk->iqk_cfir_en = %x\n", iqk->iqk_cfir_en); in rtw89_phy_c2h_rfk_rpt_log()
3133 "[IQK] iqk->thermal_rek_en = %x\n", iqk->thermal_rek_en); in rtw89_phy_c2h_rfk_rpt_log()
3135 "[IQK] iqk->version = %x\n", iqk->version); in rtw89_phy_c2h_rfk_rpt_log()
3137 "[IQK] iqk->phy = %x\n", iqk->phy); in rtw89_phy_c2h_rfk_rpt_log()
3139 "[IQK] iqk->fwk_status = %x\n", iqk->fwk_status); in rtw89_phy_c2h_rfk_rpt_log()
3144 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_band[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3145 i, iqk->iqk_band[i]); in rtw89_phy_c2h_rfk_rpt_log()
3146 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_ch[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3147 i, iqk->iqk_ch[i]); in rtw89_phy_c2h_rfk_rpt_log()
3148 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_bw[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3149 i, iqk->iqk_bw[i]); in rtw89_phy_c2h_rfk_rpt_log()
3150 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->lok_idac[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3151 i, le32_to_cpu(iqk->lok_idac[i])); in rtw89_phy_c2h_rfk_rpt_log()
3152 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->lok_vbuf[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3153 i, le32_to_cpu(iqk->lok_vbuf[i])); in rtw89_phy_c2h_rfk_rpt_log()
3154 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_tx_fail[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3155 i, iqk->iqk_tx_fail[i]); in rtw89_phy_c2h_rfk_rpt_log()
3156 rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] iqk->iqk_rx_fail[%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3157 i, iqk->iqk_rx_fail[i]); in rtw89_phy_c2h_rfk_rpt_log()
3160 "[IQK] iqk->rftxgain[%d][%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3161 i, j, le32_to_cpu(iqk->rftxgain[i][j])); in rtw89_phy_c2h_rfk_rpt_log()
3164 "[IQK] iqk->tx_xym[%d][%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3165 i, j, le32_to_cpu(iqk->tx_xym[i][j])); in rtw89_phy_c2h_rfk_rpt_log()
3168 "[IQK] iqk->rfrxgain[%d][%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3169 i, j, le32_to_cpu(iqk->rfrxgain[i][j])); in rtw89_phy_c2h_rfk_rpt_log()
3172 "[IQK] iqk->rx_xym[%d][%d] = %x\n", in rtw89_phy_c2h_rfk_rpt_log()
3173 i, j, le32_to_cpu(iqk->rx_xym[i][j])); in rtw89_phy_c2h_rfk_rpt_log()
3183 dpk->ver, dpk->idx, dpk->band, dpk->bw, dpk->ch, dpk->path_ok); in rtw89_phy_c2h_rfk_rpt_log()
3186 dpk->txagc, dpk->ther, dpk->gs, dpk->dc_i, dpk->dc_q); in rtw89_phy_c2h_rfk_rpt_log()
3189 dpk->corr_val, dpk->corr_idx, dpk->is_timeout, dpk->rxbb_ov); in rtw89_phy_c2h_rfk_rpt_log()
3200 dack->fwdack_ver, dack->fwdack_info_ver, 0x2); in rtw89_phy_c2h_rfk_rpt_log()
3204 dack->addck_timeout, dack->cdack_timeout, dack->dadck_timeout, in rtw89_phy_c2h_rfk_rpt_log()
3205 dack->adgaink_timeout, dack->msbk_timeout); in rtw89_phy_c2h_rfk_rpt_log()
3207 "[DACK]DACK fail = 0x%x\n", dack->dack_fail); in rtw89_phy_c2h_rfk_rpt_log()
3209 "[DACK]S0 WBADCK = [0x%x]\n", dack->wbdck_d[0]); in rtw89_phy_c2h_rfk_rpt_log()
3211 "[DACK]S1 WBADCK = [0x%x]\n", dack->wbdck_d[1]); in rtw89_phy_c2h_rfk_rpt_log()
3213 "[DACK]DRCK = [0x%x]\n", dack->rck_d); in rtw89_phy_c2h_rfk_rpt_log()
3215 dack->cdack_d[0][0][0], dack->cdack_d[0][0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3217 dack->cdack_d[0][1][0], dack->cdack_d[0][1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3219 dack->cdack_d[1][0][0], dack->cdack_d[1][0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3221 dack->cdack_d[1][1][0], dack->cdack_d[1][1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3224 ((u32)dack->addck2_hd[0][0][0] << 8) | dack->addck2_ld[0][0][0], in rtw89_phy_c2h_rfk_rpt_log()
3225 ((u32)dack->addck2_hd[0][0][1] << 8) | dack->addck2_ld[0][0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3227 ((u32)dack->addck2_hd[0][1][0] << 8) | dack->addck2_ld[0][1][0], in rtw89_phy_c2h_rfk_rpt_log()
3228 ((u32)dack->addck2_hd[0][1][1] << 8) | dack->addck2_ld[0][1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3230 ((u32)dack->addck2_hd[1][0][0] << 8) | dack->addck2_ld[1][0][0], in rtw89_phy_c2h_rfk_rpt_log()
3231 ((u32)dack->addck2_hd[1][0][1] << 8) | dack->addck2_ld[1][0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3233 ((u32)dack->addck2_hd[1][1][0] << 8) | dack->addck2_ld[1][1][0], in rtw89_phy_c2h_rfk_rpt_log()
3234 ((u32)dack->addck2_hd[1][1][1] << 8) | dack->addck2_ld[1][1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3237 dack->adgaink_d[0][0], dack->adgaink_d[0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3239 dack->adgaink_d[1][0], dack->adgaink_d[1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3242 dack->dadck_d[0][0], dack->dadck_d[0][1]); in rtw89_phy_c2h_rfk_rpt_log()
3244 dack->dadck_d[1][0], dack->dadck_d[1][1]); in rtw89_phy_c2h_rfk_rpt_log()
3247 ((u32)dack->biask_hd[0][0] << 8) | dack->biask_ld[0][0]); in rtw89_phy_c2h_rfk_rpt_log()
3249 ((u32)dack->biask_hd[1][0] << 8) | dack->biask_ld[1][0]); in rtw89_phy_c2h_rfk_rpt_log()
3254 dack->msbk_d[0][0][i]); in rtw89_phy_c2h_rfk_rpt_log()
3259 dack->msbk_d[0][1][i]); in rtw89_phy_c2h_rfk_rpt_log()
3264 dack->msbk_d[1][0][i]); in rtw89_phy_c2h_rfk_rpt_log()
3269 dack->msbk_d[1][1][i]); in rtw89_phy_c2h_rfk_rpt_log()
3278 rxdck->ver, rxdck->band, rxdck->bw, rxdck->ch, in rtw89_phy_c2h_rfk_rpt_log()
3279 rxdck->timeout); in rtw89_phy_c2h_rfk_rpt_log()
3291 i, j, k, tssi->alignment_power_cw_h[i][j][k]); in rtw89_phy_c2h_rfk_rpt_log()
3294 i, j, k, tssi->alignment_power_cw_l[i][j][k]); in rtw89_phy_c2h_rfk_rpt_log()
3297 i, j, k, tssi->alignment_power[i][j][k]); in rtw89_phy_c2h_rfk_rpt_log()
3301 (tssi->alignment_power_cw_h[i][j][k] << 8) + in rtw89_phy_c2h_rfk_rpt_log()
3302 tssi->alignment_power_cw_l[i][j][k]); in rtw89_phy_c2h_rfk_rpt_log()
3307 i, j, tssi->tssi_alimk_state[i][j]); in rtw89_phy_c2h_rfk_rpt_log()
3310 j, tssi->default_txagc_offset[0][j]); in rtw89_phy_c2h_rfk_rpt_log()
3321 le32_to_cpu(txgapk->r0x8010[0]), in rtw89_phy_c2h_rfk_rpt_log()
3322 le32_to_cpu(txgapk->r0x8010[1])); in rtw89_phy_c2h_rfk_rpt_log()
3324 txgapk->chk_id); in rtw89_phy_c2h_rfk_rpt_log()
3326 le32_to_cpu(txgapk->chk_cnt)); in rtw89_phy_c2h_rfk_rpt_log()
3328 txgapk->ver); in rtw89_phy_c2h_rfk_rpt_log()
3330 txgapk->rsv1); in rtw89_phy_c2h_rfk_rpt_log()
3333 (int)sizeof(txgapk->track_d[0]), txgapk->track_d[0]); in rtw89_phy_c2h_rfk_rpt_log()
3335 (int)sizeof(txgapk->power_d[0]), txgapk->power_d[0]); in rtw89_phy_c2h_rfk_rpt_log()
3337 (int)sizeof(txgapk->track_d[1]), txgapk->track_d[1]); in rtw89_phy_c2h_rfk_rpt_log()
3339 (int)sizeof(txgapk->power_d[1]), txgapk->power_d[1]); in rtw89_phy_c2h_rfk_rpt_log()
3354 struct rtw89_fw_elm_info *elm_info = &rtwdev->fw.elm_info; in rtw89_phy_c2h_rfk_run_log()
3363 if (!elm_info->rfk_log_fmt) in rtw89_phy_c2h_rfk_run_log()
3366 elm = elm_info->rfk_log_fmt->elm[func]; in rtw89_phy_c2h_rfk_run_log()
3367 fmt_idx = le32_to_cpu(log->fmt_idx); in rtw89_phy_c2h_rfk_run_log()
3368 if (!elm || fmt_idx >= elm->u.rfk_log_fmt.nr) in rtw89_phy_c2h_rfk_run_log()
3371 offset = le16_to_cpu(elm->u.rfk_log_fmt.offset[fmt_idx]); in rtw89_phy_c2h_rfk_run_log()
3375 rtw89_debug(rtwdev, RTW89_DBG_RFK, &elm->u.common.contents[offset], in rtw89_phy_c2h_rfk_run_log()
3376 le32_to_cpu(log->arg[0]), le32_to_cpu(log->arg[1]), in rtw89_phy_c2h_rfk_run_log()
3377 le32_to_cpu(log->arg[2]), le32_to_cpu(log->arg[3])); in rtw89_phy_c2h_rfk_run_log()
3386 struct rtw89_c2h_hdr *c2h_hdr = (struct rtw89_c2h_hdr *)c2h->data; in rtw89_phy_c2h_rfk_log()
3397 len -= sizeof(*c2h_hdr); in rtw89_phy_c2h_rfk_log()
3401 content_len = le16_to_cpu(log_hdr->len); in rtw89_phy_c2h_rfk_log()
3407 switch (log_hdr->type) { in rtw89_phy_c2h_rfk_log()
3410 log_hdr->content, content_len); in rtw89_phy_c2h_rfk_log()
3415 rfk_name, content_len, log_hdr->content); in rtw89_phy_c2h_rfk_log()
3419 log_hdr->content, content_len); in rtw89_phy_c2h_rfk_log()
3426 len -= chunk_len; in rtw89_phy_c2h_rfk_log()
3486 struct rtw89_rfk_wait_info *wait = &rtwdev->rfk_wait; in rtw89_phy_rfk_report_prep()
3488 wait->state = RTW89_RFK_STATE_START; in rtw89_phy_rfk_report_prep()
3489 wait->start_time = ktime_get(); in rtw89_phy_rfk_report_prep()
3490 reinit_completion(&wait->completion); in rtw89_phy_rfk_report_prep()
3497 struct rtw89_rfk_wait_info *wait = &rtwdev->rfk_wait; in rtw89_phy_rfk_report_wait()
3501 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) { in rtw89_phy_rfk_report_wait()
3506 time_left = wait_for_completion_timeout(&wait->completion, in rtw89_phy_rfk_report_wait()
3510 return -ETIMEDOUT; in rtw89_phy_rfk_report_wait()
3511 } else if (wait->state != RTW89_RFK_STATE_OK) { in rtw89_phy_rfk_report_wait()
3513 rfk_name, wait->state); in rtw89_phy_rfk_report_wait()
3514 return -EFAULT; in rtw89_phy_rfk_report_wait()
3519 rfk_name, ktime_ms_delta(ktime_get(), wait->start_time)); in rtw89_phy_rfk_report_wait()
3528 (const struct rtw89_c2h_rfk_report *)c2h->data; in rtw89_phy_c2h_rfk_report_state()
3529 struct rtw89_rfk_wait_info *wait = &rtwdev->rfk_wait; in rtw89_phy_c2h_rfk_report_state()
3531 wait->state = report->state; in rtw89_phy_c2h_rfk_report_state()
3532 wait->version = report->version; in rtw89_phy_c2h_rfk_report_state()
3534 complete(&wait->completion); in rtw89_phy_c2h_rfk_report_state()
3538 wait->state, wait->version, in rtw89_phy_c2h_rfk_report_state()
3539 (int)(len - sizeof(report->hdr)), &report->state); in rtw89_phy_c2h_rfk_report_state()
3546 (const struct rtw89_c2h_rf_tas_info *)c2h->data; in rtw89_phy_c2h_rfk_log_tas_pwr()
3547 const enum rtw89_sar_sources src = rtwdev->sar.src; in rtw89_phy_c2h_rfk_log_tas_pwr()
3548 struct rtw89_tas_info *tas = &rtwdev->tas; in rtw89_phy_c2h_rfk_log_tas_pwr()
3553 if (!tas->enable || src == RTW89_SAR_SOURCE_NONE) in rtw89_phy_c2h_rfk_log_tas_pwr()
3556 cur_idx = le32_to_cpu(rf_tas->cur_idx); in rtw89_phy_c2h_rfk_log_tas_pwr()
3558 txpwr = (s16)le16_to_cpu(rf_tas->txpwr_history[i]); in rtw89_phy_c2h_rfk_log_tas_pwr()
3566 tas->instant_txpwr = rtw89_db_to_linear(0); in rtw89_phy_c2h_rfk_log_tas_pwr()
3568 tas->instant_txpwr = DIV_ROUND_DOWN_ULL(linear, cur_idx); in rtw89_phy_c2h_rfk_log_tas_pwr()
4064 struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; in phy_tssi_get_ofdm_de()
4065 enum rtw89_band band = chan->band_type; in phy_tssi_get_ofdm_de()
4066 u8 ch = chan->channel; in phy_tssi_get_ofdm_de()
4080 "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", in phy_tssi_get_ofdm_de()
4086 de_1st = tssi_info->tssi_mcs[path][gidx_1st]; in phy_tssi_get_ofdm_de()
4087 de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; in phy_tssi_get_ofdm_de()
4091 "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", in phy_tssi_get_ofdm_de()
4094 val = tssi_info->tssi_mcs[path][gidx]; in phy_tssi_get_ofdm_de()
4097 "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); in phy_tssi_get_ofdm_de()
4106 "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", in phy_tssi_get_ofdm_de()
4112 de_1st = tssi_info->tssi_6g_mcs[path][gidx_1st]; in phy_tssi_get_ofdm_de()
4113 de_2nd = tssi_info->tssi_6g_mcs[path][gidx_2nd]; in phy_tssi_get_ofdm_de()
4117 "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", in phy_tssi_get_ofdm_de()
4120 val = tssi_info->tssi_6g_mcs[path][gidx]; in phy_tssi_get_ofdm_de()
4123 "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); in phy_tssi_get_ofdm_de()
4134 struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; in phy_tssi_get_ofdm_trim_de()
4135 enum rtw89_band band = chan->band_type; in phy_tssi_get_ofdm_trim_de()
4136 u8 ch = chan->channel; in phy_tssi_get_ofdm_trim_de()
4150 "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", in phy_tssi_get_ofdm_trim_de()
4156 tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; in phy_tssi_get_ofdm_trim_de()
4157 tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; in phy_tssi_get_ofdm_trim_de()
4161 "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", in phy_tssi_get_ofdm_trim_de()
4164 val = tssi_info->tssi_trim[path][tgidx]; in phy_tssi_get_ofdm_trim_de()
4167 "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", in phy_tssi_get_ofdm_trim_de()
4177 "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", in phy_tssi_get_ofdm_trim_de()
4183 tde_1st = tssi_info->tssi_trim_6g[path][tgidx_1st]; in phy_tssi_get_ofdm_trim_de()
4184 tde_2nd = tssi_info->tssi_trim_6g[path][tgidx_2nd]; in phy_tssi_get_ofdm_trim_de()
4188 "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", in phy_tssi_get_ofdm_trim_de()
4191 val = tssi_info->tssi_trim_6g[path][tgidx]; in phy_tssi_get_ofdm_trim_de()
4194 "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", in phy_tssi_get_ofdm_trim_de()
4206 struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4207 u8 ch = chan->channel; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4215 rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4220 h2c->curr_tssi_trim_de[i] = trim_de; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4223 "[TSSI][TRIM]: path=%d trim_de=0x%x\n", i, trim_de); in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4226 cck_de = tssi_info->tssi_cck[i][gidx]; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4229 h2c->curr_tssi_cck_de[i] = 0x0; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4230 h2c->curr_tssi_cck_de_20m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4231 h2c->curr_tssi_cck_de_40m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4232 h2c->curr_tssi_efuse_cck_de[i] = cck_de; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4235 "[TSSI][TRIM]: path=%d cck_de=0x%x\n", i, cck_de); in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4240 h2c->curr_tssi_ofdm_de[i] = 0x0; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4241 h2c->curr_tssi_ofdm_de_20m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4242 h2c->curr_tssi_ofdm_de_40m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4243 h2c->curr_tssi_ofdm_de_80m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4244 h2c->curr_tssi_ofdm_de_160m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4245 h2c->curr_tssi_ofdm_de_320m[i] = val; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4246 h2c->curr_tssi_efuse_ofdm_de[i] = ofdm_de; in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4249 "[TSSI][TRIM]: path=%d ofdm_de=0x%x\n", i, ofdm_de); in rtw89_phy_rfk_tssi_fill_fwcmd_efuse_to_de()
4258 struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4259 struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4262 u8 subband = chan->subband_type; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4271 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4272 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4273 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4274 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4277 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4278 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4279 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4280 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4283 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4284 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4285 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4286 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4289 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4290 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4291 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4292 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4296 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4297 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4298 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4299 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4303 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4304 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4305 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4306 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4310 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4311 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4312 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4313 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4317 thm_up[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_P][3]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4318 thm_down[RF_PATH_A] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GA_N][3]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4319 thm_up[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_P][3]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4320 thm_down[RF_PATH_B] = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_6GB_N][3]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4328 thermal = tssi_info->thermal[path]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4333 h2c->pg_thermal[path] = 0x38; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4334 memset(h2c->ftable[path], 0, sizeof(h2c->ftable[path])); in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4338 h2c->pg_thermal[path] = thermal; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4344 thm_up[path][DELTA_SWINGIDX_SIZE - 1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4347 for (j = 127; j >= 64; j--) in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4349 -thm_down[path][i++] : in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4350 -thm_down[path][DELTA_SWINGIDX_SIZE - 1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4353 h2c->ftable[path][i + 0] = thm_ofst[i + 3]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4354 h2c->ftable[path][i + 1] = thm_ofst[i + 2]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4355 h2c->ftable[path][i + 2] = thm_ofst[i + 1]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4356 h2c->ftable[path][i + 3] = thm_ofst[i + 0]; in rtw89_phy_rfk_tssi_fill_fwcmd_tmeter_tbl()
4368 const struct rtw89_xtal_info *xtal = rtwdev->chip->xtal_info; in rtw89_phy_cfo_get_xcap_reg() local
4372 reg_mask = xtal->sc_xo_mask; in rtw89_phy_cfo_get_xcap_reg()
4374 reg_mask = xtal->sc_xi_mask; in rtw89_phy_cfo_get_xcap_reg()
4376 return (u8)rtw89_read32_mask(rtwdev, xtal->xcap_reg, reg_mask); in rtw89_phy_cfo_get_xcap_reg()
4382 const struct rtw89_xtal_info *xtal = rtwdev->chip->xtal_info; in rtw89_phy_cfo_set_xcap_reg() local
4386 reg_mask = xtal->sc_xo_mask; in rtw89_phy_cfo_set_xcap_reg()
4388 reg_mask = xtal->sc_xi_mask; in rtw89_phy_cfo_set_xcap_reg()
4390 rtw89_write32_mask(rtwdev, xtal->xcap_reg, reg_mask, val); in rtw89_phy_cfo_set_xcap_reg()
4396 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_set_crystal_cap()
4397 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_cfo_set_crystal_cap()
4400 if (!force && cfo->crystal_cap == crystal_cap) in rtw89_phy_cfo_set_crystal_cap()
4402 if (chip->chip_id == RTL8852A || chip->chip_id == RTL8851B) { in rtw89_phy_cfo_set_crystal_cap()
4415 cfo->crystal_cap = sc_xi_val; in rtw89_phy_cfo_set_crystal_cap()
4416 cfo->x_cap_ofst = (s8)((int)cfo->crystal_cap - cfo->def_x_cap); in rtw89_phy_cfo_set_crystal_cap()
4421 cfo->x_cap_ofst); in rtw89_phy_cfo_set_crystal_cap()
4427 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_reset()
4430 cfo->def_x_cap = cfo->crystal_cap_default & B_AX_XTAL_SC_MASK; in rtw89_phy_cfo_reset()
4431 cfo->is_adjust = false; in rtw89_phy_cfo_reset()
4432 if (cfo->crystal_cap == cfo->def_x_cap) in rtw89_phy_cfo_reset()
4434 cap = cfo->crystal_cap; in rtw89_phy_cfo_reset()
4435 cap += (cap > cfo->def_x_cap ? -1 : 1); in rtw89_phy_cfo_reset()
4438 "(0x%x) approach to dflt_val=(0x%x)\n", cfo->crystal_cap, in rtw89_phy_cfo_reset()
4439 cfo->def_x_cap); in rtw89_phy_cfo_reset()
4444 const struct rtw89_reg_def *dcfo_comp = rtwdev->chip->dcfo_comp; in rtw89_dcfo_comp()
4445 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_dcfo_comp()
4450 if (rtwdev->chip->chip_id == RTL8922A) in rtw89_dcfo_comp()
4462 sign = curr_cfo > 0 ? 1 : -1; in rtw89_dcfo_comp()
4465 if (rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv == CHIP_CBV) in rtw89_dcfo_comp()
4466 cfo_avg_312 = -cfo_avg_312; in rtw89_dcfo_comp()
4467 rtw89_phy_set_phy_regs(rtwdev, dcfo_comp->addr, dcfo_comp->mask, in rtw89_dcfo_comp()
4473 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_dcfo_comp_init()
4474 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_dcfo_comp_init()
4475 const struct rtw89_cfo_regs *cfo = phy->cfo; in rtw89_dcfo_comp_init()
4477 rtw89_phy_set_phy_regs(rtwdev, cfo->comp_seg0, cfo->valid_0_mask, 1); in rtw89_dcfo_comp_init()
4478 rtw89_phy_set_phy_regs(rtwdev, cfo->comp, cfo->weighting_mask, 8); in rtw89_dcfo_comp_init()
4480 if (chip->chip_gen == RTW89_CHIP_AX) { in rtw89_dcfo_comp_init()
4481 if (chip->cfo_hw_comp) { in rtw89_dcfo_comp_init()
4494 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_init()
4495 struct rtw89_efuse *efuse = &rtwdev->efuse; in rtw89_phy_cfo_init()
4497 cfo->crystal_cap_default = efuse->xtal_cap & B_AX_XTAL_SC_MASK; in rtw89_phy_cfo_init()
4498 cfo->crystal_cap = cfo->crystal_cap_default; in rtw89_phy_cfo_init()
4499 cfo->def_x_cap = cfo->crystal_cap; in rtw89_phy_cfo_init()
4500 cfo->x_cap_ub = min_t(int, cfo->def_x_cap + CFO_BOUND, 0x7f); in rtw89_phy_cfo_init()
4501 cfo->x_cap_lb = max_t(int, cfo->def_x_cap - CFO_BOUND, 0x1); in rtw89_phy_cfo_init()
4502 cfo->is_adjust = false; in rtw89_phy_cfo_init()
4503 cfo->divergence_lock_en = false; in rtw89_phy_cfo_init()
4504 cfo->x_cap_ofst = 0; in rtw89_phy_cfo_init()
4505 cfo->lock_cnt = 0; in rtw89_phy_cfo_init()
4506 cfo->rtw89_multi_cfo_mode = RTW89_TP_BASED_AVG_MODE; in rtw89_phy_cfo_init()
4507 cfo->apply_compensation = false; in rtw89_phy_cfo_init()
4508 cfo->residual_cfo_acc = 0; in rtw89_phy_cfo_init()
4510 cfo->crystal_cap_default); in rtw89_phy_cfo_init()
4511 rtw89_phy_cfo_set_crystal_cap(rtwdev, cfo->crystal_cap_default, true); in rtw89_phy_cfo_init()
4513 cfo->cfo_timer_ms = 2000; in rtw89_phy_cfo_init()
4514 cfo->cfo_trig_by_timer_en = false; in rtw89_phy_cfo_init()
4515 cfo->phy_cfo_trk_cnt = 0; in rtw89_phy_cfo_init()
4516 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; in rtw89_phy_cfo_init()
4517 cfo->cfo_ul_ofdma_acc_mode = RTW89_CFO_UL_OFDMA_ACC_ENABLE; in rtw89_phy_cfo_init()
4523 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_crystal_cap_adjust()
4524 int crystal_cap = cfo->crystal_cap; in rtw89_phy_cfo_crystal_cap_adjust()
4532 if (!cfo->is_adjust) { in rtw89_phy_cfo_crystal_cap_adjust()
4534 cfo->is_adjust = true; in rtw89_phy_cfo_crystal_cap_adjust()
4537 cfo->is_adjust = false; in rtw89_phy_cfo_crystal_cap_adjust()
4539 if (!cfo->is_adjust) { in rtw89_phy_cfo_crystal_cap_adjust()
4543 sign = curr_cfo > 0 ? 1 : -1; in rtw89_phy_cfo_crystal_cap_adjust()
4559 cfo->crystal_cap, cfo->def_x_cap); in rtw89_phy_cfo_crystal_cap_adjust()
4564 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_average_cfo_calc()
4565 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_average_cfo_calc()
4571 if (rtwdev->total_sta_assoc != 1) in rtw89_phy_average_cfo_calc()
4575 if (cfo->cfo_cnt[i] == 0) in rtw89_phy_average_cfo_calc()
4577 cfo_khz_all += cfo->cfo_tail[i]; in rtw89_phy_average_cfo_calc()
4578 cfo_cnt_all += cfo->cfo_cnt[i]; in rtw89_phy_average_cfo_calc()
4580 cfo->pre_cfo_avg[i] = cfo->cfo_avg[i]; in rtw89_phy_average_cfo_calc()
4581 cfo->dcfo_avg = phy_div(cfo_khz_all << chip->dcfo_comp_sft, in rtw89_phy_average_cfo_calc()
4594 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_multi_sta_cfo_calc()
4595 struct rtw89_traffic_stats *stats = &rtwdev->stats; in rtw89_phy_multi_sta_cfo_calc()
4610 if (cfo->rtw89_multi_cfo_mode == RTW89_PKT_BASED_AVG_MODE) { in rtw89_phy_multi_sta_cfo_calc()
4613 if (cfo->cfo_cnt[i] == 0) in rtw89_phy_multi_sta_cfo_calc()
4615 cfo_khz_all += cfo->cfo_tail[i]; in rtw89_phy_multi_sta_cfo_calc()
4616 cfo_cnt_all += cfo->cfo_cnt[i]; in rtw89_phy_multi_sta_cfo_calc()
4623 } else if (cfo->rtw89_multi_cfo_mode == RTW89_ENTRY_BASED_AVG_MODE) { in rtw89_phy_multi_sta_cfo_calc()
4626 if (cfo->cfo_cnt[i] == 0) in rtw89_phy_multi_sta_cfo_calc()
4628 cfo->cfo_avg[i] = phy_div(cfo->cfo_tail[i], in rtw89_phy_multi_sta_cfo_calc()
4629 (s32)cfo->cfo_cnt[i]); in rtw89_phy_multi_sta_cfo_calc()
4630 cfo_khz_all += cfo->cfo_avg[i]; in rtw89_phy_multi_sta_cfo_calc()
4633 cfo->cfo_avg[i]); in rtw89_phy_multi_sta_cfo_calc()
4635 sta_cnt = rtwdev->total_sta_assoc; in rtw89_phy_multi_sta_cfo_calc()
4641 } else if (cfo->rtw89_multi_cfo_mode == RTW89_TP_BASED_AVG_MODE) { in rtw89_phy_multi_sta_cfo_calc()
4643 cfo_tol = cfo->sta_cfo_tolerance; in rtw89_phy_multi_sta_cfo_calc()
4646 if (cfo->cfo_cnt[i] != 0) { in rtw89_phy_multi_sta_cfo_calc()
4647 cfo->cfo_avg[i] = phy_div(cfo->cfo_tail[i], in rtw89_phy_multi_sta_cfo_calc()
4648 (s32)cfo->cfo_cnt[i]); in rtw89_phy_multi_sta_cfo_calc()
4651 cfo->cfo_avg[i] = cfo->pre_cfo_avg[i]; in rtw89_phy_multi_sta_cfo_calc()
4653 max_cfo_lb = max(cfo->cfo_avg[i] - cfo_tol, max_cfo_lb); in rtw89_phy_multi_sta_cfo_calc()
4654 min_cfo_ub = min(cfo->cfo_avg[i] + cfo_tol, min_cfo_ub); in rtw89_phy_multi_sta_cfo_calc()
4655 cfo_khz_all += cfo->cfo_avg[i]; in rtw89_phy_multi_sta_cfo_calc()
4659 i, cfo->cfo_avg[i]); in rtw89_phy_multi_sta_cfo_calc()
4660 if (sta_cnt >= rtwdev->total_sta_assoc) in rtw89_phy_multi_sta_cfo_calc()
4663 tp_all = stats->rx_throughput; /* need tp for each entry */ in rtw89_phy_multi_sta_cfo_calc()
4678 min_cfo_ub - max_cfo_lb); in rtw89_phy_multi_sta_cfo_calc()
4686 cfo->pre_cfo_avg[i] = cfo->cfo_avg[i]; in rtw89_phy_multi_sta_cfo_calc()
4694 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_statistics_reset()
4696 memset(&cfo->cfo_tail, 0, sizeof(cfo->cfo_tail)); in rtw89_phy_cfo_statistics_reset()
4697 memset(&cfo->cfo_cnt, 0, sizeof(cfo->cfo_cnt)); in rtw89_phy_cfo_statistics_reset()
4698 cfo->packet_count = 0; in rtw89_phy_cfo_statistics_reset()
4699 cfo->packet_count_pre = 0; in rtw89_phy_cfo_statistics_reset()
4700 cfo->cfo_avg_pre = 0; in rtw89_phy_cfo_statistics_reset()
4705 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_dm()
4708 u8 pre_x_cap = cfo->crystal_cap; in rtw89_phy_cfo_dm()
4709 u8 dcfo_comp_sft = rtwdev->chip->dcfo_comp_sft; in rtw89_phy_cfo_dm()
4711 cfo->dcfo_avg = 0; in rtw89_phy_cfo_dm()
4713 rtwdev->total_sta_assoc); in rtw89_phy_cfo_dm()
4714 if (rtwdev->total_sta_assoc == 0 || rtw89_is_mlo_1_1(rtwdev)) { in rtw89_phy_cfo_dm()
4718 if (cfo->packet_count == 0) { in rtw89_phy_cfo_dm()
4722 if (cfo->packet_count == cfo->packet_count_pre) { in rtw89_phy_cfo_dm()
4726 if (rtwdev->total_sta_assoc == 1) in rtw89_phy_cfo_dm()
4730 if (cfo->divergence_lock_en) { in rtw89_phy_cfo_dm()
4731 cfo->lock_cnt++; in rtw89_phy_cfo_dm()
4732 if (cfo->lock_cnt > CFO_PERIOD_CNT) { in rtw89_phy_cfo_dm()
4733 cfo->divergence_lock_en = false; in rtw89_phy_cfo_dm()
4734 cfo->lock_cnt = 0; in rtw89_phy_cfo_dm()
4740 if (cfo->crystal_cap >= cfo->x_cap_ub || in rtw89_phy_cfo_dm()
4741 cfo->crystal_cap <= cfo->x_cap_lb) { in rtw89_phy_cfo_dm()
4742 cfo->divergence_lock_en = true; in rtw89_phy_cfo_dm()
4748 cfo->cfo_avg_pre = new_cfo; in rtw89_phy_cfo_dm()
4749 cfo->dcfo_avg_pre = cfo->dcfo_avg; in rtw89_phy_cfo_dm()
4750 x_cap_update = cfo->crystal_cap != pre_x_cap; in rtw89_phy_cfo_dm()
4752 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Xcap: D:%x C:%x->%x, ofst=%d\n", in rtw89_phy_cfo_dm()
4753 cfo->def_x_cap, pre_x_cap, cfo->crystal_cap, in rtw89_phy_cfo_dm()
4754 cfo->x_cap_ofst); in rtw89_phy_cfo_dm()
4756 if (cfo->dcfo_avg > 0) in rtw89_phy_cfo_dm()
4757 cfo->dcfo_avg -= CFO_SW_COMP_FINE_TUNE << dcfo_comp_sft; in rtw89_phy_cfo_dm()
4759 cfo->dcfo_avg += CFO_SW_COMP_FINE_TUNE << dcfo_comp_sft; in rtw89_phy_cfo_dm()
4761 rtw89_dcfo_comp(rtwdev, cfo->dcfo_avg); in rtw89_phy_cfo_dm()
4769 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_track_work()
4773 if (!cfo->cfo_trig_by_timer_en) in rtw89_phy_cfo_track_work()
4777 wiphy_delayed_work_queue(wiphy, &rtwdev->cfo_track_work, in rtw89_phy_cfo_track_work()
4778 msecs_to_jiffies(cfo->cfo_timer_ms)); in rtw89_phy_cfo_track_work()
4783 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_start_work()
4785 wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->cfo_track_work, in rtw89_phy_cfo_start_work()
4786 msecs_to_jiffies(cfo->cfo_timer_ms)); in rtw89_phy_cfo_start_work()
4791 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_track()
4792 struct rtw89_traffic_stats *stats = &rtwdev->stats; in rtw89_phy_cfo_track()
4795 if (stats->rx_tf_periodic > CFO_TF_CNT_TH) in rtw89_phy_cfo_track()
4797 if (cfo->cfo_ul_ofdma_acc_mode == RTW89_CFO_UL_OFDMA_ACC_ENABLE && in rtw89_phy_cfo_track()
4801 switch (cfo->phy_cfo_status) { in rtw89_phy_cfo_track()
4803 if (stats->tx_throughput >= CFO_TP_UPPER) { in rtw89_phy_cfo_track()
4804 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_ENHANCE; in rtw89_phy_cfo_track()
4805 cfo->cfo_trig_by_timer_en = true; in rtw89_phy_cfo_track()
4806 cfo->cfo_timer_ms = CFO_COMP_PERIOD; in rtw89_phy_cfo_track()
4811 if (stats->tx_throughput <= CFO_TP_LOWER) in rtw89_phy_cfo_track()
4812 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; in rtw89_phy_cfo_track()
4814 cfo->phy_cfo_trk_cnt >= CFO_PERIOD_CNT) in rtw89_phy_cfo_track()
4815 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_HOLD; in rtw89_phy_cfo_track()
4817 cfo->phy_cfo_trk_cnt++; in rtw89_phy_cfo_track()
4819 if (cfo->phy_cfo_status == RTW89_PHY_DCFO_STATE_NORMAL) { in rtw89_phy_cfo_track()
4820 cfo->phy_cfo_trk_cnt = 0; in rtw89_phy_cfo_track()
4821 cfo->cfo_trig_by_timer_en = false; in rtw89_phy_cfo_track()
4825 if (stats->tx_throughput <= CFO_TP_LOWER) { in rtw89_phy_cfo_track()
4826 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; in rtw89_phy_cfo_track()
4827 cfo->phy_cfo_trk_cnt = 0; in rtw89_phy_cfo_track()
4828 cfo->cfo_trig_by_timer_en = false; in rtw89_phy_cfo_track()
4830 cfo->phy_cfo_trk_cnt++; in rtw89_phy_cfo_track()
4834 cfo->phy_cfo_status = RTW89_PHY_DCFO_STATE_NORMAL; in rtw89_phy_cfo_track()
4835 cfo->phy_cfo_trk_cnt = 0; in rtw89_phy_cfo_track()
4840 stats->tx_throughput, cfo->phy_cfo_status, in rtw89_phy_cfo_track()
4841 cfo->cfo_trig_by_timer_en, cfo->phy_cfo_trk_cnt, in rtw89_phy_cfo_track()
4842 ewma_thermal_read(&rtwdev->phystat.avg_thermal[0])); in rtw89_phy_cfo_track()
4843 if (cfo->cfo_trig_by_timer_en) in rtw89_phy_cfo_track()
4851 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_parse()
4852 u8 macid = phy_ppdu->mac_id; in rtw89_phy_cfo_parse()
4859 cfo->cfo_tail[macid] += cfo_val; in rtw89_phy_cfo_parse()
4860 cfo->cfo_cnt[macid]++; in rtw89_phy_cfo_parse()
4861 cfo->packet_count++; in rtw89_phy_cfo_parse()
4866 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_ul_tb_assoc()
4868 rtwvif_link->chanctx_idx); in rtw89_phy_ul_tb_assoc()
4869 struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; in rtw89_phy_ul_tb_assoc()
4871 if (!chip->ul_tb_waveform_ctrl) in rtw89_phy_ul_tb_assoc()
4874 rtwvif_link->def_tri_idx = in rtw89_phy_ul_tb_assoc()
4877 if (chip->chip_id == RTL8852B && rtwdev->hal.cv > CHIP_CBV) in rtw89_phy_ul_tb_assoc()
4878 rtwvif_link->dyn_tb_bedge_en = false; in rtw89_phy_ul_tb_assoc()
4879 else if (chan->band_type >= RTW89_BAND_5G && in rtw89_phy_ul_tb_assoc()
4880 chan->band_width >= RTW89_CHANNEL_WIDTH_40) in rtw89_phy_ul_tb_assoc()
4881 rtwvif_link->dyn_tb_bedge_en = true; in rtw89_phy_ul_tb_assoc()
4883 rtwvif_link->dyn_tb_bedge_en = false; in rtw89_phy_ul_tb_assoc()
4887 ul_tb_info->def_if_bandedge, rtwvif_link->def_tri_idx); in rtw89_phy_ul_tb_assoc()
4890 rtwvif_link->dyn_tb_bedge_en, ul_tb_info->dyn_tb_tri_en); in rtw89_phy_ul_tb_assoc()
4921 if (!rtwdev->chip->ul_tb_pwr_diff) in rtw89_phy_ofdma_power_diff()
4924 if (rtwvif_link->pwr_diff_en == rtwvif_link->pre_pwr_diff_en) { in rtw89_phy_ofdma_power_diff()
4925 rtwvif_link->pwr_diff_en = false; in rtw89_phy_ofdma_power_diff()
4929 rtwvif_link->pre_pwr_diff_en = rtwvif_link->pwr_diff_en; in rtw89_phy_ofdma_power_diff()
4930 param = &table[rtwvif_link->pwr_diff_en]; in rtw89_phy_ofdma_power_diff()
4933 param->q_00); in rtw89_phy_ofdma_power_diff()
4935 param->q_11); in rtw89_phy_ofdma_power_diff()
4937 B_CUSTOMIZE_Q_MATRIX_EN, param->q_matrix_en); in rtw89_phy_ofdma_power_diff()
4939 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_1T, rtwvif_link->mac_idx); in rtw89_phy_ofdma_power_diff()
4941 param->ultb_1t_norm_160); in rtw89_phy_ofdma_power_diff()
4943 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PWR_UL_TB_2T, rtwvif_link->mac_idx); in rtw89_phy_ofdma_power_diff()
4945 param->ultb_2t_norm_160); in rtw89_phy_ofdma_power_diff()
4947 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM1, rtwvif_link->mac_idx); in rtw89_phy_ofdma_power_diff()
4949 param->com1_norm_1sts); in rtw89_phy_ofdma_power_diff()
4951 reg = rtw89_mac_reg_by_idx(rtwdev, R_AX_PATH_COM2, rtwvif_link->mac_idx); in rtw89_phy_ofdma_power_diff()
4953 param->com2_resp_1sts_path); in rtw89_phy_ofdma_power_diff()
4961 struct rtw89_traffic_stats *stats = &rtwdev->stats; in rtw89_phy_ul_tb_ctrl_check()
4964 if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION) in rtw89_phy_ul_tb_ctrl_check()
4967 if (!vif->cfg.assoc) in rtw89_phy_ul_tb_ctrl_check()
4970 if (rtwdev->chip->ul_tb_waveform_ctrl) { in rtw89_phy_ul_tb_ctrl_check()
4971 if (stats->rx_tf_periodic > UL_TB_TF_CNT_L2H_TH) in rtw89_phy_ul_tb_ctrl_check()
4972 ul_tb_data->high_tf_client = true; in rtw89_phy_ul_tb_ctrl_check()
4973 else if (stats->rx_tf_periodic < UL_TB_TF_CNT_H2L_TH) in rtw89_phy_ul_tb_ctrl_check()
4974 ul_tb_data->low_tf_client = true; in rtw89_phy_ul_tb_ctrl_check()
4976 ul_tb_data->valid = true; in rtw89_phy_ul_tb_ctrl_check()
4977 ul_tb_data->def_tri_idx = rtwvif_link->def_tri_idx; in rtw89_phy_ul_tb_ctrl_check()
4978 ul_tb_data->dyn_tb_bedge_en = rtwvif_link->dyn_tb_bedge_en; in rtw89_phy_ul_tb_ctrl_check()
4987 struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; in rtw89_phy_ul_tb_waveform_ctrl()
4989 if (!rtwdev->chip->ul_tb_waveform_ctrl) in rtw89_phy_ul_tb_waveform_ctrl()
4992 if (ul_tb_data->dyn_tb_bedge_en) { in rtw89_phy_ul_tb_waveform_ctrl()
4993 if (ul_tb_data->high_tf_client) { in rtw89_phy_ul_tb_waveform_ctrl()
4997 } else if (ul_tb_data->low_tf_client) { in rtw89_phy_ul_tb_waveform_ctrl()
4999 ul_tb_info->def_if_bandedge); in rtw89_phy_ul_tb_waveform_ctrl()
5002 ul_tb_info->def_if_bandedge); in rtw89_phy_ul_tb_waveform_ctrl()
5006 if (ul_tb_info->dyn_tb_tri_en) { in rtw89_phy_ul_tb_waveform_ctrl()
5007 if (ul_tb_data->high_tf_client) { in rtw89_phy_ul_tb_waveform_ctrl()
5012 } else if (ul_tb_data->low_tf_client) { in rtw89_phy_ul_tb_waveform_ctrl()
5015 ul_tb_data->def_tri_idx); in rtw89_phy_ul_tb_waveform_ctrl()
5018 ul_tb_data->def_tri_idx); in rtw89_phy_ul_tb_waveform_ctrl()
5025 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_ul_tb_ctrl_track()
5031 if (!chip->ul_tb_waveform_ctrl && !chip->ul_tb_pwr_diff) in rtw89_phy_ul_tb_ctrl_track()
5034 if (rtwdev->total_sta_assoc != 1) in rtw89_phy_ul_tb_ctrl_track()
5049 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_ul_tb_info_init()
5050 struct rtw89_phy_ul_tb_info *ul_tb_info = &rtwdev->ul_tb_info; in rtw89_phy_ul_tb_info_init()
5052 if (!chip->ul_tb_waveform_ctrl) in rtw89_phy_ul_tb_info_init()
5055 ul_tb_info->dyn_tb_tri_en = true; in rtw89_phy_ul_tb_info_init()
5056 ul_tb_info->def_if_bandedge = in rtw89_phy_ul_tb_info_init()
5063 ewma_rssi_init(&antdiv_sts->cck_rssi_avg); in rtw89_phy_antdiv_sts_instance_reset()
5064 ewma_rssi_init(&antdiv_sts->ofdm_rssi_avg); in rtw89_phy_antdiv_sts_instance_reset()
5065 ewma_rssi_init(&antdiv_sts->non_legacy_rssi_avg); in rtw89_phy_antdiv_sts_instance_reset()
5066 antdiv_sts->pkt_cnt_cck = 0; in rtw89_phy_antdiv_sts_instance_reset()
5067 antdiv_sts->pkt_cnt_ofdm = 0; in rtw89_phy_antdiv_sts_instance_reset()
5068 antdiv_sts->pkt_cnt_non_legacy = 0; in rtw89_phy_antdiv_sts_instance_reset()
5069 antdiv_sts->evm = 0; in rtw89_phy_antdiv_sts_instance_reset()
5076 if (rtw89_get_data_rate_mode(rtwdev, phy_ppdu->rate) == DATA_RATE_MODE_NON_HT) { in rtw89_phy_antdiv_sts_instance_add()
5077 if (phy_ppdu->rate < RTW89_HW_RATE_OFDM6) { in rtw89_phy_antdiv_sts_instance_add()
5078 ewma_rssi_add(&stats->cck_rssi_avg, phy_ppdu->rssi_avg); in rtw89_phy_antdiv_sts_instance_add()
5079 stats->pkt_cnt_cck++; in rtw89_phy_antdiv_sts_instance_add()
5081 ewma_rssi_add(&stats->ofdm_rssi_avg, phy_ppdu->rssi_avg); in rtw89_phy_antdiv_sts_instance_add()
5082 stats->pkt_cnt_ofdm++; in rtw89_phy_antdiv_sts_instance_add()
5083 stats->evm += phy_ppdu->ofdm.evm_min; in rtw89_phy_antdiv_sts_instance_add()
5086 ewma_rssi_add(&stats->non_legacy_rssi_avg, phy_ppdu->rssi_avg); in rtw89_phy_antdiv_sts_instance_add()
5087 stats->pkt_cnt_non_legacy++; in rtw89_phy_antdiv_sts_instance_add()
5088 stats->evm += phy_ppdu->ofdm.evm_min; in rtw89_phy_antdiv_sts_instance_add()
5094 if (stats->pkt_cnt_non_legacy >= stats->pkt_cnt_cck && in rtw89_phy_antdiv_sts_instance_get_rssi()
5095 stats->pkt_cnt_non_legacy >= stats->pkt_cnt_ofdm) in rtw89_phy_antdiv_sts_instance_get_rssi()
5096 return ewma_rssi_read(&stats->non_legacy_rssi_avg); in rtw89_phy_antdiv_sts_instance_get_rssi()
5097 else if (stats->pkt_cnt_ofdm >= stats->pkt_cnt_cck && in rtw89_phy_antdiv_sts_instance_get_rssi()
5098 stats->pkt_cnt_ofdm >= stats->pkt_cnt_non_legacy) in rtw89_phy_antdiv_sts_instance_get_rssi()
5099 return ewma_rssi_read(&stats->ofdm_rssi_avg); in rtw89_phy_antdiv_sts_instance_get_rssi()
5101 return ewma_rssi_read(&stats->cck_rssi_avg); in rtw89_phy_antdiv_sts_instance_get_rssi()
5106 return phy_div(stats->evm, stats->pkt_cnt_non_legacy + stats->pkt_cnt_ofdm); in rtw89_phy_antdiv_sts_instance_get_evm()
5112 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_parse()
5113 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_antdiv_parse()
5115 if (!hal->ant_diversity || hal->ant_diversity_fixed) in rtw89_phy_antdiv_parse()
5118 rtw89_phy_antdiv_sts_instance_add(rtwdev, phy_ppdu, &antdiv->target_stats); in rtw89_phy_antdiv_parse()
5120 if (!antdiv->get_stats) in rtw89_phy_antdiv_parse()
5123 if (hal->antenna_rx == RF_A) in rtw89_phy_antdiv_parse()
5124 rtw89_phy_antdiv_sts_instance_add(rtwdev, phy_ppdu, &antdiv->main_stats); in rtw89_phy_antdiv_parse()
5125 else if (hal->antenna_rx == RF_B) in rtw89_phy_antdiv_parse()
5126 rtw89_phy_antdiv_sts_instance_add(rtwdev, phy_ppdu, &antdiv->aux_stats); in rtw89_phy_antdiv_parse()
5159 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_sts_reset()
5161 rtw89_phy_antdiv_sts_instance_reset(&antdiv->target_stats); in rtw89_phy_antdiv_sts_reset()
5162 rtw89_phy_antdiv_sts_instance_reset(&antdiv->main_stats); in rtw89_phy_antdiv_sts_reset()
5163 rtw89_phy_antdiv_sts_instance_reset(&antdiv->aux_stats); in rtw89_phy_antdiv_sts_reset()
5168 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_init()
5169 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_antdiv_init()
5171 if (!hal->ant_diversity) in rtw89_phy_antdiv_init()
5174 antdiv->get_stats = false; in rtw89_phy_antdiv_init()
5175 antdiv->rssi_pre = 0; in rtw89_phy_antdiv_init()
5182 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_thermal_protect()
5183 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_thermal_protect()
5184 u8 th_max = phystat->last_thermal_max; in rtw89_phy_thermal_protect()
5185 u8 lv = hal->thermal_prot_lv; in rtw89_phy_thermal_protect()
5187 if (!hal->thermal_prot_th || in rtw89_phy_thermal_protect()
5188 (hal->disabled_dm_bitmap & BIT(RTW89_DM_THERMAL_PROTECT))) in rtw89_phy_thermal_protect()
5191 if (th_max > hal->thermal_prot_th && lv < RTW89_THERMAL_PROT_LV_MAX) in rtw89_phy_thermal_protect()
5193 else if (th_max < hal->thermal_prot_th - 2 && lv > 0) in rtw89_phy_thermal_protect()
5194 lv--; in rtw89_phy_thermal_protect()
5198 hal->thermal_prot_lv = lv; in rtw89_phy_thermal_protect()
5202 rtw89_fw_h2c_tx_duty(rtwdev, hal->thermal_prot_lv); in rtw89_phy_thermal_protect()
5207 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_thermal_update()
5211 for (i = 0; i < rtwdev->chip->rf_path_num; i++) { in rtw89_phy_stat_thermal_update()
5214 ewma_thermal_add(&phystat->avg_thermal[i], th); in rtw89_phy_stat_thermal_update()
5218 ewma_thermal_read(&phystat->avg_thermal[i])); in rtw89_phy_stat_thermal_update()
5223 phystat->last_thermal_max = th_max; in rtw89_phy_stat_thermal_update()
5235 struct rtw89_vif_link *rtwvif_link = rtwsta_link->rtwvif_link; in __rtw89_phy_stat_rssi_update_iter()
5236 struct rtw89_dev *rtwdev = rssi_data->rtwdev; in __rtw89_phy_stat_rssi_update_iter()
5241 rssi_curr = ewma_rssi_read(&rtwsta_link->avg_rssi); in __rtw89_phy_stat_rssi_update_iter()
5242 bb = rtw89_get_bb_ctx(rtwdev, rtwvif_link->phy_idx); in __rtw89_phy_stat_rssi_update_iter()
5243 ch_info = &bb->ch_info; in __rtw89_phy_stat_rssi_update_iter()
5245 if (rssi_curr < ch_info->rssi_min) { in __rtw89_phy_stat_rssi_update_iter()
5246 ch_info->rssi_min = rssi_curr; in __rtw89_phy_stat_rssi_update_iter()
5247 ch_info->rssi_min_macid = rtwsta_link->mac_id; in __rtw89_phy_stat_rssi_update_iter()
5250 if (rtwsta_link->prev_rssi == 0) { in __rtw89_phy_stat_rssi_update_iter()
5251 rtwsta_link->prev_rssi = rssi_curr; in __rtw89_phy_stat_rssi_update_iter()
5252 } else if (abs((int)rtwsta_link->prev_rssi - (int)rssi_curr) > in __rtw89_phy_stat_rssi_update_iter()
5254 rtwsta_link->prev_rssi = rssi_curr; in __rtw89_phy_stat_rssi_update_iter()
5255 rssi_data->rssi_changed = true; in __rtw89_phy_stat_rssi_update_iter()
5279 bb->ch_info.rssi_min = U8_MAX; in rtw89_phy_stat_rssi_update()
5281 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_stat_rssi_update()
5290 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_init()
5293 for (i = 0; i < rtwdev->chip->rf_path_num; i++) in rtw89_phy_stat_init()
5294 ewma_thermal_init(&phystat->avg_thermal[i]); in rtw89_phy_stat_init()
5298 memset(&phystat->cur_pkt_stat, 0, sizeof(phystat->cur_pkt_stat)); in rtw89_phy_stat_init()
5299 memset(&phystat->last_pkt_stat, 0, sizeof(phystat->last_pkt_stat)); in rtw89_phy_stat_init()
5301 ewma_rssi_init(&phystat->bcn_rssi); in rtw89_phy_stat_init()
5303 rtwdev->hal.thermal_prot_lv = 0; in rtw89_phy_stat_init()
5308 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_track()
5314 phystat->last_pkt_stat = phystat->cur_pkt_stat; in rtw89_phy_stat_track()
5315 memset(&phystat->cur_pkt_stat, 0, sizeof(phystat->cur_pkt_stat)); in rtw89_phy_stat_track()
5321 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_us_to_idx()
5323 return time_us >> (ilog2(CCX_US_BASE_RATIO) + env->ccx_unit_idx); in rtw89_phy_ccx_us_to_idx()
5329 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_idx_to_us()
5331 return idx << (ilog2(CCX_US_BASE_RATIO) + env->ccx_unit_idx); in rtw89_phy_ccx_idx_to_us()
5337 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ccx_top_setting_init()
5338 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_top_setting_init()
5339 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ccx_top_setting_init()
5341 env->ccx_manual_ctrl = false; in rtw89_phy_ccx_top_setting_init()
5342 env->ccx_ongoing = false; in rtw89_phy_ccx_top_setting_init()
5343 env->ccx_rac_lv = RTW89_RAC_RELEASE; in rtw89_phy_ccx_top_setting_init()
5344 env->ccx_period = 0; in rtw89_phy_ccx_top_setting_init()
5345 env->ccx_unit_idx = RTW89_CCX_32_US; in rtw89_phy_ccx_top_setting_init()
5347 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->en_mask, 1, bb->phy_idx); in rtw89_phy_ccx_top_setting_init()
5348 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->trig_opt_mask, 1, in rtw89_phy_ccx_top_setting_init()
5349 bb->phy_idx); in rtw89_phy_ccx_top_setting_init()
5350 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1, in rtw89_phy_ccx_top_setting_init()
5351 bb->phy_idx); in rtw89_phy_ccx_top_setting_init()
5352 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->edcca_opt_mask, in rtw89_phy_ccx_top_setting_init()
5353 RTW89_CCX_EDCCA_BW20_0, bb->phy_idx); in rtw89_phy_ccx_top_setting_init()
5360 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_get_report()
5364 numer = report * score + (env->ccx_period >> 1); in rtw89_phy_ccx_get_report()
5365 if (env->ccx_period) in rtw89_phy_ccx_get_report()
5366 ret = numer / env->ccx_period; in rtw89_phy_ccx_get_report()
5368 return ret >= score ? score - 1 : ret; in rtw89_phy_ccx_get_report()
5403 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_racing_release()
5406 "lv:(%d)->(0)\n", env->ccx_rac_lv); in rtw89_phy_ccx_racing_release()
5408 env->ccx_ongoing = false; in rtw89_phy_ccx_racing_release()
5409 env->ccx_rac_lv = RTW89_RAC_RELEASE; in rtw89_phy_ccx_racing_release()
5410 env->ifs_clm_app = RTW89_IFS_CLM_BACKGROUND; in rtw89_phy_ccx_racing_release()
5417 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_th_update_check()
5418 bool is_update = env->ifs_clm_app != para->ifs_clm_app; in rtw89_phy_ifs_clm_th_update_check()
5420 u16 *ifs_th_l = env->ifs_clm_th_l; in rtw89_phy_ifs_clm_th_update_check()
5421 u16 *ifs_th_h = env->ifs_clm_th_h; in rtw89_phy_ifs_clm_th_update_check()
5428 switch (para->ifs_clm_app) { in rtw89_phy_ifs_clm_th_update_check()
5439 ifs_th0_us = para->ifs_clm_manual_th0; in rtw89_phy_ifs_clm_th_update_check()
5440 ifs_th_times = para->ifs_clm_manual_th_times; in rtw89_phy_ifs_clm_th_update_check()
5447 * low[i] = high[i-1] + 1 in rtw89_phy_ifs_clm_th_update_check()
5448 * high[i] = high[i-1] * ifs_th_times in rtw89_phy_ifs_clm_th_update_check()
5455 ifs_th_l[i] = ifs_th_h[i - 1] + 1; in rtw89_phy_ifs_clm_th_update_check()
5456 ifs_th_h_us[i] = ifs_th_h_us[i - 1] * ifs_th_times; in rtw89_phy_ifs_clm_th_update_check()
5471 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ifs_clm_set_th_reg()
5472 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_set_th_reg()
5473 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ifs_clm_set_th_reg()
5476 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_l_mask, in rtw89_phy_ifs_clm_set_th_reg()
5477 env->ifs_clm_th_l[0], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5478 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_l_mask, in rtw89_phy_ifs_clm_set_th_reg()
5479 env->ifs_clm_th_l[1], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5480 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_l_mask, in rtw89_phy_ifs_clm_set_th_reg()
5481 env->ifs_clm_th_l[2], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5482 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_l_mask, in rtw89_phy_ifs_clm_set_th_reg()
5483 env->ifs_clm_th_l[3], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5485 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_th_h_mask, in rtw89_phy_ifs_clm_set_th_reg()
5486 env->ifs_clm_th_h[0], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5487 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_th_h_mask, in rtw89_phy_ifs_clm_set_th_reg()
5488 env->ifs_clm_th_h[1], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5489 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_th_h_mask, in rtw89_phy_ifs_clm_set_th_reg()
5490 env->ifs_clm_th_h[2], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5491 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_th_h_mask, in rtw89_phy_ifs_clm_set_th_reg()
5492 env->ifs_clm_th_h[3], bb->phy_idx); in rtw89_phy_ifs_clm_set_th_reg()
5497 i + 1, env->ifs_clm_th_l[i], env->ifs_clm_th_h[i]); in rtw89_phy_ifs_clm_set_th_reg()
5503 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ifs_clm_setting_init()
5504 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_setting_init()
5505 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ifs_clm_setting_init()
5508 env->ifs_clm_app = RTW89_IFS_CLM_BACKGROUND; in rtw89_phy_ifs_clm_setting_init()
5509 env->ifs_clm_mntr_time = 0; in rtw89_phy_ifs_clm_setting_init()
5515 rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_collect_en_mask, true, in rtw89_phy_ifs_clm_setting_init()
5516 bb->phy_idx); in rtw89_phy_ifs_clm_setting_init()
5517 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t1_addr, ccx->ifs_t1_en_mask, true, in rtw89_phy_ifs_clm_setting_init()
5518 bb->phy_idx); in rtw89_phy_ifs_clm_setting_init()
5519 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t2_addr, ccx->ifs_t2_en_mask, true, in rtw89_phy_ifs_clm_setting_init()
5520 bb->phy_idx); in rtw89_phy_ifs_clm_setting_init()
5521 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t3_addr, ccx->ifs_t3_en_mask, true, in rtw89_phy_ifs_clm_setting_init()
5522 bb->phy_idx); in rtw89_phy_ifs_clm_setting_init()
5523 rtw89_phy_write32_idx(rtwdev, ccx->ifs_t4_addr, ccx->ifs_t4_en_mask, true, in rtw89_phy_ifs_clm_setting_init()
5524 bb->phy_idx); in rtw89_phy_ifs_clm_setting_init()
5531 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_racing_ctrl()
5537 return -EINVAL; in rtw89_phy_ccx_racing_ctrl()
5541 "ccx_ongoing=%d, level:(%d)->(%d)\n", env->ccx_ongoing, in rtw89_phy_ccx_racing_ctrl()
5542 env->ccx_rac_lv, level); in rtw89_phy_ccx_racing_ctrl()
5544 if (env->ccx_ongoing) { in rtw89_phy_ccx_racing_ctrl()
5545 if (level <= env->ccx_rac_lv) in rtw89_phy_ccx_racing_ctrl()
5546 ret = -EINVAL; in rtw89_phy_ccx_racing_ctrl()
5548 env->ccx_ongoing = false; in rtw89_phy_ccx_racing_ctrl()
5552 env->ccx_rac_lv = level; in rtw89_phy_ccx_racing_ctrl()
5563 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ccx_trigger()
5564 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ccx_trigger()
5565 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ccx_trigger()
5567 rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 0, in rtw89_phy_ccx_trigger()
5568 bb->phy_idx); in rtw89_phy_ccx_trigger()
5569 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 0, in rtw89_phy_ccx_trigger()
5570 bb->phy_idx); in rtw89_phy_ccx_trigger()
5571 rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, ccx->ifs_clm_cnt_clear_mask, 1, in rtw89_phy_ccx_trigger()
5572 bb->phy_idx); in rtw89_phy_ccx_trigger()
5573 rtw89_phy_write32_idx(rtwdev, ccx->setting_addr, ccx->measurement_trig_mask, 1, in rtw89_phy_ccx_trigger()
5574 bb->phy_idx); in rtw89_phy_ccx_trigger()
5576 env->ccx_ongoing = true; in rtw89_phy_ccx_trigger()
5582 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_get_utility()
5586 env->ifs_clm_tx_ratio = in rtw89_phy_ifs_clm_get_utility()
5587 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_tx, PERCENT); in rtw89_phy_ifs_clm_get_utility()
5588 env->ifs_clm_edcca_excl_cca_ratio = in rtw89_phy_ifs_clm_get_utility()
5589 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_edcca_excl_cca, in rtw89_phy_ifs_clm_get_utility()
5591 env->ifs_clm_cck_fa_ratio = in rtw89_phy_ifs_clm_get_utility()
5592 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckfa, PERCENT); in rtw89_phy_ifs_clm_get_utility()
5593 env->ifs_clm_ofdm_fa_ratio = in rtw89_phy_ifs_clm_get_utility()
5594 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmfa, PERCENT); in rtw89_phy_ifs_clm_get_utility()
5595 env->ifs_clm_cck_cca_excl_fa_ratio = in rtw89_phy_ifs_clm_get_utility()
5596 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckcca_excl_fa, in rtw89_phy_ifs_clm_get_utility()
5598 env->ifs_clm_ofdm_cca_excl_fa_ratio = in rtw89_phy_ifs_clm_get_utility()
5599 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmcca_excl_fa, in rtw89_phy_ifs_clm_get_utility()
5601 env->ifs_clm_cck_fa_permil = in rtw89_phy_ifs_clm_get_utility()
5602 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_cckfa, PERMIL); in rtw89_phy_ifs_clm_get_utility()
5603 env->ifs_clm_ofdm_fa_permil = in rtw89_phy_ifs_clm_get_utility()
5604 rtw89_phy_ccx_get_report(rtwdev, bb, env->ifs_clm_ofdmfa, PERMIL); in rtw89_phy_ifs_clm_get_utility()
5607 if (env->ifs_clm_his[i] > ENV_MNTR_IFSCLM_HIS_MAX) { in rtw89_phy_ifs_clm_get_utility()
5608 env->ifs_clm_ifs_avg[i] = ENV_MNTR_FAIL_DWORD; in rtw89_phy_ifs_clm_get_utility()
5610 env->ifs_clm_ifs_avg[i] = in rtw89_phy_ifs_clm_get_utility()
5612 env->ifs_clm_avg[i]); in rtw89_phy_ifs_clm_get_utility()
5615 res = rtw89_phy_ccx_idx_to_us(rtwdev, bb, env->ifs_clm_cca[i]); in rtw89_phy_ifs_clm_get_utility()
5616 res += env->ifs_clm_his[i] >> 1; in rtw89_phy_ifs_clm_get_utility()
5617 if (env->ifs_clm_his[i]) in rtw89_phy_ifs_clm_get_utility()
5618 res /= env->ifs_clm_his[i]; in rtw89_phy_ifs_clm_get_utility()
5621 env->ifs_clm_cca_avg[i] = res; in rtw89_phy_ifs_clm_get_utility()
5625 "IFS-CLM ratio {Tx, EDCCA_exclu_cca} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_utility()
5626 env->ifs_clm_tx_ratio, env->ifs_clm_edcca_excl_cca_ratio); in rtw89_phy_ifs_clm_get_utility()
5628 "IFS-CLM FA ratio {CCK, OFDM} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_utility()
5629 env->ifs_clm_cck_fa_ratio, env->ifs_clm_ofdm_fa_ratio); in rtw89_phy_ifs_clm_get_utility()
5631 "IFS-CLM FA permil {CCK, OFDM} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_utility()
5632 env->ifs_clm_cck_fa_permil, env->ifs_clm_ofdm_fa_permil); in rtw89_phy_ifs_clm_get_utility()
5634 "IFS-CLM CCA_exclu_FA ratio {CCK, OFDM} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_utility()
5635 env->ifs_clm_cck_cca_excl_fa_ratio, in rtw89_phy_ifs_clm_get_utility()
5636 env->ifs_clm_ofdm_cca_excl_fa_ratio); in rtw89_phy_ifs_clm_get_utility()
5641 i + 1, env->ifs_clm_his[i], env->ifs_clm_ifs_avg[i], in rtw89_phy_ifs_clm_get_utility()
5642 env->ifs_clm_cca_avg[i]); in rtw89_phy_ifs_clm_get_utility()
5648 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ifs_clm_get_result()
5649 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_get_result()
5650 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ifs_clm_get_result()
5653 if (rtw89_phy_read32_idx(rtwdev, ccx->ifs_total_addr, in rtw89_phy_ifs_clm_get_result()
5654 ccx->ifs_cnt_done_mask, bb->phy_idx) == 0) { in rtw89_phy_ifs_clm_get_result()
5660 env->ifs_clm_tx = in rtw89_phy_ifs_clm_get_result()
5661 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_tx_cnt_addr, in rtw89_phy_ifs_clm_get_result()
5662 ccx->ifs_clm_tx_cnt_msk, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5663 env->ifs_clm_edcca_excl_cca = in rtw89_phy_ifs_clm_get_result()
5664 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_tx_cnt_addr, in rtw89_phy_ifs_clm_get_result()
5665 ccx->ifs_clm_edcca_excl_cca_fa_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5666 env->ifs_clm_cckcca_excl_fa = in rtw89_phy_ifs_clm_get_result()
5667 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_cca_addr, in rtw89_phy_ifs_clm_get_result()
5668 ccx->ifs_clm_cckcca_excl_fa_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5669 env->ifs_clm_ofdmcca_excl_fa = in rtw89_phy_ifs_clm_get_result()
5670 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_cca_addr, in rtw89_phy_ifs_clm_get_result()
5671 ccx->ifs_clm_ofdmcca_excl_fa_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5672 env->ifs_clm_cckfa = in rtw89_phy_ifs_clm_get_result()
5673 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_fa_addr, in rtw89_phy_ifs_clm_get_result()
5674 ccx->ifs_clm_cck_fa_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5675 env->ifs_clm_ofdmfa = in rtw89_phy_ifs_clm_get_result()
5676 rtw89_phy_read32_idx(rtwdev, ccx->ifs_clm_fa_addr, in rtw89_phy_ifs_clm_get_result()
5677 ccx->ifs_clm_ofdm_fa_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5679 env->ifs_clm_his[0] = in rtw89_phy_ifs_clm_get_result()
5680 rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr, in rtw89_phy_ifs_clm_get_result()
5681 ccx->ifs_t1_his_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5682 env->ifs_clm_his[1] = in rtw89_phy_ifs_clm_get_result()
5683 rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr, in rtw89_phy_ifs_clm_get_result()
5684 ccx->ifs_t2_his_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5685 env->ifs_clm_his[2] = in rtw89_phy_ifs_clm_get_result()
5686 rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr, in rtw89_phy_ifs_clm_get_result()
5687 ccx->ifs_t3_his_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5688 env->ifs_clm_his[3] = in rtw89_phy_ifs_clm_get_result()
5689 rtw89_phy_read32_idx(rtwdev, ccx->ifs_his_addr, in rtw89_phy_ifs_clm_get_result()
5690 ccx->ifs_t4_his_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5692 env->ifs_clm_avg[0] = in rtw89_phy_ifs_clm_get_result()
5693 rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_l_addr, in rtw89_phy_ifs_clm_get_result()
5694 ccx->ifs_t1_avg_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5695 env->ifs_clm_avg[1] = in rtw89_phy_ifs_clm_get_result()
5696 rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_l_addr, in rtw89_phy_ifs_clm_get_result()
5697 ccx->ifs_t2_avg_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5698 env->ifs_clm_avg[2] = in rtw89_phy_ifs_clm_get_result()
5699 rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_h_addr, in rtw89_phy_ifs_clm_get_result()
5700 ccx->ifs_t3_avg_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5701 env->ifs_clm_avg[3] = in rtw89_phy_ifs_clm_get_result()
5702 rtw89_phy_read32_idx(rtwdev, ccx->ifs_avg_h_addr, in rtw89_phy_ifs_clm_get_result()
5703 ccx->ifs_t4_avg_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5705 env->ifs_clm_cca[0] = in rtw89_phy_ifs_clm_get_result()
5706 rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_l_addr, in rtw89_phy_ifs_clm_get_result()
5707 ccx->ifs_t1_cca_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5708 env->ifs_clm_cca[1] = in rtw89_phy_ifs_clm_get_result()
5709 rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_l_addr, in rtw89_phy_ifs_clm_get_result()
5710 ccx->ifs_t2_cca_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5711 env->ifs_clm_cca[2] = in rtw89_phy_ifs_clm_get_result()
5712 rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_h_addr, in rtw89_phy_ifs_clm_get_result()
5713 ccx->ifs_t3_cca_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5714 env->ifs_clm_cca[3] = in rtw89_phy_ifs_clm_get_result()
5715 rtw89_phy_read32_idx(rtwdev, ccx->ifs_cca_h_addr, in rtw89_phy_ifs_clm_get_result()
5716 ccx->ifs_t4_cca_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5718 env->ifs_clm_total_ifs = in rtw89_phy_ifs_clm_get_result()
5719 rtw89_phy_read32_idx(rtwdev, ccx->ifs_total_addr, in rtw89_phy_ifs_clm_get_result()
5720 ccx->ifs_total_mask, bb->phy_idx); in rtw89_phy_ifs_clm_get_result()
5722 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "IFS-CLM total_ifs = %d\n", in rtw89_phy_ifs_clm_get_result()
5723 env->ifs_clm_total_ifs); in rtw89_phy_ifs_clm_get_result()
5726 env->ifs_clm_tx, env->ifs_clm_edcca_excl_cca); in rtw89_phy_ifs_clm_get_result()
5728 "IFS-CLM FA{CCK, OFDM} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_result()
5729 env->ifs_clm_cckfa, env->ifs_clm_ofdmfa); in rtw89_phy_ifs_clm_get_result()
5731 "IFS-CLM CCA_exclu_FA{CCK, OFDM} = {%d, %d}\n", in rtw89_phy_ifs_clm_get_result()
5732 env->ifs_clm_cckcca_excl_fa, env->ifs_clm_ofdmcca_excl_fa); in rtw89_phy_ifs_clm_get_result()
5737 "T%d:[%d, %d, %d]\n", i + 1, env->ifs_clm_his[i], in rtw89_phy_ifs_clm_get_result()
5738 env->ifs_clm_avg[i], env->ifs_clm_cca[i]); in rtw89_phy_ifs_clm_get_result()
5749 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_phy_ifs_clm_set()
5750 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_ifs_clm_set()
5751 const struct rtw89_ccx_regs *ccx = phy->ccx; in rtw89_phy_ifs_clm_set()
5755 if (para->mntr_time == 0) { in rtw89_phy_ifs_clm_set()
5758 return -EINVAL; in rtw89_phy_ifs_clm_set()
5761 if (rtw89_phy_ccx_racing_ctrl(rtwdev, bb, para->rac_lv)) in rtw89_phy_ifs_clm_set()
5762 return -EINVAL; in rtw89_phy_ifs_clm_set()
5764 if (para->mntr_time != env->ifs_clm_mntr_time) { in rtw89_phy_ifs_clm_set()
5765 rtw89_phy_ccx_ms_to_period_unit(rtwdev, para->mntr_time, in rtw89_phy_ifs_clm_set()
5767 rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, in rtw89_phy_ifs_clm_set()
5768 ccx->ifs_clm_period_mask, period, bb->phy_idx); in rtw89_phy_ifs_clm_set()
5769 rtw89_phy_write32_idx(rtwdev, ccx->ifs_cnt_addr, in rtw89_phy_ifs_clm_set()
5770 ccx->ifs_clm_cnt_unit_mask, in rtw89_phy_ifs_clm_set()
5771 unit_idx, bb->phy_idx); in rtw89_phy_ifs_clm_set()
5774 "Update IFS-CLM time ((%d)) -> ((%d))\n", in rtw89_phy_ifs_clm_set()
5775 env->ifs_clm_mntr_time, para->mntr_time); in rtw89_phy_ifs_clm_set()
5777 env->ifs_clm_mntr_time = para->mntr_time; in rtw89_phy_ifs_clm_set()
5778 env->ccx_period = (u16)period; in rtw89_phy_ifs_clm_set()
5779 env->ccx_unit_idx = (u8)unit_idx; in rtw89_phy_ifs_clm_set()
5783 env->ifs_clm_app = para->ifs_clm_app; in rtw89_phy_ifs_clm_set()
5793 struct rtw89_env_monitor_info *env = &bb->env_monitor; in __rtw89_phy_env_monitor_track()
5797 env->ccx_watchdog_result = RTW89_PHY_ENV_MON_CCX_FAIL; in __rtw89_phy_env_monitor_track()
5798 if (env->ccx_manual_ctrl) { in __rtw89_phy_env_monitor_track()
5805 "BB-%d env_monitor track\n", bb->phy_idx); in __rtw89_phy_env_monitor_track()
5809 env->ccx_watchdog_result |= RTW89_PHY_ENV_MON_IFS_CLM; in __rtw89_phy_env_monitor_track()
5823 env->ccx_watchdog_result, chk_result); in __rtw89_phy_env_monitor_track()
5837 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_physts_ie_page_valid()
5843 *ie_page -= 1; in rtw89_physts_ie_page_valid()
5845 if (*ie_page == RTW89_EHT_PKT && chip->chip_gen == RTW89_CHIP_AX) in rtw89_physts_ie_page_valid()
5879 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_physts_set_ie_bitmap()
5885 if (chip->chip_id == RTL8852A) in rtw89_physts_set_ie_bitmap()
5896 const struct rtw89_phy_gen_def *phy = rtwdev->chip->phy_def; in rtw89_physts_enable_fail_report()
5897 const struct rtw89_physts_regs *physts = phy->physts; in rtw89_physts_enable_fail_report()
5900 rtw89_phy_write32_idx_clr(rtwdev, physts->setting_addr, in rtw89_physts_enable_fail_report()
5901 physts->dis_trigger_fail_mask, phy_idx); in rtw89_physts_enable_fail_report()
5902 rtw89_phy_write32_idx_clr(rtwdev, physts->setting_addr, in rtw89_physts_enable_fail_report()
5903 physts->dis_trigger_brk_mask, phy_idx); in rtw89_physts_enable_fail_report()
5905 rtw89_phy_write32_idx_set(rtwdev, physts->setting_addr, in rtw89_physts_enable_fail_report()
5906 physts->dis_trigger_fail_mask, phy_idx); in rtw89_physts_enable_fail_report()
5907 rtw89_phy_write32_idx_set(rtwdev, physts->setting_addr, in rtw89_physts_enable_fail_report()
5908 physts->dis_trigger_brk_mask, phy_idx); in rtw89_physts_enable_fail_report()
5915 const struct rtw89_chip_info *chip = rtwdev->chip; in __rtw89_physts_parsing_init()
5923 (i == RTW89_EHT_PKT && chip->chip_gen == RTW89_CHIP_AX)) in __rtw89_physts_parsing_init()
5951 if (rtwdev->dbcc_en) in rtw89_physts_parsing_init()
5958 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_dig_read_gain_table()
5960 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_read_gain_table()
5969 gain_arr = dig->lna_gain_g; in rtw89_phy_dig_read_gain_table()
5971 cfg = chip->dig_table->cfg_lna_g; in rtw89_phy_dig_read_gain_table()
5975 gain_arr = dig->tia_gain_g; in rtw89_phy_dig_read_gain_table()
5977 cfg = chip->dig_table->cfg_tia_g; in rtw89_phy_dig_read_gain_table()
5981 gain_arr = dig->lna_gain_a; in rtw89_phy_dig_read_gain_table()
5983 cfg = chip->dig_table->cfg_lna_a; in rtw89_phy_dig_read_gain_table()
5987 gain_arr = dig->tia_gain_a; in rtw89_phy_dig_read_gain_table()
5989 cfg = chip->dig_table->cfg_tia_a; in rtw89_phy_dig_read_gain_table()
5996 for (i = 0; i < cfg->size; i++) { in rtw89_phy_dig_read_gain_table()
5997 tmp = rtw89_phy_read32_idx(rtwdev, cfg->table[i].addr, in rtw89_phy_dig_read_gain_table()
5998 cfg->table[i].mask, bb->phy_idx); in rtw89_phy_dig_read_gain_table()
6011 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_update_gain_para()
6015 if (!rtwdev->hal.support_igi) in rtw89_phy_dig_update_gain_para()
6019 B_PATH0_IB_PKPW_MSK, bb->phy_idx); in rtw89_phy_dig_update_gain_para()
6020 dig->ib_pkpwr = sign_extend32(tmp >> DIG_GAIN_SHIFT, U8_MAX_BIT); in rtw89_phy_dig_update_gain_para()
6021 dig->ib_pbk = rtw89_phy_read32_idx(rtwdev, R_PATH0_IB_PBK, in rtw89_phy_dig_update_gain_para()
6022 B_PATH0_IB_PBK_MSK, bb->phy_idx); in rtw89_phy_dig_update_gain_para()
6024 dig->ib_pkpwr, dig->ib_pbk); in rtw89_phy_dig_update_gain_para()
6039 struct rtw89_phy_ch_info *ch_info = &bb->ch_info; in rtw89_phy_dig_update_rssi_info()
6040 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_update_rssi_info()
6041 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig_update_rssi_info()
6044 dig->igi_rssi = ch_info->rssi_min >> 1; in rtw89_phy_dig_update_rssi_info()
6047 dig->igi_rssi = rssi_nolink; in rtw89_phy_dig_update_rssi_info()
6054 const struct rtw89_chan *chan = rtw89_mgnt_chan_get(rtwdev, bb->phy_idx); in rtw89_phy_dig_update_para()
6055 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_update_para()
6056 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig_update_para()
6059 switch (chan->band_type) { in rtw89_phy_dig_update_para()
6061 dig->lna_gain = dig->lna_gain_g; in rtw89_phy_dig_update_para()
6062 dig->tia_gain = dig->tia_gain_g; in rtw89_phy_dig_update_para()
6064 dig->force_gaincode_idx_en = false; in rtw89_phy_dig_update_para()
6065 dig->dyn_pd_th_en = true; in rtw89_phy_dig_update_para()
6069 dig->lna_gain = dig->lna_gain_a; in rtw89_phy_dig_update_para()
6070 dig->tia_gain = dig->tia_gain_a; in rtw89_phy_dig_update_para()
6072 dig->force_gaincode_idx_en = true; in rtw89_phy_dig_update_para()
6073 dig->dyn_pd_th_en = true; in rtw89_phy_dig_update_para()
6076 memcpy(dig->fa_th, fa_th_src, sizeof(dig->fa_th)); in rtw89_phy_dig_update_para()
6077 memcpy(dig->igi_rssi_th, igi_rssi_th, sizeof(dig->igi_rssi_th)); in rtw89_phy_dig_update_para()
6087 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_para_reset()
6089 dig->cur_gaincode.lna_idx = LNA_IDX_MAX; in rtw89_phy_dig_para_reset()
6090 dig->cur_gaincode.tia_idx = TIA_IDX_MAX; in rtw89_phy_dig_para_reset()
6091 dig->cur_gaincode.rxb_idx = RXB_IDX_MAX; in rtw89_phy_dig_para_reset()
6092 dig->force_gaincode.lna_idx = LNA_IDX_MAX; in rtw89_phy_dig_para_reset()
6093 dig->force_gaincode.tia_idx = TIA_IDX_MAX; in rtw89_phy_dig_para_reset()
6094 dig->force_gaincode.rxb_idx = RXB_IDX_MAX; in rtw89_phy_dig_para_reset()
6096 dig->dyn_igi_max = igi_max_performance_mode; in rtw89_phy_dig_para_reset()
6097 dig->dyn_igi_min = dynamic_igi_min; in rtw89_phy_dig_para_reset()
6098 dig->dyn_pd_th_max = dynamic_pd_threshold_max; in rtw89_phy_dig_para_reset()
6099 dig->pd_low_th_ofst = pd_low_th_offset; in rtw89_phy_dig_para_reset()
6100 dig->is_linked_pre = false; in rtw89_phy_dig_para_reset()
6106 rtw89_debug(rtwdev, RTW89_DBG_DIG, "BB-%d dig_init\n", bb->phy_idx); in __rtw89_phy_dig_init()
6123 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_lna_idx_by_rssi()
6126 if (rssi < dig->igi_rssi_th[0]) in rtw89_phy_dig_lna_idx_by_rssi()
6128 else if (rssi < dig->igi_rssi_th[1]) in rtw89_phy_dig_lna_idx_by_rssi()
6130 else if (rssi < dig->igi_rssi_th[2]) in rtw89_phy_dig_lna_idx_by_rssi()
6132 else if (rssi < dig->igi_rssi_th[3]) in rtw89_phy_dig_lna_idx_by_rssi()
6134 else if (rssi < dig->igi_rssi_th[4]) in rtw89_phy_dig_lna_idx_by_rssi()
6145 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_tia_idx_by_rssi()
6148 if (rssi < dig->igi_rssi_th[0]) in rtw89_phy_dig_tia_idx_by_rssi()
6162 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_rxb_idx_by_rssi()
6163 s8 lna_gain = dig->lna_gain[set->lna_idx]; in rtw89_phy_dig_rxb_idx_by_rssi()
6164 s8 tia_gain = dig->tia_gain[set->tia_idx]; in rtw89_phy_dig_rxb_idx_by_rssi()
6169 rxb_idx_tmp += dig->ib_pkpwr - dig->ib_pbk - wb_rssi; in rtw89_phy_dig_rxb_idx_by_rssi()
6182 set->lna_idx = rtw89_phy_dig_lna_idx_by_rssi(rtwdev, bb, rssi); in rtw89_phy_dig_gaincode_by_rssi()
6183 set->tia_idx = rtw89_phy_dig_tia_idx_by_rssi(rtwdev, bb, rssi); in rtw89_phy_dig_gaincode_by_rssi()
6184 set->rxb_idx = rtw89_phy_dig_rxb_idx_by_rssi(rtwdev, bb, rssi, set); in rtw89_phy_dig_gaincode_by_rssi()
6188 rssi, set->lna_idx, set->tia_idx, set->rxb_idx); in rtw89_phy_dig_gaincode_by_rssi()
6196 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_igi_offset_by_env()
6197 struct rtw89_env_monitor_info *env = &bb->env_monitor; in rtw89_phy_dig_igi_offset_by_env()
6199 u8 igi_offset = dig->fa_rssi_ofst; in rtw89_phy_dig_igi_offset_by_env()
6202 fa_ratio = env->ifs_clm_cck_fa_permil + env->ifs_clm_ofdm_fa_permil; in rtw89_phy_dig_igi_offset_by_env()
6204 if (fa_ratio < dig->fa_th[0]) in rtw89_phy_dig_igi_offset_by_env()
6206 else if (fa_ratio < dig->fa_th[1]) in rtw89_phy_dig_igi_offset_by_env()
6208 else if (fa_ratio < dig->fa_th[2]) in rtw89_phy_dig_igi_offset_by_env()
6210 else if (fa_ratio < dig->fa_th[3]) in rtw89_phy_dig_igi_offset_by_env()
6221 dig->fa_rssi_ofst = igi_offset; in rtw89_phy_dig_igi_offset_by_env()
6224 "fa_th: [+6 (%d) +4 (%d) +2 (%d) 0 (%d) -2 ]\n", in rtw89_phy_dig_igi_offset_by_env()
6225 dig->fa_th[3], dig->fa_th[2], dig->fa_th[1], dig->fa_th[0]); in rtw89_phy_dig_igi_offset_by_env()
6229 env->ifs_clm_cck_fa_permil, env->ifs_clm_ofdm_fa_permil, in rtw89_phy_dig_igi_offset_by_env()
6230 env->ifs_clm_cck_fa_permil + env->ifs_clm_ofdm_fa_permil, in rtw89_phy_dig_igi_offset_by_env()
6237 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_lna_idx()
6239 rtw89_phy_write32_idx(rtwdev, dig_regs->p0_lna_init.addr, in rtw89_phy_dig_set_lna_idx()
6240 dig_regs->p0_lna_init.mask, lna_idx, bb->phy_idx); in rtw89_phy_dig_set_lna_idx()
6241 rtw89_phy_write32_idx(rtwdev, dig_regs->p1_lna_init.addr, in rtw89_phy_dig_set_lna_idx()
6242 dig_regs->p1_lna_init.mask, lna_idx, bb->phy_idx); in rtw89_phy_dig_set_lna_idx()
6248 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_tia_idx()
6250 rtw89_phy_write32_idx(rtwdev, dig_regs->p0_tia_init.addr, in rtw89_phy_dig_set_tia_idx()
6251 dig_regs->p0_tia_init.mask, tia_idx, bb->phy_idx); in rtw89_phy_dig_set_tia_idx()
6252 rtw89_phy_write32_idx(rtwdev, dig_regs->p1_tia_init.addr, in rtw89_phy_dig_set_tia_idx()
6253 dig_regs->p1_tia_init.mask, tia_idx, bb->phy_idx); in rtw89_phy_dig_set_tia_idx()
6259 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_rxb_idx()
6261 rtw89_phy_write32_idx(rtwdev, dig_regs->p0_rxb_init.addr, in rtw89_phy_dig_set_rxb_idx()
6262 dig_regs->p0_rxb_init.mask, rxb_idx, bb->phy_idx); in rtw89_phy_dig_set_rxb_idx()
6263 rtw89_phy_write32_idx(rtwdev, dig_regs->p1_rxb_init.addr, in rtw89_phy_dig_set_rxb_idx()
6264 dig_regs->p1_rxb_init.mask, rxb_idx, bb->phy_idx); in rtw89_phy_dig_set_rxb_idx()
6271 if (!rtwdev->hal.support_igi) in rtw89_phy_dig_set_igi_cr()
6286 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_sdagc_follow_pagc_config()
6288 rtw89_phy_write32_idx(rtwdev, dig_regs->p0_p20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
6289 dig_regs->p0_p20_pagcugc_en.mask, enable, bb->phy_idx); in rtw89_phy_dig_sdagc_follow_pagc_config()
6290 rtw89_phy_write32_idx(rtwdev, dig_regs->p0_s20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
6291 dig_regs->p0_s20_pagcugc_en.mask, enable, bb->phy_idx); in rtw89_phy_dig_sdagc_follow_pagc_config()
6292 rtw89_phy_write32_idx(rtwdev, dig_regs->p1_p20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
6293 dig_regs->p1_p20_pagcugc_en.mask, enable, bb->phy_idx); in rtw89_phy_dig_sdagc_follow_pagc_config()
6294 rtw89_phy_write32_idx(rtwdev, dig_regs->p1_s20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
6295 dig_regs->p1_s20_pagcugc_en.mask, enable, bb->phy_idx); in rtw89_phy_dig_sdagc_follow_pagc_config()
6303 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_config_igi()
6305 if (!rtwdev->hal.support_igi) in rtw89_phy_dig_config_igi()
6308 if (dig->force_gaincode_idx_en) { in rtw89_phy_dig_config_igi()
6309 rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->force_gaincode); in rtw89_phy_dig_config_igi()
6313 rtw89_phy_dig_gaincode_by_rssi(rtwdev, bb, dig->igi_fa_rssi, in rtw89_phy_dig_config_igi()
6314 &dig->cur_gaincode); in rtw89_phy_dig_config_igi()
6315 rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->cur_gaincode); in rtw89_phy_dig_config_igi()
6323 enum rtw89_bandwidth cbw = chan->band_width; in rtw89_phy_dig_cal_under_region()
6324 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_cal_under_region()
6325 u8 under_region = dig->pd_low_th_ofst; in rtw89_phy_dig_cal_under_region()
6327 if (rtwdev->chip->chip_gen == RTW89_CHIP_AX) in rtw89_phy_dig_cal_under_region()
6355 struct rtw89_dig_info *dig = &bb->dig; in __rtw89_phy_dig_dyn_pd_th()
6361 dig->dyn_pd_th_max = dig->igi_rssi; in __rtw89_phy_dig_dyn_pd_th()
6363 final_rssi = min_t(u8, rssi, dig->igi_rssi); in __rtw89_phy_dig_dyn_pd_th()
6368 pd_val = (ofdm_cca_th - under_region - PD_TH_MIN_RSSI) >> 1; in __rtw89_phy_dig_dyn_pd_th()
6385 const struct rtw89_chan *chan = rtw89_mgnt_chan_get(rtwdev, bb->phy_idx); in rtw89_phy_dig_dyn_pd_th()
6386 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_dyn_pd_th()
6387 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_dyn_pd_th()
6388 u8 final_rssi, under_region = dig->pd_low_th_ofst; in rtw89_phy_dig_dyn_pd_th()
6393 dig->bak_dig = pd_val; in rtw89_phy_dig_dyn_pd_th()
6395 rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_dyn_pd_th()
6396 dig_regs->pd_lower_bound_mask, pd_val, bb->phy_idx); in rtw89_phy_dig_dyn_pd_th()
6397 rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_dyn_pd_th()
6398 dig_regs->pd_spatial_reuse_en, enable, bb->phy_idx); in rtw89_phy_dig_dyn_pd_th()
6400 if (!rtwdev->hal.support_cckpd) in rtw89_phy_dig_dyn_pd_th()
6403 final_rssi = min_t(u8, rssi, dig->igi_rssi); in rtw89_phy_dig_dyn_pd_th()
6405 cck_cca_th = max_t(s8, final_rssi - under_region, CCKPD_TH_MIN_RSSI); in rtw89_phy_dig_dyn_pd_th()
6406 pd_val = (u32)(cck_cca_th - IGI_RSSI_MAX); in rtw89_phy_dig_dyn_pd_th()
6412 rtw89_phy_write32_idx(rtwdev, dig_regs->bmode_pd_reg, in rtw89_phy_dig_dyn_pd_th()
6413 dig_regs->bmode_cca_rssi_limit_en, enable, bb->phy_idx); in rtw89_phy_dig_dyn_pd_th()
6414 rtw89_phy_write32_idx(rtwdev, dig_regs->bmode_pd_lower_bound_reg, in rtw89_phy_dig_dyn_pd_th()
6415 dig_regs->bmode_rssi_nocca_low_th_mask, pd_val, bb->phy_idx); in rtw89_phy_dig_dyn_pd_th()
6420 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_reset()
6422 dig->bypass_dig = false; in rtw89_phy_dig_reset()
6424 rtw89_phy_dig_set_igi_cr(rtwdev, bb, dig->force_gaincode); in rtw89_phy_dig_reset()
6435 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_cal_igi_fa_rssi()
6440 igi_min = max_t(int, dig->igi_rssi - IGI_RSSI_MIN, 0); in rtw89_phy_cal_igi_fa_rssi()
6441 dig->dyn_igi_max = min(igi_min + IGI_OFFSET_MAX, igi_max_performance_mode); in rtw89_phy_cal_igi_fa_rssi()
6442 dig->dyn_igi_min = max(igi_min, ABS_IGI_MIN); in rtw89_phy_cal_igi_fa_rssi()
6444 if (dig->dyn_igi_max >= dig->dyn_igi_min) { in rtw89_phy_cal_igi_fa_rssi()
6445 dig->igi_fa_rssi += dig->fa_rssi_ofst; in rtw89_phy_cal_igi_fa_rssi()
6446 dig->igi_fa_rssi = clamp(dig->igi_fa_rssi, dig->dyn_igi_min, in rtw89_phy_cal_igi_fa_rssi()
6447 dig->dyn_igi_max); in rtw89_phy_cal_igi_fa_rssi()
6449 dig->igi_fa_rssi = dig->dyn_igi_max; in rtw89_phy_cal_igi_fa_rssi()
6465 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_set_mcc_dig()
6470 dig->igi_rssi = rssi_min >> 1; in rtw89_phy_set_mcc_dig()
6471 dig->igi_fa_rssi = dig->igi_rssi; in rtw89_phy_set_mcc_dig()
6474 dig->igi_rssi = rssi_nolink; in rtw89_phy_set_mcc_dig()
6475 dig->igi_fa_rssi = dig->igi_rssi; in rtw89_phy_set_mcc_dig()
6478 chan = rtw89_chan_get(rtwdev, rtwvif_link->chanctx_idx); in rtw89_phy_set_mcc_dig()
6480 pd_val = __rtw89_phy_dig_dyn_pd_th(rtwdev, bb, dig->igi_fa_rssi, in rtw89_phy_set_mcc_dig()
6482 rtw89_fw_h2c_mcc_dig(rtwdev, rtwvif_link->chanctx_idx, in rtw89_phy_set_mcc_dig()
6487 rtwvif_link->chanctx_idx, chan->primary_channel, in rtw89_phy_set_mcc_dig()
6488 dig->igi_rssi, pd_val); in rtw89_phy_set_mcc_dig()
6494 unsigned int link_id = mcc_dig->rtwvif_link->link_id; in rtw89_phy_set_mcc_dig_iter()
6498 if (rtwsta->rtwvif != mcc_dig->rtwvif_link->rtwvif) in rtw89_phy_set_mcc_dig_iter()
6501 rtwsta_link = rtwsta->links[link_id]; in rtw89_phy_set_mcc_dig_iter()
6505 mcc_dig->has_sta = true; in rtw89_phy_set_mcc_dig_iter()
6506 if (ewma_rssi_read(&rtwsta_link->avg_rssi) < mcc_dig->rssi_min) in rtw89_phy_set_mcc_dig_iter()
6507 mcc_dig->rssi_min = ewma_rssi_read(&rtwsta_link->avg_rssi); in rtw89_phy_set_mcc_dig_iter()
6527 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_dig_mcc()
6539 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_ctrl()
6540 struct rtw89_dig_info *dig = &bb->dig; in rtw89_phy_dig_ctrl()
6544 if (dig->pause_dig == pause_dig) in rtw89_phy_dig_ctrl()
6551 en_dig = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig_ctrl()
6552 pd_val = restore ? dig->bak_dig : 0; in rtw89_phy_dig_ctrl()
6558 rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_ctrl()
6559 dig_regs->pd_lower_bound_mask, pd_val, bb->phy_idx); in rtw89_phy_dig_ctrl()
6560 rtw89_phy_write32_idx(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_ctrl()
6561 dig_regs->pd_spatial_reuse_en, en_dig, bb->phy_idx); in rtw89_phy_dig_ctrl()
6563 dig->pause_dig = pause_dig; in rtw89_phy_dig_ctrl()
6584 struct rtw89_dig_info *dig = &bb->dig; in __rtw89_phy_dig()
6585 bool is_linked = rtwdev->total_sta_assoc > 0; in __rtw89_phy_dig()
6588 if (unlikely(dig->bypass_dig)) { in __rtw89_phy_dig()
6589 dig->bypass_dig = false; in __rtw89_phy_dig()
6593 rtw89_debug(rtwdev, RTW89_DBG_DIG, "BB-%d dig track\n", bb->phy_idx); in __rtw89_phy_dig()
6603 if (unlikely(dig->pause_dig)) in __rtw89_phy_dig()
6606 if (!dig->is_linked_pre && is_linked) { in __rtw89_phy_dig()
6609 dig->igi_fa_rssi = dig->igi_rssi; in __rtw89_phy_dig()
6610 } else if (dig->is_linked_pre && !is_linked) { in __rtw89_phy_dig()
6613 dig->igi_fa_rssi = dig->igi_rssi; in __rtw89_phy_dig()
6615 dig->is_linked_pre = is_linked; in __rtw89_phy_dig()
6621 dig->igi_rssi, dig->dyn_igi_max, dig->dyn_igi_min, in __rtw89_phy_dig()
6622 dig->igi_fa_rssi); in __rtw89_phy_dig()
6626 rtw89_phy_dig_dyn_pd_th(rtwdev, bb, dig->igi_fa_rssi, dig->dyn_pd_th_en); in __rtw89_phy_dig()
6628 if (dig->dyn_pd_th_en && dig->igi_fa_rssi > dig->dyn_pd_th_max) in __rtw89_phy_dig()
6645 struct rtw89_hal *hal = &rtwdev->hal; in __rtw89_phy_tx_path_div_sta_iter()
6649 rssi_a = ewma_rssi_read(&rtwsta_link->rssi[RF_PATH_A]); in __rtw89_phy_tx_path_div_sta_iter()
6650 rssi_b = ewma_rssi_read(&rtwsta_link->rssi[RF_PATH_B]); in __rtw89_phy_tx_path_div_sta_iter()
6659 if (hal->antenna_tx == candidate) in __rtw89_phy_tx_path_div_sta_iter()
6662 hal->antenna_tx = candidate; in __rtw89_phy_tx_path_div_sta_iter()
6665 if (hal->antenna_tx == RF_A) { in __rtw89_phy_tx_path_div_sta_iter()
6668 } else if (hal->antenna_tx == RF_B) { in __rtw89_phy_tx_path_div_sta_iter()
6677 struct rtw89_dev *rtwdev = rtwsta->rtwdev; in rtw89_phy_tx_path_div_sta_iter()
6678 struct rtw89_vif *rtwvif = rtwsta->rtwvif; in rtw89_phy_tx_path_div_sta_iter()
6688 if (sta->tdls) in rtw89_phy_tx_path_div_sta_iter()
6695 rtwvif_link = rtwsta_link->rtwvif_link; in rtw89_phy_tx_path_div_sta_iter()
6696 if (rtwvif_link->wifi_role != RTW89_WIFI_ROLE_STATION) in rtw89_phy_tx_path_div_sta_iter()
6707 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_tx_path_div_track()
6710 if (!hal->tx_path_diversity) in rtw89_phy_tx_path_div_track()
6713 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_tx_path_div_track()
6723 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_antdiv_set_ant()
6726 if (!hal->ant_diversity || hal->antenna_tx == 0) in rtw89_phy_antdiv_set_ant()
6729 if (hal->antenna_tx == RF_B) { in rtw89_phy_antdiv_set_ant()
6749 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_swap_hal_antenna()
6751 hal->antenna_rx = hal->antenna_rx == RF_A ? RF_B : RF_A; in rtw89_phy_swap_hal_antenna()
6752 hal->antenna_tx = hal->antenna_rx; in rtw89_phy_swap_hal_antenna()
6757 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_decision_state()
6758 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_antdiv_decision_state()
6764 antdiv->get_stats = false; in rtw89_phy_antdiv_decision_state()
6765 antdiv->training_count = 0; in rtw89_phy_antdiv_decision_state()
6767 main_rssi = rtw89_phy_antdiv_sts_instance_get_rssi(&antdiv->main_stats); in rtw89_phy_antdiv_decision_state()
6768 main_evm = rtw89_phy_antdiv_sts_instance_get_evm(&antdiv->main_stats); in rtw89_phy_antdiv_decision_state()
6769 aux_rssi = rtw89_phy_antdiv_sts_instance_get_rssi(&antdiv->aux_stats); in rtw89_phy_antdiv_decision_state()
6770 aux_evm = rtw89_phy_antdiv_sts_instance_get_evm(&antdiv->aux_stats); in rtw89_phy_antdiv_decision_state()
6789 hal->antenna_tx = candidate; in rtw89_phy_antdiv_decision_state()
6790 hal->antenna_rx = candidate; in rtw89_phy_antdiv_decision_state()
6795 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_training_state()
6798 if (antdiv->training_count % 2 == 0) { in rtw89_phy_antdiv_training_state()
6799 if (antdiv->training_count == 0) in rtw89_phy_antdiv_training_state()
6802 antdiv->get_stats = true; in rtw89_phy_antdiv_training_state()
6805 antdiv->get_stats = false; in rtw89_phy_antdiv_training_state()
6812 antdiv->training_count++; in rtw89_phy_antdiv_training_state()
6813 wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work, in rtw89_phy_antdiv_training_state()
6821 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_work()
6825 if (antdiv->training_count <= ANTDIV_TRAINNING_CNT) { in rtw89_phy_antdiv_work()
6835 struct rtw89_antdiv_info *antdiv = &rtwdev->antdiv; in rtw89_phy_antdiv_track()
6836 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_antdiv_track()
6839 if (!hal->ant_diversity || hal->ant_diversity_fixed) in rtw89_phy_antdiv_track()
6842 rssi = rtw89_phy_antdiv_sts_instance_get_rssi(&antdiv->target_stats); in rtw89_phy_antdiv_track()
6843 rssi_pre = antdiv->rssi_pre; in rtw89_phy_antdiv_track()
6844 antdiv->rssi_pre = rssi; in rtw89_phy_antdiv_track()
6845 rtw89_phy_antdiv_sts_instance_reset(&antdiv->target_stats); in rtw89_phy_antdiv_track()
6847 if (abs((int)rssi - (int)rssi_pre) < ANTDIV_RSSI_DIFF_TH) in rtw89_phy_antdiv_track()
6850 antdiv->training_count = 0; in rtw89_phy_antdiv_track()
6851 wiphy_delayed_work_queue(rtwdev->hw->wiphy, &rtwdev->antdiv_work, 0); in rtw89_phy_antdiv_track()
6858 "BB-%d env_monitor init\n", bb->phy_idx); in __rtw89_phy_env_monitor_init()
6875 const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs; in __rtw89_phy_edcca_init()
6876 struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak; in __rtw89_phy_edcca_init()
6878 rtw89_debug(rtwdev, RTW89_DBG_EDCCA, "BB-%d edcca init\n", bb->phy_idx); in __rtw89_phy_edcca_init()
6882 if (rtwdev->chip->chip_id == RTL8922A && rtwdev->hal.cv == CHIP_CAV) { in __rtw89_phy_edcca_init()
6894 rtw89_phy_write32_idx(rtwdev, edcca_regs->tx_collision_t2r_st, in __rtw89_phy_edcca_init()
6895 edcca_regs->tx_collision_t2r_st_mask, 0x29, bb->phy_idx); in __rtw89_phy_edcca_init()
6942 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_set_bss_color()
6943 const struct rtw89_reg_def *bss_clr_vld = &chip->bss_clr_vld; in rtw89_phy_set_bss_color()
6944 enum rtw89_phy_idx phy_idx = rtwvif_link->phy_idx; in rtw89_phy_set_bss_color()
6951 if (!bss_conf->he_support || !vif->cfg.assoc) { in rtw89_phy_set_bss_color()
6956 bss_color = bss_conf->he_bss_color.color; in rtw89_phy_set_bss_color()
6960 rtw89_phy_write32_idx(rtwdev, bss_clr_vld->addr, bss_clr_vld->mask, 0x1, in rtw89_phy_set_bss_color()
6962 rtw89_phy_write32_idx(rtwdev, chip->bss_clr_map_reg, B_BSS_CLR_MAP_TGT, in rtw89_phy_set_bss_color()
6964 rtw89_phy_write32_idx(rtwdev, chip->bss_clr_map_reg, B_BSS_CLR_MAP_STAID, in rtw89_phy_set_bss_color()
6965 vif->cfg.aid, phy_idx); in rtw89_phy_set_bss_color()
6970 return desc->ch != 0; in rfk_chan_validate_desc()
6979 if (desc->ch != chan->channel) in rfk_chan_is_equivalent()
6982 if (desc->has_band && desc->band != chan->band_type) in rfk_chan_is_equivalent()
6985 if (desc->has_bw && desc->bw != chan->band_width) in rfk_chan_is_equivalent()
7000 if (rfk_chan_is_equivalent(&iter_data->desc, chan)) in rfk_chan_iter_search()
7001 iter_data->found++; in rfk_chan_iter_search()
7010 int sel = -1; in rtw89_rfk_chan_lookup()
7022 if (!iter_data.found && sel == -1) in rtw89_rfk_chan_lookup()
7026 if (sel == -1) { in rtw89_rfk_chan_lookup()
7039 rtw89_write_rf(rtwdev, def->path, def->addr, def->mask, def->data); in _rfk_write_rf()
7045 rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); in _rfk_write32_mask()
7051 rtw89_phy_write32_set(rtwdev, def->addr, def->mask); in _rfk_write32_set()
7057 rtw89_phy_write32_clr(rtwdev, def->addr, def->mask); in _rfk_write32_clr()
7063 udelay(def->data); in _rfk_delay()
7080 const struct rtw89_reg5_def *p = tbl->defs; in rtw89_rfk_parser()
7081 const struct rtw89_reg5_def *end = tbl->defs + tbl->size; in rtw89_rfk_parser()
7084 _rfk_handler[p->flag](rtwdev, p); in rtw89_rfk_parser()
7165 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_tssi_ctrl_set_bandedge_cfg()
7179 data = chip->tssi_dbw_table->data[bandedge_cfg]; in rtw89_phy_tssi_ctrl_set_bandedge_cfg()
7231 for (idx = last; idx >= first; idx--) in rtw89_encode_chan_idx()
7242 (central_ch - rtw89_ch_base_table[idx]) >> 1); in rtw89_encode_chan_idx()
7269 const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs; in rtw89_phy_config_edcca()
7270 struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak; in rtw89_phy_config_edcca()
7273 edcca_bak->a = in rtw89_phy_config_edcca()
7274 rtw89_phy_read32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7275 edcca_regs->edcca_mask, bb->phy_idx); in rtw89_phy_config_edcca()
7276 edcca_bak->p = in rtw89_phy_config_edcca()
7277 rtw89_phy_read32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7278 edcca_regs->edcca_p_mask, bb->phy_idx); in rtw89_phy_config_edcca()
7279 edcca_bak->ppdu = in rtw89_phy_config_edcca()
7280 rtw89_phy_read32_idx(rtwdev, edcca_regs->ppdu_level, in rtw89_phy_config_edcca()
7281 edcca_regs->ppdu_mask, bb->phy_idx); in rtw89_phy_config_edcca()
7283 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7284 edcca_regs->edcca_mask, EDCCA_MAX, bb->phy_idx); in rtw89_phy_config_edcca()
7285 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7286 edcca_regs->edcca_p_mask, EDCCA_MAX, bb->phy_idx); in rtw89_phy_config_edcca()
7287 rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level, in rtw89_phy_config_edcca()
7288 edcca_regs->ppdu_mask, EDCCA_MAX, bb->phy_idx); in rtw89_phy_config_edcca()
7290 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7291 edcca_regs->edcca_mask, in rtw89_phy_config_edcca()
7292 edcca_bak->a, bb->phy_idx); in rtw89_phy_config_edcca()
7293 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_config_edcca()
7294 edcca_regs->edcca_p_mask, in rtw89_phy_config_edcca()
7295 edcca_bak->p, bb->phy_idx); in rtw89_phy_config_edcca()
7296 rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level, in rtw89_phy_config_edcca()
7297 edcca_regs->ppdu_mask, in rtw89_phy_config_edcca()
7298 edcca_bak->ppdu, bb->phy_idx); in rtw89_phy_config_edcca()
7304 const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs; in rtw89_phy_edcca_log()
7315 if (bb->phy_idx == RTW89_PHY_1) in rtw89_phy_edcca_log()
7316 edcca_p_regs = &edcca_regs->p[RTW89_PHY_1]; in rtw89_phy_edcca_log()
7318 edcca_p_regs = &edcca_regs->p[RTW89_PHY_0]; in rtw89_phy_edcca_log()
7320 if (rtwdev->chip->chip_id == RTL8922A) in rtw89_phy_edcca_log()
7321 rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be, in rtw89_phy_edcca_log()
7322 edcca_regs->rpt_sel_be_mask, 0); in rtw89_phy_edcca_log()
7324 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7325 edcca_p_regs->rpt_sel_mask, 0); in rtw89_phy_edcca_log()
7326 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b); in rtw89_phy_edcca_log()
7337 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7338 edcca_p_regs->rpt_sel_mask, 5); in rtw89_phy_edcca_log()
7339 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b); in rtw89_phy_edcca_log()
7343 if (rtwdev->chip->chip_id == RTL8922A) { in rtw89_phy_edcca_log()
7344 rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be, in rtw89_phy_edcca_log()
7345 edcca_regs->rpt_sel_be_mask, 4); in rtw89_phy_edcca_log()
7346 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b); in rtw89_phy_edcca_log()
7351 per20_bitmap = rtw89_phy_read32_mask(rtwdev, edcca_p_regs->rpt_a, in rtw89_phy_edcca_log()
7354 rtw89_phy_write32_mask(rtwdev, edcca_regs->rpt_sel_be, in rtw89_phy_edcca_log()
7355 edcca_regs->rpt_sel_be_mask, 5); in rtw89_phy_edcca_log()
7356 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_b); in rtw89_phy_edcca_log()
7362 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7363 edcca_p_regs->rpt_sel_mask, 0); in rtw89_phy_edcca_log()
7364 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a); in rtw89_phy_edcca_log()
7368 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7369 edcca_p_regs->rpt_sel_mask, 5); in rtw89_phy_edcca_log()
7370 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a); in rtw89_phy_edcca_log()
7374 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7375 edcca_p_regs->rpt_sel_mask, 2); in rtw89_phy_edcca_log()
7376 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a); in rtw89_phy_edcca_log()
7380 rtw89_phy_write32_mask(rtwdev, edcca_p_regs->rpt_sel, in rtw89_phy_edcca_log()
7381 edcca_p_regs->rpt_sel_mask, 3); in rtw89_phy_edcca_log()
7382 tmp = rtw89_phy_read32(rtwdev, edcca_p_regs->rpt_a); in rtw89_phy_edcca_log()
7407 struct rtw89_phy_ch_info *ch_info = &bb->ch_info; in rtw89_phy_edcca_get_thre_by_rssi()
7408 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_edcca_get_thre_by_rssi()
7409 u8 rssi_min = ch_info->rssi_min >> 1; in rtw89_phy_edcca_get_thre_by_rssi()
7415 edcca_thre = rssi_min - RSSI_UNIT_CONVER + EDCCA_UNIT_CONVER - in rtw89_phy_edcca_get_thre_by_rssi()
7425 const struct rtw89_edcca_regs *edcca_regs = rtwdev->chip->edcca_regs; in rtw89_phy_edcca_thre_calc()
7426 struct rtw89_edcca_bak *edcca_bak = &bb->edcca_bak; in rtw89_phy_edcca_thre_calc()
7430 if (th == edcca_bak->th_old) in rtw89_phy_edcca_thre_calc()
7433 edcca_bak->th_old = th; in rtw89_phy_edcca_thre_calc()
7438 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_edcca_thre_calc()
7439 edcca_regs->edcca_mask, th, bb->phy_idx); in rtw89_phy_edcca_thre_calc()
7440 rtw89_phy_write32_idx(rtwdev, edcca_regs->edcca_level, in rtw89_phy_edcca_thre_calc()
7441 edcca_regs->edcca_p_mask, th, bb->phy_idx); in rtw89_phy_edcca_thre_calc()
7442 rtw89_phy_write32_idx(rtwdev, edcca_regs->ppdu_level, in rtw89_phy_edcca_thre_calc()
7443 edcca_regs->ppdu_mask, th, bb->phy_idx); in rtw89_phy_edcca_thre_calc()
7449 rtw89_debug(rtwdev, RTW89_DBG_EDCCA, "BB-%d edcca track\n", bb->phy_idx); in __rtw89_phy_edcca_track()
7457 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_edcca_track()
7460 if (hal->disabled_dm_bitmap & BIT(RTW89_DM_DYNAMIC_EDCCA)) in rtw89_phy_edcca_track()
7472 rtwdev->dbcc_en, rtwdev->mlo_dbcc_mode, phy_idx); in rtw89_phy_get_kpath()
7474 switch (rtwdev->mlo_dbcc_mode) { in rtw89_phy_get_kpath()
7506 rtwdev->dbcc_en, rtwdev->mlo_dbcc_mode, phy_idx); in rtw89_phy_get_syn_sel()
7508 switch (rtwdev->mlo_dbcc_mode) { in rtw89_phy_get_syn_sel()