Lines Matching refs:rtwdev

14 static u16 get_max_amsdu_len(struct rtw89_dev *rtwdev,  in get_max_amsdu_len()  argument
39 return rtwdev->chip->max_amsdu_limit; in get_max_amsdu_len()
91 static u64 rtw89_phy_ra_mask_rssi(struct rtw89_dev *rtwdev, u8 rssi, in rtw89_phy_ra_mask_rssi() argument
134 static u64 rtw89_phy_ra_mask_cfg(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta) in rtw89_phy_ra_mask_cfg() argument
137 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_ra_mask_cfg()
162 rtw89_warn(rtwdev, "unhandled band type %d\n", chan->band_type); in rtw89_phy_ra_mask_cfg()
196 static void rtw89_phy_ra_gi_ltf(struct rtw89_dev *rtwdev, in rtw89_phy_ra_gi_ltf() argument
200 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_ra_gi_ltf()
230 static void rtw89_phy_ra_sta_update(struct rtw89_dev *rtwdev, in rtw89_phy_ra_sta_update() argument
237 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_ra_sta_update()
266 rtw89_phy_ra_gi_ltf(rtwdev, rtwsta, &fix_giltf_en, &fix_giltf); in rtw89_phy_ra_sta_update()
310 rtw89_err(rtwdev, "Unknown band type\n"); in rtw89_phy_ra_sta_update()
318 for (i = 0; i < rtwdev->hal.tx_nss; i++) in rtw89_phy_ra_sta_update()
330 ra_mask &= rtw89_phy_ra_mask_rssi(rtwdev, rssi, 0); in rtw89_phy_ra_sta_update()
333 ra_mask &= rtw89_phy_ra_mask_cfg(rtwdev, rtwsta); in rtw89_phy_ra_sta_update()
363 ra_mask = rtw89_phy_ra_mask_cfg(rtwdev, rtwsta); in rtw89_phy_ra_sta_update()
373 ra->ss_num = min(sta->deflink.rx_nss, rtwdev->hal.tx_nss) - 1; in rtw89_phy_ra_sta_update()
392 void rtw89_phy_ra_updata_sta(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta, in rtw89_phy_ra_updata_sta() argument
398 rtw89_phy_ra_sta_update(rtwdev, sta, false); in rtw89_phy_ra_updata_sta()
405 rtw89_debug(rtwdev, RTW89_DBG_RA, in rtw89_phy_ra_updata_sta()
413 rtw89_fw_h2c_ra(rtwdev, ra, false); in rtw89_phy_ra_updata_sta()
444 void rtw89_phy_rate_pattern_vif(struct rtw89_dev *rtwdev, in rtw89_phy_rate_pattern_vif() argument
451 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_rate_pattern_vif()
466 u8 tx_nss = rtwdev->hal.tx_nss; in rtw89_phy_rate_pattern_vif()
494 sband = rtwdev->hw->wiphy->bands[nl_band]; in rtw89_phy_rate_pattern_vif()
514 rtw89_debug(rtwdev, RTW89_DBG_RA, in rtw89_phy_rate_pattern_vif()
523 rtw89_debug(rtwdev, RTW89_DBG_RA, "unset rate pattern\n"); in rtw89_phy_rate_pattern_vif()
528 struct rtw89_dev *rtwdev = (struct rtw89_dev *)data; in rtw89_phy_ra_updata_sta_iter() local
530 rtw89_phy_ra_updata_sta(rtwdev, sta, IEEE80211_RC_SUPP_RATES_CHANGED); in rtw89_phy_ra_updata_sta_iter()
533 void rtw89_phy_ra_update(struct rtw89_dev *rtwdev) in rtw89_phy_ra_update() argument
535 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_ra_update()
537 rtwdev); in rtw89_phy_ra_update()
540 void rtw89_phy_ra_assoc(struct rtw89_dev *rtwdev, struct ieee80211_sta *sta) in rtw89_phy_ra_assoc() argument
547 rtw89_phy_ra_sta_update(rtwdev, sta, csi); in rtw89_phy_ra_assoc()
558 rtw89_debug(rtwdev, RTW89_DBG_RA, in rtw89_phy_ra_assoc()
565 rtw89_debug(rtwdev, RTW89_DBG_RA, in rtw89_phy_ra_assoc()
574 rtw89_fw_h2c_ra(rtwdev, ra, csi); in rtw89_phy_ra_assoc()
577 u8 rtw89_phy_get_txsc(struct rtw89_dev *rtwdev, in rtw89_phy_get_txsc() argument
647 static bool rtw89_phy_check_swsi_busy(struct rtw89_dev *rtwdev) in rtw89_phy_check_swsi_busy() argument
649 return !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_W_BUSY_V1) || in rtw89_phy_check_swsi_busy()
650 !!rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, B_SWSI_R_BUSY_V1); in rtw89_phy_check_swsi_busy()
653 u32 rtw89_phy_read_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, in rtw89_phy_read_rf() argument
656 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_read_rf()
660 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_read_rf()
661 rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); in rtw89_phy_read_rf()
669 val = rtw89_phy_read32_mask(rtwdev, direct_addr, mask); in rtw89_phy_read_rf()
675 static u32 rtw89_phy_read_rf_a(struct rtw89_dev *rtwdev, in rtw89_phy_read_rf_a() argument
684 1, 30, false, rtwdev); in rtw89_phy_read_rf_a()
686 rtw89_err(rtwdev, "read rf busy swsi\n"); in rtw89_phy_read_rf_a()
694 rtw89_phy_write32_mask(rtwdev, R_SWSI_READ_ADDR_V1, B_SWSI_READ_ADDR_V1, val); in rtw89_phy_read_rf_a()
698 30, false, rtwdev, R_SWSI_V1, in rtw89_phy_read_rf_a()
701 rtw89_err(rtwdev, "read swsi busy\n"); in rtw89_phy_read_rf_a()
705 return rtw89_phy_read32_mask(rtwdev, R_SWSI_V1, mask); in rtw89_phy_read_rf_a()
708 u32 rtw89_phy_read_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, in rtw89_phy_read_rf_v1() argument
713 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_read_rf_v1()
714 rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); in rtw89_phy_read_rf_v1()
719 return rtw89_phy_read_rf(rtwdev, rf_path, addr, mask); in rtw89_phy_read_rf_v1()
721 return rtw89_phy_read_rf_a(rtwdev, rf_path, addr, mask); in rtw89_phy_read_rf_v1()
725 bool rtw89_phy_write_rf(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, in rtw89_phy_write_rf() argument
728 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_write_rf()
732 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_write_rf()
733 rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); in rtw89_phy_write_rf()
741 rtw89_phy_write32_mask(rtwdev, direct_addr, mask, data); in rtw89_phy_write_rf()
750 static bool rtw89_phy_write_rf_a(struct rtw89_dev *rtwdev, in rtw89_phy_write_rf_a() argument
760 1, 30, false, rtwdev); in rtw89_phy_write_rf_a()
762 rtw89_err(rtwdev, "write rf busy swsi\n"); in rtw89_phy_write_rf_a()
771 rtw89_phy_write32_mask(rtwdev, R_SWSI_BIT_MASK_V1, RFREG_MASK, in rtw89_phy_write_rf_a()
782 rtw89_phy_write32_mask(rtwdev, R_SWSI_DATA_V1, MASKDWORD, val); in rtw89_phy_write_rf_a()
787 bool rtw89_phy_write_rf_v1(struct rtw89_dev *rtwdev, enum rtw89_rf_path rf_path, in rtw89_phy_write_rf_v1() argument
792 if (rf_path >= rtwdev->chip->rf_path_num) { in rtw89_phy_write_rf_v1()
793 rtw89_err(rtwdev, "unsupported rf path (%d)\n", rf_path); in rtw89_phy_write_rf_v1()
798 return rtw89_phy_write_rf(rtwdev, rf_path, addr, mask, data); in rtw89_phy_write_rf_v1()
800 return rtw89_phy_write_rf_a(rtwdev, rf_path, addr, mask, data); in rtw89_phy_write_rf_v1()
804 static void rtw89_phy_bb_reset(struct rtw89_dev *rtwdev, in rtw89_phy_bb_reset() argument
807 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_bb_reset()
809 chip->ops->bb_reset(rtwdev, phy_idx); in rtw89_phy_bb_reset()
812 static void rtw89_phy_config_bb_reg(struct rtw89_dev *rtwdev, in rtw89_phy_config_bb_reg() argument
830 rtw89_phy_write32(rtwdev, reg->addr, reg->data); in rtw89_phy_config_bb_reg()
850 rtw89_phy_cfg_bb_gain_error(struct rtw89_dev *rtwdev, in rtw89_phy_cfg_bb_gain_error() argument
853 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; in rtw89_phy_cfg_bb_gain_error()
873 rtw89_warn(rtwdev, in rtw89_phy_cfg_bb_gain_error()
889 rtw89_phy_cfg_bb_rpl_ofst(struct rtw89_dev *rtwdev, in rtw89_phy_cfg_bb_rpl_ofst() argument
892 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; in rtw89_phy_cfg_bb_rpl_ofst()
963 rtw89_warn(rtwdev, in rtw89_phy_cfg_bb_rpl_ofst()
971 rtw89_phy_cfg_bb_gain_bypass(struct rtw89_dev *rtwdev, in rtw89_phy_cfg_bb_gain_bypass() argument
974 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; in rtw89_phy_cfg_bb_gain_bypass()
990 rtw89_warn(rtwdev, in rtw89_phy_cfg_bb_gain_bypass()
998 rtw89_phy_cfg_bb_gain_op1db(struct rtw89_dev *rtwdev, in rtw89_phy_cfg_bb_gain_op1db() argument
1001 struct rtw89_phy_bb_gain_info *gain = &rtwdev->bb_gain; in rtw89_phy_cfg_bb_gain_op1db()
1025 rtw89_warn(rtwdev, in rtw89_phy_cfg_bb_gain_op1db()
1032 static void rtw89_phy_config_bb_gain(struct rtw89_dev *rtwdev, in rtw89_phy_config_bb_gain() argument
1037 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_config_bb_gain()
1047 rtw89_warn(rtwdev, "bb gain table with flow ctrl\n"); in rtw89_phy_config_bb_gain()
1053 rtw89_phy_cfg_bb_gain_error(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain()
1056 rtw89_phy_cfg_bb_rpl_ofst(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain()
1059 rtw89_phy_cfg_bb_gain_bypass(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain()
1062 rtw89_phy_cfg_bb_gain_op1db(rtwdev, arg, reg->data); in rtw89_phy_config_bb_gain()
1065 rtw89_warn(rtwdev, in rtw89_phy_config_bb_gain()
1073 rtw89_phy_cofig_rf_reg_store(struct rtw89_dev *rtwdev, in rtw89_phy_cofig_rf_reg_store() argument
1082 rtw89_warn(rtwdev, "RF parameters exceed size. path=%d, idx=%d", in rtw89_phy_cofig_rf_reg_store()
1092 static int rtw89_phy_config_rf_reg_fw(struct rtw89_dev *rtwdev, in rtw89_phy_config_rf_reg_fw() argument
1101 rtw89_warn(rtwdev, in rtw89_phy_config_rf_reg_fw()
1110 ret = rtw89_fw_h2c_rf_reg(rtwdev, info, len * 4, i); in rtw89_phy_config_rf_reg_fw()
1120 static void rtw89_phy_config_rf_reg(struct rtw89_dev *rtwdev, in rtw89_phy_config_rf_reg() argument
1138 rtw89_write_rf(rtwdev, rf_path, reg->addr, 0xfffff, reg->data); in rtw89_phy_config_rf_reg()
1139 rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path, in rtw89_phy_config_rf_reg()
1144 void rtw89_phy_config_rf_reg_v1(struct rtw89_dev *rtwdev, in rtw89_phy_config_rf_reg_v1() argument
1149 rtw89_write_rf(rtwdev, rf_path, reg->addr, RFREG_MASK, reg->data); in rtw89_phy_config_rf_reg_v1()
1154 rtw89_phy_cofig_rf_reg_store(rtwdev, reg, rf_path, in rtw89_phy_config_rf_reg_v1()
1159 static int rtw89_phy_sel_headline(struct rtw89_dev *rtwdev, in rtw89_phy_sel_headline() argument
1241 static void rtw89_phy_init_reg(struct rtw89_dev *rtwdev, in rtw89_phy_init_reg() argument
1243 void (*config)(struct rtw89_dev *rtwdev, in rtw89_phy_init_reg() argument
1251 u8 rfe = rtwdev->efuse.rfe_type; in rtw89_phy_init_reg()
1252 u8 cv = rtwdev->hal.cv; in rtw89_phy_init_reg()
1261 ret = rtw89_phy_sel_headline(rtwdev, table, &headline_size, in rtw89_phy_init_reg()
1264 rtw89_err(rtwdev, "invalid PHY package: %d/%d\n", rfe, cv); in rtw89_phy_init_reg()
1280 rtw89_warn(rtwdev, "failed to load CR %x/%x\n", in rtw89_phy_init_reg()
1305 config(rtwdev, reg, rf_path, extra_data); in rtw89_phy_init_reg()
1311 void rtw89_phy_init_bb_reg(struct rtw89_dev *rtwdev) in rtw89_phy_init_bb_reg() argument
1313 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_bb_reg()
1317 rtw89_phy_init_reg(rtwdev, bb_table, rtw89_phy_config_bb_reg, NULL); in rtw89_phy_init_bb_reg()
1318 rtw89_chip_init_txpwr_unit(rtwdev, RTW89_PHY_0); in rtw89_phy_init_bb_reg()
1320 rtw89_phy_init_reg(rtwdev, bb_gain_table, in rtw89_phy_init_bb_reg()
1322 rtw89_phy_bb_reset(rtwdev, RTW89_PHY_0); in rtw89_phy_init_bb_reg()
1325 static u32 rtw89_phy_nctl_poll(struct rtw89_dev *rtwdev) in rtw89_phy_nctl_poll() argument
1327 rtw89_phy_write32(rtwdev, 0x8080, 0x4); in rtw89_phy_nctl_poll()
1329 return rtw89_phy_read32(rtwdev, 0x8080); in rtw89_phy_nctl_poll()
1332 void rtw89_phy_init_rf_reg(struct rtw89_dev *rtwdev) in rtw89_phy_init_rf_reg() argument
1334 void (*config)(struct rtw89_dev *rtwdev, const struct rtw89_reg2_def *reg, in rtw89_phy_init_rf_reg()
1336 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_rf_reg()
1349 rtw89_phy_init_reg(rtwdev, rf_table, config, (void *)rf_reg_info); in rtw89_phy_init_rf_reg()
1350 if (rtw89_phy_config_rf_reg_fw(rtwdev, rf_reg_info)) in rtw89_phy_init_rf_reg()
1351 rtw89_warn(rtwdev, "rf path %d reg h2c config failed\n", in rtw89_phy_init_rf_reg()
1357 static void rtw89_phy_init_rf_nctl(struct rtw89_dev *rtwdev) in rtw89_phy_init_rf_nctl() argument
1359 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_init_rf_nctl()
1365 rtw89_phy_write32_set(rtwdev, 0x0c60, 0x3); in rtw89_phy_init_rf_nctl()
1366 rtw89_phy_write32_set(rtwdev, 0x0c6c, 0x1); in rtw89_phy_init_rf_nctl()
1367 rtw89_phy_write32_set(rtwdev, 0x58ac, 0x8000000); in rtw89_phy_init_rf_nctl()
1368 rtw89_phy_write32_set(rtwdev, 0x78ac, 0x8000000); in rtw89_phy_init_rf_nctl()
1371 rtw89_phy_write32(rtwdev, 0x8000, 0x8); in rtw89_phy_init_rf_nctl()
1374 1000, false, rtwdev); in rtw89_phy_init_rf_nctl()
1376 rtw89_err(rtwdev, "failed to poll nctl block\n"); in rtw89_phy_init_rf_nctl()
1379 rtw89_phy_init_reg(rtwdev, nctl_table, rtw89_phy_config_bb_reg, NULL); in rtw89_phy_init_rf_nctl()
1382 static u32 rtw89_phy0_phy1_offset(struct rtw89_dev *rtwdev, u32 addr) in rtw89_phy0_phy1_offset() argument
1413 void rtw89_phy_write32_idx(struct rtw89_dev *rtwdev, u32 addr, u32 mask, in rtw89_phy_write32_idx() argument
1416 if (rtwdev->dbcc_en && phy_idx == RTW89_PHY_1) in rtw89_phy_write32_idx()
1417 addr += rtw89_phy0_phy1_offset(rtwdev, addr); in rtw89_phy_write32_idx()
1418 rtw89_phy_write32_mask(rtwdev, addr, mask, data); in rtw89_phy_write32_idx()
1422 void rtw89_phy_set_phy_regs(struct rtw89_dev *rtwdev, u32 addr, u32 mask, in rtw89_phy_set_phy_regs() argument
1425 rtw89_phy_write32_idx(rtwdev, addr, mask, val, RTW89_PHY_0); in rtw89_phy_set_phy_regs()
1427 if (!rtwdev->dbcc_en) in rtw89_phy_set_phy_regs()
1430 rtw89_phy_write32_idx(rtwdev, addr, mask, val, RTW89_PHY_1); in rtw89_phy_set_phy_regs()
1433 void rtw89_phy_write_reg3_tbl(struct rtw89_dev *rtwdev, in rtw89_phy_write_reg3_tbl() argument
1441 rtw89_phy_write32_mask(rtwdev, reg3->addr, reg3->mask, reg3->data); in rtw89_phy_write_reg3_tbl()
1477 void rtw89_phy_load_txpwr_byrate(struct rtw89_dev *rtwdev, in rtw89_phy_load_txpwr_byrate() argument
1487 byr = _byr_seek(cfg->rs, &rtwdev->byr[cfg->band]); in rtw89_phy_load_txpwr_byrate()
1498 #define _phy_txpwr_rf_to_mac(rtwdev, txpwr_rf) \ argument
1500 const struct rtw89_chip_info *__c = (rtwdev)->chip; \
1504 s8 rtw89_phy_read_txpwr_byrate(struct rtw89_dev *rtwdev, u8 band, in rtw89_phy_read_txpwr_byrate() argument
1514 rtw89_debug(rtwdev, RTW89_DBG_TXPWR, in rtw89_phy_read_txpwr_byrate()
1521 byr = _byr_seek(rate_desc->rs, &rtwdev->byr[band]); in rtw89_phy_read_txpwr_byrate()
1524 return _phy_txpwr_rf_to_mac(rtwdev, byr[idx]); in rtw89_phy_read_txpwr_byrate()
1528 static u8 rtw89_channel_6g_to_idx(struct rtw89_dev *rtwdev, u8 channel_6g) in rtw89_channel_6g_to_idx() argument
1548 rtw89_warn(rtwdev, "unknown 6g channel: %d\n", channel_6g); in rtw89_channel_6g_to_idx()
1553 static u8 rtw89_channel_to_idx(struct rtw89_dev *rtwdev, u8 band, u8 channel) in rtw89_channel_to_idx() argument
1556 return rtw89_channel_6g_to_idx(rtwdev, channel); in rtw89_channel_to_idx()
1568 rtw89_warn(rtwdev, "unknown channel: %d\n", channel); in rtw89_channel_to_idx()
1573 s8 rtw89_phy_read_txpwr_limit(struct rtw89_dev *rtwdev, u8 band, in rtw89_phy_read_txpwr_limit() argument
1576 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_read_txpwr_limit()
1577 u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch); in rtw89_phy_read_txpwr_limit()
1578 u8 regd = rtw89_regd_get(rtwdev, band); in rtw89_phy_read_txpwr_limit()
1601 rtw89_warn(rtwdev, "unknown band type: %d\n", band); in rtw89_phy_read_txpwr_limit()
1605 lmt = _phy_txpwr_rf_to_mac(rtwdev, lmt); in rtw89_phy_read_txpwr_limit()
1606 sar = rtw89_query_sar(rtwdev); in rtw89_phy_read_txpwr_limit()
1616 ptr[__i] = rtw89_phy_read_txpwr_limit(rtwdev, \
1623 static void rtw89_phy_fill_txpwr_limit_20m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_20m() argument
1638 static void rtw89_phy_fill_txpwr_limit_40m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_40m() argument
1659 static void rtw89_phy_fill_txpwr_limit_80m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_80m() argument
1700 static void rtw89_phy_fill_txpwr_limit_160m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_160m() argument
1786 void rtw89_phy_fill_txpwr_limit(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit() argument
1800 rtw89_phy_fill_txpwr_limit_20m(rtwdev, lmt, band, ntx, ch); in rtw89_phy_fill_txpwr_limit()
1803 rtw89_phy_fill_txpwr_limit_40m(rtwdev, lmt, band, ntx, ch, in rtw89_phy_fill_txpwr_limit()
1807 rtw89_phy_fill_txpwr_limit_80m(rtwdev, lmt, band, ntx, ch, in rtw89_phy_fill_txpwr_limit()
1811 rtw89_phy_fill_txpwr_limit_160m(rtwdev, lmt, band, ntx, ch, in rtw89_phy_fill_txpwr_limit()
1818 static s8 rtw89_phy_read_txpwr_limit_ru(struct rtw89_dev *rtwdev, u8 band, in rtw89_phy_read_txpwr_limit_ru() argument
1821 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_read_txpwr_limit_ru()
1822 u8 ch_idx = rtw89_channel_to_idx(rtwdev, band, ch); in rtw89_phy_read_txpwr_limit_ru()
1823 u8 regd = rtw89_regd_get(rtwdev, band); in rtw89_phy_read_txpwr_limit_ru()
1846 rtw89_warn(rtwdev, "unknown band type: %d\n", band); in rtw89_phy_read_txpwr_limit_ru()
1850 lmt_ru = _phy_txpwr_rf_to_mac(rtwdev, lmt_ru); in rtw89_phy_read_txpwr_limit_ru()
1851 sar = rtw89_query_sar(rtwdev); in rtw89_phy_read_txpwr_limit_ru()
1857 rtw89_phy_fill_txpwr_limit_ru_20m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_ru_20m() argument
1861 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m()
1864 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m()
1867 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_20m()
1873 rtw89_phy_fill_txpwr_limit_ru_40m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_ru_40m() argument
1877 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1880 lmt_ru->ru26[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1883 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1886 lmt_ru->ru52[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1889 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1892 lmt_ru->ru106[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_40m()
1898 rtw89_phy_fill_txpwr_limit_ru_80m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_ru_80m() argument
1902 lmt_ru->ru26[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1905 lmt_ru->ru26[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1908 lmt_ru->ru26[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1911 lmt_ru->ru26[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1914 lmt_ru->ru52[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1917 lmt_ru->ru52[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1920 lmt_ru->ru52[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1923 lmt_ru->ru52[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1926 lmt_ru->ru106[0] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1929 lmt_ru->ru106[1] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1932 lmt_ru->ru106[2] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1935 lmt_ru->ru106[3] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_80m()
1941 rtw89_phy_fill_txpwr_limit_ru_160m(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_ru_160m() argument
1950 lmt_ru->ru26[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m()
1954 lmt_ru->ru52[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m()
1958 lmt_ru->ru106[i] = rtw89_phy_read_txpwr_limit_ru(rtwdev, band, in rtw89_phy_fill_txpwr_limit_ru_160m()
1965 void rtw89_phy_fill_txpwr_limit_ru(struct rtw89_dev *rtwdev, in rtw89_phy_fill_txpwr_limit_ru() argument
1978 rtw89_phy_fill_txpwr_limit_ru_20m(rtwdev, lmt_ru, band, ntx, in rtw89_phy_fill_txpwr_limit_ru()
1982 rtw89_phy_fill_txpwr_limit_ru_40m(rtwdev, lmt_ru, band, ntx, in rtw89_phy_fill_txpwr_limit_ru()
1986 rtw89_phy_fill_txpwr_limit_ru_80m(rtwdev, lmt_ru, band, ntx, in rtw89_phy_fill_txpwr_limit_ru()
1990 rtw89_phy_fill_txpwr_limit_ru_160m(rtwdev, lmt_ru, band, ntx, in rtw89_phy_fill_txpwr_limit_ru()
1998 struct rtw89_dev *rtwdev; member
2005 struct rtw89_dev *rtwdev = ra_data->rtwdev; in rtw89_phy_c2h_ra_rpt_iter() local
2024 valid = rtw89_ra_report_to_bitrate(rtwdev, rate, &legacy_bitrate); in rtw89_phy_c2h_ra_rpt_iter()
2037 if (RTW89_CHK_FW_FEATURE(OLD_HT_RA_FORMAT, &rtwdev->fw)) in rtw89_phy_c2h_ra_rpt_iter()
2074 sta->deflink.agg.max_rc_amsdu_len = get_max_amsdu_len(rtwdev, ra_report); in rtw89_phy_c2h_ra_rpt_iter()
2079 rtw89_phy_c2h_ra_rpt(struct rtw89_dev *rtwdev, struct sk_buff *c2h, u32 len) in rtw89_phy_c2h_ra_rpt() argument
2083 ra_data.rtwdev = rtwdev; in rtw89_phy_c2h_ra_rpt()
2085 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_c2h_ra_rpt()
2091 void (* const rtw89_phy_c2h_ra_handler[])(struct rtw89_dev *rtwdev,
2098 void rtw89_phy_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, in rtw89_phy_c2h_handle() argument
2101 void (*handler)(struct rtw89_dev *rtwdev, in rtw89_phy_c2h_handle()
2110 rtw89_info(rtwdev, "c2h class %d not support\n", class); in rtw89_phy_c2h_handle()
2114 rtw89_info(rtwdev, "c2h class %d func %d not support\n", class, in rtw89_phy_c2h_handle()
2118 handler(rtwdev, skb, len); in rtw89_phy_c2h_handle()
2121 static u8 rtw89_phy_cfo_get_xcap_reg(struct rtw89_dev *rtwdev, bool sc_xo) in rtw89_phy_cfo_get_xcap_reg() argument
2130 return (u8)rtw89_read32_mask(rtwdev, R_AX_XTAL_ON_CTRL0, reg_mask); in rtw89_phy_cfo_get_xcap_reg()
2133 static void rtw89_phy_cfo_set_xcap_reg(struct rtw89_dev *rtwdev, bool sc_xo, in rtw89_phy_cfo_set_xcap_reg() argument
2143 rtw89_write32_mask(rtwdev, R_AX_XTAL_ON_CTRL0, reg_mask, val); in rtw89_phy_cfo_set_xcap_reg()
2146 static void rtw89_phy_cfo_set_crystal_cap(struct rtw89_dev *rtwdev, in rtw89_phy_cfo_set_crystal_cap() argument
2149 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_set_crystal_cap()
2150 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_cfo_set_crystal_cap()
2157 rtw89_phy_cfo_set_xcap_reg(rtwdev, true, crystal_cap); in rtw89_phy_cfo_set_crystal_cap()
2158 rtw89_phy_cfo_set_xcap_reg(rtwdev, false, crystal_cap); in rtw89_phy_cfo_set_crystal_cap()
2159 sc_xo_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, true); in rtw89_phy_cfo_set_crystal_cap()
2160 sc_xi_val = rtw89_phy_cfo_get_xcap_reg(rtwdev, false); in rtw89_phy_cfo_set_crystal_cap()
2162 rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO, in rtw89_phy_cfo_set_crystal_cap()
2164 rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI, in rtw89_phy_cfo_set_crystal_cap()
2166 rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XO, &sc_xo_val); in rtw89_phy_cfo_set_crystal_cap()
2167 rtw89_mac_read_xtal_si(rtwdev, XTAL_SI_XTAL_SC_XI, &sc_xi_val); in rtw89_phy_cfo_set_crystal_cap()
2172 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Set sc_xi=0x%x\n", sc_xi_val); in rtw89_phy_cfo_set_crystal_cap()
2173 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Set sc_xo=0x%x\n", sc_xo_val); in rtw89_phy_cfo_set_crystal_cap()
2174 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Get xcap_ofst=%d\n", in rtw89_phy_cfo_set_crystal_cap()
2176 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Set xcap OK\n"); in rtw89_phy_cfo_set_crystal_cap()
2179 static void rtw89_phy_cfo_reset(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_reset() argument
2181 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_reset()
2190 rtw89_phy_cfo_set_crystal_cap(rtwdev, cap, false); in rtw89_phy_cfo_reset()
2191 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_cfo_reset()
2196 static void rtw89_dcfo_comp(struct rtw89_dev *rtwdev, s32 curr_cfo) in rtw89_dcfo_comp() argument
2198 const struct rtw89_reg_def *dcfo_comp = rtwdev->chip->dcfo_comp; in rtw89_dcfo_comp()
2199 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_dcfo_comp()
2202 u8 dcfo_comp_sft = rtwdev->chip->dcfo_comp_sft; in rtw89_dcfo_comp()
2206 rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: is_linked=%d\n", in rtw89_dcfo_comp()
2210 rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: curr_cfo=%d\n", curr_cfo); in rtw89_dcfo_comp()
2213 dcfo_comp_val = rtw89_phy_read32_mask(rtwdev, R_DCFO, B_DCFO); in rtw89_dcfo_comp()
2216 rtw89_debug(rtwdev, RTW89_DBG_CFO, "DCFO: avg_cfo=%d\n", cfo_avg_312); in rtw89_dcfo_comp()
2217 if (rtwdev->chip->chip_id == RTL8852A && rtwdev->hal.cv == CHIP_CBV) in rtw89_dcfo_comp()
2219 rtw89_phy_set_phy_regs(rtwdev, dcfo_comp->addr, dcfo_comp->mask, in rtw89_dcfo_comp()
2223 static void rtw89_dcfo_comp_init(struct rtw89_dev *rtwdev) in rtw89_dcfo_comp_init() argument
2225 rtw89_phy_set_phy_regs(rtwdev, R_DCFO_OPT, B_DCFO_OPT_EN, 1); in rtw89_dcfo_comp_init()
2226 rtw89_phy_set_phy_regs(rtwdev, R_DCFO_WEIGHT, B_DCFO_WEIGHT_MSK, 8); in rtw89_dcfo_comp_init()
2227 rtw89_write32_clr(rtwdev, R_AX_PWR_UL_CTRL2, B_AX_PWR_UL_CFO_MASK); in rtw89_dcfo_comp_init()
2230 static void rtw89_phy_cfo_init(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_init() argument
2232 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_init()
2233 struct rtw89_efuse *efuse = &rtwdev->efuse; in rtw89_phy_cfo_init()
2247 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Default xcap=%0x\n", in rtw89_phy_cfo_init()
2249 rtw89_phy_cfo_set_crystal_cap(rtwdev, cfo->crystal_cap_default, true); in rtw89_phy_cfo_init()
2250 rtw89_phy_set_phy_regs(rtwdev, R_DCFO, B_DCFO, 1); in rtw89_phy_cfo_init()
2251 rtw89_dcfo_comp_init(rtwdev); in rtw89_phy_cfo_init()
2259 static void rtw89_phy_cfo_crystal_cap_adjust(struct rtw89_dev *rtwdev, in rtw89_phy_cfo_crystal_cap_adjust() argument
2262 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_crystal_cap_adjust()
2275 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Stop CFO tracking\n"); in rtw89_phy_cfo_crystal_cap_adjust()
2289 rtw89_phy_cfo_set_crystal_cap(rtwdev, (u8)crystal_cap, false); in rtw89_phy_cfo_crystal_cap_adjust()
2290 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_cfo_crystal_cap_adjust()
2295 static s32 rtw89_phy_average_cfo_calc(struct rtw89_dev *rtwdev) in rtw89_phy_average_cfo_calc() argument
2297 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_average_cfo_calc()
2303 if (rtwdev->total_sta_assoc != 1) in rtw89_phy_average_cfo_calc()
2305 rtw89_debug(rtwdev, RTW89_DBG_CFO, "one_entry_only\n"); in rtw89_phy_average_cfo_calc()
2314 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_average_cfo_calc()
2316 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_average_cfo_calc()
2322 static s32 rtw89_phy_multi_sta_cfo_calc(struct rtw89_dev *rtwdev) in rtw89_phy_multi_sta_cfo_calc() argument
2324 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_multi_sta_cfo_calc()
2325 struct rtw89_traffic_stats *stats = &rtwdev->stats; in rtw89_phy_multi_sta_cfo_calc()
2339 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Multi entry cfo_trk\n"); in rtw89_phy_multi_sta_cfo_calc()
2341 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Pkt based avg mode\n"); in rtw89_phy_multi_sta_cfo_calc()
2348 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2354 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Entry based avg mode\n"); in rtw89_phy_multi_sta_cfo_calc()
2361 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2365 sta_cnt = rtwdev->total_sta_assoc; in rtw89_phy_multi_sta_cfo_calc()
2367 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2372 rtw89_debug(rtwdev, RTW89_DBG_CFO, "TP based avg mode\n"); in rtw89_phy_multi_sta_cfo_calc()
2387 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2390 if (sta_cnt >= rtwdev->total_sta_assoc) in rtw89_phy_multi_sta_cfo_calc()
2396 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Assoc sta cnt=%d\n", in rtw89_phy_multi_sta_cfo_calc()
2398 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Active sta cnt=%d\n", in rtw89_phy_multi_sta_cfo_calc()
2400 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2403 rtw89_debug(rtwdev, RTW89_DBG_CFO, "cfo_lb=%d,cfo_ub=%d\n", in rtw89_phy_multi_sta_cfo_calc()
2406 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2411 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_multi_sta_cfo_calc()
2418 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Target cfo=%d\n", target_cfo); in rtw89_phy_multi_sta_cfo_calc()
2422 static void rtw89_phy_cfo_statistics_reset(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_statistics_reset() argument
2424 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_statistics_reset()
2433 static void rtw89_phy_cfo_dm(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_dm() argument
2435 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_dm()
2440 rtw89_debug(rtwdev, RTW89_DBG_CFO, "CFO:total_sta_assoc=%d\n", in rtw89_phy_cfo_dm()
2441 rtwdev->total_sta_assoc); in rtw89_phy_cfo_dm()
2442 if (rtwdev->total_sta_assoc == 0) { in rtw89_phy_cfo_dm()
2443 rtw89_phy_cfo_reset(rtwdev); in rtw89_phy_cfo_dm()
2447 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Pkt cnt = 0\n"); in rtw89_phy_cfo_dm()
2451 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Pkt cnt doesn't change\n"); in rtw89_phy_cfo_dm()
2454 if (rtwdev->total_sta_assoc == 1) in rtw89_phy_cfo_dm()
2455 new_cfo = rtw89_phy_average_cfo_calc(rtwdev); in rtw89_phy_cfo_dm()
2457 new_cfo = rtw89_phy_multi_sta_cfo_calc(rtwdev); in rtw89_phy_cfo_dm()
2459 rtw89_debug(rtwdev, RTW89_DBG_CFO, "curr_cfo=0\n"); in rtw89_phy_cfo_dm()
2468 rtw89_phy_cfo_reset(rtwdev); in rtw89_phy_cfo_dm()
2475 rtw89_phy_cfo_reset(rtwdev); in rtw89_phy_cfo_dm()
2479 rtw89_phy_cfo_crystal_cap_adjust(rtwdev, new_cfo); in rtw89_phy_cfo_dm()
2482 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Xcap_up=%d\n", x_cap_update); in rtw89_phy_cfo_dm()
2483 rtw89_debug(rtwdev, RTW89_DBG_CFO, "Xcap: D:%x C:%x->%x, ofst=%d\n", in rtw89_phy_cfo_dm()
2492 rtw89_dcfo_comp(rtwdev, new_cfo); in rtw89_phy_cfo_dm()
2493 rtw89_phy_cfo_statistics_reset(rtwdev); in rtw89_phy_cfo_dm()
2498 struct rtw89_dev *rtwdev = container_of(work, struct rtw89_dev, in rtw89_phy_cfo_track_work() local
2500 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_track_work()
2502 mutex_lock(&rtwdev->mutex); in rtw89_phy_cfo_track_work()
2505 rtw89_leave_ps_mode(rtwdev); in rtw89_phy_cfo_track_work()
2506 rtw89_phy_cfo_dm(rtwdev); in rtw89_phy_cfo_track_work()
2507 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work, in rtw89_phy_cfo_track_work()
2510 mutex_unlock(&rtwdev->mutex); in rtw89_phy_cfo_track_work()
2513 static void rtw89_phy_cfo_start_work(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_start_work() argument
2515 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_start_work()
2517 ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->cfo_track_work, in rtw89_phy_cfo_start_work()
2521 void rtw89_phy_cfo_track(struct rtw89_dev *rtwdev) in rtw89_phy_cfo_track() argument
2523 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_track()
2524 struct rtw89_traffic_stats *stats = &rtwdev->stats; in rtw89_phy_cfo_track()
2539 rtw89_phy_cfo_start_work(rtwdev); in rtw89_phy_cfo_track()
2570 rtw89_debug(rtwdev, RTW89_DBG_CFO, in rtw89_phy_cfo_track()
2574 ewma_thermal_read(&rtwdev->phystat.avg_thermal[0])); in rtw89_phy_cfo_track()
2577 rtw89_phy_cfo_dm(rtwdev); in rtw89_phy_cfo_track()
2580 void rtw89_phy_cfo_parse(struct rtw89_dev *rtwdev, s16 cfo_val, in rtw89_phy_cfo_parse() argument
2583 struct rtw89_cfo_tracking_info *cfo = &rtwdev->cfo_tracking; in rtw89_phy_cfo_parse()
2587 rtw89_warn(rtwdev, "mac_id %d is out of range\n", macid); in rtw89_phy_cfo_parse()
2596 static void rtw89_phy_stat_thermal_update(struct rtw89_dev *rtwdev) in rtw89_phy_stat_thermal_update() argument
2598 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_thermal_update()
2602 for (i = 0; i < rtwdev->chip->rf_path_num; i++) { in rtw89_phy_stat_thermal_update()
2603 th = rtw89_chip_get_thermal(rtwdev, i); in rtw89_phy_stat_thermal_update()
2607 rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, in rtw89_phy_stat_thermal_update()
2614 struct rtw89_dev *rtwdev; member
2643 static void rtw89_phy_stat_rssi_update(struct rtw89_dev *rtwdev) in rtw89_phy_stat_rssi_update() argument
2647 rssi_data.rtwdev = rtwdev; in rtw89_phy_stat_rssi_update()
2648 rssi_data.ch_info = &rtwdev->ch_info; in rtw89_phy_stat_rssi_update()
2650 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_stat_rssi_update()
2654 rtw89_btc_ntfy_wl_sta(rtwdev); in rtw89_phy_stat_rssi_update()
2657 static void rtw89_phy_stat_init(struct rtw89_dev *rtwdev) in rtw89_phy_stat_init() argument
2659 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_init()
2662 for (i = 0; i < rtwdev->chip->rf_path_num; i++) in rtw89_phy_stat_init()
2665 rtw89_phy_stat_thermal_update(rtwdev); in rtw89_phy_stat_init()
2671 void rtw89_phy_stat_track(struct rtw89_dev *rtwdev) in rtw89_phy_stat_track() argument
2673 struct rtw89_phy_stat *phystat = &rtwdev->phystat; in rtw89_phy_stat_track()
2675 rtw89_phy_stat_thermal_update(rtwdev); in rtw89_phy_stat_track()
2676 rtw89_phy_stat_rssi_update(rtwdev); in rtw89_phy_stat_track()
2682 static u16 rtw89_phy_ccx_us_to_idx(struct rtw89_dev *rtwdev, u32 time_us) in rtw89_phy_ccx_us_to_idx() argument
2684 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_us_to_idx()
2689 static u32 rtw89_phy_ccx_idx_to_us(struct rtw89_dev *rtwdev, u16 idx) in rtw89_phy_ccx_idx_to_us() argument
2691 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_idx_to_us()
2696 static void rtw89_phy_ccx_top_setting_init(struct rtw89_dev *rtwdev) in rtw89_phy_ccx_top_setting_init() argument
2698 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_top_setting_init()
2709 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_EN_MSK, 1); in rtw89_phy_ccx_top_setting_init()
2710 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_TRIG_OPT_MSK, 1); in rtw89_phy_ccx_top_setting_init()
2711 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 1); in rtw89_phy_ccx_top_setting_init()
2712 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_CCX_EDCCA_OPT_MSK, in rtw89_phy_ccx_top_setting_init()
2716 static u16 rtw89_phy_ccx_get_report(struct rtw89_dev *rtwdev, u16 report, in rtw89_phy_ccx_get_report() argument
2719 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_get_report()
2730 static void rtw89_phy_ccx_ms_to_period_unit(struct rtw89_dev *rtwdev, in rtw89_phy_ccx_ms_to_period_unit() argument
2754 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ccx_ms_to_period_unit()
2759 static void rtw89_phy_ccx_racing_release(struct rtw89_dev *rtwdev) in rtw89_phy_ccx_racing_release() argument
2761 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_racing_release()
2763 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ccx_racing_release()
2771 static bool rtw89_phy_ifs_clm_th_update_check(struct rtw89_dev *rtwdev, in rtw89_phy_ifs_clm_th_update_check() argument
2774 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_th_update_check()
2809 ifs_th_h[IFS_CLM_TH_START_IDX] = rtw89_phy_ccx_us_to_idx(rtwdev, in rtw89_phy_ifs_clm_th_update_check()
2814 ifs_th_h[i] = rtw89_phy_ccx_us_to_idx(rtwdev, ifs_th_h_us[i]); in rtw89_phy_ifs_clm_th_update_check()
2819 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_th_update_check()
2825 static void rtw89_phy_ifs_clm_set_th_reg(struct rtw89_dev *rtwdev) in rtw89_phy_ifs_clm_set_th_reg() argument
2827 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_set_th_reg()
2830 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_TH_LOW_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2832 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_TH_LOW_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2834 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_TH_LOW_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2836 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_TH_LOW_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2839 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_TH_HIGH_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2841 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_TH_HIGH_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2843 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_TH_HIGH_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2845 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_TH_HIGH_MSK, in rtw89_phy_ifs_clm_set_th_reg()
2849 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_set_th_reg()
2854 static void rtw89_phy_ifs_clm_setting_init(struct rtw89_dev *rtwdev) in rtw89_phy_ifs_clm_setting_init() argument
2856 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_setting_init()
2863 if (rtw89_phy_ifs_clm_th_update_check(rtwdev, &para)) in rtw89_phy_ifs_clm_setting_init()
2864 rtw89_phy_ifs_clm_set_th_reg(rtwdev); in rtw89_phy_ifs_clm_setting_init()
2866 rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COLLECT_EN, in rtw89_phy_ifs_clm_setting_init()
2868 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T1, B_IFS_T1_EN_MSK, true); in rtw89_phy_ifs_clm_setting_init()
2869 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T2, B_IFS_T2_EN_MSK, true); in rtw89_phy_ifs_clm_setting_init()
2870 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T3, B_IFS_T3_EN_MSK, true); in rtw89_phy_ifs_clm_setting_init()
2871 rtw89_phy_set_phy_regs(rtwdev, R_IFS_T4, B_IFS_T4_EN_MSK, true); in rtw89_phy_ifs_clm_setting_init()
2874 static int rtw89_phy_ccx_racing_ctrl(struct rtw89_dev *rtwdev, in rtw89_phy_ccx_racing_ctrl() argument
2877 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_racing_ctrl()
2881 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ccx_racing_ctrl()
2886 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ccx_racing_ctrl()
2900 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "ccx racing success=%d\n", in rtw89_phy_ccx_racing_ctrl()
2906 static void rtw89_phy_ccx_trigger(struct rtw89_dev *rtwdev) in rtw89_phy_ccx_trigger() argument
2908 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ccx_trigger()
2910 rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COUNTER_CLR_MSK, 0); in rtw89_phy_ccx_trigger()
2911 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 0); in rtw89_phy_ccx_trigger()
2912 rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, B_IFS_COUNTER_CLR_MSK, 1); in rtw89_phy_ccx_trigger()
2913 rtw89_phy_set_phy_regs(rtwdev, R_CCX, B_MEASUREMENT_TRIG_MSK, 1); in rtw89_phy_ccx_trigger()
2919 static void rtw89_phy_ifs_clm_get_utility(struct rtw89_dev *rtwdev) in rtw89_phy_ifs_clm_get_utility() argument
2921 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_get_utility()
2926 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_tx, PERCENT); in rtw89_phy_ifs_clm_get_utility()
2928 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_edcca_excl_cca, in rtw89_phy_ifs_clm_get_utility()
2931 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckfa, PERCENT); in rtw89_phy_ifs_clm_get_utility()
2933 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmfa, PERCENT); in rtw89_phy_ifs_clm_get_utility()
2935 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckcca_excl_fa, in rtw89_phy_ifs_clm_get_utility()
2938 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmcca_excl_fa, in rtw89_phy_ifs_clm_get_utility()
2941 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_cckfa, PERMIL); in rtw89_phy_ifs_clm_get_utility()
2943 rtw89_phy_ccx_get_report(rtwdev, env->ifs_clm_ofdmfa, PERMIL); in rtw89_phy_ifs_clm_get_utility()
2950 rtw89_phy_ccx_idx_to_us(rtwdev, in rtw89_phy_ifs_clm_get_utility()
2954 res = rtw89_phy_ccx_idx_to_us(rtwdev, env->ifs_clm_cca[i]); in rtw89_phy_ifs_clm_get_utility()
2963 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_utility()
2966 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_utility()
2969 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_utility()
2972 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_utility()
2976 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_utility()
2979 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "T%d:[%d, %d, %d]\n", in rtw89_phy_ifs_clm_get_utility()
2984 static bool rtw89_phy_ifs_clm_get_result(struct rtw89_dev *rtwdev) in rtw89_phy_ifs_clm_get_result() argument
2986 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_get_result()
2989 if (rtw89_phy_read32_mask(rtwdev, R_IFSCNT, B_IFSCNT_DONE_MSK) == 0) { in rtw89_phy_ifs_clm_get_result()
2990 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_result()
2996 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_TX_CNT, in rtw89_phy_ifs_clm_get_result()
2999 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_TX_CNT, in rtw89_phy_ifs_clm_get_result()
3002 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_CCA, in rtw89_phy_ifs_clm_get_result()
3005 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_CCA, in rtw89_phy_ifs_clm_get_result()
3008 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_FA, in rtw89_phy_ifs_clm_get_result()
3011 rtw89_phy_read32_mask(rtwdev, R_IFS_CLM_FA, in rtw89_phy_ifs_clm_get_result()
3015 rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T1_HIS_MSK); in rtw89_phy_ifs_clm_get_result()
3017 rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T2_HIS_MSK); in rtw89_phy_ifs_clm_get_result()
3019 rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T3_HIS_MSK); in rtw89_phy_ifs_clm_get_result()
3021 rtw89_phy_read32_mask(rtwdev, R_IFS_HIS, B_IFS_T4_HIS_MSK); in rtw89_phy_ifs_clm_get_result()
3024 rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_L, B_IFS_T1_AVG_MSK); in rtw89_phy_ifs_clm_get_result()
3026 rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_L, B_IFS_T2_AVG_MSK); in rtw89_phy_ifs_clm_get_result()
3028 rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_H, B_IFS_T3_AVG_MSK); in rtw89_phy_ifs_clm_get_result()
3030 rtw89_phy_read32_mask(rtwdev, R_IFS_AVG_H, B_IFS_T4_AVG_MSK); in rtw89_phy_ifs_clm_get_result()
3033 rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_L, B_IFS_T1_CCA_MSK); in rtw89_phy_ifs_clm_get_result()
3035 rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_L, B_IFS_T2_CCA_MSK); in rtw89_phy_ifs_clm_get_result()
3037 rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_H, B_IFS_T3_CCA_MSK); in rtw89_phy_ifs_clm_get_result()
3039 rtw89_phy_read32_mask(rtwdev, R_IFS_CCA_H, B_IFS_T4_CCA_MSK); in rtw89_phy_ifs_clm_get_result()
3042 rtw89_phy_read32_mask(rtwdev, R_IFSCNT, B_IFSCNT_TOTAL_CNT_MSK); in rtw89_phy_ifs_clm_get_result()
3044 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "IFS-CLM total_ifs = %d\n", in rtw89_phy_ifs_clm_get_result()
3046 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_result()
3049 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_result()
3052 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_result()
3056 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, "Time:[his, avg, cca]\n"); in rtw89_phy_ifs_clm_get_result()
3058 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_get_result()
3062 rtw89_phy_ifs_clm_get_utility(rtwdev); in rtw89_phy_ifs_clm_get_result()
3067 static int rtw89_phy_ifs_clm_set(struct rtw89_dev *rtwdev, in rtw89_phy_ifs_clm_set() argument
3070 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_ifs_clm_set()
3075 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_set()
3080 if (rtw89_phy_ccx_racing_ctrl(rtwdev, para->rac_lv)) in rtw89_phy_ifs_clm_set()
3084 rtw89_phy_ccx_ms_to_period_unit(rtwdev, para->mntr_time, in rtw89_phy_ifs_clm_set()
3086 rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, in rtw89_phy_ifs_clm_set()
3088 rtw89_phy_set_phy_regs(rtwdev, R_IFS_COUNTER, in rtw89_phy_ifs_clm_set()
3091 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_ifs_clm_set()
3100 if (rtw89_phy_ifs_clm_th_update_check(rtwdev, para)) { in rtw89_phy_ifs_clm_set()
3102 rtw89_phy_ifs_clm_set_th_reg(rtwdev); in rtw89_phy_ifs_clm_set()
3108 void rtw89_phy_env_monitor_track(struct rtw89_dev *rtwdev) in rtw89_phy_env_monitor_track() argument
3110 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_env_monitor_track()
3116 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_env_monitor_track()
3122 if (rtw89_phy_ifs_clm_get_result(rtwdev)) in rtw89_phy_env_monitor_track()
3125 rtw89_phy_ccx_racing_release(rtwdev); in rtw89_phy_env_monitor_track()
3130 if (rtw89_phy_ifs_clm_set(rtwdev, &para) == 0) in rtw89_phy_env_monitor_track()
3133 rtw89_phy_ccx_trigger(rtwdev); in rtw89_phy_env_monitor_track()
3135 rtw89_debug(rtwdev, RTW89_DBG_PHY_TRACK, in rtw89_phy_env_monitor_track()
3158 static u32 rtw89_physts_get_ie_bitmap(struct rtw89_dev *rtwdev, in rtw89_physts_get_ie_bitmap() argument
3168 return rtw89_phy_read32(rtwdev, addr); in rtw89_physts_get_ie_bitmap()
3171 static void rtw89_physts_set_ie_bitmap(struct rtw89_dev *rtwdev, in rtw89_physts_set_ie_bitmap() argument
3175 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_physts_set_ie_bitmap()
3185 rtw89_phy_write32(rtwdev, addr, val); in rtw89_physts_set_ie_bitmap()
3188 static void rtw89_physts_enable_ie_bitmap(struct rtw89_dev *rtwdev, in rtw89_physts_enable_ie_bitmap() argument
3193 u32 val = rtw89_physts_get_ie_bitmap(rtwdev, bitmap); in rtw89_physts_enable_ie_bitmap()
3200 rtw89_physts_set_ie_bitmap(rtwdev, bitmap, val); in rtw89_physts_enable_ie_bitmap()
3203 static void rtw89_physts_enable_fail_report(struct rtw89_dev *rtwdev, in rtw89_physts_enable_fail_report() argument
3208 rtw89_phy_write32_clr(rtwdev, R_PLCP_HISTOGRAM, in rtw89_physts_enable_fail_report()
3210 rtw89_phy_write32_clr(rtwdev, R_PLCP_HISTOGRAM, in rtw89_physts_enable_fail_report()
3213 rtw89_phy_write32_set(rtwdev, R_PLCP_HISTOGRAM, in rtw89_physts_enable_fail_report()
3215 rtw89_phy_write32_set(rtwdev, R_PLCP_HISTOGRAM, in rtw89_physts_enable_fail_report()
3220 static void rtw89_physts_parsing_init(struct rtw89_dev *rtwdev) in rtw89_physts_parsing_init() argument
3224 rtw89_physts_enable_fail_report(rtwdev, false, RTW89_PHY_0); in rtw89_physts_parsing_init()
3228 rtw89_physts_enable_ie_bitmap(rtwdev, i, in rtw89_physts_parsing_init()
3234 rtw89_physts_enable_ie_bitmap(rtwdev, i, in rtw89_physts_parsing_init()
3238 rtw89_physts_enable_ie_bitmap(rtwdev, RTW89_VHT_PKT, in rtw89_physts_parsing_init()
3240 rtw89_physts_enable_ie_bitmap(rtwdev, RTW89_HE_PKT, in rtw89_physts_parsing_init()
3244 rtw89_physts_enable_ie_bitmap(rtwdev, RTW89_CCK_PKT, in rtw89_physts_parsing_init()
3248 static void rtw89_phy_dig_read_gain_table(struct rtw89_dev *rtwdev, int type) in rtw89_phy_dig_read_gain_table() argument
3250 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_dig_read_gain_table()
3251 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_read_gain_table()
3289 tmp = rtw89_phy_read32_mask(rtwdev, cfg->table[i].addr, in rtw89_phy_dig_read_gain_table()
3295 rtw89_debug(rtwdev, RTW89_DBG_DIG, "%s[%d]=%d\n", in rtw89_phy_dig_read_gain_table()
3300 static void rtw89_phy_dig_update_gain_para(struct rtw89_dev *rtwdev) in rtw89_phy_dig_update_gain_para() argument
3302 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_update_gain_para()
3306 if (!rtwdev->hal.support_igi) in rtw89_phy_dig_update_gain_para()
3309 tmp = rtw89_phy_read32_mask(rtwdev, R_PATH0_IB_PKPW, in rtw89_phy_dig_update_gain_para()
3312 dig->ib_pbk = rtw89_phy_read32_mask(rtwdev, R_PATH0_IB_PBK, in rtw89_phy_dig_update_gain_para()
3314 rtw89_debug(rtwdev, RTW89_DBG_DIG, "ib_pkpwr=%d, ib_pbk=%d\n", in rtw89_phy_dig_update_gain_para()
3318 rtw89_phy_dig_read_gain_table(rtwdev, i); in rtw89_phy_dig_update_gain_para()
3327 static void rtw89_phy_dig_update_rssi_info(struct rtw89_dev *rtwdev) in rtw89_phy_dig_update_rssi_info() argument
3329 struct rtw89_phy_ch_info *ch_info = &rtwdev->ch_info; in rtw89_phy_dig_update_rssi_info()
3330 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_update_rssi_info()
3331 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig_update_rssi_info()
3336 rtw89_debug(rtwdev, RTW89_DBG_DIG, "RSSI update : NO Link\n"); in rtw89_phy_dig_update_rssi_info()
3341 static void rtw89_phy_dig_update_para(struct rtw89_dev *rtwdev) in rtw89_phy_dig_update_para() argument
3343 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_update_para()
3344 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_dig_update_para()
3345 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig_update_para()
3373 static void rtw89_phy_dig_para_reset(struct rtw89_dev *rtwdev) in rtw89_phy_dig_para_reset() argument
3375 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_para_reset()
3391 static void rtw89_phy_dig_init(struct rtw89_dev *rtwdev) in rtw89_phy_dig_init() argument
3393 rtw89_phy_dig_update_gain_para(rtwdev); in rtw89_phy_dig_init()
3394 rtw89_phy_dig_reset(rtwdev); in rtw89_phy_dig_init()
3397 static u8 rtw89_phy_dig_lna_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi) in rtw89_phy_dig_lna_idx_by_rssi() argument
3399 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_lna_idx_by_rssi()
3418 static u8 rtw89_phy_dig_tia_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi) in rtw89_phy_dig_tia_idx_by_rssi() argument
3420 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_tia_idx_by_rssi()
3433 static u8 rtw89_phy_dig_rxb_idx_by_rssi(struct rtw89_dev *rtwdev, u8 rssi, in rtw89_phy_dig_rxb_idx_by_rssi() argument
3436 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_rxb_idx_by_rssi()
3446 rtw89_debug(rtwdev, RTW89_DBG_DIG, "wb_rssi=%03d, rxb_idx_tmp=%03d\n", in rtw89_phy_dig_rxb_idx_by_rssi()
3452 static void rtw89_phy_dig_gaincode_by_rssi(struct rtw89_dev *rtwdev, u8 rssi, in rtw89_phy_dig_gaincode_by_rssi() argument
3455 set->lna_idx = rtw89_phy_dig_lna_idx_by_rssi(rtwdev, rssi); in rtw89_phy_dig_gaincode_by_rssi()
3456 set->tia_idx = rtw89_phy_dig_tia_idx_by_rssi(rtwdev, rssi); in rtw89_phy_dig_gaincode_by_rssi()
3457 set->rxb_idx = rtw89_phy_dig_rxb_idx_by_rssi(rtwdev, rssi, set); in rtw89_phy_dig_gaincode_by_rssi()
3459 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_gaincode_by_rssi()
3466 static void rtw89_phy_dig_igi_offset_by_env(struct rtw89_dev *rtwdev) in rtw89_phy_dig_igi_offset_by_env() argument
3468 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_igi_offset_by_env()
3469 struct rtw89_env_monitor_info *env = &rtwdev->env_monitor; in rtw89_phy_dig_igi_offset_by_env()
3495 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_igi_offset_by_env()
3499 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_igi_offset_by_env()
3506 static void rtw89_phy_dig_set_lna_idx(struct rtw89_dev *rtwdev, u8 lna_idx) in rtw89_phy_dig_set_lna_idx() argument
3508 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_lna_idx()
3510 rtw89_phy_write32_mask(rtwdev, dig_regs->p0_lna_init.addr, in rtw89_phy_dig_set_lna_idx()
3512 rtw89_phy_write32_mask(rtwdev, dig_regs->p1_lna_init.addr, in rtw89_phy_dig_set_lna_idx()
3516 static void rtw89_phy_dig_set_tia_idx(struct rtw89_dev *rtwdev, u8 tia_idx) in rtw89_phy_dig_set_tia_idx() argument
3518 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_tia_idx()
3520 rtw89_phy_write32_mask(rtwdev, dig_regs->p0_tia_init.addr, in rtw89_phy_dig_set_tia_idx()
3522 rtw89_phy_write32_mask(rtwdev, dig_regs->p1_tia_init.addr, in rtw89_phy_dig_set_tia_idx()
3526 static void rtw89_phy_dig_set_rxb_idx(struct rtw89_dev *rtwdev, u8 rxb_idx) in rtw89_phy_dig_set_rxb_idx() argument
3528 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_set_rxb_idx()
3530 rtw89_phy_write32_mask(rtwdev, dig_regs->p0_rxb_init.addr, in rtw89_phy_dig_set_rxb_idx()
3532 rtw89_phy_write32_mask(rtwdev, dig_regs->p1_rxb_init.addr, in rtw89_phy_dig_set_rxb_idx()
3536 static void rtw89_phy_dig_set_igi_cr(struct rtw89_dev *rtwdev, in rtw89_phy_dig_set_igi_cr() argument
3539 rtw89_phy_dig_set_lna_idx(rtwdev, set.lna_idx); in rtw89_phy_dig_set_igi_cr()
3540 rtw89_phy_dig_set_tia_idx(rtwdev, set.tia_idx); in rtw89_phy_dig_set_igi_cr()
3541 rtw89_phy_dig_set_rxb_idx(rtwdev, set.rxb_idx); in rtw89_phy_dig_set_igi_cr()
3543 rtw89_debug(rtwdev, RTW89_DBG_DIG, "Set (lna,tia,rxb)=((%d,%d,%02d))\n", in rtw89_phy_dig_set_igi_cr()
3547 static void rtw89_phy_dig_sdagc_follow_pagc_config(struct rtw89_dev *rtwdev, in rtw89_phy_dig_sdagc_follow_pagc_config() argument
3550 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_sdagc_follow_pagc_config()
3552 rtw89_phy_write32_mask(rtwdev, dig_regs->p0_p20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
3554 rtw89_phy_write32_mask(rtwdev, dig_regs->p0_s20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
3556 rtw89_phy_write32_mask(rtwdev, dig_regs->p1_p20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
3558 rtw89_phy_write32_mask(rtwdev, dig_regs->p1_s20_pagcugc_en.addr, in rtw89_phy_dig_sdagc_follow_pagc_config()
3561 rtw89_debug(rtwdev, RTW89_DBG_DIG, "sdagc_follow_pagc=%d\n", enable); in rtw89_phy_dig_sdagc_follow_pagc_config()
3564 static void rtw89_phy_dig_config_igi(struct rtw89_dev *rtwdev) in rtw89_phy_dig_config_igi() argument
3566 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_config_igi()
3568 if (!rtwdev->hal.support_igi) in rtw89_phy_dig_config_igi()
3572 rtw89_phy_dig_set_igi_cr(rtwdev, dig->force_gaincode); in rtw89_phy_dig_config_igi()
3573 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_config_igi()
3576 rtw89_phy_dig_gaincode_by_rssi(rtwdev, dig->igi_fa_rssi, in rtw89_phy_dig_config_igi()
3578 rtw89_phy_dig_set_igi_cr(rtwdev, dig->cur_gaincode); in rtw89_phy_dig_config_igi()
3582 static void rtw89_phy_dig_dyn_pd_th(struct rtw89_dev *rtwdev, u8 rssi, in rtw89_phy_dig_dyn_pd_th() argument
3585 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); in rtw89_phy_dig_dyn_pd_th()
3586 const struct rtw89_dig_regs *dig_regs = rtwdev->chip->dig_regs; in rtw89_phy_dig_dyn_pd_th()
3588 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_dyn_pd_th()
3621 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_dyn_pd_th()
3625 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_dyn_pd_th()
3629 rtw89_phy_write32_mask(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_dyn_pd_th()
3631 rtw89_phy_write32_mask(rtwdev, dig_regs->seg0_pd_reg, in rtw89_phy_dig_dyn_pd_th()
3634 if (!rtwdev->hal.support_cckpd) in rtw89_phy_dig_dyn_pd_th()
3640 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig_dyn_pd_th()
3644 rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_EN_V1, in rtw89_phy_dig_dyn_pd_th()
3646 rtw89_phy_write32_mask(rtwdev, R_BMODE_PDTH_V1, in rtw89_phy_dig_dyn_pd_th()
3650 void rtw89_phy_dig_reset(struct rtw89_dev *rtwdev) in rtw89_phy_dig_reset() argument
3652 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig_reset()
3655 rtw89_phy_dig_para_reset(rtwdev); in rtw89_phy_dig_reset()
3656 rtw89_phy_dig_set_igi_cr(rtwdev, dig->force_gaincode); in rtw89_phy_dig_reset()
3657 rtw89_phy_dig_dyn_pd_th(rtwdev, rssi_nolink, false); in rtw89_phy_dig_reset()
3658 rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, false); in rtw89_phy_dig_reset()
3659 rtw89_phy_dig_update_para(rtwdev); in rtw89_phy_dig_reset()
3663 void rtw89_phy_dig(struct rtw89_dev *rtwdev) in rtw89_phy_dig() argument
3665 struct rtw89_dig_info *dig = &rtwdev->dig; in rtw89_phy_dig()
3666 bool is_linked = rtwdev->total_sta_assoc > 0; in rtw89_phy_dig()
3674 rtw89_debug(rtwdev, RTW89_DBG_DIG, "First connected\n"); in rtw89_phy_dig()
3675 rtw89_phy_dig_update_para(rtwdev); in rtw89_phy_dig()
3677 rtw89_debug(rtwdev, RTW89_DBG_DIG, "First disconnected\n"); in rtw89_phy_dig()
3678 rtw89_phy_dig_update_para(rtwdev); in rtw89_phy_dig()
3682 rtw89_phy_dig_igi_offset_by_env(rtwdev); in rtw89_phy_dig()
3683 rtw89_phy_dig_update_rssi_info(rtwdev); in rtw89_phy_dig()
3693 rtw89_debug(rtwdev, RTW89_DBG_DIG, in rtw89_phy_dig()
3698 rtw89_phy_dig_config_igi(rtwdev); in rtw89_phy_dig()
3700 rtw89_phy_dig_dyn_pd_th(rtwdev, dig->igi_fa_rssi, dig->dyn_pd_th_en); in rtw89_phy_dig()
3703 rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, true); in rtw89_phy_dig()
3705 rtw89_phy_dig_sdagc_follow_pagc_config(rtwdev, false); in rtw89_phy_dig()
3711 struct rtw89_dev *rtwdev = rtwsta->rtwdev; in rtw89_phy_tx_path_div_sta_iter() local
3713 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_tx_path_div_sta_iter()
3740 rtw89_fw_h2c_txpath_cmac_tbl(rtwdev, rtwsta); in rtw89_phy_tx_path_div_sta_iter()
3743 rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE, B_P0_RFMODE_MUX, 0x12); in rtw89_phy_tx_path_div_sta_iter()
3744 rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE, B_P1_RFMODE_MUX, 0x11); in rtw89_phy_tx_path_div_sta_iter()
3746 rtw89_phy_write32_mask(rtwdev, R_P0_RFMODE, B_P0_RFMODE_MUX, 0x11); in rtw89_phy_tx_path_div_sta_iter()
3747 rtw89_phy_write32_mask(rtwdev, R_P1_RFMODE, B_P1_RFMODE_MUX, 0x12); in rtw89_phy_tx_path_div_sta_iter()
3751 void rtw89_phy_tx_path_div_track(struct rtw89_dev *rtwdev) in rtw89_phy_tx_path_div_track() argument
3753 struct rtw89_hal *hal = &rtwdev->hal; in rtw89_phy_tx_path_div_track()
3759 ieee80211_iterate_stations_atomic(rtwdev->hw, in rtw89_phy_tx_path_div_track()
3764 static void rtw89_phy_env_monitor_init(struct rtw89_dev *rtwdev) in rtw89_phy_env_monitor_init() argument
3766 rtw89_phy_ccx_top_setting_init(rtwdev); in rtw89_phy_env_monitor_init()
3767 rtw89_phy_ifs_clm_setting_init(rtwdev); in rtw89_phy_env_monitor_init()
3770 void rtw89_phy_dm_init(struct rtw89_dev *rtwdev) in rtw89_phy_dm_init() argument
3772 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_dm_init()
3774 rtw89_phy_stat_init(rtwdev); in rtw89_phy_dm_init()
3776 rtw89_chip_bb_sethw(rtwdev); in rtw89_phy_dm_init()
3778 rtw89_phy_env_monitor_init(rtwdev); in rtw89_phy_dm_init()
3779 rtw89_physts_parsing_init(rtwdev); in rtw89_phy_dm_init()
3780 rtw89_phy_dig_init(rtwdev); in rtw89_phy_dm_init()
3781 rtw89_phy_cfo_init(rtwdev); in rtw89_phy_dm_init()
3783 rtw89_phy_init_rf_nctl(rtwdev); in rtw89_phy_dm_init()
3784 rtw89_chip_rfk_init(rtwdev); in rtw89_phy_dm_init()
3785 rtw89_load_txpwr_table(rtwdev, chip->byr_table); in rtw89_phy_dm_init()
3786 rtw89_chip_set_txpwr_ctrl(rtwdev); in rtw89_phy_dm_init()
3787 rtw89_chip_power_trim(rtwdev); in rtw89_phy_dm_init()
3788 rtw89_chip_cfg_txrx_path(rtwdev); in rtw89_phy_dm_init()
3791 void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif) in rtw89_phy_set_bss_color() argument
3801 rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0, 0x1, in rtw89_phy_set_bss_color()
3803 rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_TGT, bss_color, in rtw89_phy_set_bss_color()
3805 rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_STAID, in rtw89_phy_set_bss_color()
3810 _rfk_write_rf(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) in _rfk_write_rf() argument
3812 rtw89_write_rf(rtwdev, def->path, def->addr, def->mask, def->data); in _rfk_write_rf()
3816 _rfk_write32_mask(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) in _rfk_write32_mask() argument
3818 rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); in _rfk_write32_mask()
3822 _rfk_write32_set(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) in _rfk_write32_set() argument
3824 rtw89_phy_write32_set(rtwdev, def->addr, def->mask); in _rfk_write32_set()
3828 _rfk_write32_clr(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) in _rfk_write32_clr() argument
3830 rtw89_phy_write32_clr(rtwdev, def->addr, def->mask); in _rfk_write32_clr()
3834 _rfk_delay(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) in _rfk_delay() argument
3840 (*_rfk_handler[])(struct rtw89_dev *rtwdev, const struct rtw89_reg5_def *def) = {
3851 rtw89_rfk_parser(struct rtw89_dev *rtwdev, const struct rtw89_rfk_tbl *tbl) in rtw89_rfk_parser() argument
3857 _rfk_handler[p->flag](rtwdev, p); in rtw89_rfk_parser()
3878 void rtw89_phy_tssi_ctrl_set_fast_mode_cfg(struct rtw89_dev *rtwdev, in rtw89_phy_tssi_ctrl_set_fast_mode_cfg() argument
3894 rtw89_write32_mask(rtwdev, reg, regs[i].mask, val); in rtw89_phy_tssi_ctrl_set_fast_mode_cfg()
3934 void rtw89_phy_tssi_ctrl_set_bandedge_cfg(struct rtw89_dev *rtwdev, in rtw89_phy_tssi_ctrl_set_bandedge_cfg() argument
3938 const struct rtw89_chip_info *chip = rtwdev->chip; in rtw89_phy_tssi_ctrl_set_bandedge_cfg()
3956 rtw89_write32_mask(rtwdev, reg, regs[i].mask, data[i]); in rtw89_phy_tssi_ctrl_set_bandedge_cfg()
3960 rtw89_write32_mask(rtwdev, reg, B_AX_BANDEDGE_CFG_IDX_MASK, bandedge_cfg); in rtw89_phy_tssi_ctrl_set_bandedge_cfg()
3962 rtw89_phy_tssi_ctrl_set_fast_mode_cfg(rtwdev, mac_idx, bandedge_cfg, in rtw89_phy_tssi_ctrl_set_bandedge_cfg()