16d67aabdSBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 26d67aabdSBjoern A. Zeeb /* Copyright(c) 2023 Realtek Corporation 36d67aabdSBjoern A. Zeeb */ 46d67aabdSBjoern A. Zeeb 56d67aabdSBjoern A. Zeeb #include "debug.h" 66d67aabdSBjoern A. Zeeb #include "mac.h" 76d67aabdSBjoern A. Zeeb #include "phy.h" 86d67aabdSBjoern A. Zeeb #include "reg.h" 96d67aabdSBjoern A. Zeeb 106d67aabdSBjoern A. Zeeb static const struct rtw89_ccx_regs rtw89_ccx_regs_be = { 116d67aabdSBjoern A. Zeeb .setting_addr = R_CCX, 126d67aabdSBjoern A. Zeeb .edcca_opt_mask = B_CCX_EDCCA_OPT_MSK_V1, 136d67aabdSBjoern A. Zeeb .measurement_trig_mask = B_MEASUREMENT_TRIG_MSK, 146d67aabdSBjoern A. Zeeb .trig_opt_mask = B_CCX_TRIG_OPT_MSK, 156d67aabdSBjoern A. Zeeb .en_mask = B_CCX_EN_MSK, 166d67aabdSBjoern A. Zeeb .ifs_cnt_addr = R_IFS_COUNTER, 176d67aabdSBjoern A. Zeeb .ifs_clm_period_mask = B_IFS_CLM_PERIOD_MSK, 186d67aabdSBjoern A. Zeeb .ifs_clm_cnt_unit_mask = B_IFS_CLM_COUNTER_UNIT_MSK, 196d67aabdSBjoern A. Zeeb .ifs_clm_cnt_clear_mask = B_IFS_COUNTER_CLR_MSK, 206d67aabdSBjoern A. Zeeb .ifs_collect_en_mask = B_IFS_COLLECT_EN, 216d67aabdSBjoern A. Zeeb .ifs_t1_addr = R_IFS_T1, 226d67aabdSBjoern A. Zeeb .ifs_t1_th_h_mask = B_IFS_T1_TH_HIGH_MSK, 236d67aabdSBjoern A. Zeeb .ifs_t1_en_mask = B_IFS_T1_EN_MSK, 246d67aabdSBjoern A. Zeeb .ifs_t1_th_l_mask = B_IFS_T1_TH_LOW_MSK, 256d67aabdSBjoern A. Zeeb .ifs_t2_addr = R_IFS_T2, 266d67aabdSBjoern A. Zeeb .ifs_t2_th_h_mask = B_IFS_T2_TH_HIGH_MSK, 276d67aabdSBjoern A. Zeeb .ifs_t2_en_mask = B_IFS_T2_EN_MSK, 286d67aabdSBjoern A. Zeeb .ifs_t2_th_l_mask = B_IFS_T2_TH_LOW_MSK, 296d67aabdSBjoern A. Zeeb .ifs_t3_addr = R_IFS_T3, 306d67aabdSBjoern A. Zeeb .ifs_t3_th_h_mask = B_IFS_T3_TH_HIGH_MSK, 316d67aabdSBjoern A. Zeeb .ifs_t3_en_mask = B_IFS_T3_EN_MSK, 326d67aabdSBjoern A. Zeeb .ifs_t3_th_l_mask = B_IFS_T3_TH_LOW_MSK, 336d67aabdSBjoern A. Zeeb .ifs_t4_addr = R_IFS_T4, 346d67aabdSBjoern A. Zeeb .ifs_t4_th_h_mask = B_IFS_T4_TH_HIGH_MSK, 356d67aabdSBjoern A. Zeeb .ifs_t4_en_mask = B_IFS_T4_EN_MSK, 366d67aabdSBjoern A. Zeeb .ifs_t4_th_l_mask = B_IFS_T4_TH_LOW_MSK, 376d67aabdSBjoern A. Zeeb .ifs_clm_tx_cnt_addr = R_IFS_CLM_TX_CNT_V1, 386d67aabdSBjoern A. Zeeb .ifs_clm_edcca_excl_cca_fa_mask = B_IFS_CLM_EDCCA_EXCLUDE_CCA_FA_MSK, 396d67aabdSBjoern A. Zeeb .ifs_clm_tx_cnt_msk = B_IFS_CLM_TX_CNT_MSK, 406d67aabdSBjoern A. Zeeb .ifs_clm_cca_addr = R_IFS_CLM_CCA_V1, 416d67aabdSBjoern A. Zeeb .ifs_clm_ofdmcca_excl_fa_mask = B_IFS_CLM_OFDMCCA_EXCLUDE_FA_MSK, 426d67aabdSBjoern A. Zeeb .ifs_clm_cckcca_excl_fa_mask = B_IFS_CLM_CCKCCA_EXCLUDE_FA_MSK, 436d67aabdSBjoern A. Zeeb .ifs_clm_fa_addr = R_IFS_CLM_FA_V1, 446d67aabdSBjoern A. Zeeb .ifs_clm_ofdm_fa_mask = B_IFS_CLM_OFDM_FA_MSK, 456d67aabdSBjoern A. Zeeb .ifs_clm_cck_fa_mask = B_IFS_CLM_CCK_FA_MSK, 466d67aabdSBjoern A. Zeeb .ifs_his_addr = R_IFS_HIS_V1, 476d67aabdSBjoern A. Zeeb .ifs_t4_his_mask = B_IFS_T4_HIS_MSK, 486d67aabdSBjoern A. Zeeb .ifs_t3_his_mask = B_IFS_T3_HIS_MSK, 496d67aabdSBjoern A. Zeeb .ifs_t2_his_mask = B_IFS_T2_HIS_MSK, 506d67aabdSBjoern A. Zeeb .ifs_t1_his_mask = B_IFS_T1_HIS_MSK, 516d67aabdSBjoern A. Zeeb .ifs_avg_l_addr = R_IFS_AVG_L_V1, 526d67aabdSBjoern A. Zeeb .ifs_t2_avg_mask = B_IFS_T2_AVG_MSK, 536d67aabdSBjoern A. Zeeb .ifs_t1_avg_mask = B_IFS_T1_AVG_MSK, 546d67aabdSBjoern A. Zeeb .ifs_avg_h_addr = R_IFS_AVG_H_V1, 556d67aabdSBjoern A. Zeeb .ifs_t4_avg_mask = B_IFS_T4_AVG_MSK, 566d67aabdSBjoern A. Zeeb .ifs_t3_avg_mask = B_IFS_T3_AVG_MSK, 576d67aabdSBjoern A. Zeeb .ifs_cca_l_addr = R_IFS_CCA_L_V1, 586d67aabdSBjoern A. Zeeb .ifs_t2_cca_mask = B_IFS_T2_CCA_MSK, 596d67aabdSBjoern A. Zeeb .ifs_t1_cca_mask = B_IFS_T1_CCA_MSK, 606d67aabdSBjoern A. Zeeb .ifs_cca_h_addr = R_IFS_CCA_H_V1, 616d67aabdSBjoern A. Zeeb .ifs_t4_cca_mask = B_IFS_T4_CCA_MSK, 626d67aabdSBjoern A. Zeeb .ifs_t3_cca_mask = B_IFS_T3_CCA_MSK, 636d67aabdSBjoern A. Zeeb .ifs_total_addr = R_IFSCNT_V1, 646d67aabdSBjoern A. Zeeb .ifs_cnt_done_mask = B_IFSCNT_DONE_MSK, 656d67aabdSBjoern A. Zeeb .ifs_total_mask = B_IFSCNT_TOTAL_CNT_MSK, 666d67aabdSBjoern A. Zeeb }; 676d67aabdSBjoern A. Zeeb 686d67aabdSBjoern A. Zeeb static const struct rtw89_physts_regs rtw89_physts_regs_be = { 696d67aabdSBjoern A. Zeeb .setting_addr = R_PLCP_HISTOGRAM, 706d67aabdSBjoern A. Zeeb .dis_trigger_fail_mask = B_STS_DIS_TRIG_BY_FAIL, 716d67aabdSBjoern A. Zeeb .dis_trigger_brk_mask = B_STS_DIS_TRIG_BY_BRK, 726d67aabdSBjoern A. Zeeb }; 736d67aabdSBjoern A. Zeeb 746d67aabdSBjoern A. Zeeb static const struct rtw89_cfo_regs rtw89_cfo_regs_be = { 756d67aabdSBjoern A. Zeeb .comp = R_DCFO_WEIGHT_V1, 766d67aabdSBjoern A. Zeeb .weighting_mask = B_DCFO_WEIGHT_MSK_V1, 776d67aabdSBjoern A. Zeeb .comp_seg0 = R_DCFO_OPT_V1, 786d67aabdSBjoern A. Zeeb .valid_0_mask = B_DCFO_OPT_EN_V1, 796d67aabdSBjoern A. Zeeb }; 806d67aabdSBjoern A. Zeeb 816d67aabdSBjoern A. Zeeb static u32 rtw89_phy0_phy1_offset_be(struct rtw89_dev *rtwdev, u32 addr) 826d67aabdSBjoern A. Zeeb { 836d67aabdSBjoern A. Zeeb u32 phy_page = addr >> 8; 846d67aabdSBjoern A. Zeeb u32 ofst = 0; 856d67aabdSBjoern A. Zeeb 866d67aabdSBjoern A. Zeeb if ((phy_page >= 0x4 && phy_page <= 0xF) || 876d67aabdSBjoern A. Zeeb (phy_page >= 0x20 && phy_page <= 0x2B) || 886d67aabdSBjoern A. Zeeb (phy_page >= 0x40 && phy_page <= 0x4f) || 896d67aabdSBjoern A. Zeeb (phy_page >= 0x60 && phy_page <= 0x6f) || 906d67aabdSBjoern A. Zeeb (phy_page >= 0xE4 && phy_page <= 0xE5) || 916d67aabdSBjoern A. Zeeb (phy_page >= 0xE8 && phy_page <= 0xED)) 926d67aabdSBjoern A. Zeeb ofst = 0x1000; 936d67aabdSBjoern A. Zeeb else 946d67aabdSBjoern A. Zeeb ofst = 0x0; 956d67aabdSBjoern A. Zeeb 966d67aabdSBjoern A. Zeeb return ofst; 976d67aabdSBjoern A. Zeeb } 986d67aabdSBjoern A. Zeeb 996d67aabdSBjoern A. Zeeb union rtw89_phy_bb_gain_arg_be { 1006d67aabdSBjoern A. Zeeb u32 addr; 1016d67aabdSBjoern A. Zeeb struct { 1026d67aabdSBjoern A. Zeeb u8 type; 1036d67aabdSBjoern A. Zeeb #define BB_GAIN_TYPE_SUB0_BE GENMASK(3, 0) 1046d67aabdSBjoern A. Zeeb #define BB_GAIN_TYPE_SUB1_BE GENMASK(7, 4) 1056d67aabdSBjoern A. Zeeb u8 path_bw; 1066d67aabdSBjoern A. Zeeb #define BB_GAIN_PATH_BE GENMASK(3, 0) 1076d67aabdSBjoern A. Zeeb #define BB_GAIN_BW_BE GENMASK(7, 4) 1086d67aabdSBjoern A. Zeeb u8 gain_band; 1096d67aabdSBjoern A. Zeeb u8 cfg_type; 1106d67aabdSBjoern A. Zeeb } __packed; 1116d67aabdSBjoern A. Zeeb } __packed; 1126d67aabdSBjoern A. Zeeb 1136d67aabdSBjoern A. Zeeb static void 1146d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_gain_error_be(struct rtw89_dev *rtwdev, 1156d67aabdSBjoern A. Zeeb union rtw89_phy_bb_gain_arg_be arg, u32 data) 1166d67aabdSBjoern A. Zeeb { 1176d67aabdSBjoern A. Zeeb struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be; 1186d67aabdSBjoern A. Zeeb u8 bw_type = u8_get_bits(arg.path_bw, BB_GAIN_BW_BE); 1196d67aabdSBjoern A. Zeeb u8 path = u8_get_bits(arg.path_bw, BB_GAIN_PATH_BE); 1206d67aabdSBjoern A. Zeeb u8 gband = arg.gain_band; 1216d67aabdSBjoern A. Zeeb u8 type = arg.type; 1226d67aabdSBjoern A. Zeeb int i; 1236d67aabdSBjoern A. Zeeb 1246d67aabdSBjoern A. Zeeb switch (type) { 1256d67aabdSBjoern A. Zeeb case 0: 1266d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++, data >>= 8) 1276d67aabdSBjoern A. Zeeb gain->lna_gain[gband][bw_type][path][i] = data & 0xff; 1286d67aabdSBjoern A. Zeeb break; 1296d67aabdSBjoern A. Zeeb case 1: 1306d67aabdSBjoern A. Zeeb for (i = 4; i < 7; i++, data >>= 8) 1316d67aabdSBjoern A. Zeeb gain->lna_gain[gband][bw_type][path][i] = data & 0xff; 1326d67aabdSBjoern A. Zeeb break; 1336d67aabdSBjoern A. Zeeb case 2: 1346d67aabdSBjoern A. Zeeb for (i = 0; i < 2; i++, data >>= 8) 1356d67aabdSBjoern A. Zeeb gain->tia_gain[gband][bw_type][path][i] = data & 0xff; 1366d67aabdSBjoern A. Zeeb break; 1376d67aabdSBjoern A. Zeeb default: 1386d67aabdSBjoern A. Zeeb rtw89_warn(rtwdev, 1396d67aabdSBjoern A. Zeeb "bb gain error {0x%x:0x%x} with unknown type: %d\n", 1406d67aabdSBjoern A. Zeeb arg.addr, data, type); 1416d67aabdSBjoern A. Zeeb break; 1426d67aabdSBjoern A. Zeeb } 1436d67aabdSBjoern A. Zeeb } 1446d67aabdSBjoern A. Zeeb 1456d67aabdSBjoern A. Zeeb static void 1466d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_rpl_ofst_be(struct rtw89_dev *rtwdev, 1476d67aabdSBjoern A. Zeeb union rtw89_phy_bb_gain_arg_be arg, u32 data) 1486d67aabdSBjoern A. Zeeb { 1496d67aabdSBjoern A. Zeeb struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be; 1506d67aabdSBjoern A. Zeeb u8 type_sub0 = u8_get_bits(arg.type, BB_GAIN_TYPE_SUB0_BE); 1516d67aabdSBjoern A. Zeeb u8 type_sub1 = u8_get_bits(arg.type, BB_GAIN_TYPE_SUB1_BE); 1526d67aabdSBjoern A. Zeeb u8 path = u8_get_bits(arg.path_bw, BB_GAIN_PATH_BE); 1536d67aabdSBjoern A. Zeeb u8 gband = arg.gain_band; 1546d67aabdSBjoern A. Zeeb u8 ofst = 0; 1556d67aabdSBjoern A. Zeeb int i; 1566d67aabdSBjoern A. Zeeb 1576d67aabdSBjoern A. Zeeb switch (type_sub1) { 1586d67aabdSBjoern A. Zeeb case RTW89_CMAC_BW_20M: 1596d67aabdSBjoern A. Zeeb gain->rpl_ofst_20[gband][path][0] = (s8)data; 1606d67aabdSBjoern A. Zeeb break; 1616d67aabdSBjoern A. Zeeb case RTW89_CMAC_BW_40M: 1626d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_BW20_SC_40M; i++, data >>= 8) 1636d67aabdSBjoern A. Zeeb gain->rpl_ofst_40[gband][path][i] = data & 0xff; 1646d67aabdSBjoern A. Zeeb break; 1656d67aabdSBjoern A. Zeeb case RTW89_CMAC_BW_80M: 1666d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_BW20_SC_80M; i++, data >>= 8) 1676d67aabdSBjoern A. Zeeb gain->rpl_ofst_80[gband][path][i] = data & 0xff; 1686d67aabdSBjoern A. Zeeb break; 1696d67aabdSBjoern A. Zeeb case RTW89_CMAC_BW_160M: 1706d67aabdSBjoern A. Zeeb if (type_sub0 == 0) 1716d67aabdSBjoern A. Zeeb ofst = 0; 1726d67aabdSBjoern A. Zeeb else 1736d67aabdSBjoern A. Zeeb ofst = RTW89_BW20_SC_80M; 1746d67aabdSBjoern A. Zeeb 1756d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_BW20_SC_80M; i++, data >>= 8) 1766d67aabdSBjoern A. Zeeb gain->rpl_ofst_160[gband][path][i + ofst] = data & 0xff; 1776d67aabdSBjoern A. Zeeb break; 1786d67aabdSBjoern A. Zeeb default: 1796d67aabdSBjoern A. Zeeb rtw89_warn(rtwdev, 1806d67aabdSBjoern A. Zeeb "bb rpl ofst {0x%x:0x%x} with unknown type_sub1: %d\n", 1816d67aabdSBjoern A. Zeeb arg.addr, data, type_sub1); 1826d67aabdSBjoern A. Zeeb break; 1836d67aabdSBjoern A. Zeeb } 1846d67aabdSBjoern A. Zeeb } 1856d67aabdSBjoern A. Zeeb 1866d67aabdSBjoern A. Zeeb static void 1876d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_gain_op1db_be(struct rtw89_dev *rtwdev, 1886d67aabdSBjoern A. Zeeb union rtw89_phy_bb_gain_arg_be arg, u32 data) 1896d67aabdSBjoern A. Zeeb { 1906d67aabdSBjoern A. Zeeb struct rtw89_phy_bb_gain_info_be *gain = &rtwdev->bb_gain.be; 1916d67aabdSBjoern A. Zeeb u8 bw_type = u8_get_bits(arg.path_bw, BB_GAIN_BW_BE); 1926d67aabdSBjoern A. Zeeb u8 path = u8_get_bits(arg.path_bw, BB_GAIN_PATH_BE); 1936d67aabdSBjoern A. Zeeb u8 gband = arg.gain_band; 1946d67aabdSBjoern A. Zeeb u8 type = arg.type; 1956d67aabdSBjoern A. Zeeb int i; 1966d67aabdSBjoern A. Zeeb 1976d67aabdSBjoern A. Zeeb switch (type) { 1986d67aabdSBjoern A. Zeeb case 0: 1996d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++, data >>= 8) 2006d67aabdSBjoern A. Zeeb gain->lna_op1db[gband][bw_type][path][i] = data & 0xff; 2016d67aabdSBjoern A. Zeeb break; 2026d67aabdSBjoern A. Zeeb case 1: 2036d67aabdSBjoern A. Zeeb for (i = 4; i < 7; i++, data >>= 8) 2046d67aabdSBjoern A. Zeeb gain->lna_op1db[gband][bw_type][path][i] = data & 0xff; 2056d67aabdSBjoern A. Zeeb break; 2066d67aabdSBjoern A. Zeeb case 2: 2076d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++, data >>= 8) 2086d67aabdSBjoern A. Zeeb gain->tia_lna_op1db[gband][bw_type][path][i] = data & 0xff; 2096d67aabdSBjoern A. Zeeb break; 2106d67aabdSBjoern A. Zeeb case 3: 2116d67aabdSBjoern A. Zeeb for (i = 4; i < 8; i++, data >>= 8) 2126d67aabdSBjoern A. Zeeb gain->tia_lna_op1db[gband][bw_type][path][i] = data & 0xff; 2136d67aabdSBjoern A. Zeeb break; 2146d67aabdSBjoern A. Zeeb default: 2156d67aabdSBjoern A. Zeeb rtw89_warn(rtwdev, 2166d67aabdSBjoern A. Zeeb "bb gain op1db {0x%x:0x%x} with unknown type: %d\n", 2176d67aabdSBjoern A. Zeeb arg.addr, data, type); 2186d67aabdSBjoern A. Zeeb break; 2196d67aabdSBjoern A. Zeeb } 2206d67aabdSBjoern A. Zeeb } 2216d67aabdSBjoern A. Zeeb 2226d67aabdSBjoern A. Zeeb static void rtw89_phy_config_bb_gain_be(struct rtw89_dev *rtwdev, 2236d67aabdSBjoern A. Zeeb const struct rtw89_reg2_def *reg, 2246d67aabdSBjoern A. Zeeb enum rtw89_rf_path rf_path, 2256d67aabdSBjoern A. Zeeb void *extra_data) 2266d67aabdSBjoern A. Zeeb { 2276d67aabdSBjoern A. Zeeb const struct rtw89_chip_info *chip = rtwdev->chip; 2286d67aabdSBjoern A. Zeeb union rtw89_phy_bb_gain_arg_be arg = { .addr = reg->addr }; 2296d67aabdSBjoern A. Zeeb struct rtw89_efuse *efuse = &rtwdev->efuse; 2306d67aabdSBjoern A. Zeeb u8 bw_type = u8_get_bits(arg.path_bw, BB_GAIN_BW_BE); 2316d67aabdSBjoern A. Zeeb u8 path = u8_get_bits(arg.path_bw, BB_GAIN_PATH_BE); 2326d67aabdSBjoern A. Zeeb 2336d67aabdSBjoern A. Zeeb if (bw_type >= RTW89_BB_BW_NR_BE) 2346d67aabdSBjoern A. Zeeb return; 2356d67aabdSBjoern A. Zeeb 2366d67aabdSBjoern A. Zeeb if (arg.gain_band >= RTW89_BB_GAIN_BAND_NR_BE) 2376d67aabdSBjoern A. Zeeb return; 2386d67aabdSBjoern A. Zeeb 2396d67aabdSBjoern A. Zeeb if (path >= chip->rf_path_num) 2406d67aabdSBjoern A. Zeeb return; 2416d67aabdSBjoern A. Zeeb 2426d67aabdSBjoern A. Zeeb if (arg.addr >= 0xf9 && arg.addr <= 0xfe) { 2436d67aabdSBjoern A. Zeeb rtw89_warn(rtwdev, "bb gain table with flow ctrl\n"); 2446d67aabdSBjoern A. Zeeb return; 2456d67aabdSBjoern A. Zeeb } 2466d67aabdSBjoern A. Zeeb 2476d67aabdSBjoern A. Zeeb switch (arg.cfg_type) { 2486d67aabdSBjoern A. Zeeb case 0: 2496d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_gain_error_be(rtwdev, arg, reg->data); 2506d67aabdSBjoern A. Zeeb break; 2516d67aabdSBjoern A. Zeeb case 1: 2526d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_rpl_ofst_be(rtwdev, arg, reg->data); 2536d67aabdSBjoern A. Zeeb break; 2546d67aabdSBjoern A. Zeeb case 2: 2556d67aabdSBjoern A. Zeeb /* ignore BB gain bypass */ 2566d67aabdSBjoern A. Zeeb break; 2576d67aabdSBjoern A. Zeeb case 3: 2586d67aabdSBjoern A. Zeeb rtw89_phy_cfg_bb_gain_op1db_be(rtwdev, arg, reg->data); 2596d67aabdSBjoern A. Zeeb break; 2606d67aabdSBjoern A. Zeeb case 4: 2616d67aabdSBjoern A. Zeeb /* This cfg_type is only used by rfe_type >= 50 with eFEM */ 2626d67aabdSBjoern A. Zeeb if (efuse->rfe_type < 50) 2636d67aabdSBjoern A. Zeeb break; 2646d67aabdSBjoern A. Zeeb fallthrough; 2656d67aabdSBjoern A. Zeeb default: 2666d67aabdSBjoern A. Zeeb rtw89_warn(rtwdev, 2676d67aabdSBjoern A. Zeeb "bb gain {0x%x:0x%x} with unknown cfg type: %d\n", 2686d67aabdSBjoern A. Zeeb arg.addr, reg->data, arg.cfg_type); 2696d67aabdSBjoern A. Zeeb break; 2706d67aabdSBjoern A. Zeeb } 2716d67aabdSBjoern A. Zeeb } 2726d67aabdSBjoern A. Zeeb 2736d67aabdSBjoern A. Zeeb static void rtw89_phy_preinit_rf_nctl_be(struct rtw89_dev *rtwdev) 2746d67aabdSBjoern A. Zeeb { 2756d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_GOTX_IQKDPK_C0, B_GOTX_IQKDPK, 0x3); 2766d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_GOTX_IQKDPK_C1, B_GOTX_IQKDPK, 0x3); 2776d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQKDPK_HC, B_IQKDPK_HC, 0x1); 2786d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CLK_GCK, B_CLK_GCK, 0x00fffff); 2796d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_CLKEN, 0x3); 2806d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST, B_IQK_DPK_RST, 0x1); 2816d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_PRST, B_IQK_DPK_PRST, 0x1); 2826d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_PRST_C1, B_IQK_DPK_PRST, 0x1); 2836d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXRFC, B_TXRFC_RST, 0x1); 2846d67aabdSBjoern A. Zeeb 2856d67aabdSBjoern A. Zeeb if (rtwdev->dbcc_en) { 2866d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST_C1, B_IQK_DPK_RST, 0x1); 2876d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXRFC_C1, B_TXRFC_RST, 0x1); 2886d67aabdSBjoern A. Zeeb } 2896d67aabdSBjoern A. Zeeb } 2906d67aabdSBjoern A. Zeeb 2916d67aabdSBjoern A. Zeeb static 2926d67aabdSBjoern A. Zeeb void rtw89_phy_bb_wrap_pwr_by_macid_init(struct rtw89_dev *rtwdev) 2936d67aabdSBjoern A. Zeeb { 2946d67aabdSBjoern A. Zeeb u32 macid_idx, cr, base_macid_lmt, max_macid = 32; 2956d67aabdSBjoern A. Zeeb 2966d67aabdSBjoern A. Zeeb base_macid_lmt = R_BE_PWR_MACID_LMT_BASE; 2976d67aabdSBjoern A. Zeeb 2986d67aabdSBjoern A. Zeeb for (macid_idx = 0; macid_idx < 4 * max_macid; macid_idx += 4) { 2996d67aabdSBjoern A. Zeeb cr = base_macid_lmt + macid_idx; 3006d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, cr, 0x03007F7F); 3016d67aabdSBjoern A. Zeeb } 3026d67aabdSBjoern A. Zeeb } 3036d67aabdSBjoern A. Zeeb 3046d67aabdSBjoern A. Zeeb static 3056d67aabdSBjoern A. Zeeb void rtw89_phy_bb_wrap_tx_path_by_macid_init(struct rtw89_dev *rtwdev) 3066d67aabdSBjoern A. Zeeb { 3076d67aabdSBjoern A. Zeeb int i, max_macid = 32; 3086d67aabdSBjoern A. Zeeb u32 cr = R_BE_PWR_MACID_PATH_BASE; 3096d67aabdSBjoern A. Zeeb 3106d67aabdSBjoern A. Zeeb for (i = 0; i < max_macid; i++, cr += 4) 3116d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, cr, 0x03C86000); 3126d67aabdSBjoern A. Zeeb } 3136d67aabdSBjoern A. Zeeb 3146d67aabdSBjoern A. Zeeb static void rtw89_phy_bb_wrap_tpu_set_all(struct rtw89_dev *rtwdev, 3156d67aabdSBjoern A. Zeeb enum rtw89_mac_idx mac_idx) 3166d67aabdSBjoern A. Zeeb { 3176d67aabdSBjoern A. Zeeb u32 addr; 3186d67aabdSBjoern A. Zeeb 3196d67aabdSBjoern A. Zeeb for (addr = R_BE_PWR_BY_RATE; addr <= R_BE_PWR_BY_RATE_END; addr += 4) 3206d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0); 3216d67aabdSBjoern A. Zeeb for (addr = R_BE_PWR_RULMT_START; addr <= R_BE_PWR_RULMT_END; addr += 4) 3226d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0); 3236d67aabdSBjoern A. Zeeb for (addr = R_BE_PWR_RATE_OFST_CTRL; addr <= R_BE_PWR_RATE_OFST_END; addr += 4) 3246d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0); 3256d67aabdSBjoern A. Zeeb 3266d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_REF_CTRL, mac_idx); 3276d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_OFST_LMT_DB, 0); 3286d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_OFST_LMTBF, mac_idx); 3296d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_OFST_LMTBF_DB, 0); 3306d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_RATE_CTRL, mac_idx); 3316d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_OFST_BYRATE_DB, 0); 3326d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_OFST_RULMT, mac_idx); 3336d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_OFST_RULMT_DB, 0); 3346d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_OFST_SW, mac_idx); 3356d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_OFST_SW_DB, 0); 3366d67aabdSBjoern A. Zeeb } 3376d67aabdSBjoern A. Zeeb 3386d67aabdSBjoern A. Zeeb static 3396d67aabdSBjoern A. Zeeb void rtw89_phy_bb_wrap_listen_path_en_init(struct rtw89_dev *rtwdev) 3406d67aabdSBjoern A. Zeeb { 3416d67aabdSBjoern A. Zeeb u32 addr; 3426d67aabdSBjoern A. Zeeb int ret; 3436d67aabdSBjoern A. Zeeb 3446d67aabdSBjoern A. Zeeb ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_1, RTW89_CMAC_SEL); 3456d67aabdSBjoern A. Zeeb if (ret) 3466d67aabdSBjoern A. Zeeb return; 3476d67aabdSBjoern A. Zeeb 3486d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_LISTEN_PATH, RTW89_MAC_1); 3496d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_LISTEN_PATH_EN, 0x2); 3506d67aabdSBjoern A. Zeeb } 3516d67aabdSBjoern A. Zeeb 3526d67aabdSBjoern A. Zeeb static void rtw89_phy_bb_wrap_force_cr_init(struct rtw89_dev *rtwdev, 3536d67aabdSBjoern A. Zeeb enum rtw89_mac_idx mac_idx) 3546d67aabdSBjoern A. Zeeb { 3556d67aabdSBjoern A. Zeeb u32 addr; 3566d67aabdSBjoern A. Zeeb 3576d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_FORCE_LMT, mac_idx); 3586d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_LMT_ON, 0); 3596d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_BOOST, mac_idx); 3606d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_RATE_ON, 0); 3616d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_OFST_RULMT, mac_idx); 3626d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_RU_ENON, 0); 3636d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_RU_ON, 0); 3646d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_FORCE_MACID, mac_idx); 3656d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_MACID_ON, 0); 3666d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_COEX_CTRL, mac_idx); 3676d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_PWR_FORCE_COEX_ON, 0); 3686d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_RATE_CTRL, mac_idx); 3696d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, B_BE_FORCE_PWR_BY_RATE_EN, 0); 3706d67aabdSBjoern A. Zeeb } 3716d67aabdSBjoern A. Zeeb 3726d67aabdSBjoern A. Zeeb static void rtw89_phy_bb_wrap_ftm_init(struct rtw89_dev *rtwdev, 3736d67aabdSBjoern A. Zeeb enum rtw89_mac_idx mac_idx) 3746d67aabdSBjoern A. Zeeb { 3756d67aabdSBjoern A. Zeeb u32 addr; 3766d67aabdSBjoern A. Zeeb 3776d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_FTM, mac_idx); 3786d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0xE4E431); 3796d67aabdSBjoern A. Zeeb 3806d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_FTM_SS, mac_idx); 3816d67aabdSBjoern A. Zeeb rtw89_write32_mask(rtwdev, addr, 0x7, 0); 3826d67aabdSBjoern A. Zeeb } 3836d67aabdSBjoern A. Zeeb 3846d67aabdSBjoern A. Zeeb static void rtw89_phy_bb_wrap_ul_pwr(struct rtw89_dev *rtwdev) 3856d67aabdSBjoern A. Zeeb { 3866d67aabdSBjoern A. Zeeb enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id; 3876d67aabdSBjoern A. Zeeb u8 mac_idx; 3886d67aabdSBjoern A. Zeeb u32 addr; 3896d67aabdSBjoern A. Zeeb 3906d67aabdSBjoern A. Zeeb if (chip_id != RTL8922A) 3916d67aabdSBjoern A. Zeeb return; 3926d67aabdSBjoern A. Zeeb 3936d67aabdSBjoern A. Zeeb for (mac_idx = 0; mac_idx < RTW89_MAC_NUM; mac_idx++) { 3946d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_RSSI_TARGET_LMT, mac_idx); 3956d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0x0201FE00); 3966d67aabdSBjoern A. Zeeb addr = rtw89_mac_reg_by_idx(rtwdev, R_BE_PWR_TH, mac_idx); 3976d67aabdSBjoern A. Zeeb rtw89_write32(rtwdev, addr, 0x00FFEC7E); 3986d67aabdSBjoern A. Zeeb } 3996d67aabdSBjoern A. Zeeb } 4006d67aabdSBjoern A. Zeeb 401*df279a26SBjoern A. Zeeb static void __rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev, 402*df279a26SBjoern A. Zeeb enum rtw89_mac_idx mac_idx) 4036d67aabdSBjoern A. Zeeb { 4046d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_pwr_by_macid_init(rtwdev); 4056d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_tx_path_by_macid_init(rtwdev); 4066d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_listen_path_en_init(rtwdev); 4076d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_force_cr_init(rtwdev, mac_idx); 4086d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_ftm_init(rtwdev, mac_idx); 4096d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_tpu_set_all(rtwdev, mac_idx); 4106d67aabdSBjoern A. Zeeb rtw89_phy_bb_wrap_ul_pwr(rtwdev); 4116d67aabdSBjoern A. Zeeb } 4126d67aabdSBjoern A. Zeeb 413*df279a26SBjoern A. Zeeb static void rtw89_phy_bb_wrap_init_be(struct rtw89_dev *rtwdev) 414*df279a26SBjoern A. Zeeb { 415*df279a26SBjoern A. Zeeb __rtw89_phy_bb_wrap_init_be(rtwdev, RTW89_MAC_0); 416*df279a26SBjoern A. Zeeb if (rtwdev->dbcc_en) 417*df279a26SBjoern A. Zeeb __rtw89_phy_bb_wrap_init_be(rtwdev, RTW89_MAC_1); 418*df279a26SBjoern A. Zeeb } 419*df279a26SBjoern A. Zeeb 4206d67aabdSBjoern A. Zeeb static void rtw89_phy_ch_info_init_be(struct rtw89_dev *rtwdev) 4216d67aabdSBjoern A. Zeeb { 4226d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CHINFO_SEG, B_CHINFO_SEG_LEN, 0x0); 4236d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CHINFO_SEG, B_CHINFO_SEG, 0xf); 4246d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CHINFO_DATA, B_CHINFO_DATA_BITMAP, 0x1); 4256d67aabdSBjoern A. Zeeb rtw89_phy_set_phy_regs(rtwdev, R_CHINFO_ELM_SRC, B_CHINFO_ELM_BITMAP, 0x40303); 4266d67aabdSBjoern A. Zeeb rtw89_phy_set_phy_regs(rtwdev, R_CHINFO_ELM_SRC, B_CHINFO_SRC, 0x0); 4276d67aabdSBjoern A. Zeeb rtw89_phy_set_phy_regs(rtwdev, R_CHINFO_TYPE_SCAL, B_CHINFO_TYPE, 0x3); 4286d67aabdSBjoern A. Zeeb rtw89_phy_set_phy_regs(rtwdev, R_CHINFO_TYPE_SCAL, B_CHINFO_SCAL, 0x0); 4296d67aabdSBjoern A. Zeeb } 4306d67aabdSBjoern A. Zeeb 4316d67aabdSBjoern A. Zeeb struct rtw89_byr_spec_ent_be { 4326d67aabdSBjoern A. Zeeb struct rtw89_rate_desc init; 4336d67aabdSBjoern A. Zeeb u8 num_of_idx; 4346d67aabdSBjoern A. Zeeb bool no_over_bw40; 4356d67aabdSBjoern A. Zeeb bool no_multi_nss; 4366d67aabdSBjoern A. Zeeb }; 4376d67aabdSBjoern A. Zeeb 4386d67aabdSBjoern A. Zeeb static const struct rtw89_byr_spec_ent_be rtw89_byr_spec_be[] = { 4396d67aabdSBjoern A. Zeeb { 4406d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_CCK }, 4416d67aabdSBjoern A. Zeeb .num_of_idx = RTW89_RATE_CCK_NUM, 4426d67aabdSBjoern A. Zeeb .no_over_bw40 = true, 4436d67aabdSBjoern A. Zeeb .no_multi_nss = true, 4446d67aabdSBjoern A. Zeeb }, 4456d67aabdSBjoern A. Zeeb { 4466d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_OFDM }, 4476d67aabdSBjoern A. Zeeb .num_of_idx = RTW89_RATE_OFDM_NUM, 4486d67aabdSBjoern A. Zeeb .no_multi_nss = true, 4496d67aabdSBjoern A. Zeeb }, 4506d67aabdSBjoern A. Zeeb { 4516d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_MCS, .idx = 14, .ofdma = RTW89_NON_OFDMA }, 4526d67aabdSBjoern A. Zeeb .num_of_idx = 2, 4536d67aabdSBjoern A. Zeeb .no_multi_nss = true, 4546d67aabdSBjoern A. Zeeb }, 4556d67aabdSBjoern A. Zeeb { 4566d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_MCS, .idx = 14, .ofdma = RTW89_OFDMA }, 4576d67aabdSBjoern A. Zeeb .num_of_idx = 2, 4586d67aabdSBjoern A. Zeeb .no_multi_nss = true, 4596d67aabdSBjoern A. Zeeb }, 4606d67aabdSBjoern A. Zeeb { 4616d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_MCS, .ofdma = RTW89_NON_OFDMA }, 4626d67aabdSBjoern A. Zeeb .num_of_idx = 14, 4636d67aabdSBjoern A. Zeeb }, 4646d67aabdSBjoern A. Zeeb { 4656d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_HEDCM, .ofdma = RTW89_NON_OFDMA }, 4666d67aabdSBjoern A. Zeeb .num_of_idx = RTW89_RATE_HEDCM_NUM, 4676d67aabdSBjoern A. Zeeb }, 4686d67aabdSBjoern A. Zeeb { 4696d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_MCS, .ofdma = RTW89_OFDMA }, 4706d67aabdSBjoern A. Zeeb .num_of_idx = 14, 4716d67aabdSBjoern A. Zeeb }, 4726d67aabdSBjoern A. Zeeb { 4736d67aabdSBjoern A. Zeeb .init = { .rs = RTW89_RS_HEDCM, .ofdma = RTW89_OFDMA }, 4746d67aabdSBjoern A. Zeeb .num_of_idx = RTW89_RATE_HEDCM_NUM, 4756d67aabdSBjoern A. Zeeb }, 4766d67aabdSBjoern A. Zeeb }; 4776d67aabdSBjoern A. Zeeb 4786d67aabdSBjoern A. Zeeb static 4796d67aabdSBjoern A. Zeeb void __phy_set_txpwr_byrate_be(struct rtw89_dev *rtwdev, u8 band, u8 bw, 4806d67aabdSBjoern A. Zeeb u8 nss, u32 *addr, enum rtw89_phy_idx phy_idx) 4816d67aabdSBjoern A. Zeeb { 4826d67aabdSBjoern A. Zeeb const struct rtw89_byr_spec_ent_be *ent; 4836d67aabdSBjoern A. Zeeb struct rtw89_rate_desc desc; 4846d67aabdSBjoern A. Zeeb int pos = 0; 4856d67aabdSBjoern A. Zeeb int i, j; 4866d67aabdSBjoern A. Zeeb u32 val; 4876d67aabdSBjoern A. Zeeb s8 v[4]; 4886d67aabdSBjoern A. Zeeb 4896d67aabdSBjoern A. Zeeb for (i = 0; i < ARRAY_SIZE(rtw89_byr_spec_be); i++) { 4906d67aabdSBjoern A. Zeeb ent = &rtw89_byr_spec_be[i]; 4916d67aabdSBjoern A. Zeeb 4926d67aabdSBjoern A. Zeeb if (bw > RTW89_CHANNEL_WIDTH_40 && ent->no_over_bw40) 4936d67aabdSBjoern A. Zeeb continue; 4946d67aabdSBjoern A. Zeeb if (nss > RTW89_NSS_1 && ent->no_multi_nss) 4956d67aabdSBjoern A. Zeeb continue; 4966d67aabdSBjoern A. Zeeb 4976d67aabdSBjoern A. Zeeb desc = ent->init; 4986d67aabdSBjoern A. Zeeb desc.nss = nss; 4996d67aabdSBjoern A. Zeeb for (j = 0; j < ent->num_of_idx; j++, desc.idx++) { 5006d67aabdSBjoern A. Zeeb v[pos] = rtw89_phy_read_txpwr_byrate(rtwdev, band, bw, 5016d67aabdSBjoern A. Zeeb &desc); 5026d67aabdSBjoern A. Zeeb pos = (pos + 1) % 4; 5036d67aabdSBjoern A. Zeeb if (pos) 5046d67aabdSBjoern A. Zeeb continue; 5056d67aabdSBjoern A. Zeeb 5066d67aabdSBjoern A. Zeeb val = u32_encode_bits(v[0], GENMASK(7, 0)) | 5076d67aabdSBjoern A. Zeeb u32_encode_bits(v[1], GENMASK(15, 8)) | 5086d67aabdSBjoern A. Zeeb u32_encode_bits(v[2], GENMASK(23, 16)) | 5096d67aabdSBjoern A. Zeeb u32_encode_bits(v[3], GENMASK(31, 24)); 5106d67aabdSBjoern A. Zeeb 5116d67aabdSBjoern A. Zeeb rtw89_mac_txpwr_write32(rtwdev, phy_idx, *addr, val); 5126d67aabdSBjoern A. Zeeb *addr += 4; 5136d67aabdSBjoern A. Zeeb } 5146d67aabdSBjoern A. Zeeb } 5156d67aabdSBjoern A. Zeeb } 5166d67aabdSBjoern A. Zeeb 5176d67aabdSBjoern A. Zeeb static void rtw89_phy_set_txpwr_byrate_be(struct rtw89_dev *rtwdev, 5186d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 5196d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx) 5206d67aabdSBjoern A. Zeeb { 5216d67aabdSBjoern A. Zeeb u32 addr = R_BE_PWR_BY_RATE; 5226d67aabdSBjoern A. Zeeb u8 band = chan->band_type; 5236d67aabdSBjoern A. Zeeb u8 bw, nss; 5246d67aabdSBjoern A. Zeeb 5256d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TXPWR, 5266d67aabdSBjoern A. Zeeb "[TXPWR] set txpwr byrate on band %d\n", band); 5276d67aabdSBjoern A. Zeeb 5286d67aabdSBjoern A. Zeeb for (bw = 0; bw <= RTW89_CHANNEL_WIDTH_320; bw++) 5296d67aabdSBjoern A. Zeeb for (nss = 0; nss <= RTW89_NSS_2; nss++) 5306d67aabdSBjoern A. Zeeb __phy_set_txpwr_byrate_be(rtwdev, band, bw, nss, 5316d67aabdSBjoern A. Zeeb &addr, phy_idx); 5326d67aabdSBjoern A. Zeeb } 5336d67aabdSBjoern A. Zeeb 5346d67aabdSBjoern A. Zeeb static void rtw89_phy_set_txpwr_offset_be(struct rtw89_dev *rtwdev, 5356d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 5366d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx) 5376d67aabdSBjoern A. Zeeb { 5386d67aabdSBjoern A. Zeeb struct rtw89_rate_desc desc = { 5396d67aabdSBjoern A. Zeeb .nss = RTW89_NSS_1, 5406d67aabdSBjoern A. Zeeb .rs = RTW89_RS_OFFSET, 5416d67aabdSBjoern A. Zeeb }; 5426d67aabdSBjoern A. Zeeb u8 band = chan->band_type; 5436d67aabdSBjoern A. Zeeb s8 v[RTW89_RATE_OFFSET_NUM_BE] = {}; 5446d67aabdSBjoern A. Zeeb u32 val; 5456d67aabdSBjoern A. Zeeb 5466d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TXPWR, 5476d67aabdSBjoern A. Zeeb "[TXPWR] set txpwr offset on band %d\n", band); 5486d67aabdSBjoern A. Zeeb 5496d67aabdSBjoern A. Zeeb for (desc.idx = 0; desc.idx < RTW89_RATE_OFFSET_NUM_BE; desc.idx++) 5506d67aabdSBjoern A. Zeeb v[desc.idx] = rtw89_phy_read_txpwr_byrate(rtwdev, band, 0, &desc); 5516d67aabdSBjoern A. Zeeb 5526d67aabdSBjoern A. Zeeb val = u32_encode_bits(v[RTW89_RATE_OFFSET_CCK], GENMASK(3, 0)) | 5536d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_OFDM], GENMASK(7, 4)) | 5546d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_HT], GENMASK(11, 8)) | 5556d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_VHT], GENMASK(15, 12)) | 5566d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_HE], GENMASK(19, 16)) | 5576d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_EHT], GENMASK(23, 20)) | 5586d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_DLRU_HE], GENMASK(27, 24)) | 5596d67aabdSBjoern A. Zeeb u32_encode_bits(v[RTW89_RATE_OFFSET_DLRU_EHT], GENMASK(31, 28)); 5606d67aabdSBjoern A. Zeeb 5616d67aabdSBjoern A. Zeeb rtw89_mac_txpwr_write32(rtwdev, phy_idx, R_BE_PWR_RATE_OFST_CTRL, val); 5626d67aabdSBjoern A. Zeeb } 5636d67aabdSBjoern A. Zeeb 5646d67aabdSBjoern A. Zeeb static void 5656d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(struct rtw89_dev *rtwdev, s8 (*ptr)[RTW89_BF_NUM], 5666d67aabdSBjoern A. Zeeb u8 band, u8 bw, u8 ntx, u8 rs, u8 ch) 5676d67aabdSBjoern A. Zeeb { 5686d67aabdSBjoern A. Zeeb int bf; 5696d67aabdSBjoern A. Zeeb 5706d67aabdSBjoern A. Zeeb for (bf = 0; bf < RTW89_BF_NUM; bf++) 5716d67aabdSBjoern A. Zeeb (*ptr)[bf] = rtw89_phy_read_txpwr_limit(rtwdev, band, bw, ntx, 5726d67aabdSBjoern A. Zeeb rs, bf, ch); 5736d67aabdSBjoern A. Zeeb } 5746d67aabdSBjoern A. Zeeb 5756d67aabdSBjoern A. Zeeb static void 5766d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(struct rtw89_dev *rtwdev, s8 (*ptr)[RTW89_BF_NUM], 5776d67aabdSBjoern A. Zeeb u8 band, u8 bw, u8 ntx, u8 rs, u8 ch1, u8 ch2) 5786d67aabdSBjoern A. Zeeb { 5796d67aabdSBjoern A. Zeeb s8 v1[RTW89_BF_NUM]; 5806d67aabdSBjoern A. Zeeb s8 v2[RTW89_BF_NUM]; 5816d67aabdSBjoern A. Zeeb int bf; 5826d67aabdSBjoern A. Zeeb 5836d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &v1, band, bw, ntx, rs, ch1); 5846d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &v2, band, bw, ntx, rs, ch2); 5856d67aabdSBjoern A. Zeeb 5866d67aabdSBjoern A. Zeeb for (bf = 0; bf < RTW89_BF_NUM; bf++) 5876d67aabdSBjoern A. Zeeb (*ptr)[bf] = min(v1[bf], v2[bf]); 5886d67aabdSBjoern A. Zeeb } 5896d67aabdSBjoern A. Zeeb 5906d67aabdSBjoern A. Zeeb static void phy_fill_limit_20m_be(struct rtw89_dev *rtwdev, 5916d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 5926d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 5936d67aabdSBjoern A. Zeeb { 5946d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->cck_20m, band, 5956d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_CCK, ch); 5966d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->cck_40m, band, 5976d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_CCK, ch); 5986d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->ofdm, band, 5996d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_OFDM, ch); 6006d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[0], band, 6016d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch); 6026d67aabdSBjoern A. Zeeb } 6036d67aabdSBjoern A. Zeeb 6046d67aabdSBjoern A. Zeeb static void phy_fill_limit_40m_be(struct rtw89_dev *rtwdev, 6056d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 6066d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch, u8 pri_ch) 6076d67aabdSBjoern A. Zeeb { 6086d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->cck_20m, band, 6096d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_CCK, ch - 2); 6106d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->cck_40m, band, 6116d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_CCK, ch); 6126d67aabdSBjoern A. Zeeb 6136d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->ofdm, band, 6146d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_OFDM, pri_ch); 6156d67aabdSBjoern A. Zeeb 6166d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[0], band, 6176d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 2); 6186d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[1], band, 6196d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 2); 6206d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[0], band, 6216d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch); 6226d67aabdSBjoern A. Zeeb } 6236d67aabdSBjoern A. Zeeb 6246d67aabdSBjoern A. Zeeb static void phy_fill_limit_80m_be(struct rtw89_dev *rtwdev, 6256d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 6266d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch, u8 pri_ch) 6276d67aabdSBjoern A. Zeeb { 6286d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->ofdm, band, 6296d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_OFDM, pri_ch); 6306d67aabdSBjoern A. Zeeb 6316d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[0], band, 6326d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 6); 6336d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[1], band, 6346d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 2); 6356d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[2], band, 6366d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 2); 6376d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[3], band, 6386d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 6); 6396d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[0], band, 6406d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 4); 6416d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[1], band, 6426d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 4); 6436d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[0], band, 6446d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch); 6456d67aabdSBjoern A. Zeeb 6466d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_0p5, band, 6476d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 6486d67aabdSBjoern A. Zeeb ch - 4, ch + 4); 6496d67aabdSBjoern A. Zeeb } 6506d67aabdSBjoern A. Zeeb 6516d67aabdSBjoern A. Zeeb static void phy_fill_limit_160m_be(struct rtw89_dev *rtwdev, 6526d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 6536d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch, u8 pri_ch) 6546d67aabdSBjoern A. Zeeb { 6556d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->ofdm, band, 6566d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_OFDM, pri_ch); 6576d67aabdSBjoern A. Zeeb 6586d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[0], band, 6596d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 14); 6606d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[1], band, 6616d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 10); 6626d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[2], band, 6636d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 6); 6646d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[3], band, 6656d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 2); 6666d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[4], band, 6676d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 2); 6686d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[5], band, 6696d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 6); 6706d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[6], band, 6716d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 10); 6726d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[7], band, 6736d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 14); 6746d67aabdSBjoern A. Zeeb 6756d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[0], band, 6766d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 12); 6776d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[1], band, 6786d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 4); 6796d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[2], band, 6806d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 4); 6816d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[3], band, 6826d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 12); 6836d67aabdSBjoern A. Zeeb 6846d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[0], band, 6856d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch - 8); 6866d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[1], band, 6876d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch + 8); 6886d67aabdSBjoern A. Zeeb 6896d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_160m[0], band, 6906d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_160, ntx, RTW89_RS_MCS, ch); 6916d67aabdSBjoern A. Zeeb 6926d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_0p5, band, 6936d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 6946d67aabdSBjoern A. Zeeb ch - 12, ch - 4); 6956d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_2p5, band, 6966d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 6976d67aabdSBjoern A. Zeeb ch + 4, ch + 12); 6986d67aabdSBjoern A. Zeeb } 6996d67aabdSBjoern A. Zeeb 7006d67aabdSBjoern A. Zeeb static void phy_fill_limit_320m_be(struct rtw89_dev *rtwdev, 7016d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 7026d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch, u8 pri_ch) 7036d67aabdSBjoern A. Zeeb { 7046d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->ofdm, band, 7056d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_OFDM, pri_ch); 7066d67aabdSBjoern A. Zeeb 7076d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[0], band, 7086d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 30); 7096d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[1], band, 7106d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 26); 7116d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[2], band, 7126d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 22); 7136d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[3], band, 7146d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 18); 7156d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[4], band, 7166d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 14); 7176d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[5], band, 7186d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 10); 7196d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[6], band, 7206d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 6); 7216d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[7], band, 7226d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch - 2); 7236d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[8], band, 7246d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 2); 7256d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[9], band, 7266d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 6); 7276d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[10], band, 7286d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 10); 7296d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[11], band, 7306d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 14); 7316d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[12], band, 7326d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 18); 7336d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[13], band, 7346d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 22); 7356d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[14], band, 7366d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 26); 7376d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_20m[15], band, 7386d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_20, ntx, RTW89_RS_MCS, ch + 30); 7396d67aabdSBjoern A. Zeeb 7406d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[0], band, 7416d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 28); 7426d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[1], band, 7436d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 20); 7446d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[2], band, 7456d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 12); 7466d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[3], band, 7476d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch - 4); 7486d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[4], band, 7496d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 4); 7506d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[5], band, 7516d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 12); 7526d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[6], band, 7536d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 20); 7546d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_40m[7], band, 7556d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, ch + 28); 7566d67aabdSBjoern A. Zeeb 7576d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[0], band, 7586d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch - 24); 7596d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[1], band, 7606d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch - 8); 7616d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[2], band, 7626d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch + 8); 7636d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_80m[3], band, 7646d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_80, ntx, RTW89_RS_MCS, ch + 24); 7656d67aabdSBjoern A. Zeeb 7666d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_160m[0], band, 7676d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_160, ntx, RTW89_RS_MCS, ch - 16); 7686d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_160m[1], band, 7696d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_160, ntx, RTW89_RS_MCS, ch + 16); 7706d67aabdSBjoern A. Zeeb 7716d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf(rtwdev, &lmt->mcs_320m, band, 7726d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_320, ntx, RTW89_RS_MCS, ch); 7736d67aabdSBjoern A. Zeeb 7746d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_0p5, band, 7756d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 7766d67aabdSBjoern A. Zeeb ch - 28, ch - 20); 7776d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_2p5, band, 7786d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 7796d67aabdSBjoern A. Zeeb ch - 12, ch - 4); 7806d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_4p5, band, 7816d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 7826d67aabdSBjoern A. Zeeb ch + 4, ch + 12); 7836d67aabdSBjoern A. Zeeb fill_limit_nonbf_bf_min(rtwdev, &lmt->mcs_40m_6p5, band, 7846d67aabdSBjoern A. Zeeb RTW89_CHANNEL_WIDTH_40, ntx, RTW89_RS_MCS, 7856d67aabdSBjoern A. Zeeb ch + 20, ch + 28); 7866d67aabdSBjoern A. Zeeb } 7876d67aabdSBjoern A. Zeeb 7886d67aabdSBjoern A. Zeeb static void rtw89_phy_fill_limit_be(struct rtw89_dev *rtwdev, 7896d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 7906d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be *lmt, 7916d67aabdSBjoern A. Zeeb u8 ntx) 7926d67aabdSBjoern A. Zeeb { 7936d67aabdSBjoern A. Zeeb u8 band = chan->band_type; 7946d67aabdSBjoern A. Zeeb u8 pri_ch = chan->primary_channel; 7956d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 7966d67aabdSBjoern A. Zeeb u8 bw = chan->band_width; 7976d67aabdSBjoern A. Zeeb 7986d67aabdSBjoern A. Zeeb memset(lmt, 0, sizeof(*lmt)); 7996d67aabdSBjoern A. Zeeb 8006d67aabdSBjoern A. Zeeb switch (bw) { 8016d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_20: 8026d67aabdSBjoern A. Zeeb phy_fill_limit_20m_be(rtwdev, lmt, band, ntx, ch); 8036d67aabdSBjoern A. Zeeb break; 8046d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_40: 8056d67aabdSBjoern A. Zeeb phy_fill_limit_40m_be(rtwdev, lmt, band, ntx, ch, pri_ch); 8066d67aabdSBjoern A. Zeeb break; 8076d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_80: 8086d67aabdSBjoern A. Zeeb phy_fill_limit_80m_be(rtwdev, lmt, band, ntx, ch, pri_ch); 8096d67aabdSBjoern A. Zeeb break; 8106d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_160: 8116d67aabdSBjoern A. Zeeb phy_fill_limit_160m_be(rtwdev, lmt, band, ntx, ch, pri_ch); 8126d67aabdSBjoern A. Zeeb break; 8136d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_320: 8146d67aabdSBjoern A. Zeeb phy_fill_limit_320m_be(rtwdev, lmt, band, ntx, ch, pri_ch); 8156d67aabdSBjoern A. Zeeb break; 8166d67aabdSBjoern A. Zeeb } 8176d67aabdSBjoern A. Zeeb } 8186d67aabdSBjoern A. Zeeb 8196d67aabdSBjoern A. Zeeb static void rtw89_phy_set_txpwr_limit_be(struct rtw89_dev *rtwdev, 8206d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 8216d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx) 8226d67aabdSBjoern A. Zeeb { 8236d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_be lmt; 8246d67aabdSBjoern A. Zeeb const s8 *ptr; 8256d67aabdSBjoern A. Zeeb u32 addr, val; 8266d67aabdSBjoern A. Zeeb u8 i, j; 8276d67aabdSBjoern A. Zeeb 8286d67aabdSBjoern A. Zeeb BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit_be) != 8296d67aabdSBjoern A. Zeeb RTW89_TXPWR_LMT_PAGE_SIZE_BE); 8306d67aabdSBjoern A. Zeeb 8316d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TXPWR, 8326d67aabdSBjoern A. Zeeb "[TXPWR] set txpwr limit on band %d bw %d\n", 8336d67aabdSBjoern A. Zeeb chan->band_type, chan->band_width); 8346d67aabdSBjoern A. Zeeb 8356d67aabdSBjoern A. Zeeb addr = R_BE_PWR_LMT; 8366d67aabdSBjoern A. Zeeb for (i = 0; i <= RTW89_NSS_2; i++) { 8376d67aabdSBjoern A. Zeeb rtw89_phy_fill_limit_be(rtwdev, chan, &lmt, i); 8386d67aabdSBjoern A. Zeeb 8396d67aabdSBjoern A. Zeeb ptr = (s8 *)&lmt; 8406d67aabdSBjoern A. Zeeb for (j = 0; j < RTW89_TXPWR_LMT_PAGE_SIZE_BE; 8416d67aabdSBjoern A. Zeeb j += 4, addr += 4, ptr += 4) { 8426d67aabdSBjoern A. Zeeb val = u32_encode_bits(ptr[0], GENMASK(7, 0)) | 8436d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[1], GENMASK(15, 8)) | 8446d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[2], GENMASK(23, 16)) | 8456d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[3], GENMASK(31, 24)); 8466d67aabdSBjoern A. Zeeb 8476d67aabdSBjoern A. Zeeb rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); 8486d67aabdSBjoern A. Zeeb } 8496d67aabdSBjoern A. Zeeb } 8506d67aabdSBjoern A. Zeeb } 8516d67aabdSBjoern A. Zeeb 8526d67aabdSBjoern A. Zeeb static void fill_limit_ru_each(struct rtw89_dev *rtwdev, u8 index, 8536d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 8546d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 8556d67aabdSBjoern A. Zeeb { 8566d67aabdSBjoern A. Zeeb lmt_ru->ru26[index] = 8576d67aabdSBjoern A. Zeeb rtw89_phy_read_txpwr_limit_ru(rtwdev, band, RTW89_RU26, ntx, ch); 8586d67aabdSBjoern A. Zeeb lmt_ru->ru52[index] = 8596d67aabdSBjoern A. Zeeb rtw89_phy_read_txpwr_limit_ru(rtwdev, band, RTW89_RU52, ntx, ch); 8606d67aabdSBjoern A. Zeeb lmt_ru->ru106[index] = 8616d67aabdSBjoern A. Zeeb rtw89_phy_read_txpwr_limit_ru(rtwdev, band, RTW89_RU106, ntx, ch); 8626d67aabdSBjoern A. Zeeb lmt_ru->ru52_26[index] = 8636d67aabdSBjoern A. Zeeb rtw89_phy_read_txpwr_limit_ru(rtwdev, band, RTW89_RU52_26, ntx, ch); 8646d67aabdSBjoern A. Zeeb lmt_ru->ru106_26[index] = 8656d67aabdSBjoern A. Zeeb rtw89_phy_read_txpwr_limit_ru(rtwdev, band, RTW89_RU106_26, ntx, ch); 8666d67aabdSBjoern A. Zeeb } 8676d67aabdSBjoern A. Zeeb 8686d67aabdSBjoern A. Zeeb static void phy_fill_limit_ru_20m_be(struct rtw89_dev *rtwdev, 8696d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 8706d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 8716d67aabdSBjoern A. Zeeb { 8726d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 0, lmt_ru, band, ntx, ch); 8736d67aabdSBjoern A. Zeeb } 8746d67aabdSBjoern A. Zeeb 8756d67aabdSBjoern A. Zeeb static void phy_fill_limit_ru_40m_be(struct rtw89_dev *rtwdev, 8766d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 8776d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 8786d67aabdSBjoern A. Zeeb { 8796d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 0, lmt_ru, band, ntx, ch - 2); 8806d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 1, lmt_ru, band, ntx, ch + 2); 8816d67aabdSBjoern A. Zeeb } 8826d67aabdSBjoern A. Zeeb 8836d67aabdSBjoern A. Zeeb static void phy_fill_limit_ru_80m_be(struct rtw89_dev *rtwdev, 8846d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 8856d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 8866d67aabdSBjoern A. Zeeb { 8876d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 0, lmt_ru, band, ntx, ch - 6); 8886d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 1, lmt_ru, band, ntx, ch - 2); 8896d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 2, lmt_ru, band, ntx, ch + 2); 8906d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 3, lmt_ru, band, ntx, ch + 6); 8916d67aabdSBjoern A. Zeeb } 8926d67aabdSBjoern A. Zeeb 8936d67aabdSBjoern A. Zeeb static void phy_fill_limit_ru_160m_be(struct rtw89_dev *rtwdev, 8946d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 8956d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 8966d67aabdSBjoern A. Zeeb { 8976d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 0, lmt_ru, band, ntx, ch - 14); 8986d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 1, lmt_ru, band, ntx, ch - 10); 8996d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 2, lmt_ru, band, ntx, ch - 6); 9006d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 3, lmt_ru, band, ntx, ch - 2); 9016d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 4, lmt_ru, band, ntx, ch + 2); 9026d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 5, lmt_ru, band, ntx, ch + 6); 9036d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 6, lmt_ru, band, ntx, ch + 10); 9046d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 7, lmt_ru, band, ntx, ch + 14); 9056d67aabdSBjoern A. Zeeb } 9066d67aabdSBjoern A. Zeeb 9076d67aabdSBjoern A. Zeeb static void phy_fill_limit_ru_320m_be(struct rtw89_dev *rtwdev, 9086d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 9096d67aabdSBjoern A. Zeeb u8 band, u8 ntx, u8 ch) 9106d67aabdSBjoern A. Zeeb { 9116d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 0, lmt_ru, band, ntx, ch - 30); 9126d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 1, lmt_ru, band, ntx, ch - 26); 9136d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 2, lmt_ru, band, ntx, ch - 22); 9146d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 3, lmt_ru, band, ntx, ch - 18); 9156d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 4, lmt_ru, band, ntx, ch - 14); 9166d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 5, lmt_ru, band, ntx, ch - 10); 9176d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 6, lmt_ru, band, ntx, ch - 6); 9186d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 7, lmt_ru, band, ntx, ch - 2); 9196d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 8, lmt_ru, band, ntx, ch + 2); 9206d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 9, lmt_ru, band, ntx, ch + 6); 9216d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 10, lmt_ru, band, ntx, ch + 10); 9226d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 11, lmt_ru, band, ntx, ch + 14); 9236d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 12, lmt_ru, band, ntx, ch + 18); 9246d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 13, lmt_ru, band, ntx, ch + 22); 9256d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 14, lmt_ru, band, ntx, ch + 26); 9266d67aabdSBjoern A. Zeeb fill_limit_ru_each(rtwdev, 15, lmt_ru, band, ntx, ch + 30); 9276d67aabdSBjoern A. Zeeb } 9286d67aabdSBjoern A. Zeeb 9296d67aabdSBjoern A. Zeeb static void rtw89_phy_fill_limit_ru_be(struct rtw89_dev *rtwdev, 9306d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 9316d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be *lmt_ru, 9326d67aabdSBjoern A. Zeeb u8 ntx) 9336d67aabdSBjoern A. Zeeb { 9346d67aabdSBjoern A. Zeeb u8 band = chan->band_type; 9356d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 9366d67aabdSBjoern A. Zeeb u8 bw = chan->band_width; 9376d67aabdSBjoern A. Zeeb 9386d67aabdSBjoern A. Zeeb memset(lmt_ru, 0, sizeof(*lmt_ru)); 9396d67aabdSBjoern A. Zeeb 9406d67aabdSBjoern A. Zeeb switch (bw) { 9416d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_20: 9426d67aabdSBjoern A. Zeeb phy_fill_limit_ru_20m_be(rtwdev, lmt_ru, band, ntx, ch); 9436d67aabdSBjoern A. Zeeb break; 9446d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_40: 9456d67aabdSBjoern A. Zeeb phy_fill_limit_ru_40m_be(rtwdev, lmt_ru, band, ntx, ch); 9466d67aabdSBjoern A. Zeeb break; 9476d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_80: 9486d67aabdSBjoern A. Zeeb phy_fill_limit_ru_80m_be(rtwdev, lmt_ru, band, ntx, ch); 9496d67aabdSBjoern A. Zeeb break; 9506d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_160: 9516d67aabdSBjoern A. Zeeb phy_fill_limit_ru_160m_be(rtwdev, lmt_ru, band, ntx, ch); 9526d67aabdSBjoern A. Zeeb break; 9536d67aabdSBjoern A. Zeeb case RTW89_CHANNEL_WIDTH_320: 9546d67aabdSBjoern A. Zeeb phy_fill_limit_ru_320m_be(rtwdev, lmt_ru, band, ntx, ch); 9556d67aabdSBjoern A. Zeeb break; 9566d67aabdSBjoern A. Zeeb } 9576d67aabdSBjoern A. Zeeb } 9586d67aabdSBjoern A. Zeeb 9596d67aabdSBjoern A. Zeeb static void rtw89_phy_set_txpwr_limit_ru_be(struct rtw89_dev *rtwdev, 9606d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan, 9616d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx) 9626d67aabdSBjoern A. Zeeb { 9636d67aabdSBjoern A. Zeeb struct rtw89_txpwr_limit_ru_be lmt_ru; 9646d67aabdSBjoern A. Zeeb const s8 *ptr; 9656d67aabdSBjoern A. Zeeb u32 addr, val; 9666d67aabdSBjoern A. Zeeb u8 i, j; 9676d67aabdSBjoern A. Zeeb 9686d67aabdSBjoern A. Zeeb BUILD_BUG_ON(sizeof(struct rtw89_txpwr_limit_ru_be) != 9696d67aabdSBjoern A. Zeeb RTW89_TXPWR_LMT_RU_PAGE_SIZE_BE); 9706d67aabdSBjoern A. Zeeb 9716d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TXPWR, 9726d67aabdSBjoern A. Zeeb "[TXPWR] set txpwr limit ru on band %d bw %d\n", 9736d67aabdSBjoern A. Zeeb chan->band_type, chan->band_width); 9746d67aabdSBjoern A. Zeeb 9756d67aabdSBjoern A. Zeeb addr = R_BE_PWR_RU_LMT; 9766d67aabdSBjoern A. Zeeb for (i = 0; i <= RTW89_NSS_2; i++) { 9776d67aabdSBjoern A. Zeeb rtw89_phy_fill_limit_ru_be(rtwdev, chan, &lmt_ru, i); 9786d67aabdSBjoern A. Zeeb 9796d67aabdSBjoern A. Zeeb ptr = (s8 *)&lmt_ru; 9806d67aabdSBjoern A. Zeeb for (j = 0; j < RTW89_TXPWR_LMT_RU_PAGE_SIZE_BE; 9816d67aabdSBjoern A. Zeeb j += 4, addr += 4, ptr += 4) { 9826d67aabdSBjoern A. Zeeb val = u32_encode_bits(ptr[0], GENMASK(7, 0)) | 9836d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[1], GENMASK(15, 8)) | 9846d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[2], GENMASK(23, 16)) | 9856d67aabdSBjoern A. Zeeb u32_encode_bits(ptr[3], GENMASK(31, 24)); 9866d67aabdSBjoern A. Zeeb 9876d67aabdSBjoern A. Zeeb rtw89_mac_txpwr_write32(rtwdev, phy_idx, addr, val); 9886d67aabdSBjoern A. Zeeb } 9896d67aabdSBjoern A. Zeeb } 9906d67aabdSBjoern A. Zeeb } 9916d67aabdSBjoern A. Zeeb 9926d67aabdSBjoern A. Zeeb const struct rtw89_phy_gen_def rtw89_phy_gen_be = { 9936d67aabdSBjoern A. Zeeb .cr_base = 0x20000, 9946d67aabdSBjoern A. Zeeb .ccx = &rtw89_ccx_regs_be, 9956d67aabdSBjoern A. Zeeb .physts = &rtw89_physts_regs_be, 9966d67aabdSBjoern A. Zeeb .cfo = &rtw89_cfo_regs_be, 9976d67aabdSBjoern A. Zeeb .phy0_phy1_offset = rtw89_phy0_phy1_offset_be, 9986d67aabdSBjoern A. Zeeb .config_bb_gain = rtw89_phy_config_bb_gain_be, 9996d67aabdSBjoern A. Zeeb .preinit_rf_nctl = rtw89_phy_preinit_rf_nctl_be, 10006d67aabdSBjoern A. Zeeb .bb_wrap_init = rtw89_phy_bb_wrap_init_be, 10016d67aabdSBjoern A. Zeeb .ch_info_init = rtw89_phy_ch_info_init_be, 10026d67aabdSBjoern A. Zeeb 10036d67aabdSBjoern A. Zeeb .set_txpwr_byrate = rtw89_phy_set_txpwr_byrate_be, 10046d67aabdSBjoern A. Zeeb .set_txpwr_offset = rtw89_phy_set_txpwr_offset_be, 10056d67aabdSBjoern A. Zeeb .set_txpwr_limit = rtw89_phy_set_txpwr_limit_be, 10066d67aabdSBjoern A. Zeeb .set_txpwr_limit_ru = rtw89_phy_set_txpwr_limit_ru_be, 10076d67aabdSBjoern A. Zeeb }; 10086d67aabdSBjoern A. Zeeb EXPORT_SYMBOL(rtw89_phy_gen_be); 1009