1*6d67aabdSBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2*6d67aabdSBjoern A. Zeeb /* Copyright(c) 2024 Realtek Corporation 3*6d67aabdSBjoern A. Zeeb */ 4*6d67aabdSBjoern A. Zeeb 5*6d67aabdSBjoern A. Zeeb #include "coex.h" 6*6d67aabdSBjoern A. Zeeb #include "debug.h" 7*6d67aabdSBjoern A. Zeeb #include "fw.h" 8*6d67aabdSBjoern A. Zeeb #include "mac.h" 9*6d67aabdSBjoern A. Zeeb #include "phy.h" 10*6d67aabdSBjoern A. Zeeb #include "reg.h" 11*6d67aabdSBjoern A. Zeeb #include "rtw8852bt.h" 12*6d67aabdSBjoern A. Zeeb #include "rtw8852bt_rfk.h" 13*6d67aabdSBjoern A. Zeeb #include "rtw8852bt_rfk_table.h" 14*6d67aabdSBjoern A. Zeeb #include "rtw8852b_common.h" 15*6d67aabdSBjoern A. Zeeb 16*6d67aabdSBjoern A. Zeeb #define RTW8852BT_RXDCK_VER 0x1 17*6d67aabdSBjoern A. Zeeb #define RTW8852BT_IQK_VER 0x2a 18*6d67aabdSBjoern A. Zeeb #define RTW8852BT_SS 2 19*6d67aabdSBjoern A. Zeeb #define RTW8852BT_TSSI_PATH_NR 2 20*6d67aabdSBjoern A. Zeeb #define RTW8852BT_DPK_VER 0x06 21*6d67aabdSBjoern A. Zeeb #define DPK_RF_PATH_MAX_8852BT 2 22*6d67aabdSBjoern A. Zeeb 23*6d67aabdSBjoern A. Zeeb #define _TSSI_DE_MASK GENMASK(21, 12) 24*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_LOWER 0x2e 25*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_UPPER 0x3f 26*6d67aabdSBjoern A. Zeeb #define DPK_TXAGC_INVAL 0xff 27*6d67aabdSBjoern A. Zeeb #define RFREG_MASKRXBB 0x003e0 28*6d67aabdSBjoern A. Zeeb #define RFREG_MASKMODE 0xf0000 29*6d67aabdSBjoern A. Zeeb 30*6d67aabdSBjoern A. Zeeb enum rf_mode { 31*6d67aabdSBjoern A. Zeeb RF_SHUT_DOWN = 0x0, 32*6d67aabdSBjoern A. Zeeb RF_STANDBY = 0x1, 33*6d67aabdSBjoern A. Zeeb RF_TX = 0x2, 34*6d67aabdSBjoern A. Zeeb RF_RX = 0x3, 35*6d67aabdSBjoern A. Zeeb RF_TXIQK = 0x4, 36*6d67aabdSBjoern A. Zeeb RF_DPK = 0x5, 37*6d67aabdSBjoern A. Zeeb RF_RXK1 = 0x6, 38*6d67aabdSBjoern A. Zeeb RF_RXK2 = 0x7, 39*6d67aabdSBjoern A. Zeeb }; 40*6d67aabdSBjoern A. Zeeb 41*6d67aabdSBjoern A. Zeeb enum rtw8852bt_dpk_id { 42*6d67aabdSBjoern A. Zeeb LBK_RXIQK = 0x06, 43*6d67aabdSBjoern A. Zeeb SYNC = 0x10, 44*6d67aabdSBjoern A. Zeeb MDPK_IDL = 0x11, 45*6d67aabdSBjoern A. Zeeb MDPK_MPA = 0x12, 46*6d67aabdSBjoern A. Zeeb GAIN_LOSS = 0x13, 47*6d67aabdSBjoern A. Zeeb GAIN_CAL = 0x14, 48*6d67aabdSBjoern A. Zeeb DPK_RXAGC = 0x15, 49*6d67aabdSBjoern A. Zeeb KIP_PRESET = 0x16, 50*6d67aabdSBjoern A. Zeeb KIP_RESTORE = 0x17, 51*6d67aabdSBjoern A. Zeeb DPK_TXAGC = 0x19, 52*6d67aabdSBjoern A. Zeeb D_KIP_PRESET = 0x28, 53*6d67aabdSBjoern A. Zeeb D_TXAGC = 0x29, 54*6d67aabdSBjoern A. Zeeb D_RXAGC = 0x2a, 55*6d67aabdSBjoern A. Zeeb D_SYNC = 0x2b, 56*6d67aabdSBjoern A. Zeeb D_GAIN_LOSS = 0x2c, 57*6d67aabdSBjoern A. Zeeb D_MDPK_IDL = 0x2d, 58*6d67aabdSBjoern A. Zeeb D_GAIN_NORM = 0x2f, 59*6d67aabdSBjoern A. Zeeb D_KIP_THERMAL = 0x30, 60*6d67aabdSBjoern A. Zeeb D_KIP_RESTORE = 0x31 61*6d67aabdSBjoern A. Zeeb }; 62*6d67aabdSBjoern A. Zeeb 63*6d67aabdSBjoern A. Zeeb enum dpk_agc_step { 64*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_SYNC_DGAIN, 65*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_GAIN_ADJ, 66*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_GAIN_LOSS_IDX, 67*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_GL_GT_CRITERION, 68*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_GL_LT_CRITERION, 69*6d67aabdSBjoern A. Zeeb DPK_AGC_STEP_SET_TX_GAIN, 70*6d67aabdSBjoern A. Zeeb }; 71*6d67aabdSBjoern A. Zeeb 72*6d67aabdSBjoern A. Zeeb enum rtw8852bt_iqk_type { 73*6d67aabdSBjoern A. Zeeb ID_TXAGC = 0x0, 74*6d67aabdSBjoern A. Zeeb ID_FLOK_COARSE = 0x1, 75*6d67aabdSBjoern A. Zeeb ID_FLOK_FINE = 0x2, 76*6d67aabdSBjoern A. Zeeb ID_TXK = 0x3, 77*6d67aabdSBjoern A. Zeeb ID_RXAGC = 0x4, 78*6d67aabdSBjoern A. Zeeb ID_RXK = 0x5, 79*6d67aabdSBjoern A. Zeeb ID_NBTXK = 0x6, 80*6d67aabdSBjoern A. Zeeb ID_NBRXK = 0x7, 81*6d67aabdSBjoern A. Zeeb ID_FLOK_VBUFFER = 0x8, 82*6d67aabdSBjoern A. Zeeb ID_A_FLOK_COARSE = 0x9, 83*6d67aabdSBjoern A. Zeeb ID_G_FLOK_COARSE = 0xa, 84*6d67aabdSBjoern A. Zeeb ID_A_FLOK_FINE = 0xb, 85*6d67aabdSBjoern A. Zeeb ID_G_FLOK_FINE = 0xc, 86*6d67aabdSBjoern A. Zeeb ID_IQK_RESTORE = 0x10, 87*6d67aabdSBjoern A. Zeeb }; 88*6d67aabdSBjoern A. Zeeb 89*6d67aabdSBjoern A. Zeeb enum adc_ck { 90*6d67aabdSBjoern A. Zeeb ADC_NA = 0, 91*6d67aabdSBjoern A. Zeeb ADC_480M = 1, 92*6d67aabdSBjoern A. Zeeb ADC_960M = 2, 93*6d67aabdSBjoern A. Zeeb ADC_1920M = 3, 94*6d67aabdSBjoern A. Zeeb }; 95*6d67aabdSBjoern A. Zeeb 96*6d67aabdSBjoern A. Zeeb enum dac_ck { 97*6d67aabdSBjoern A. Zeeb DAC_40M = 0, 98*6d67aabdSBjoern A. Zeeb DAC_80M = 1, 99*6d67aabdSBjoern A. Zeeb DAC_120M = 2, 100*6d67aabdSBjoern A. Zeeb DAC_160M = 3, 101*6d67aabdSBjoern A. Zeeb DAC_240M = 4, 102*6d67aabdSBjoern A. Zeeb DAC_320M = 5, 103*6d67aabdSBjoern A. Zeeb DAC_480M = 6, 104*6d67aabdSBjoern A. Zeeb DAC_960M = 7, 105*6d67aabdSBjoern A. Zeeb }; 106*6d67aabdSBjoern A. Zeeb 107*6d67aabdSBjoern A. Zeeb static const u32 _tssi_trigger[RTW8852BT_TSSI_PATH_NR] = {0x5820, 0x7820}; 108*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_rpt_addr[RTW8852BT_TSSI_PATH_NR] = {0x1c18, 0x3c18}; 109*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_default_addr[RTW8852BT_TSSI_PATH_NR][4] = { 110*6d67aabdSBjoern A. Zeeb {0x5634, 0x5630, 0x5630, 0x5630}, 111*6d67aabdSBjoern A. Zeeb {0x7634, 0x7630, 0x7630, 0x7630} }; 112*6d67aabdSBjoern A. Zeeb static const u32 _tssi_cw_default_mask[4] = { 113*6d67aabdSBjoern A. Zeeb 0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff}; 114*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_cck_long[RF_PATH_NUM_8852BT] = {0x5858, 0x7858}; 115*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_cck_short[RF_PATH_NUM_8852BT] = {0x5860, 0x7860}; 116*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852BT] = {0x5838, 0x7838}; 117*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852BT] = {0x5840, 0x7840}; 118*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852BT] = {0x5848, 0x7848}; 119*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852BT] = {0x5850, 0x7850}; 120*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852BT] = {0x5828, 0x7828}; 121*6d67aabdSBjoern A. Zeeb static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852BT] = {0x5830, 0x7830}; 122*6d67aabdSBjoern A. Zeeb 123*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_bb_regs[] = {0x2344, 0x5800, 0x7800, 0x0704}; 124*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_rf_regs[] = { 125*6d67aabdSBjoern A. Zeeb 0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x5, 0x10005}; 126*6d67aabdSBjoern A. Zeeb static const u32 rtw8852bt_backup_kip_regs[] = { 127*6d67aabdSBjoern A. Zeeb 0x813c, 0x8124, 0x8120, 0xc0d4, 0xc0d8, 0xc0c4, 0xc0ec, 128*6d67aabdSBjoern A. Zeeb 0x823c, 0x8224, 0x8220, 0xc1d4, 0xc1d8, 0xc1c4, 0xc1ec}; 129*6d67aabdSBjoern A. Zeeb 130*6d67aabdSBjoern A. Zeeb #define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852bt_backup_bb_regs) 131*6d67aabdSBjoern A. Zeeb #define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852bt_backup_rf_regs) 132*6d67aabdSBjoern A. Zeeb #define BACKUP_KIP_REGS_NR ARRAY_SIZE(rtw8852bt_backup_kip_regs) 133*6d67aabdSBjoern A. Zeeb 134*6d67aabdSBjoern A. Zeeb static void _rfk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path) 135*6d67aabdSBjoern A. Zeeb { 136*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 137*6d67aabdSBjoern A. Zeeb 138*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); 139*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0); 140*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); 141*6d67aabdSBjoern A. Zeeb 142*6d67aabdSBjoern A. Zeeb udelay(200); 143*6d67aabdSBjoern A. Zeeb 144*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL); 145*6d67aabdSBjoern A. Zeeb 146*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n", 147*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].ther_dpk); 148*6d67aabdSBjoern A. Zeeb } 149*6d67aabdSBjoern A. Zeeb 150*6d67aabdSBjoern A. Zeeb static void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) 151*6d67aabdSBjoern A. Zeeb { 152*6d67aabdSBjoern A. Zeeb u32 i; 153*6d67aabdSBjoern A. Zeeb 154*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 155*6d67aabdSBjoern A. Zeeb backup_bb_reg_val[i] = 156*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, rtw8852bt_backup_bb_regs[i], MASKDWORD); 157*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 158*6d67aabdSBjoern A. Zeeb "[RFK]backup bb reg : %x, value =%x\n", 159*6d67aabdSBjoern A. Zeeb rtw8852bt_backup_bb_regs[i], backup_bb_reg_val[i]); 160*6d67aabdSBjoern A. Zeeb } 161*6d67aabdSBjoern A. Zeeb } 162*6d67aabdSBjoern A. Zeeb 163*6d67aabdSBjoern A. Zeeb static void _rfk_backup_kip_reg(struct rtw89_dev *rtwdev, u32 backup_kip_reg_val[]) 164*6d67aabdSBjoern A. Zeeb { 165*6d67aabdSBjoern A. Zeeb u32 i; 166*6d67aabdSBjoern A. Zeeb 167*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_KIP_REGS_NR; i++) { 168*6d67aabdSBjoern A. Zeeb backup_kip_reg_val[i] = 169*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, rtw8852bt_backup_kip_regs[i], 170*6d67aabdSBjoern A. Zeeb MASKDWORD); 171*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", 172*6d67aabdSBjoern A. Zeeb rtw8852bt_backup_kip_regs[i], backup_kip_reg_val[i]); 173*6d67aabdSBjoern A. Zeeb } 174*6d67aabdSBjoern A. Zeeb } 175*6d67aabdSBjoern A. Zeeb 176*6d67aabdSBjoern A. Zeeb static 177*6d67aabdSBjoern A. Zeeb void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], u8 rf_path) 178*6d67aabdSBjoern A. Zeeb { 179*6d67aabdSBjoern A. Zeeb u32 i; 180*6d67aabdSBjoern A. Zeeb 181*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 182*6d67aabdSBjoern A. Zeeb backup_rf_reg_val[i] = 183*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, rf_path, rtw8852bt_backup_rf_regs[i], 184*6d67aabdSBjoern A. Zeeb RFREG_MASK); 185*6d67aabdSBjoern A. Zeeb 186*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup RF S%d 0x%x = %x\n", 187*6d67aabdSBjoern A. Zeeb rf_path, rtw8852bt_backup_rf_regs[i], backup_rf_reg_val[i]); 188*6d67aabdSBjoern A. Zeeb } 189*6d67aabdSBjoern A. Zeeb } 190*6d67aabdSBjoern A. Zeeb 191*6d67aabdSBjoern A. Zeeb static void _rfk_reload_bb_reg(struct rtw89_dev *rtwdev, const u32 backup_bb_reg_val[]) 192*6d67aabdSBjoern A. Zeeb { 193*6d67aabdSBjoern A. Zeeb u32 i; 194*6d67aabdSBjoern A. Zeeb 195*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 196*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, rtw8852bt_backup_bb_regs[i], 197*6d67aabdSBjoern A. Zeeb MASKDWORD, backup_bb_reg_val[i]); 198*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 199*6d67aabdSBjoern A. Zeeb "[RFK]restore bb reg : %x, value =%x\n", 200*6d67aabdSBjoern A. Zeeb rtw8852bt_backup_bb_regs[i], backup_bb_reg_val[i]); 201*6d67aabdSBjoern A. Zeeb } 202*6d67aabdSBjoern A. Zeeb } 203*6d67aabdSBjoern A. Zeeb 204*6d67aabdSBjoern A. Zeeb static void _rfk_reload_kip_reg(struct rtw89_dev *rtwdev, u32 backup_kip_reg_val[]) 205*6d67aabdSBjoern A. Zeeb { 206*6d67aabdSBjoern A. Zeeb u32 i; 207*6d67aabdSBjoern A. Zeeb 208*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_KIP_REGS_NR; i++) { 209*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, rtw8852bt_backup_kip_regs[i], 210*6d67aabdSBjoern A. Zeeb MASKDWORD, backup_kip_reg_val[i]); 211*6d67aabdSBjoern A. Zeeb 212*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 213*6d67aabdSBjoern A. Zeeb "[RFK]restore kip reg : %x, value =%x\n", 214*6d67aabdSBjoern A. Zeeb rtw8852bt_backup_kip_regs[i], backup_kip_reg_val[i]); 215*6d67aabdSBjoern A. Zeeb } 216*6d67aabdSBjoern A. Zeeb } 217*6d67aabdSBjoern A. Zeeb 218*6d67aabdSBjoern A. Zeeb static void _rfk_reload_rf_reg(struct rtw89_dev *rtwdev, 219*6d67aabdSBjoern A. Zeeb const u32 backup_rf_reg_val[], u8 rf_path) 220*6d67aabdSBjoern A. Zeeb { 221*6d67aabdSBjoern A. Zeeb u32 i; 222*6d67aabdSBjoern A. Zeeb 223*6d67aabdSBjoern A. Zeeb for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 224*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, rf_path, rtw8852bt_backup_rf_regs[i], 225*6d67aabdSBjoern A. Zeeb RFREG_MASK, backup_rf_reg_val[i]); 226*6d67aabdSBjoern A. Zeeb 227*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 228*6d67aabdSBjoern A. Zeeb "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path, 229*6d67aabdSBjoern A. Zeeb rtw8852bt_backup_rf_regs[i], backup_rf_reg_val[i]); 230*6d67aabdSBjoern A. Zeeb } 231*6d67aabdSBjoern A. Zeeb } 232*6d67aabdSBjoern A. Zeeb 233*6d67aabdSBjoern A. Zeeb static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 234*6d67aabdSBjoern A. Zeeb { 235*6d67aabdSBjoern A. Zeeb u8 val; 236*6d67aabdSBjoern A. Zeeb 237*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n", 238*6d67aabdSBjoern A. Zeeb rtwdev->dbcc_en, phy_idx); 239*6d67aabdSBjoern A. Zeeb 240*6d67aabdSBjoern A. Zeeb if (!rtwdev->dbcc_en) { 241*6d67aabdSBjoern A. Zeeb val = RF_AB; 242*6d67aabdSBjoern A. Zeeb } else { 243*6d67aabdSBjoern A. Zeeb if (phy_idx == RTW89_PHY_0) 244*6d67aabdSBjoern A. Zeeb val = RF_A; 245*6d67aabdSBjoern A. Zeeb else 246*6d67aabdSBjoern A. Zeeb val = RF_B; 247*6d67aabdSBjoern A. Zeeb } 248*6d67aabdSBjoern A. Zeeb return val; 249*6d67aabdSBjoern A. Zeeb } 250*6d67aabdSBjoern A. Zeeb 251*6d67aabdSBjoern A. Zeeb static 252*6d67aabdSBjoern A. Zeeb void _txck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool force, 253*6d67aabdSBjoern A. Zeeb enum dac_ck ck) 254*6d67aabdSBjoern A. Zeeb { 255*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x0); 256*6d67aabdSBjoern A. Zeeb 257*6d67aabdSBjoern A. Zeeb if (!force) 258*6d67aabdSBjoern A. Zeeb return; 259*6d67aabdSBjoern A. Zeeb 260*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_VAL, ck); 261*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x1); 262*6d67aabdSBjoern A. Zeeb } 263*6d67aabdSBjoern A. Zeeb 264*6d67aabdSBjoern A. Zeeb static 265*6d67aabdSBjoern A. Zeeb void _rxck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool force, 266*6d67aabdSBjoern A. Zeeb enum adc_ck ck) 267*6d67aabdSBjoern A. Zeeb { 268*6d67aabdSBjoern A. Zeeb u32 bw = 0; 269*6d67aabdSBjoern A. Zeeb 270*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x0); 271*6d67aabdSBjoern A. Zeeb 272*6d67aabdSBjoern A. Zeeb if (!force) 273*6d67aabdSBjoern A. Zeeb return; 274*6d67aabdSBjoern A. Zeeb 275*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_VAL, ck); 276*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x1); 277*6d67aabdSBjoern A. Zeeb 278*6d67aabdSBjoern A. Zeeb switch (ck) { 279*6d67aabdSBjoern A. Zeeb case ADC_480M: 280*6d67aabdSBjoern A. Zeeb bw = RTW89_CHANNEL_WIDTH_40; 281*6d67aabdSBjoern A. Zeeb break; 282*6d67aabdSBjoern A. Zeeb case ADC_960M: 283*6d67aabdSBjoern A. Zeeb bw = RTW89_CHANNEL_WIDTH_80; 284*6d67aabdSBjoern A. Zeeb break; 285*6d67aabdSBjoern A. Zeeb case ADC_1920M: 286*6d67aabdSBjoern A. Zeeb bw = RTW89_CHANNEL_WIDTH_160; 287*6d67aabdSBjoern A. Zeeb break; 288*6d67aabdSBjoern A. Zeeb default: 289*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s==>Invalid ck", __func__); 290*6d67aabdSBjoern A. Zeeb break; 291*6d67aabdSBjoern A. Zeeb } 292*6d67aabdSBjoern A. Zeeb 293*6d67aabdSBjoern A. Zeeb rtw8852bx_adc_cfg(rtwdev, bw, path); 294*6d67aabdSBjoern A. Zeeb } 295*6d67aabdSBjoern A. Zeeb 296*6d67aabdSBjoern A. Zeeb static void _rfk_bb_afe_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 297*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kpath) 298*6d67aabdSBjoern A. Zeeb { 299*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0303); 300*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x1); 301*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x1); 302*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x3); 303*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x3); 304*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x1ffffff); 305*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x1); 306*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x1); 307*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x3ff); 308*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_CLKEN, 0x3); 309*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST, B_IQK_DPK_RST, 0x1); 310*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_PATH_RST, B_P0_PATH_RST, 0x1); 311*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_PATH_RST, B_P1_PATH_RST, 0x1); 312*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1); 313*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1); 314*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCFO_WEIGHT, B_DAC_CLK_IDX, 0x1); 315*6d67aabdSBjoern A. Zeeb 316*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_A, true, DAC_960M); 317*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_B, true, DAC_960M); 318*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, true, ADC_1920M); 319*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, true, ADC_1920M); 320*6d67aabdSBjoern A. Zeeb 321*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 322*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x5); 323*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 324*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 325*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x1f); 326*6d67aabdSBjoern A. Zeeb udelay(1); 327*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x13); 328*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0001); 329*6d67aabdSBjoern A. Zeeb udelay(1); 330*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0041); 331*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_RSTB, 0x1); 332*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x3333); 333*6d67aabdSBjoern A. Zeeb 334*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H, B_TXPWRB_RDY, 0x1); 335*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_EN, MASKLWORD, 0x0000); 336*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_FORCE, B_P1_TXPW_RDY, 0x1); 337*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TXAGC_TH, MASKLWORD, 0x0000); 338*6d67aabdSBjoern A. Zeeb } 339*6d67aabdSBjoern A. Zeeb 340*6d67aabdSBjoern A. Zeeb static void _rfk_bb_afe_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 341*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kpath) 342*6d67aabdSBjoern A. Zeeb { 343*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0303); 344*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 345*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 346*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x0); 347*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x0); 348*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x0); 349*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x0); 350*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x0); 351*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x63); 352*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_TXCK_ALL, 0x00); 353*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_TXCK_ALL, 0x00); 354*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 355*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x0); 356*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, MASKHWORD, 0x0000); 357*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x0); 358*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x0); 359*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0); 360*6d67aabdSBjoern A. Zeeb 361*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H, B_TXPWRB_RDY, 0x0); 362*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TXPW_RSTB, 0x1); 363*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TXPW_RSTB, 0x2); 364*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TXPW_FORCE, B_P1_TXPW_RDY, 0x0); 365*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TXPW_RSTB, 0x1); 366*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TXPW_RSTB, 0x2); 367*6d67aabdSBjoern A. Zeeb } 368*6d67aabdSBjoern A. Zeeb 369*6d67aabdSBjoern A. Zeeb static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 370*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 371*6d67aabdSBjoern A. Zeeb { 372*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0); 373*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 374*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 375*6d67aabdSBjoern A. Zeeb mdelay(1); 376*6d67aabdSBjoern A. Zeeb } 377*6d67aabdSBjoern A. Zeeb 378*6d67aabdSBjoern A. Zeeb static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 379*6d67aabdSBjoern A. Zeeb { 380*6d67aabdSBjoern A. Zeeb u8 path, dck_tune; 381*6d67aabdSBjoern A. Zeeb u32 rf_reg5; 382*6d67aabdSBjoern A. Zeeb 383*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 384*6d67aabdSBjoern A. Zeeb "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n", 385*6d67aabdSBjoern A. Zeeb RTW8852BT_RXDCK_VER, rtwdev->hal.cv); 386*6d67aabdSBjoern A. Zeeb 387*6d67aabdSBjoern A. Zeeb for (path = 0; path < RF_PATH_NUM_8852BT; path++) { 388*6d67aabdSBjoern A. Zeeb rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 389*6d67aabdSBjoern A. Zeeb dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE); 390*6d67aabdSBjoern A. Zeeb 391*6d67aabdSBjoern A. Zeeb if (rtwdev->is_tssi_mode[path]) 392*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 393*6d67aabdSBjoern A. Zeeb R_P0_TSSI_TRK + (path << 13), 394*6d67aabdSBjoern A. Zeeb B_P0_TSSI_TRK_EN, 0x1); 395*6d67aabdSBjoern A. Zeeb 396*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 397*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); 398*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 399*6d67aabdSBjoern A. Zeeb _set_rx_dck(rtwdev, phy, path); 400*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune); 401*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 402*6d67aabdSBjoern A. Zeeb 403*6d67aabdSBjoern A. Zeeb if (rtwdev->is_tssi_mode[path]) 404*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 405*6d67aabdSBjoern A. Zeeb R_P0_TSSI_TRK + (path << 13), 406*6d67aabdSBjoern A. Zeeb B_P0_TSSI_TRK_EN, 0x0); 407*6d67aabdSBjoern A. Zeeb } 408*6d67aabdSBjoern A. Zeeb } 409*6d67aabdSBjoern A. Zeeb 410*6d67aabdSBjoern A. Zeeb static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 411*6d67aabdSBjoern A. Zeeb { 412*6d67aabdSBjoern A. Zeeb u32 rf_reg5; 413*6d67aabdSBjoern A. Zeeb u32 rck_val; 414*6d67aabdSBjoern A. Zeeb u32 val; 415*6d67aabdSBjoern A. Zeeb int ret; 416*6d67aabdSBjoern A. Zeeb 417*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); 418*6d67aabdSBjoern A. Zeeb 419*6d67aabdSBjoern A. Zeeb rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 420*6d67aabdSBjoern A. Zeeb 421*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 422*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 423*6d67aabdSBjoern A. Zeeb 424*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n", 425*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 426*6d67aabdSBjoern A. Zeeb 427*6d67aabdSBjoern A. Zeeb /* RCK trigger */ 428*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); 429*6d67aabdSBjoern A. Zeeb 430*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30, 431*6d67aabdSBjoern A. Zeeb false, rtwdev, path, RR_RCKS, BIT(3)); 432*6d67aabdSBjoern A. Zeeb 433*6d67aabdSBjoern A. Zeeb rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); 434*6d67aabdSBjoern A. Zeeb 435*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n", 436*6d67aabdSBjoern A. Zeeb rck_val, ret); 437*6d67aabdSBjoern A. Zeeb 438*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); 439*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 440*6d67aabdSBjoern A. Zeeb 441*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n", 442*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK)); 443*6d67aabdSBjoern A. Zeeb } 444*6d67aabdSBjoern A. Zeeb 445*6d67aabdSBjoern A. Zeeb static void _drck(struct rtw89_dev *rtwdev) 446*6d67aabdSBjoern A. Zeeb { 447*6d67aabdSBjoern A. Zeeb u32 rck_d; 448*6d67aabdSBjoern A. Zeeb u32 val; 449*6d67aabdSBjoern A. Zeeb int ret; 450*6d67aabdSBjoern A. Zeeb 451*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n"); 452*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x1); 453*6d67aabdSBjoern A. Zeeb 454*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 455*6d67aabdSBjoern A. Zeeb 1, 10000, false, 456*6d67aabdSBjoern A. Zeeb rtwdev, R_DRCK_RES, B_DRCK_POL); 457*6d67aabdSBjoern A. Zeeb if (ret) 458*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n"); 459*6d67aabdSBjoern A. Zeeb 460*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x0); 461*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1); 462*6d67aabdSBjoern A. Zeeb udelay(1); 463*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0); 464*6d67aabdSBjoern A. Zeeb 465*6d67aabdSBjoern A. Zeeb rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RES, 0x7c00); 466*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x0); 467*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_VAL, rck_d); 468*6d67aabdSBjoern A. Zeeb 469*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0c4 = 0x%x\n", 470*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD)); 471*6d67aabdSBjoern A. Zeeb } 472*6d67aabdSBjoern A. Zeeb 473*6d67aabdSBjoern A. Zeeb static void _dack_backup_s0(struct rtw89_dev *rtwdev) 474*6d67aabdSBjoern A. Zeeb { 475*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 476*6d67aabdSBjoern A. Zeeb u8 i; 477*6d67aabdSBjoern A. Zeeb 478*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 479*6d67aabdSBjoern A. Zeeb 480*6d67aabdSBjoern A. Zeeb for (i = 0; i < 0x10; i++) { 481*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i); 482*6d67aabdSBjoern A. Zeeb dack->msbk_d[0][0][i] = 483*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0); 484*6d67aabdSBjoern A. Zeeb 485*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i); 486*6d67aabdSBjoern A. Zeeb dack->msbk_d[0][1][i] = 487*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1); 488*6d67aabdSBjoern A. Zeeb } 489*6d67aabdSBjoern A. Zeeb 490*6d67aabdSBjoern A. Zeeb dack->biask_d[0][0] = 491*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00); 492*6d67aabdSBjoern A. Zeeb dack->biask_d[0][1] = 493*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01); 494*6d67aabdSBjoern A. Zeeb 495*6d67aabdSBjoern A. Zeeb dack->dadck_d[0][0] = 496*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00); 497*6d67aabdSBjoern A. Zeeb dack->dadck_d[0][1] = 498*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01); 499*6d67aabdSBjoern A. Zeeb } 500*6d67aabdSBjoern A. Zeeb 501*6d67aabdSBjoern A. Zeeb static void _dack_backup_s1(struct rtw89_dev *rtwdev) 502*6d67aabdSBjoern A. Zeeb { 503*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 504*6d67aabdSBjoern A. Zeeb u8 i; 505*6d67aabdSBjoern A. Zeeb 506*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 507*6d67aabdSBjoern A. Zeeb 508*6d67aabdSBjoern A. Zeeb for (i = 0; i < 0x10; i++) { 509*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i); 510*6d67aabdSBjoern A. Zeeb dack->msbk_d[1][0][i] = 511*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S); 512*6d67aabdSBjoern A. Zeeb 513*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i); 514*6d67aabdSBjoern A. Zeeb dack->msbk_d[1][1][i] = 515*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S); 516*6d67aabdSBjoern A. Zeeb } 517*6d67aabdSBjoern A. Zeeb 518*6d67aabdSBjoern A. Zeeb dack->biask_d[1][0] = 519*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10); 520*6d67aabdSBjoern A. Zeeb dack->biask_d[1][1] = 521*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11); 522*6d67aabdSBjoern A. Zeeb 523*6d67aabdSBjoern A. Zeeb dack->dadck_d[1][0] = 524*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10); 525*6d67aabdSBjoern A. Zeeb dack->dadck_d[1][1] = 526*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11); 527*6d67aabdSBjoern A. Zeeb } 528*6d67aabdSBjoern A. Zeeb 529*6d67aabdSBjoern A. Zeeb static 530*6d67aabdSBjoern A. Zeeb void _dack_reset(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 531*6d67aabdSBjoern A. Zeeb { 532*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) { 533*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x0); 534*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x1); 535*6d67aabdSBjoern A. Zeeb } else { 536*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10_RST, 0x0); 537*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10_RST, 0x1); 538*6d67aabdSBjoern A. Zeeb } 539*6d67aabdSBjoern A. Zeeb } 540*6d67aabdSBjoern A. Zeeb 541*6d67aabdSBjoern A. Zeeb static 542*6d67aabdSBjoern A. Zeeb void _dack_reload_by_path(struct rtw89_dev *rtwdev, u8 path, u8 index) 543*6d67aabdSBjoern A. Zeeb { 544*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 545*6d67aabdSBjoern A. Zeeb u32 tmp, tmp_offset, tmp_reg; 546*6d67aabdSBjoern A. Zeeb u32 idx_offset, path_offset; 547*6d67aabdSBjoern A. Zeeb u8 i; 548*6d67aabdSBjoern A. Zeeb 549*6d67aabdSBjoern A. Zeeb if (index == 0) 550*6d67aabdSBjoern A. Zeeb idx_offset = 0; 551*6d67aabdSBjoern A. Zeeb else 552*6d67aabdSBjoern A. Zeeb idx_offset = 0x14; 553*6d67aabdSBjoern A. Zeeb 554*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 555*6d67aabdSBjoern A. Zeeb path_offset = 0; 556*6d67aabdSBjoern A. Zeeb else 557*6d67aabdSBjoern A. Zeeb path_offset = 0x28; 558*6d67aabdSBjoern A. Zeeb 559*6d67aabdSBjoern A. Zeeb tmp_offset = idx_offset + path_offset; 560*6d67aabdSBjoern A. Zeeb 561*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_RST, 0x1); 562*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_RST, 0x1); 563*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_RST, 0x1); 564*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK2_K, B_DACK2_RST, 0x1); 565*6d67aabdSBjoern A. Zeeb 566*6d67aabdSBjoern A. Zeeb /* msbk_d: 15/14/13/12 */ 567*6d67aabdSBjoern A. Zeeb tmp = 0x0; 568*6d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++) 569*6d67aabdSBjoern A. Zeeb tmp |= dack->msbk_d[path][index][i + 12] << (i * 8); 570*6d67aabdSBjoern A. Zeeb tmp_reg = 0xc200 + tmp_offset; 571*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, tmp_reg, tmp); 572*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 573*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 574*6d67aabdSBjoern A. Zeeb 575*6d67aabdSBjoern A. Zeeb /* msbk_d: 11/10/9/8 */ 576*6d67aabdSBjoern A. Zeeb tmp = 0x0; 577*6d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++) 578*6d67aabdSBjoern A. Zeeb tmp |= dack->msbk_d[path][index][i + 8] << (i * 8); 579*6d67aabdSBjoern A. Zeeb tmp_reg = 0xc204 + tmp_offset; 580*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, tmp_reg, tmp); 581*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 582*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 583*6d67aabdSBjoern A. Zeeb 584*6d67aabdSBjoern A. Zeeb /* msbk_d: 7/6/5/4 */ 585*6d67aabdSBjoern A. Zeeb tmp = 0x0; 586*6d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++) 587*6d67aabdSBjoern A. Zeeb tmp |= dack->msbk_d[path][index][i + 4] << (i * 8); 588*6d67aabdSBjoern A. Zeeb tmp_reg = 0xc208 + tmp_offset; 589*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, tmp_reg, tmp); 590*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 591*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 592*6d67aabdSBjoern A. Zeeb 593*6d67aabdSBjoern A. Zeeb /* msbk_d: 3/2/1/0 */ 594*6d67aabdSBjoern A. Zeeb tmp = 0x0; 595*6d67aabdSBjoern A. Zeeb for (i = 0; i < 4; i++) 596*6d67aabdSBjoern A. Zeeb tmp |= dack->msbk_d[path][index][i] << (i * 8); 597*6d67aabdSBjoern A. Zeeb tmp_reg = 0xc20c + tmp_offset; 598*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, tmp_reg, tmp); 599*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 600*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 601*6d67aabdSBjoern A. Zeeb 602*6d67aabdSBjoern A. Zeeb /* dadak_d/biask_d */ 603*6d67aabdSBjoern A. Zeeb tmp = (dack->biask_d[path][index] << 22) | 604*6d67aabdSBjoern A. Zeeb (dack->dadck_d[path][index] << 14); 605*6d67aabdSBjoern A. Zeeb tmp_reg = 0xc210 + tmp_offset; 606*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, tmp_reg, tmp); 607*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 608*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 609*6d67aabdSBjoern A. Zeeb 610*6d67aabdSBjoern A. Zeeb /* enable DACK result from reg */ 611*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL + tmp_offset, B_DACKN0_EN, 0x1); 612*6d67aabdSBjoern A. Zeeb } 613*6d67aabdSBjoern A. Zeeb 614*6d67aabdSBjoern A. Zeeb static 615*6d67aabdSBjoern A. Zeeb void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 616*6d67aabdSBjoern A. Zeeb { 617*6d67aabdSBjoern A. Zeeb u8 i; 618*6d67aabdSBjoern A. Zeeb 619*6d67aabdSBjoern A. Zeeb for (i = 0; i < 2; i++) 620*6d67aabdSBjoern A. Zeeb _dack_reload_by_path(rtwdev, path, i); 621*6d67aabdSBjoern A. Zeeb } 622*6d67aabdSBjoern A. Zeeb 623*6d67aabdSBjoern A. Zeeb static bool _dack_s0_poll(struct rtw89_dev *rtwdev) 624*6d67aabdSBjoern A. Zeeb { 625*6d67aabdSBjoern A. Zeeb if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 || 626*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0 || 627*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 || 628*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0) 629*6d67aabdSBjoern A. Zeeb return false; 630*6d67aabdSBjoern A. Zeeb 631*6d67aabdSBjoern A. Zeeb return true; 632*6d67aabdSBjoern A. Zeeb } 633*6d67aabdSBjoern A. Zeeb 634*6d67aabdSBjoern A. Zeeb static void _dack_s0(struct rtw89_dev *rtwdev) 635*6d67aabdSBjoern A. Zeeb { 636*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 637*6d67aabdSBjoern A. Zeeb bool done; 638*6d67aabdSBjoern A. Zeeb int ret; 639*6d67aabdSBjoern A. Zeeb 640*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_A, true, DAC_160M); 641*6d67aabdSBjoern A. Zeeb 642*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 643*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, BIT(28), 0x1); 644*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN1, 0x0); 645*6d67aabdSBjoern A. Zeeb udelay(100); 646*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_VAL, 0x30); 647*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_VAL, 0x30); 648*6d67aabdSBjoern A. Zeeb 649*6d67aabdSBjoern A. Zeeb _dack_reset(rtwdev, RF_PATH_A); 650*6d67aabdSBjoern A. Zeeb 651*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x1); 652*6d67aabdSBjoern A. Zeeb udelay(1); 653*6d67aabdSBjoern A. Zeeb 654*6d67aabdSBjoern A. Zeeb dack->msbk_timeout[0] = false; 655*6d67aabdSBjoern A. Zeeb 656*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(_dack_s0_poll, done, done, 657*6d67aabdSBjoern A. Zeeb 1, 20000, false, rtwdev); 658*6d67aabdSBjoern A. Zeeb if (ret) { 659*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DACK timeout\n"); 660*6d67aabdSBjoern A. Zeeb dack->msbk_timeout[0] = true; 661*6d67aabdSBjoern A. Zeeb } 662*6d67aabdSBjoern A. Zeeb 663*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x0); 664*6d67aabdSBjoern A. Zeeb 665*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_A, false, DAC_960M); 666*6d67aabdSBjoern A. Zeeb _dack_backup_s0(rtwdev); 667*6d67aabdSBjoern A. Zeeb _dack_reload(rtwdev, RF_PATH_A); 668*6d67aabdSBjoern A. Zeeb 669*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 670*6d67aabdSBjoern A. Zeeb } 671*6d67aabdSBjoern A. Zeeb 672*6d67aabdSBjoern A. Zeeb static bool _dack_s1_poll(struct rtw89_dev *rtwdev) 673*6d67aabdSBjoern A. Zeeb { 674*6d67aabdSBjoern A. Zeeb if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 || 675*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0 || 676*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S1P2, B_DACK_S1P2_OK) == 0 || 677*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_DACK_S1P3, B_DACK_S1P3_OK) == 0) 678*6d67aabdSBjoern A. Zeeb return false; 679*6d67aabdSBjoern A. Zeeb 680*6d67aabdSBjoern A. Zeeb return true; 681*6d67aabdSBjoern A. Zeeb } 682*6d67aabdSBjoern A. Zeeb 683*6d67aabdSBjoern A. Zeeb static void _dack_s1(struct rtw89_dev *rtwdev) 684*6d67aabdSBjoern A. Zeeb { 685*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 686*6d67aabdSBjoern A. Zeeb bool done; 687*6d67aabdSBjoern A. Zeeb int ret; 688*6d67aabdSBjoern A. Zeeb 689*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_B, true, DAC_160M); 690*6d67aabdSBjoern A. Zeeb 691*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 692*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, BIT(28), 0x1); 693*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN1, 0x0); 694*6d67aabdSBjoern A. Zeeb udelay(100); 695*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_VAL, 0x30); 696*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK2_K, B_DACK2_VAL, 0x30); 697*6d67aabdSBjoern A. Zeeb 698*6d67aabdSBjoern A. Zeeb _dack_reset(rtwdev, RF_PATH_B); 699*6d67aabdSBjoern A. Zeeb 700*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x1); 701*6d67aabdSBjoern A. Zeeb udelay(1); 702*6d67aabdSBjoern A. Zeeb 703*6d67aabdSBjoern A. Zeeb dack->msbk_timeout[1] = false; 704*6d67aabdSBjoern A. Zeeb 705*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(_dack_s1_poll, done, done, 706*6d67aabdSBjoern A. Zeeb 1, 10000, false, rtwdev); 707*6d67aabdSBjoern A. Zeeb if (ret) { 708*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DACK timeout\n"); 709*6d67aabdSBjoern A. Zeeb dack->msbk_timeout[1] = true; 710*6d67aabdSBjoern A. Zeeb } 711*6d67aabdSBjoern A. Zeeb 712*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x0); 713*6d67aabdSBjoern A. Zeeb 714*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_B, false, DAC_960M); 715*6d67aabdSBjoern A. Zeeb _dack_backup_s1(rtwdev); 716*6d67aabdSBjoern A. Zeeb _dack_reload(rtwdev, RF_PATH_B); 717*6d67aabdSBjoern A. Zeeb 718*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 719*6d67aabdSBjoern A. Zeeb } 720*6d67aabdSBjoern A. Zeeb 721*6d67aabdSBjoern A. Zeeb static void _dack(struct rtw89_dev *rtwdev) 722*6d67aabdSBjoern A. Zeeb { 723*6d67aabdSBjoern A. Zeeb _dack_s0(rtwdev); 724*6d67aabdSBjoern A. Zeeb _dack_s1(rtwdev); 725*6d67aabdSBjoern A. Zeeb } 726*6d67aabdSBjoern A. Zeeb 727*6d67aabdSBjoern A. Zeeb static void _dack_dump(struct rtw89_dev *rtwdev) 728*6d67aabdSBjoern A. Zeeb { 729*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 730*6d67aabdSBjoern A. Zeeb u8 i; 731*6d67aabdSBjoern A. Zeeb u8 t; 732*6d67aabdSBjoern A. Zeeb 733*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 734*6d67aabdSBjoern A. Zeeb "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", 735*6d67aabdSBjoern A. Zeeb dack->addck_d[0][0], dack->addck_d[0][1]); 736*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 737*6d67aabdSBjoern A. Zeeb "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n", 738*6d67aabdSBjoern A. Zeeb dack->addck_d[1][0], dack->addck_d[1][1]); 739*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 740*6d67aabdSBjoern A. Zeeb "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", 741*6d67aabdSBjoern A. Zeeb dack->dadck_d[0][0], dack->dadck_d[0][1]); 742*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 743*6d67aabdSBjoern A. Zeeb "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n", 744*6d67aabdSBjoern A. Zeeb dack->dadck_d[1][0], dack->dadck_d[1][1]); 745*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 746*6d67aabdSBjoern A. Zeeb "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", 747*6d67aabdSBjoern A. Zeeb dack->biask_d[0][0], dack->biask_d[0][1]); 748*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 749*6d67aabdSBjoern A. Zeeb "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n", 750*6d67aabdSBjoern A. Zeeb dack->biask_d[1][0], dack->biask_d[1][1]); 751*6d67aabdSBjoern A. Zeeb 752*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); 753*6d67aabdSBjoern A. Zeeb for (i = 0; i < 0x10; i++) { 754*6d67aabdSBjoern A. Zeeb t = dack->msbk_d[0][0][i]; 755*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 756*6d67aabdSBjoern A. Zeeb } 757*6d67aabdSBjoern A. Zeeb 758*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); 759*6d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 760*6d67aabdSBjoern A. Zeeb t = dack->msbk_d[0][1][i]; 761*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 762*6d67aabdSBjoern A. Zeeb } 763*6d67aabdSBjoern A. Zeeb 764*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n"); 765*6d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 766*6d67aabdSBjoern A. Zeeb t = dack->msbk_d[1][0][i]; 767*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 768*6d67aabdSBjoern A. Zeeb } 769*6d67aabdSBjoern A. Zeeb 770*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n"); 771*6d67aabdSBjoern A. Zeeb for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 772*6d67aabdSBjoern A. Zeeb t = dack->msbk_d[1][1][i]; 773*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 774*6d67aabdSBjoern A. Zeeb } 775*6d67aabdSBjoern A. Zeeb } 776*6d67aabdSBjoern A. Zeeb 777*6d67aabdSBjoern A. Zeeb static void _addck_ori(struct rtw89_dev *rtwdev) 778*6d67aabdSBjoern A. Zeeb { 779*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 780*6d67aabdSBjoern A. Zeeb u32 val; 781*6d67aabdSBjoern A. Zeeb int ret; 782*6d67aabdSBjoern A. Zeeb 783*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0); 784*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x0); 785*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 786*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); 787*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); 788*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); 789*6d67aabdSBjoern A. Zeeb 790*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); 791*6d67aabdSBjoern A. Zeeb udelay(100); 792*6d67aabdSBjoern A. Zeeb 793*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); 794*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(4), 0x1); 795*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); 796*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1); 797*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0); 798*6d67aabdSBjoern A. Zeeb udelay(1); 799*6d67aabdSBjoern A. Zeeb 800*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1); 801*6d67aabdSBjoern A. Zeeb dack->addck_timeout[0] = false; 802*6d67aabdSBjoern A. Zeeb 803*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 804*6d67aabdSBjoern A. Zeeb 1, 10000, false, 805*6d67aabdSBjoern A. Zeeb rtwdev, R_ADDCKR0, BIT(0)); 806*6d67aabdSBjoern A. Zeeb if (ret) { 807*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); 808*6d67aabdSBjoern A. Zeeb dack->addck_timeout[0] = true; 809*6d67aabdSBjoern A. Zeeb } 810*6d67aabdSBjoern A. Zeeb 811*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(4), 0x0); 812*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); 813*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); 814*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); 815*6d67aabdSBjoern A. Zeeb 816*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0); 817*6d67aabdSBjoern A. Zeeb dack->addck_d[0][0] = 818*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0); 819*6d67aabdSBjoern A. Zeeb dack->addck_d[0][1] = 820*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1); 821*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 822*6d67aabdSBjoern A. Zeeb 823*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 824*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); 825*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); 826*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); 827*6d67aabdSBjoern A. Zeeb 828*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); 829*6d67aabdSBjoern A. Zeeb udelay(100); 830*6d67aabdSBjoern A. Zeeb 831*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); 832*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(4), 0x1); 833*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); 834*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1); 835*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0); 836*6d67aabdSBjoern A. Zeeb udelay(1); 837*6d67aabdSBjoern A. Zeeb 838*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1); 839*6d67aabdSBjoern A. Zeeb dack->addck_timeout[1] = false; 840*6d67aabdSBjoern A. Zeeb 841*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 842*6d67aabdSBjoern A. Zeeb 1, 10000, false, 843*6d67aabdSBjoern A. Zeeb rtwdev, R_ADDCKR1, BIT(0)); 844*6d67aabdSBjoern A. Zeeb if (ret) { 845*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n"); 846*6d67aabdSBjoern A. Zeeb dack->addck_timeout[1] = true; 847*6d67aabdSBjoern A. Zeeb } 848*6d67aabdSBjoern A. Zeeb 849*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(4), 0x0); 850*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); 851*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); 852*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); 853*6d67aabdSBjoern A. Zeeb 854*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0); 855*6d67aabdSBjoern A. Zeeb dack->addck_d[1][0] = 856*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0); 857*6d67aabdSBjoern A. Zeeb dack->addck_d[1][1] = 858*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1); 859*6d67aabdSBjoern A. Zeeb 860*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 861*6d67aabdSBjoern A. Zeeb } 862*6d67aabdSBjoern A. Zeeb 863*6d67aabdSBjoern A. Zeeb static void _addck_reload(struct rtw89_dev *rtwdev) 864*6d67aabdSBjoern A. Zeeb { 865*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 866*6d67aabdSBjoern A. Zeeb 867*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL1, dack->addck_d[0][0]); 868*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL0, dack->addck_d[0][1]); 869*6d67aabdSBjoern A. Zeeb 870*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x3); 871*6d67aabdSBjoern A. Zeeb 872*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL1, dack->addck_d[1][0]); 873*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL0, dack->addck_d[1][1]); 874*6d67aabdSBjoern A. Zeeb 875*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RLS, 0x3); 876*6d67aabdSBjoern A. Zeeb } 877*6d67aabdSBjoern A. Zeeb 878*6d67aabdSBjoern A. Zeeb static void _dack_manual_off(struct rtw89_dev *rtwdev) 879*6d67aabdSBjoern A. Zeeb { 880*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x0); 881*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RLS, 0x0); 882*6d67aabdSBjoern A. Zeeb 883*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL, B_DACKN0_EN, 0x0); 884*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACKN1_CTL, B_DACKN1_ON, 0x0); 885*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACKN2_CTL, B_DACKN2_ON, 0x0); 886*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DACKN3_CTL, B_DACKN3_ON, 0x0); 887*6d67aabdSBjoern A. Zeeb } 888*6d67aabdSBjoern A. Zeeb 889*6d67aabdSBjoern A. Zeeb static void _dac_cal(struct rtw89_dev *rtwdev, bool force) 890*6d67aabdSBjoern A. Zeeb { 891*6d67aabdSBjoern A. Zeeb struct rtw89_dack_info *dack = &rtwdev->dack; 892*6d67aabdSBjoern A. Zeeb 893*6d67aabdSBjoern A. Zeeb dack->dack_done = false; 894*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); 895*6d67aabdSBjoern A. Zeeb 896*6d67aabdSBjoern A. Zeeb _drck(rtwdev); 897*6d67aabdSBjoern A. Zeeb _dack_manual_off(rtwdev); 898*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0); 899*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RFREG_MASK, 0x0); 900*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1); 901*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1); 902*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, true, ADC_960M); 903*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, true, ADC_960M); 904*6d67aabdSBjoern A. Zeeb _addck_ori(rtwdev); 905*6d67aabdSBjoern A. Zeeb 906*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, false, ADC_960M); 907*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, false, ADC_960M); 908*6d67aabdSBjoern A. Zeeb _addck_reload(rtwdev); 909*6d67aabdSBjoern A. Zeeb 910*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0); 911*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0); 912*6d67aabdSBjoern A. Zeeb 913*6d67aabdSBjoern A. Zeeb _dack(rtwdev); 914*6d67aabdSBjoern A. Zeeb _dack_dump(rtwdev); 915*6d67aabdSBjoern A. Zeeb dack->dack_done = true; 916*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x1); 917*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RFREG_MASK, 0x1); 918*6d67aabdSBjoern A. Zeeb 919*6d67aabdSBjoern A. Zeeb dack->dack_cnt++; 920*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); 921*6d67aabdSBjoern A. Zeeb } 922*6d67aabdSBjoern A. Zeeb 923*6d67aabdSBjoern A. Zeeb static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype) 924*6d67aabdSBjoern A. Zeeb { 925*6d67aabdSBjoern A. Zeeb bool notready = false; 926*6d67aabdSBjoern A. Zeeb u32 val; 927*6d67aabdSBjoern A. Zeeb int ret; 928*6d67aabdSBjoern A. Zeeb 929*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 930*6d67aabdSBjoern A. Zeeb 10, 8200, false, 931*6d67aabdSBjoern A. Zeeb rtwdev, R_RFK_ST, MASKBYTE0); 932*6d67aabdSBjoern A. Zeeb if (ret) 933*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n"); 934*6d67aabdSBjoern A. Zeeb 935*6d67aabdSBjoern A. Zeeb udelay(10); 936*6d67aabdSBjoern A. Zeeb 937*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, 938*6d67aabdSBjoern A. Zeeb 10, 400, false, 939*6d67aabdSBjoern A. Zeeb rtwdev, R_RPT_COM, B_RPT_COM_RDY); 940*6d67aabdSBjoern A. Zeeb if (ret) { 941*6d67aabdSBjoern A. Zeeb notready = true; 942*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL2 IQK timeout!!!\n"); 943*6d67aabdSBjoern A. Zeeb } 944*6d67aabdSBjoern A. Zeeb 945*6d67aabdSBjoern A. Zeeb udelay(10); 946*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 947*6d67aabdSBjoern A. Zeeb 948*6d67aabdSBjoern A. Zeeb return notready; 949*6d67aabdSBjoern A. Zeeb } 950*6d67aabdSBjoern A. Zeeb 951*6d67aabdSBjoern A. Zeeb static bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 952*6d67aabdSBjoern A. Zeeb u8 path, u8 ktype) 953*6d67aabdSBjoern A. Zeeb { 954*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 955*6d67aabdSBjoern A. Zeeb u32 iqk_cmd; 956*6d67aabdSBjoern A. Zeeb bool fail; 957*6d67aabdSBjoern A. Zeeb 958*6d67aabdSBjoern A. Zeeb switch (ktype) { 959*6d67aabdSBjoern A. Zeeb case ID_TXAGC: 960*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x008 | (1 << (4 + path)) | (path << 1); 961*6d67aabdSBjoern A. Zeeb break; 962*6d67aabdSBjoern A. Zeeb case ID_FLOK_COARSE: 963*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x108 | (1 << (4 + path)); 964*6d67aabdSBjoern A. Zeeb break; 965*6d67aabdSBjoern A. Zeeb case ID_FLOK_FINE: 966*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x208 | (1 << (4 + path)); 967*6d67aabdSBjoern A. Zeeb break; 968*6d67aabdSBjoern A. Zeeb case ID_FLOK_VBUFFER: 969*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x308 | (1 << (4 + path)); 970*6d67aabdSBjoern A. Zeeb break; 971*6d67aabdSBjoern A. Zeeb case ID_TXK: 972*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x008 | (1 << (path + 4)) | 973*6d67aabdSBjoern A. Zeeb (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8); 974*6d67aabdSBjoern A. Zeeb break; 975*6d67aabdSBjoern A. Zeeb case ID_RXAGC: 976*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1); 977*6d67aabdSBjoern A. Zeeb break; 978*6d67aabdSBjoern A. Zeeb case ID_RXK: 979*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x008 | (1 << (path + 4)) | 980*6d67aabdSBjoern A. Zeeb (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8); 981*6d67aabdSBjoern A. Zeeb break; 982*6d67aabdSBjoern A. Zeeb case ID_NBTXK: 983*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x408 | (1 << (4 + path)); 984*6d67aabdSBjoern A. Zeeb break; 985*6d67aabdSBjoern A. Zeeb case ID_NBRXK: 986*6d67aabdSBjoern A. Zeeb iqk_cmd = 0x608 | (1 << (4 + path)); 987*6d67aabdSBjoern A. Zeeb break; 988*6d67aabdSBjoern A. Zeeb default: 989*6d67aabdSBjoern A. Zeeb return false; 990*6d67aabdSBjoern A. Zeeb } 991*6d67aabdSBjoern A. Zeeb 992*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s, iqk_cmd = %x\n", 993*6d67aabdSBjoern A. Zeeb __func__, iqk_cmd + 1); 994*6d67aabdSBjoern A. Zeeb 995*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); 996*6d67aabdSBjoern A. Zeeb fail = _iqk_check_cal(rtwdev, path, ktype); 997*6d67aabdSBjoern A. Zeeb 998*6d67aabdSBjoern A. Zeeb return fail; 999*6d67aabdSBjoern A. Zeeb } 1000*6d67aabdSBjoern A. Zeeb 1001*6d67aabdSBjoern A. Zeeb static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) 1002*6d67aabdSBjoern A. Zeeb { 1003*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1004*6d67aabdSBjoern A. Zeeb 1005*6d67aabdSBjoern A. Zeeb switch (iqk_info->iqk_band[path]) { 1006*6d67aabdSBjoern A. Zeeb case RTW89_BAND_2G: 1007*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0); 1008*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0); 1009*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1); 1010*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 1011*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 1012*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00); 1013*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); 1014*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 1015*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x5); 1016*6d67aabdSBjoern A. Zeeb udelay(1); 1017*6d67aabdSBjoern A. Zeeb break; 1018*6d67aabdSBjoern A. Zeeb case RTW89_BAND_5G: 1019*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1); 1020*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 1021*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 1022*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80); 1023*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); 1024*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 1025*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4); 1026*6d67aabdSBjoern A. Zeeb udelay(1); 1027*6d67aabdSBjoern A. Zeeb break; 1028*6d67aabdSBjoern A. Zeeb default: 1029*6d67aabdSBjoern A. Zeeb break; 1030*6d67aabdSBjoern A. Zeeb } 1031*6d67aabdSBjoern A. Zeeb } 1032*6d67aabdSBjoern A. Zeeb 1033*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1034*6d67aabdSBjoern A. Zeeb { 1035*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1036*6d67aabdSBjoern A. Zeeb 1037*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 1038*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1039*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09); 1040*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 1041*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000119 + (path << 4)); 1042*6d67aabdSBjoern A. Zeeb 1043*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_COARSE); 1044*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1045*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1046*6d67aabdSBjoern A. Zeeb 1047*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 1048*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1049*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24); 1050*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4)); 1051*6d67aabdSBjoern A. Zeeb 1052*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER); 1053*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1054*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1055*6d67aabdSBjoern A. Zeeb 1056*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 1057*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1058*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09); 1059*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000219 + (path << 4)); 1060*6d67aabdSBjoern A. Zeeb 1061*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_COARSE); 1062*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1063*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1064*6d67aabdSBjoern A. Zeeb 1065*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 1066*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1067*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24); 1068*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4)); 1069*6d67aabdSBjoern A. Zeeb 1070*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER); 1071*6d67aabdSBjoern A. Zeeb 1072*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1073*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1074*6d67aabdSBjoern A. Zeeb 1075*6d67aabdSBjoern A. Zeeb return false; 1076*6d67aabdSBjoern A. Zeeb } 1077*6d67aabdSBjoern A. Zeeb 1078*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1079*6d67aabdSBjoern A. Zeeb { 1080*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1081*6d67aabdSBjoern A. Zeeb 1082*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 1083*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1084*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09); 1085*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 1086*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000119 + (path << 4)); 1087*6d67aabdSBjoern A. Zeeb 1088*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_COARSE); 1089*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1090*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1091*6d67aabdSBjoern A. Zeeb 1092*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 1093*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1094*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24); 1095*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4)); 1096*6d67aabdSBjoern A. Zeeb 1097*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER); 1098*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1099*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1100*6d67aabdSBjoern A. Zeeb 1101*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 1102*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1103*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x09); 1104*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000219 + (path << 4)); 1105*6d67aabdSBjoern A. Zeeb 1106*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_COARSE); 1107*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1108*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1109*6d67aabdSBjoern A. Zeeb 1110*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 1111*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1112*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x24); 1113*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00000319 + (path << 4)); 1114*6d67aabdSBjoern A. Zeeb 1115*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, ID_FLOK_VBUFFER); 1116*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1117*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1118*6d67aabdSBjoern A. Zeeb 1119*6d67aabdSBjoern A. Zeeb return false; 1120*6d67aabdSBjoern A. Zeeb } 1121*6d67aabdSBjoern A. Zeeb 1122*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1123*6d67aabdSBjoern A. Zeeb { 1124*6d67aabdSBjoern A. Zeeb static const u32 g_power_range[4] = {0x0, 0x0, 0x0, 0x0}; 1125*6d67aabdSBjoern A. Zeeb static const u32 g_track_range[4] = {0x4, 0x4, 0x6, 0x6}; 1126*6d67aabdSBjoern A. Zeeb static const u32 g_gain_bb[4] = {0x08, 0x0e, 0x08, 0x0e}; 1127*6d67aabdSBjoern A. Zeeb static const u32 g_itqt[4] = {0x09, 0x12, 0x1b, 0x24}; 1128*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1129*6d67aabdSBjoern A. Zeeb bool notready = false; 1130*6d67aabdSBjoern A. Zeeb bool kfail = false; 1131*6d67aabdSBjoern A. Zeeb u8 gp; 1132*6d67aabdSBjoern A. Zeeb 1133*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1134*6d67aabdSBjoern A. Zeeb 1135*6d67aabdSBjoern A. Zeeb for (gp = 0x0; gp < 0x4; gp++) { 1136*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 1137*6d67aabdSBjoern A. Zeeb g_power_range[gp]); 1138*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 1139*6d67aabdSBjoern A. Zeeb g_track_range[gp]); 1140*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 1141*6d67aabdSBjoern A. Zeeb g_gain_bb[gp]); 1142*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1143*6d67aabdSBjoern A. Zeeb 0x00000100, 0x1); 1144*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1145*6d67aabdSBjoern A. Zeeb 0x00000010, 0x1); 1146*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1147*6d67aabdSBjoern A. Zeeb 0x00000004, 0x0); 1148*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1149*6d67aabdSBjoern A. Zeeb 0x00000003, gp); 1150*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 1151*6d67aabdSBjoern A. Zeeb 0x009); 1152*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 1153*6d67aabdSBjoern A. Zeeb B_KIP_IQP_IQSW, g_itqt[gp]); 1154*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 1155*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 1156*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 1157*6d67aabdSBjoern A. Zeeb 1158*6d67aabdSBjoern A. Zeeb if (iqk_info->is_nbiqk) 1159*6d67aabdSBjoern A. Zeeb break; 1160*6d67aabdSBjoern A. Zeeb 1161*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 1162*6d67aabdSBjoern A. Zeeb B_KIP_IQP_IQSW, g_itqt[gp]); 1163*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 1164*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1165*6d67aabdSBjoern A. Zeeb 1166*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1167*6d67aabdSBjoern A. Zeeb "[IQK]S%x, gp = 0x%x, 0x8%x38 = 0x%x\n", 1168*6d67aabdSBjoern A. Zeeb path, gp, 1 << path, iqk_info->nb_txcfir[path]); 1169*6d67aabdSBjoern A. Zeeb } 1170*6d67aabdSBjoern A. Zeeb 1171*6d67aabdSBjoern A. Zeeb if (!notready) 1172*6d67aabdSBjoern A. Zeeb kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 1173*6d67aabdSBjoern A. Zeeb 1174*6d67aabdSBjoern A. Zeeb if (kfail) { 1175*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 0x40000002; 1176*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 1177*6d67aabdSBjoern A. Zeeb B_IQK_RES_TXCFIR, 0x0); 1178*6d67aabdSBjoern A. Zeeb } 1179*6d67aabdSBjoern A. Zeeb 1180*6d67aabdSBjoern A. Zeeb return kfail; 1181*6d67aabdSBjoern A. Zeeb } 1182*6d67aabdSBjoern A. Zeeb 1183*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1184*6d67aabdSBjoern A. Zeeb { 1185*6d67aabdSBjoern A. Zeeb static const u32 a_power_range[4] = {0x0, 0x0, 0x0, 0x0}; 1186*6d67aabdSBjoern A. Zeeb static const u32 a_track_range[4] = {0x3, 0x3, 0x6, 0x6}; 1187*6d67aabdSBjoern A. Zeeb static const u32 a_gain_bb[4] = {0x08, 0x10, 0x08, 0x0e}; 1188*6d67aabdSBjoern A. Zeeb static const u32 a_itqt[4] = {0x09, 0x12, 0x1b, 0x24}; 1189*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1190*6d67aabdSBjoern A. Zeeb bool notready = false; 1191*6d67aabdSBjoern A. Zeeb bool kfail = false; 1192*6d67aabdSBjoern A. Zeeb u8 gp; 1193*6d67aabdSBjoern A. Zeeb 1194*6d67aabdSBjoern A. Zeeb for (gp = 0x0; gp < 0x4; gp++) { 1195*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]); 1196*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]); 1197*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]); 1198*6d67aabdSBjoern A. Zeeb 1199*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 1200*6d67aabdSBjoern A. Zeeb MASKDWORD, a_itqt[gp]); 1201*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1202*6d67aabdSBjoern A. Zeeb 0x00000100, 0x1); 1203*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1204*6d67aabdSBjoern A. Zeeb 0x00000010, 0x1); 1205*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1206*6d67aabdSBjoern A. Zeeb 0x00000004, 0x0); 1207*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1208*6d67aabdSBjoern A. Zeeb 0x00000003, gp); 1209*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 1210*6d67aabdSBjoern A. Zeeb 0x009); 1211*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 1212*6d67aabdSBjoern A. Zeeb B_KIP_IQP_IQSW, a_itqt[gp]); 1213*6d67aabdSBjoern A. Zeeb 1214*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 1215*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 1216*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 1217*6d67aabdSBjoern A. Zeeb 1218*6d67aabdSBjoern A. Zeeb if (iqk_info->is_nbiqk) 1219*6d67aabdSBjoern A. Zeeb break; 1220*6d67aabdSBjoern A. Zeeb 1221*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 1222*6d67aabdSBjoern A. Zeeb B_KIP_IQP_IQSW, a_itqt[gp]); 1223*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 1224*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1225*6d67aabdSBjoern A. Zeeb 1226*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1227*6d67aabdSBjoern A. Zeeb "[IQK]S%x, gp = 0x%x, 0x8%x38 = 0x%x\n", 1228*6d67aabdSBjoern A. Zeeb path, gp, 1 << path, iqk_info->nb_txcfir[path]); 1229*6d67aabdSBjoern A. Zeeb } 1230*6d67aabdSBjoern A. Zeeb 1231*6d67aabdSBjoern A. Zeeb if (!notready) 1232*6d67aabdSBjoern A. Zeeb kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 1233*6d67aabdSBjoern A. Zeeb 1234*6d67aabdSBjoern A. Zeeb if (kfail) { 1235*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 0x40000002; 1236*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 1237*6d67aabdSBjoern A. Zeeb B_IQK_RES_TXCFIR, 0x0); 1238*6d67aabdSBjoern A. Zeeb } 1239*6d67aabdSBjoern A. Zeeb 1240*6d67aabdSBjoern A. Zeeb return kfail; 1241*6d67aabdSBjoern A. Zeeb } 1242*6d67aabdSBjoern A. Zeeb 1243*6d67aabdSBjoern A. Zeeb static void _iqk_adc_fifo_rst(struct rtw89_dev *rtwdev, 1244*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx, u8 path) 1245*6d67aabdSBjoern A. Zeeb { 1246*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); 1247*6d67aabdSBjoern A. Zeeb udelay(10); 1248*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333); 1249*6d67aabdSBjoern A. Zeeb } 1250*6d67aabdSBjoern A. Zeeb 1251*6d67aabdSBjoern A. Zeeb static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path) 1252*6d67aabdSBjoern A. Zeeb { 1253*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1254*6d67aabdSBjoern A. Zeeb 1255*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1256*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); 1257*6d67aabdSBjoern A. Zeeb 1258*6d67aabdSBjoern A. Zeeb if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) { 1259*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, true, ADC_960M); 1260*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, true, ADC_960M); 1261*6d67aabdSBjoern A. Zeeb udelay(1); 1262*6d67aabdSBjoern A. Zeeb 1263*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 1264*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_ON, 0x1); 1265*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 1266*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_VAL, 0x1); 1267*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 1268*6d67aabdSBjoern A. Zeeb B_PATH0_SAMPL_DLY_T_MSK_V1, 0x2); 1269*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 1270*6d67aabdSBjoern A. Zeeb B_PATH1_SAMPL_DLY_T_MSK_V1, 0x2); 1271*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0x8); 1272*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, 1273*6d67aabdSBjoern A. Zeeb B_PATH1_BW_SEL_MSK_V1, 0x8); 1274*6d67aabdSBjoern A. Zeeb } else { 1275*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, true, ADC_480M); 1276*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, true, ADC_480M); 1277*6d67aabdSBjoern A. Zeeb udelay(1); 1278*6d67aabdSBjoern A. Zeeb 1279*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 1280*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_ON, 0x1); 1281*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 1282*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_VAL, 0x0); 1283*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 1284*6d67aabdSBjoern A. Zeeb B_PATH0_SAMPL_DLY_T_MSK_V1, 0x3); 1285*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 1286*6d67aabdSBjoern A. Zeeb B_PATH1_SAMPL_DLY_T_MSK_V1, 0x3); 1287*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_BW1, 0xf); 1288*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, 1289*6d67aabdSBjoern A. Zeeb B_PATH1_BW_SEL_MSK_V1, 0xf); 1290*6d67aabdSBjoern A. Zeeb } 1291*6d67aabdSBjoern A. Zeeb 1292*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 0x00000780, 0x8); 1293*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x00000780, 0x8); 1294*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, 0x00007800, 0x2); 1295*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x00007800, 0x2); 1296*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_MUL, 0x0); 1297*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 1298*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 1299*6d67aabdSBjoern A. Zeeb udelay(1); 1300*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f); 1301*6d67aabdSBjoern A. Zeeb udelay(1); 1302*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03); 1303*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001); 1304*6d67aabdSBjoern A. Zeeb udelay(1); 1305*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); 1306*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333); 1307*6d67aabdSBjoern A. Zeeb } 1308*6d67aabdSBjoern A. Zeeb 1309*6d67aabdSBjoern A. Zeeb static bool _iqk_2g_rx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1310*6d67aabdSBjoern A. Zeeb { 1311*6d67aabdSBjoern A. Zeeb static const u32 g_idxrxgain[2] = {0x212, 0x310}; 1312*6d67aabdSBjoern A. Zeeb static const u32 g_idxattc2[2] = {0x00, 0x20}; 1313*6d67aabdSBjoern A. Zeeb static const u32 g_idxattc1[2] = {0x3, 0x2}; 1314*6d67aabdSBjoern A. Zeeb static const u32 g_idxrxagc[2] = {0x0, 0x2}; 1315*6d67aabdSBjoern A. Zeeb static const u32 g_idx[2] = {0x0, 0x2}; 1316*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1317*6d67aabdSBjoern A. Zeeb bool notready = false; 1318*6d67aabdSBjoern A. Zeeb bool kfail = false; 1319*6d67aabdSBjoern A. Zeeb u32 rf_18, tmp; 1320*6d67aabdSBjoern A. Zeeb u8 gp; 1321*6d67aabdSBjoern A. Zeeb 1322*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1323*6d67aabdSBjoern A. Zeeb 1324*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 1325*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1); 1326*6d67aabdSBjoern A. Zeeb rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 1327*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18); 1328*6d67aabdSBjoern A. Zeeb 1329*6d67aabdSBjoern A. Zeeb for (gp = 0x0; gp < 0x2; gp++) { 1330*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]); 1331*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, g_idxattc2[gp]); 1332*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, g_idxattc1[gp]); 1333*6d67aabdSBjoern A. Zeeb 1334*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1335*6d67aabdSBjoern A. Zeeb 0x00000100, 0x1); 1336*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1337*6d67aabdSBjoern A. Zeeb 0x00000010, 0x0); 1338*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1339*6d67aabdSBjoern A. Zeeb 0x00000007, g_idx[gp]); 1340*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 1341*6d67aabdSBjoern A. Zeeb udelay(100); 1342*6d67aabdSBjoern A. Zeeb udelay(100); 1343*6d67aabdSBjoern A. Zeeb 1344*6d67aabdSBjoern A. Zeeb tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 1345*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, tmp); 1346*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]); 1347*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1348*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 1349*6d67aabdSBjoern A. Zeeb 1350*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 1351*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1352*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, rf rxbb = %x\n", path, 1353*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_MOD, 0x003c0)); 1354*6d67aabdSBjoern A. Zeeb 1355*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 1356*6d67aabdSBjoern A. Zeeb udelay(100); 1357*6d67aabdSBjoern A. Zeeb udelay(100); 1358*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1359*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 1360*6d67aabdSBjoern A. Zeeb 1361*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 1362*6d67aabdSBjoern A. Zeeb iqk_info->nb_rxcfir[path] = 1363*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 1364*6d67aabdSBjoern A. Zeeb MASKDWORD) | 0x2; 1365*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1366*6d67aabdSBjoern A. Zeeb "[IQK]S%x, gp = 0x%x, 0x8%x3c = 0x%x\n", path, 1367*6d67aabdSBjoern A. Zeeb g_idx[gp], 1 << path, iqk_info->nb_rxcfir[path]); 1368*6d67aabdSBjoern A. Zeeb 1369*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1370*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1371*6d67aabdSBjoern A. Zeeb 1372*6d67aabdSBjoern A. Zeeb if (iqk_info->is_nbiqk) 1373*6d67aabdSBjoern A. Zeeb break; 1374*6d67aabdSBjoern A. Zeeb 1375*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1376*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 1377*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1378*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1379*6d67aabdSBjoern A. Zeeb } 1380*6d67aabdSBjoern A. Zeeb 1381*6d67aabdSBjoern A. Zeeb if (!notready) 1382*6d67aabdSBjoern A. Zeeb kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 1383*6d67aabdSBjoern A. Zeeb 1384*6d67aabdSBjoern A. Zeeb if (kfail) { 1385*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 0x40000002; 1386*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 1387*6d67aabdSBjoern A. Zeeb B_IQK_RES_RXCFIR, 0x0); 1388*6d67aabdSBjoern A. Zeeb } 1389*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0); 1390*6d67aabdSBjoern A. Zeeb 1391*6d67aabdSBjoern A. Zeeb return kfail; 1392*6d67aabdSBjoern A. Zeeb } 1393*6d67aabdSBjoern A. Zeeb 1394*6d67aabdSBjoern A. Zeeb static bool _iqk_5g_rx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1395*6d67aabdSBjoern A. Zeeb { 1396*6d67aabdSBjoern A. Zeeb static const u32 a_idxrxgain[2] = {0x110, 0x290}; 1397*6d67aabdSBjoern A. Zeeb static const u32 a_idxattc2[2] = {0x0f, 0x0f}; 1398*6d67aabdSBjoern A. Zeeb static const u32 a_idxattc1[2] = {0x2, 0x2}; 1399*6d67aabdSBjoern A. Zeeb static const u32 a_idxrxagc[2] = {0x4, 0x6}; 1400*6d67aabdSBjoern A. Zeeb static const u32 a_idx[2] = {0x0, 0x2}; 1401*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1402*6d67aabdSBjoern A. Zeeb bool notready = false; 1403*6d67aabdSBjoern A. Zeeb bool kfail = false; 1404*6d67aabdSBjoern A. Zeeb u32 rf_18, tmp; 1405*6d67aabdSBjoern A. Zeeb u8 gp; 1406*6d67aabdSBjoern A. Zeeb 1407*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1408*6d67aabdSBjoern A. Zeeb 1409*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 1410*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1); 1411*6d67aabdSBjoern A. Zeeb rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 1412*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18); 1413*6d67aabdSBjoern A. Zeeb 1414*6d67aabdSBjoern A. Zeeb for (gp = 0x0; gp < 0x2; gp++) { 1415*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, a_idxrxgain[gp]); 1416*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, a_idxattc2[gp]); 1417*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, a_idxattc1[gp]); 1418*6d67aabdSBjoern A. Zeeb 1419*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1420*6d67aabdSBjoern A. Zeeb 0x00000100, 0x1); 1421*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1422*6d67aabdSBjoern A. Zeeb 0x00000010, 0x0); 1423*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 1424*6d67aabdSBjoern A. Zeeb 0x00000007, a_idx[gp]); 1425*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 1426*6d67aabdSBjoern A. Zeeb udelay(100); 1427*6d67aabdSBjoern A. Zeeb udelay(100); 1428*6d67aabdSBjoern A. Zeeb 1429*6d67aabdSBjoern A. Zeeb tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 1430*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, tmp); 1431*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[gp]); 1432*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1433*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 1434*6d67aabdSBjoern A. Zeeb 1435*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 1436*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1437*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, rf rxbb = %x\n", path, 1438*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_MOD, 0x003c0)); 1439*6d67aabdSBjoern A. Zeeb 1440*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 1441*6d67aabdSBjoern A. Zeeb udelay(200); 1442*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1443*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 1444*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 1445*6d67aabdSBjoern A. Zeeb iqk_info->nb_rxcfir[path] = 1446*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 1447*6d67aabdSBjoern A. Zeeb MASKDWORD) | 0x2; 1448*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1449*6d67aabdSBjoern A. Zeeb "[IQK]S%x, gp = 0x%x, 0x8%x3c = 0x%x\n", 1450*6d67aabdSBjoern A. Zeeb path, a_idx[gp], 1 << path, iqk_info->nb_rxcfir[path]); 1451*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1452*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1453*6d67aabdSBjoern A. Zeeb 1454*6d67aabdSBjoern A. Zeeb if (iqk_info->is_nbiqk) 1455*6d67aabdSBjoern A. Zeeb break; 1456*6d67aabdSBjoern A. Zeeb 1457*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1458*6d67aabdSBjoern A. Zeeb notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 1459*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1460*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1461*6d67aabdSBjoern A. Zeeb } 1462*6d67aabdSBjoern A. Zeeb 1463*6d67aabdSBjoern A. Zeeb if (!notready) 1464*6d67aabdSBjoern A. Zeeb kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 1465*6d67aabdSBjoern A. Zeeb 1466*6d67aabdSBjoern A. Zeeb if (kfail) { 1467*6d67aabdSBjoern A. Zeeb iqk_info->nb_txcfir[path] = 0x40000002; 1468*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 1469*6d67aabdSBjoern A. Zeeb B_IQK_RES_RXCFIR, 0x0); 1470*6d67aabdSBjoern A. Zeeb } 1471*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0); 1472*6d67aabdSBjoern A. Zeeb 1473*6d67aabdSBjoern A. Zeeb return kfail; 1474*6d67aabdSBjoern A. Zeeb } 1475*6d67aabdSBjoern A. Zeeb 1476*6d67aabdSBjoern A. Zeeb static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1477*6d67aabdSBjoern A. Zeeb { 1478*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1479*6d67aabdSBjoern A. Zeeb bool lok_result = false; 1480*6d67aabdSBjoern A. Zeeb bool txk_result = false; 1481*6d67aabdSBjoern A. Zeeb bool rxk_result = false; 1482*6d67aabdSBjoern A. Zeeb u8 i; 1483*6d67aabdSBjoern A. Zeeb 1484*6d67aabdSBjoern A. Zeeb for (i = 0; i < 3; i++) { 1485*6d67aabdSBjoern A. Zeeb _iqk_txk_setting(rtwdev, path); 1486*6d67aabdSBjoern A. Zeeb if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 1487*6d67aabdSBjoern A. Zeeb lok_result = _iqk_2g_lok(rtwdev, phy_idx, path); 1488*6d67aabdSBjoern A. Zeeb else 1489*6d67aabdSBjoern A. Zeeb lok_result = _iqk_5g_lok(rtwdev, phy_idx, path); 1490*6d67aabdSBjoern A. Zeeb 1491*6d67aabdSBjoern A. Zeeb if (!lok_result) 1492*6d67aabdSBjoern A. Zeeb break; 1493*6d67aabdSBjoern A. Zeeb } 1494*6d67aabdSBjoern A. Zeeb 1495*6d67aabdSBjoern A. Zeeb if (lok_result) { 1496*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1497*6d67aabdSBjoern A. Zeeb "[IQK]!!!!!!!!!!LOK by Pass !!!!!!!!!!!\n"); 1498*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200); 1499*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200); 1500*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LOKVB, RFREG_MASK, 0x80200); 1501*6d67aabdSBjoern A. Zeeb } 1502*6d67aabdSBjoern A. Zeeb 1503*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x08[00:19] = 0x%x\n", 1504*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK)); 1505*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x09[00:19] = 0x%x\n", 1506*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_RSV2, RFREG_MASK)); 1507*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RF_0x0a[00:19] = 0x%x\n", 1508*6d67aabdSBjoern A. Zeeb rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK)); 1509*6d67aabdSBjoern A. Zeeb 1510*6d67aabdSBjoern A. Zeeb if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 1511*6d67aabdSBjoern A. Zeeb txk_result = _iqk_2g_tx(rtwdev, phy_idx, path); 1512*6d67aabdSBjoern A. Zeeb else 1513*6d67aabdSBjoern A. Zeeb txk_result = _iqk_5g_tx(rtwdev, phy_idx, path); 1514*6d67aabdSBjoern A. Zeeb 1515*6d67aabdSBjoern A. Zeeb _iqk_rxclk_setting(rtwdev, path); 1516*6d67aabdSBjoern A. Zeeb _iqk_adc_fifo_rst(rtwdev, phy_idx, path); 1517*6d67aabdSBjoern A. Zeeb 1518*6d67aabdSBjoern A. Zeeb if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 1519*6d67aabdSBjoern A. Zeeb rxk_result = _iqk_2g_rx(rtwdev, phy_idx, path); 1520*6d67aabdSBjoern A. Zeeb else 1521*6d67aabdSBjoern A. Zeeb rxk_result = _iqk_5g_rx(rtwdev, phy_idx, path); 1522*6d67aabdSBjoern A. Zeeb 1523*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1524*6d67aabdSBjoern A. Zeeb "[IQK]result : lok_= %x, txk_= %x, rxk_= %x\n", 1525*6d67aabdSBjoern A. Zeeb lok_result, txk_result, rxk_result); 1526*6d67aabdSBjoern A. Zeeb } 1527*6d67aabdSBjoern A. Zeeb 1528*6d67aabdSBjoern A. Zeeb static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path) 1529*6d67aabdSBjoern A. Zeeb { 1530*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 1531*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1532*6d67aabdSBjoern A. Zeeb u8 get_empty_table = false; 1533*6d67aabdSBjoern A. Zeeb u32 reg_rf18; 1534*6d67aabdSBjoern A. Zeeb u32 reg_35c; 1535*6d67aabdSBjoern A. Zeeb u8 idx; 1536*6d67aabdSBjoern A. Zeeb 1537*6d67aabdSBjoern A. Zeeb for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 1538*6d67aabdSBjoern A. Zeeb if (iqk_info->iqk_mcc_ch[idx][path] == 0) { 1539*6d67aabdSBjoern A. Zeeb get_empty_table = true; 1540*6d67aabdSBjoern A. Zeeb break; 1541*6d67aabdSBjoern A. Zeeb } 1542*6d67aabdSBjoern A. Zeeb } 1543*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx); 1544*6d67aabdSBjoern A. Zeeb 1545*6d67aabdSBjoern A. Zeeb if (!get_empty_table) { 1546*6d67aabdSBjoern A. Zeeb idx = iqk_info->iqk_table_idx[path] + 1; 1547*6d67aabdSBjoern A. Zeeb if (idx > 1) 1548*6d67aabdSBjoern A. Zeeb idx = 0; 1549*6d67aabdSBjoern A. Zeeb } 1550*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx); 1551*6d67aabdSBjoern A. Zeeb 1552*6d67aabdSBjoern A. Zeeb reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 1553*6d67aabdSBjoern A. Zeeb reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN); 1554*6d67aabdSBjoern A. Zeeb 1555*6d67aabdSBjoern A. Zeeb iqk_info->iqk_band[path] = chan->band_type; 1556*6d67aabdSBjoern A. Zeeb iqk_info->iqk_bw[path] = chan->band_width; 1557*6d67aabdSBjoern A. Zeeb iqk_info->iqk_ch[path] = chan->channel; 1558*6d67aabdSBjoern A. Zeeb iqk_info->iqk_mcc_ch[idx][path] = chan->channel; 1559*6d67aabdSBjoern A. Zeeb iqk_info->iqk_table_idx[path] = idx; 1560*6d67aabdSBjoern A. Zeeb 1561*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n", 1562*6d67aabdSBjoern A. Zeeb path, reg_rf18, idx); 1563*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n", 1564*6d67aabdSBjoern A. Zeeb path, reg_rf18); 1565*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x35c= 0x%x\n", 1566*6d67aabdSBjoern A. Zeeb path, reg_35c); 1567*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n", 1568*6d67aabdSBjoern A. Zeeb iqk_info->iqk_times, idx); 1569*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n", 1570*6d67aabdSBjoern A. Zeeb idx, path, iqk_info->iqk_mcc_ch[idx][path]); 1571*6d67aabdSBjoern A. Zeeb } 1572*6d67aabdSBjoern A. Zeeb 1573*6d67aabdSBjoern A. Zeeb static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 1574*6d67aabdSBjoern A. Zeeb { 1575*6d67aabdSBjoern A. Zeeb _iqk_by_path(rtwdev, phy_idx, path); 1576*6d67aabdSBjoern A. Zeeb } 1577*6d67aabdSBjoern A. Zeeb 1578*6d67aabdSBjoern A. Zeeb static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) 1579*6d67aabdSBjoern A. Zeeb { 1580*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1581*6d67aabdSBjoern A. Zeeb 1582*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__); 1583*6d67aabdSBjoern A. Zeeb 1584*6d67aabdSBjoern A. Zeeb if (iqk_info->is_nbiqk) { 1585*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 1586*6d67aabdSBjoern A. Zeeb MASKDWORD, iqk_info->nb_txcfir[path]); 1587*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 1588*6d67aabdSBjoern A. Zeeb MASKDWORD, iqk_info->nb_rxcfir[path]); 1589*6d67aabdSBjoern A. Zeeb } else { 1590*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 1591*6d67aabdSBjoern A. Zeeb MASKDWORD, 0x40000000); 1592*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 1593*6d67aabdSBjoern A. Zeeb MASKDWORD, 0x40000000); 1594*6d67aabdSBjoern A. Zeeb } 1595*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 1596*6d67aabdSBjoern A. Zeeb 0x00000e19 + (path << 4)); 1597*6d67aabdSBjoern A. Zeeb 1598*6d67aabdSBjoern A. Zeeb _iqk_check_cal(rtwdev, path, 0x0); 1599*6d67aabdSBjoern A. Zeeb 1600*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 1601*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 1602*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 1603*6d67aabdSBjoern A. Zeeb 1604*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_CLK, MASKDWORD, 0x0); 1605*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0); 1606*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), BIT(28), 0x0); 1607*6d67aabdSBjoern A. Zeeb 1608*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 1609*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 1610*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3); 1611*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 1612*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 1613*6d67aabdSBjoern A. Zeeb } 1614*6d67aabdSBjoern A. Zeeb 1615*6d67aabdSBjoern A. Zeeb static void _iqk_afebb_restore(struct rtw89_dev *rtwdev, 1616*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx, u8 path) 1617*6d67aabdSBjoern A. Zeeb { 1618*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__); 1619*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); 1620*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 1621*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 1622*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x0); 1623*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_CLKG_FORCE, 0x0); 1624*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x0000000); 1625*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x0); 1626*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x0); 1627*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, 0x0000001f, 0x03); 1628*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, 0x000003e0, 0x03); 1629*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_TXCK_ALL, 0x00); 1630*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_TXCK_ALL, 0x00); 1631*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, 1632*6d67aabdSBjoern A. Zeeb B_UPD_CLK_ADC_VAL | B_UPD_CLK_ADC_ON, 0x0); 1633*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x0); 1634*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x0); 1635*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0000); 1636*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x0); 1637*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x0); 1638*6d67aabdSBjoern A. Zeeb } 1639*6d67aabdSBjoern A. Zeeb 1640*6d67aabdSBjoern A. Zeeb static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) 1641*6d67aabdSBjoern A. Zeeb { 1642*6d67aabdSBjoern A. Zeeb u8 idx = 0; 1643*6d67aabdSBjoern A. Zeeb 1644*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 0x00000001, idx); 1645*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 0x00000008, idx); 1646*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 0x40000000); 1647*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 0x40000000); 1648*6d67aabdSBjoern A. Zeeb 1649*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 1650*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 1651*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 1652*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); 1653*6d67aabdSBjoern A. Zeeb } 1654*6d67aabdSBjoern A. Zeeb 1655*6d67aabdSBjoern A. Zeeb static void _iqk_macbb_setting(struct rtw89_dev *rtwdev, 1656*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx, u8 path) 1657*6d67aabdSBjoern A. Zeeb { 1658*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0303); 1659*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_GOT_TXRX, 0x3); 1660*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_GOT_TXRX, 0x3); 1661*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_ADCFF_EN, B_P0_ADCFF_EN, 0x1); 1662*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_ADCFF_EN, B_P1_ADCFF_EN, 0x1); 1663*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_CLKG_FORCE, 0x3); 1664*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P0_CLKG_FORCE, 0x3); 1665*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXCKEN_FORCE, B_TXCKEN_FORCE_ALL, 0x1ffffff); 1666*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_FAHM, B_RXTD_CKEN, 0x1); 1667*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_GEN_ON, 0x1); 1668*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TX_COLLISION_T2R_ST, B_TXRX_FORCE_VAL, 0x3ff); 1669*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_CLKEN, 0x3); 1670*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DPK_RST, B_IQK_DPK_RST, 0x1); 1671*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_PATH_RST, B_P0_PATH_RST, 0x1); 1672*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_PATH_RST, B_P1_PATH_RST, 0x1); 1673*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_PD_CTRL, B_PD_HIT_DIS, 0x1); 1674*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXCCA, B_RXCCA_DIS, 0x1); 1675*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DCFO_WEIGHT, B_DAC_CLK_IDX, 0x1); 1676*6d67aabdSBjoern A. Zeeb 1677*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_A, true, DAC_960M); 1678*6d67aabdSBjoern A. Zeeb _txck_force(rtwdev, RF_PATH_B, true, DAC_960M); 1679*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_A, true, ADC_1920M); 1680*6d67aabdSBjoern A. Zeeb _rxck_force(rtwdev, RF_PATH_B, true, ADC_1920M); 1681*6d67aabdSBjoern A. Zeeb 1682*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1); 1683*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x2); 1684*6d67aabdSBjoern A. Zeeb 1685*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 1686*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 1687*6d67aabdSBjoern A. Zeeb udelay(10); 1688*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); 1689*6d67aabdSBjoern A. Zeeb udelay(10); 1690*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); 1691*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001); 1692*6d67aabdSBjoern A. Zeeb udelay(10); 1693*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); 1694*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_RSTB, 0x1); 1695*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x3333); 1696*6d67aabdSBjoern A. Zeeb } 1697*6d67aabdSBjoern A. Zeeb 1698*6d67aabdSBjoern A. Zeeb static void _iqk_init(struct rtw89_dev *rtwdev) 1699*6d67aabdSBjoern A. Zeeb { 1700*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1701*6d67aabdSBjoern A. Zeeb u8 idx, path; 1702*6d67aabdSBjoern A. Zeeb 1703*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0); 1704*6d67aabdSBjoern A. Zeeb 1705*6d67aabdSBjoern A. Zeeb if (iqk_info->is_iqk_init) 1706*6d67aabdSBjoern A. Zeeb return; 1707*6d67aabdSBjoern A. Zeeb 1708*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 1709*6d67aabdSBjoern A. Zeeb iqk_info->is_iqk_init = true; 1710*6d67aabdSBjoern A. Zeeb iqk_info->is_nbiqk = false; 1711*6d67aabdSBjoern A. Zeeb iqk_info->iqk_fft_en = false; 1712*6d67aabdSBjoern A. Zeeb iqk_info->iqk_sram_en = false; 1713*6d67aabdSBjoern A. Zeeb iqk_info->iqk_cfir_en = false; 1714*6d67aabdSBjoern A. Zeeb iqk_info->iqk_xym_en = false; 1715*6d67aabdSBjoern A. Zeeb iqk_info->iqk_times = 0x0; 1716*6d67aabdSBjoern A. Zeeb 1717*6d67aabdSBjoern A. Zeeb for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 1718*6d67aabdSBjoern A. Zeeb iqk_info->iqk_channel[idx] = 0x0; 1719*6d67aabdSBjoern A. Zeeb for (path = 0; path < RTW8852BT_SS; path++) { 1720*6d67aabdSBjoern A. Zeeb iqk_info->lok_cor_fail[idx][path] = false; 1721*6d67aabdSBjoern A. Zeeb iqk_info->lok_fin_fail[idx][path] = false; 1722*6d67aabdSBjoern A. Zeeb iqk_info->iqk_tx_fail[idx][path] = false; 1723*6d67aabdSBjoern A. Zeeb iqk_info->iqk_rx_fail[idx][path] = false; 1724*6d67aabdSBjoern A. Zeeb iqk_info->iqk_mcc_ch[idx][path] = 0x0; 1725*6d67aabdSBjoern A. Zeeb iqk_info->iqk_table_idx[path] = 0x0; 1726*6d67aabdSBjoern A. Zeeb } 1727*6d67aabdSBjoern A. Zeeb } 1728*6d67aabdSBjoern A. Zeeb } 1729*6d67aabdSBjoern A. Zeeb 1730*6d67aabdSBjoern A. Zeeb static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) 1731*6d67aabdSBjoern A. Zeeb { 1732*6d67aabdSBjoern A. Zeeb u32 rf_mode; 1733*6d67aabdSBjoern A. Zeeb u8 path; 1734*6d67aabdSBjoern A. Zeeb int ret; 1735*6d67aabdSBjoern A. Zeeb 1736*6d67aabdSBjoern A. Zeeb for (path = 0; path < RF_PATH_MAX; path++) { 1737*6d67aabdSBjoern A. Zeeb if (!(kpath & BIT(path))) 1738*6d67aabdSBjoern A. Zeeb continue; 1739*6d67aabdSBjoern A. Zeeb 1740*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, 1741*6d67aabdSBjoern A. Zeeb rf_mode != 2, 2, 5000, false, 1742*6d67aabdSBjoern A. Zeeb rtwdev, path, RR_MOD, RR_MOD_MASK); 1743*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1744*6d67aabdSBjoern A. Zeeb "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret); 1745*6d67aabdSBjoern A. Zeeb } 1746*6d67aabdSBjoern A. Zeeb } 1747*6d67aabdSBjoern A. Zeeb 1748*6d67aabdSBjoern A. Zeeb static void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx, 1749*6d67aabdSBjoern A. Zeeb bool is_pause) 1750*6d67aabdSBjoern A. Zeeb { 1751*6d67aabdSBjoern A. Zeeb if (!is_pause) 1752*6d67aabdSBjoern A. Zeeb return; 1753*6d67aabdSBjoern A. Zeeb 1754*6d67aabdSBjoern A. Zeeb _wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx)); 1755*6d67aabdSBjoern A. Zeeb } 1756*6d67aabdSBjoern A. Zeeb 1757*6d67aabdSBjoern A. Zeeb static void _doiqk(struct rtw89_dev *rtwdev, bool force, 1758*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx, u8 path) 1759*6d67aabdSBjoern A. Zeeb { 1760*6d67aabdSBjoern A. Zeeb struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 1761*6d67aabdSBjoern A. Zeeb u32 backup_bb_val[BACKUP_BB_REGS_NR]; 1762*6d67aabdSBjoern A. Zeeb u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR]; 1763*6d67aabdSBjoern A. Zeeb u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); 1764*6d67aabdSBjoern A. Zeeb 1765*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 1766*6d67aabdSBjoern A. Zeeb 1767*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1768*6d67aabdSBjoern A. Zeeb "[IQK]==========IQK start!!!!!==========\n"); 1769*6d67aabdSBjoern A. Zeeb iqk_info->iqk_times++; 1770*6d67aabdSBjoern A. Zeeb iqk_info->version = RTW8852BT_IQK_VER; 1771*6d67aabdSBjoern A. Zeeb 1772*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); 1773*6d67aabdSBjoern A. Zeeb _iqk_get_ch_info(rtwdev, phy_idx, path); 1774*6d67aabdSBjoern A. Zeeb 1775*6d67aabdSBjoern A. Zeeb _rfk_backup_bb_reg(rtwdev, backup_bb_val); 1776*6d67aabdSBjoern A. Zeeb _rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path); 1777*6d67aabdSBjoern A. Zeeb _iqk_macbb_setting(rtwdev, phy_idx, path); 1778*6d67aabdSBjoern A. Zeeb _iqk_preset(rtwdev, path); 1779*6d67aabdSBjoern A. Zeeb _iqk_start_iqk(rtwdev, phy_idx, path); 1780*6d67aabdSBjoern A. Zeeb _iqk_restore(rtwdev, path); 1781*6d67aabdSBjoern A. Zeeb _iqk_afebb_restore(rtwdev, phy_idx, path); 1782*6d67aabdSBjoern A. Zeeb _rfk_reload_bb_reg(rtwdev, backup_bb_val); 1783*6d67aabdSBjoern A. Zeeb _rfk_reload_rf_reg(rtwdev, backup_rf_val[path], path); 1784*6d67aabdSBjoern A. Zeeb 1785*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 1786*6d67aabdSBjoern A. Zeeb } 1787*6d67aabdSBjoern A. Zeeb 1788*6d67aabdSBjoern A. Zeeb static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) 1789*6d67aabdSBjoern A. Zeeb { 1790*6d67aabdSBjoern A. Zeeb u8 kpath = _kpath(rtwdev, phy_idx); 1791*6d67aabdSBjoern A. Zeeb 1792*6d67aabdSBjoern A. Zeeb switch (kpath) { 1793*6d67aabdSBjoern A. Zeeb case RF_A: 1794*6d67aabdSBjoern A. Zeeb _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 1795*6d67aabdSBjoern A. Zeeb break; 1796*6d67aabdSBjoern A. Zeeb case RF_B: 1797*6d67aabdSBjoern A. Zeeb _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 1798*6d67aabdSBjoern A. Zeeb break; 1799*6d67aabdSBjoern A. Zeeb case RF_AB: 1800*6d67aabdSBjoern A. Zeeb _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 1801*6d67aabdSBjoern A. Zeeb _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 1802*6d67aabdSBjoern A. Zeeb break; 1803*6d67aabdSBjoern A. Zeeb default: 1804*6d67aabdSBjoern A. Zeeb break; 1805*6d67aabdSBjoern A. Zeeb } 1806*6d67aabdSBjoern A. Zeeb } 1807*6d67aabdSBjoern A. Zeeb 1808*6d67aabdSBjoern A. Zeeb static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off) 1809*6d67aabdSBjoern A. Zeeb { 1810*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 1811*6d67aabdSBjoern A. Zeeb u8 val, kidx = dpk->cur_idx[path]; 1812*6d67aabdSBjoern A. Zeeb bool off_reverse; 1813*6d67aabdSBjoern A. Zeeb 1814*6d67aabdSBjoern A. Zeeb val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok; 1815*6d67aabdSBjoern A. Zeeb 1816*6d67aabdSBjoern A. Zeeb if (off) 1817*6d67aabdSBjoern A. Zeeb off_reverse = false; 1818*6d67aabdSBjoern A. Zeeb else 1819*6d67aabdSBjoern A. Zeeb off_reverse = true; 1820*6d67aabdSBjoern A. Zeeb 1821*6d67aabdSBjoern A. Zeeb val = dpk->is_dpk_enable & off_reverse & dpk->bp[path][kidx].path_ok; 1822*6d67aabdSBjoern A. Zeeb 1823*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 1824*6d67aabdSBjoern A. Zeeb BIT(24), val); 1825*6d67aabdSBjoern A. Zeeb 1826*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, 1827*6d67aabdSBjoern A. Zeeb kidx, dpk->is_dpk_enable & off_reverse ? "enable" : "disable"); 1828*6d67aabdSBjoern A. Zeeb } 1829*6d67aabdSBjoern A. Zeeb 1830*6d67aabdSBjoern A. Zeeb static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 1831*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, enum rtw8852bt_dpk_id id) 1832*6d67aabdSBjoern A. Zeeb { 1833*6d67aabdSBjoern A. Zeeb u16 dpk_cmd; 1834*6d67aabdSBjoern A. Zeeb u32 val; 1835*6d67aabdSBjoern A. Zeeb int ret; 1836*6d67aabdSBjoern A. Zeeb 1837*6d67aabdSBjoern A. Zeeb dpk_cmd = (id << 8) | (0x19 + (path << 4)); 1838*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); 1839*6d67aabdSBjoern A. Zeeb 1840*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 1841*6d67aabdSBjoern A. Zeeb 1, 30000, false, 1842*6d67aabdSBjoern A. Zeeb rtwdev, R_RFK_ST, MASKBYTE0); 1843*6d67aabdSBjoern A. Zeeb if (ret) 1844*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 1 over 30ms!!!!\n"); 1845*6d67aabdSBjoern A. Zeeb 1846*6d67aabdSBjoern A. Zeeb udelay(1); 1847*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000); 1848*6d67aabdSBjoern A. Zeeb 1849*6d67aabdSBjoern A. Zeeb ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, 1850*6d67aabdSBjoern A. Zeeb 1, 2000, false, 1851*6d67aabdSBjoern A. Zeeb rtwdev, R_RPT_COM, MASKLWORD); 1852*6d67aabdSBjoern A. Zeeb if (ret) 1853*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 2 over 2ms!!!!\n"); 1854*6d67aabdSBjoern A. Zeeb 1855*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 1856*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1857*6d67aabdSBjoern A. Zeeb "[DPK] one-shot for %s = 0x%04x\n", 1858*6d67aabdSBjoern A. Zeeb id == 0x06 ? "LBK_RXIQK" : 1859*6d67aabdSBjoern A. Zeeb id == 0x10 ? "SYNC" : 1860*6d67aabdSBjoern A. Zeeb id == 0x11 ? "MDPK_IDL" : 1861*6d67aabdSBjoern A. Zeeb id == 0x12 ? "MDPK_MPA" : 1862*6d67aabdSBjoern A. Zeeb id == 0x13 ? "GAIN_LOSS" : 1863*6d67aabdSBjoern A. Zeeb id == 0x14 ? "PWR_CAL" : 1864*6d67aabdSBjoern A. Zeeb id == 0x15 ? "DPK_RXAGC" : 1865*6d67aabdSBjoern A. Zeeb id == 0x16 ? "KIP_PRESET" : 1866*6d67aabdSBjoern A. Zeeb id == 0x17 ? "KIP_RESOTRE" : 1867*6d67aabdSBjoern A. Zeeb "DPK_TXAGC", dpk_cmd); 1868*6d67aabdSBjoern A. Zeeb } 1869*6d67aabdSBjoern A. Zeeb 1870*6d67aabdSBjoern A. Zeeb static void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 1871*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 1872*6d67aabdSBjoern A. Zeeb { 1873*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 1874*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 1875*6d67aabdSBjoern A. Zeeb 1876*6d67aabdSBjoern A. Zeeb udelay(600); 1877*6d67aabdSBjoern A. Zeeb 1878*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d RXDCK\n", path); 1879*6d67aabdSBjoern A. Zeeb } 1880*6d67aabdSBjoern A. Zeeb 1881*6d67aabdSBjoern A. Zeeb static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 1882*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 1883*6d67aabdSBjoern A. Zeeb { 1884*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 1885*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 1886*6d67aabdSBjoern A. Zeeb 1887*6d67aabdSBjoern A. Zeeb u8 kidx = dpk->cur_idx[path]; 1888*6d67aabdSBjoern A. Zeeb 1889*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].band = chan->band_type; 1890*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].ch = chan->channel; 1891*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].bw = chan->band_width; 1892*6d67aabdSBjoern A. Zeeb 1893*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 1894*6d67aabdSBjoern A. Zeeb "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", 1895*6d67aabdSBjoern A. Zeeb path, dpk->cur_idx[path], phy, 1896*6d67aabdSBjoern A. Zeeb rtwdev->is_tssi_mode[path] ? "on" : "off", 1897*6d67aabdSBjoern A. Zeeb rtwdev->dbcc_en ? "on" : "off", 1898*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].band == 0 ? "2G" : 1899*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].band == 1 ? "5G" : "6G", 1900*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].ch, 1901*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].bw == 0 ? "20M" : 1902*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].bw == 1 ? "40M" : "80M"); 1903*6d67aabdSBjoern A. Zeeb } 1904*6d67aabdSBjoern A. Zeeb 1905*6d67aabdSBjoern A. Zeeb static void _dpk_tssi_pause(struct rtw89_dev *rtwdev, 1906*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, bool is_pause) 1907*6d67aabdSBjoern A. Zeeb { 1908*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 1909*6d67aabdSBjoern A. Zeeb B_P0_TSSI_TRK_EN, is_pause); 1910*6d67aabdSBjoern A. Zeeb 1911*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, 1912*6d67aabdSBjoern A. Zeeb is_pause ? "pause" : "resume"); 1913*6d67aabdSBjoern A. Zeeb } 1914*6d67aabdSBjoern A. Zeeb 1915*6d67aabdSBjoern A. Zeeb static void _dpk_kip_restore(struct rtw89_dev *rtwdev, 1916*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 1917*6d67aabdSBjoern A. Zeeb { 1918*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 1919*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 1920*6d67aabdSBjoern A. Zeeb 1921*6d67aabdSBjoern A. Zeeb if (rtwdev->hal.cv > CHIP_CAV) 1922*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), 1923*6d67aabdSBjoern A. Zeeb B_DPD_COM_OF, 0x1); 1924*6d67aabdSBjoern A. Zeeb 1925*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); 1926*6d67aabdSBjoern A. Zeeb } 1927*6d67aabdSBjoern A. Zeeb 1928*6d67aabdSBjoern A. Zeeb static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 1929*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 cur_rxbb, u32 rf_18) 1930*6d67aabdSBjoern A. Zeeb { 1931*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1); 1932*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0); 1933*6d67aabdSBjoern A. Zeeb 1934*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, rf_18); 1935*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd); 1936*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1); 1937*6d67aabdSBjoern A. Zeeb 1938*6d67aabdSBjoern A. Zeeb if (cur_rxbb >= 0x11) 1939*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13); 1940*6d67aabdSBjoern A. Zeeb else if (cur_rxbb <= 0xa) 1941*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00); 1942*6d67aabdSBjoern A. Zeeb else 1943*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05); 1944*6d67aabdSBjoern A. Zeeb 1945*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0); 1946*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 1947*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014); 1948*6d67aabdSBjoern A. Zeeb 1949*6d67aabdSBjoern A. Zeeb udelay(100); 1950*6d67aabdSBjoern A. Zeeb 1951*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 1952*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025); 1953*6d67aabdSBjoern A. Zeeb 1954*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); 1955*6d67aabdSBjoern A. Zeeb 1956*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 1957*6d67aabdSBjoern A. Zeeb 1958*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0); 1959*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0); 1960*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0); 1961*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1); 1962*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5); 1963*6d67aabdSBjoern A. Zeeb } 1964*6d67aabdSBjoern A. Zeeb 1965*6d67aabdSBjoern A. Zeeb static void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain, 1966*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx) 1967*6d67aabdSBjoern A. Zeeb { 1968*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 1969*6d67aabdSBjoern A. Zeeb 1970*6d67aabdSBjoern A. Zeeb if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { 1971*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); 1972*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2); 1973*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 1974*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 1975*6d67aabdSBjoern A. Zeeb } else { 1976*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); 1977*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5); 1978*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 1979*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 1980*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC); 1981*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0); 1982*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800); 1983*6d67aabdSBjoern A. Zeeb } 1984*6d67aabdSBjoern A. Zeeb 1985*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1); 1986*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1); 1987*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0); 1988*6d67aabdSBjoern A. Zeeb } 1989*6d67aabdSBjoern A. Zeeb 1990*6d67aabdSBjoern A. Zeeb static void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev, 1991*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, bool is_bypass) 1992*6d67aabdSBjoern A. Zeeb { 1993*6d67aabdSBjoern A. Zeeb if (is_bypass) { 1994*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 1995*6d67aabdSBjoern A. Zeeb B_RXIQC_BYPASS2, 0x1); 1996*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 1997*6d67aabdSBjoern A. Zeeb B_RXIQC_BYPASS, 0x1); 1998*6d67aabdSBjoern A. Zeeb } else { 1999*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 2000*6d67aabdSBjoern A. Zeeb B_RXIQC_BYPASS2, 0x0); 2001*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 2002*6d67aabdSBjoern A. Zeeb B_RXIQC_BYPASS, 0x0); 2003*6d67aabdSBjoern A. Zeeb } 2004*6d67aabdSBjoern A. Zeeb } 2005*6d67aabdSBjoern A. Zeeb 2006*6d67aabdSBjoern A. Zeeb static 2007*6d67aabdSBjoern A. Zeeb void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 2008*6d67aabdSBjoern A. Zeeb { 2009*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2010*6d67aabdSBjoern A. Zeeb 2011*6d67aabdSBjoern A. Zeeb if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) 2012*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x0); 2013*6d67aabdSBjoern A. Zeeb else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) 2014*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); 2015*6d67aabdSBjoern A. Zeeb else 2016*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); 2017*6d67aabdSBjoern A. Zeeb 2018*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n", 2019*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : 2020*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); 2021*6d67aabdSBjoern A. Zeeb } 2022*6d67aabdSBjoern A. Zeeb 2023*6d67aabdSBjoern A. Zeeb static void _dpk_table_select(struct rtw89_dev *rtwdev, 2024*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx, u8 gain) 2025*6d67aabdSBjoern A. Zeeb { 2026*6d67aabdSBjoern A. Zeeb u8 val; 2027*6d67aabdSBjoern A. Zeeb 2028*6d67aabdSBjoern A. Zeeb val = 0x80 + kidx * 0x20 + gain * 0x10; 2029*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val); 2030*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2031*6d67aabdSBjoern A. Zeeb "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx, 2032*6d67aabdSBjoern A. Zeeb gain, val); 2033*6d67aabdSBjoern A. Zeeb } 2034*6d67aabdSBjoern A. Zeeb 2035*6d67aabdSBjoern A. Zeeb static bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 2036*6d67aabdSBjoern A. Zeeb { 2037*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_DC_I 200 2038*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_DC_Q 200 2039*6d67aabdSBjoern A. Zeeb #define DPK_SYNC_TH_CORR 170 2040*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2041*6d67aabdSBjoern A. Zeeb u8 corr_val, corr_idx; 2042*6d67aabdSBjoern A. Zeeb u16 dc_i, dc_q; 2043*6d67aabdSBjoern A. Zeeb u32 corr, dc; 2044*6d67aabdSBjoern A. Zeeb 2045*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 2046*6d67aabdSBjoern A. Zeeb 2047*6d67aabdSBjoern A. Zeeb corr = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 2048*6d67aabdSBjoern A. Zeeb corr_idx = u32_get_bits(corr, B_PRT_COM_CORI); 2049*6d67aabdSBjoern A. Zeeb corr_val = u32_get_bits(corr, B_PRT_COM_CORV); 2050*6d67aabdSBjoern A. Zeeb 2051*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2052*6d67aabdSBjoern A. Zeeb "[DPK] S%d Corr_idx / Corr_val = %d / %d\n", 2053*6d67aabdSBjoern A. Zeeb path, corr_idx, corr_val); 2054*6d67aabdSBjoern A. Zeeb 2055*6d67aabdSBjoern A. Zeeb dpk->corr_idx[path][kidx] = corr_idx; 2056*6d67aabdSBjoern A. Zeeb dpk->corr_val[path][kidx] = corr_val; 2057*6d67aabdSBjoern A. Zeeb 2058*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); 2059*6d67aabdSBjoern A. Zeeb 2060*6d67aabdSBjoern A. Zeeb dc = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 2061*6d67aabdSBjoern A. Zeeb dc_i = u32_get_bits(dc, B_PRT_COM_DCI); 2062*6d67aabdSBjoern A. Zeeb dc_q = u32_get_bits(dc, B_PRT_COM_DCQ); 2063*6d67aabdSBjoern A. Zeeb 2064*6d67aabdSBjoern A. Zeeb dc_i = abs(sign_extend32(dc_i, 11)); 2065*6d67aabdSBjoern A. Zeeb dc_q = abs(sign_extend32(dc_q, 11)); 2066*6d67aabdSBjoern A. Zeeb 2067*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n", 2068*6d67aabdSBjoern A. Zeeb path, dc_i, dc_q); 2069*6d67aabdSBjoern A. Zeeb 2070*6d67aabdSBjoern A. Zeeb dpk->dc_i[path][kidx] = dc_i; 2071*6d67aabdSBjoern A. Zeeb dpk->dc_q[path][kidx] = dc_q; 2072*6d67aabdSBjoern A. Zeeb 2073*6d67aabdSBjoern A. Zeeb if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q || 2074*6d67aabdSBjoern A. Zeeb corr_val < DPK_SYNC_TH_CORR) 2075*6d67aabdSBjoern A. Zeeb return true; 2076*6d67aabdSBjoern A. Zeeb else 2077*6d67aabdSBjoern A. Zeeb return false; 2078*6d67aabdSBjoern A. Zeeb } 2079*6d67aabdSBjoern A. Zeeb 2080*6d67aabdSBjoern A. Zeeb static void _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2081*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx) 2082*6d67aabdSBjoern A. Zeeb { 2083*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, SYNC); 2084*6d67aabdSBjoern A. Zeeb } 2085*6d67aabdSBjoern A. Zeeb 2086*6d67aabdSBjoern A. Zeeb static u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) 2087*6d67aabdSBjoern A. Zeeb { 2088*6d67aabdSBjoern A. Zeeb u16 dgain; 2089*6d67aabdSBjoern A. Zeeb 2090*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 2091*6d67aabdSBjoern A. Zeeb 2092*6d67aabdSBjoern A. Zeeb dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 2093*6d67aabdSBjoern A. Zeeb 2094*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain); 2095*6d67aabdSBjoern A. Zeeb 2096*6d67aabdSBjoern A. Zeeb return dgain; 2097*6d67aabdSBjoern A. Zeeb } 2098*6d67aabdSBjoern A. Zeeb 2099*6d67aabdSBjoern A. Zeeb static s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain) 2100*6d67aabdSBjoern A. Zeeb { 2101*6d67aabdSBjoern A. Zeeb static const u16 bnd[15] = { 2102*6d67aabdSBjoern A. Zeeb 0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556, 2103*6d67aabdSBjoern A. Zeeb 0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220 2104*6d67aabdSBjoern A. Zeeb }; 2105*6d67aabdSBjoern A. Zeeb s8 offset; 2106*6d67aabdSBjoern A. Zeeb 2107*6d67aabdSBjoern A. Zeeb if (dgain >= bnd[0]) 2108*6d67aabdSBjoern A. Zeeb offset = 0x6; 2109*6d67aabdSBjoern A. Zeeb else if (bnd[0] > dgain && dgain >= bnd[1]) 2110*6d67aabdSBjoern A. Zeeb offset = 0x6; 2111*6d67aabdSBjoern A. Zeeb else if (bnd[1] > dgain && dgain >= bnd[2]) 2112*6d67aabdSBjoern A. Zeeb offset = 0x5; 2113*6d67aabdSBjoern A. Zeeb else if (bnd[2] > dgain && dgain >= bnd[3]) 2114*6d67aabdSBjoern A. Zeeb offset = 0x4; 2115*6d67aabdSBjoern A. Zeeb else if (bnd[3] > dgain && dgain >= bnd[4]) 2116*6d67aabdSBjoern A. Zeeb offset = 0x3; 2117*6d67aabdSBjoern A. Zeeb else if (bnd[4] > dgain && dgain >= bnd[5]) 2118*6d67aabdSBjoern A. Zeeb offset = 0x2; 2119*6d67aabdSBjoern A. Zeeb else if (bnd[5] > dgain && dgain >= bnd[6]) 2120*6d67aabdSBjoern A. Zeeb offset = 0x1; 2121*6d67aabdSBjoern A. Zeeb else if (bnd[6] > dgain && dgain >= bnd[7]) 2122*6d67aabdSBjoern A. Zeeb offset = 0x0; 2123*6d67aabdSBjoern A. Zeeb else if (bnd[7] > dgain && dgain >= bnd[8]) 2124*6d67aabdSBjoern A. Zeeb offset = 0xff; 2125*6d67aabdSBjoern A. Zeeb else if (bnd[8] > dgain && dgain >= bnd[9]) 2126*6d67aabdSBjoern A. Zeeb offset = 0xfe; 2127*6d67aabdSBjoern A. Zeeb else if (bnd[9] > dgain && dgain >= bnd[10]) 2128*6d67aabdSBjoern A. Zeeb offset = 0xfd; 2129*6d67aabdSBjoern A. Zeeb else if (bnd[10] > dgain && dgain >= bnd[11]) 2130*6d67aabdSBjoern A. Zeeb offset = 0xfc; 2131*6d67aabdSBjoern A. Zeeb else if (bnd[11] > dgain && dgain >= bnd[12]) 2132*6d67aabdSBjoern A. Zeeb offset = 0xfb; 2133*6d67aabdSBjoern A. Zeeb else if (bnd[12] > dgain && dgain >= bnd[13]) 2134*6d67aabdSBjoern A. Zeeb offset = 0xfa; 2135*6d67aabdSBjoern A. Zeeb else if (bnd[13] > dgain && dgain >= bnd[14]) 2136*6d67aabdSBjoern A. Zeeb offset = 0xf9; 2137*6d67aabdSBjoern A. Zeeb else if (bnd[14] > dgain) 2138*6d67aabdSBjoern A. Zeeb offset = 0xf8; 2139*6d67aabdSBjoern A. Zeeb else 2140*6d67aabdSBjoern A. Zeeb offset = 0x0; 2141*6d67aabdSBjoern A. Zeeb 2142*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset); 2143*6d67aabdSBjoern A. Zeeb 2144*6d67aabdSBjoern A. Zeeb return offset; 2145*6d67aabdSBjoern A. Zeeb } 2146*6d67aabdSBjoern A. Zeeb 2147*6d67aabdSBjoern A. Zeeb static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) 2148*6d67aabdSBjoern A. Zeeb { 2149*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 2150*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 2151*6d67aabdSBjoern A. Zeeb 2152*6d67aabdSBjoern A. Zeeb return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); 2153*6d67aabdSBjoern A. Zeeb } 2154*6d67aabdSBjoern A. Zeeb 2155*6d67aabdSBjoern A. Zeeb static void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2156*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx) 2157*6d67aabdSBjoern A. Zeeb { 2158*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, GAIN_LOSS); 2159*6d67aabdSBjoern A. Zeeb 2160*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 2161*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 2162*6d67aabdSBjoern A. Zeeb } 2163*6d67aabdSBjoern A. Zeeb 2164*6d67aabdSBjoern A. Zeeb static void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2165*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx) 2166*6d67aabdSBjoern A. Zeeb { 2167*6d67aabdSBjoern A. Zeeb _dpk_tpg_sel(rtwdev, path, kidx); 2168*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, KIP_PRESET); 2169*6d67aabdSBjoern A. Zeeb } 2170*6d67aabdSBjoern A. Zeeb 2171*6d67aabdSBjoern A. Zeeb static void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev, 2172*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2173*6d67aabdSBjoern A. Zeeb { 2174*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 2175*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a); 2176*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08); 2177*6d67aabdSBjoern A. Zeeb 2178*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n"); 2179*6d67aabdSBjoern A. Zeeb } 2180*6d67aabdSBjoern A. Zeeb 2181*6d67aabdSBjoern A. Zeeb static 2182*6d67aabdSBjoern A. Zeeb u8 _dpk_txagc_check_8852bt(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 txagc) 2183*6d67aabdSBjoern A. Zeeb { 2184*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2185*6d67aabdSBjoern A. Zeeb 2186*6d67aabdSBjoern A. Zeeb if (txagc >= dpk->max_dpk_txagc[path]) 2187*6d67aabdSBjoern A. Zeeb txagc = dpk->max_dpk_txagc[path]; 2188*6d67aabdSBjoern A. Zeeb 2189*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set TxAGC = 0x%x\n", txagc); 2190*6d67aabdSBjoern A. Zeeb 2191*6d67aabdSBjoern A. Zeeb return txagc; 2192*6d67aabdSBjoern A. Zeeb } 2193*6d67aabdSBjoern A. Zeeb 2194*6d67aabdSBjoern A. Zeeb static void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2195*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 txagc) 2196*6d67aabdSBjoern A. Zeeb { 2197*6d67aabdSBjoern A. Zeeb u8 val; 2198*6d67aabdSBjoern A. Zeeb 2199*6d67aabdSBjoern A. Zeeb val = _dpk_txagc_check_8852bt(rtwdev, path, txagc); 2200*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, val); 2201*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 2202*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, DPK_TXAGC); 2203*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 2204*6d67aabdSBjoern A. Zeeb 2205*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc); 2206*6d67aabdSBjoern A. Zeeb } 2207*6d67aabdSBjoern A. Zeeb 2208*6d67aabdSBjoern A. Zeeb static void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2209*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2210*6d67aabdSBjoern A. Zeeb { 2211*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 0x50220); 2212*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 2213*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, DPK_RXAGC); 2214*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 2215*6d67aabdSBjoern A. Zeeb } 2216*6d67aabdSBjoern A. Zeeb 2217*6d67aabdSBjoern A. Zeeb static u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2218*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 txagc, s8 gain_offset) 2219*6d67aabdSBjoern A. Zeeb { 2220*6d67aabdSBjoern A. Zeeb txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK); 2221*6d67aabdSBjoern A. Zeeb 2222*6d67aabdSBjoern A. Zeeb if ((txagc - gain_offset) < DPK_TXAGC_LOWER) 2223*6d67aabdSBjoern A. Zeeb txagc = DPK_TXAGC_LOWER; 2224*6d67aabdSBjoern A. Zeeb else if ((txagc - gain_offset) > DPK_TXAGC_UPPER) 2225*6d67aabdSBjoern A. Zeeb txagc = DPK_TXAGC_UPPER; 2226*6d67aabdSBjoern A. Zeeb else 2227*6d67aabdSBjoern A. Zeeb txagc = txagc - gain_offset; 2228*6d67aabdSBjoern A. Zeeb 2229*6d67aabdSBjoern A. Zeeb _dpk_kip_set_txagc(rtwdev, phy, path, txagc); 2230*6d67aabdSBjoern A. Zeeb 2231*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n", 2232*6d67aabdSBjoern A. Zeeb gain_offset, txagc); 2233*6d67aabdSBjoern A. Zeeb return txagc; 2234*6d67aabdSBjoern A. Zeeb } 2235*6d67aabdSBjoern A. Zeeb 2236*6d67aabdSBjoern A. Zeeb static bool _dpk_pas_read(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 2237*6d67aabdSBjoern A. Zeeb u8 is_check) 2238*6d67aabdSBjoern A. Zeeb { 2239*6d67aabdSBjoern A. Zeeb u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 2240*6d67aabdSBjoern A. Zeeb u8 i; 2241*6d67aabdSBjoern A. Zeeb 2242*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); 2243*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0); 2244*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08); 2245*6d67aabdSBjoern A. Zeeb 2246*6d67aabdSBjoern A. Zeeb if (is_check) { 2247*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); 2248*6d67aabdSBjoern A. Zeeb val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 2249*6d67aabdSBjoern A. Zeeb val1_i = abs(sign_extend32(val1_i, 11)); 2250*6d67aabdSBjoern A. Zeeb val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 2251*6d67aabdSBjoern A. Zeeb val1_q = abs(sign_extend32(val1_q, 11)); 2252*6d67aabdSBjoern A. Zeeb 2253*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); 2254*6d67aabdSBjoern A. Zeeb val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 2255*6d67aabdSBjoern A. Zeeb val2_i = abs(sign_extend32(val2_i, 11)); 2256*6d67aabdSBjoern A. Zeeb val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 2257*6d67aabdSBjoern A. Zeeb val2_q = abs(sign_extend32(val2_q, 11)); 2258*6d67aabdSBjoern A. Zeeb 2259*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", 2260*6d67aabdSBjoern A. Zeeb phy_div(val1_i * val1_i + val1_q * val1_q, 2261*6d67aabdSBjoern A. Zeeb val2_i * val2_i + val2_q * val2_q)); 2262*6d67aabdSBjoern A. Zeeb } else { 2263*6d67aabdSBjoern A. Zeeb for (i = 0; i < 32; i++) { 2264*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); 2265*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2266*6d67aabdSBjoern A. Zeeb "[DPK] PAS_Read[%02d]= 0x%08x\n", i, 2267*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 2268*6d67aabdSBjoern A. Zeeb } 2269*6d67aabdSBjoern A. Zeeb } 2270*6d67aabdSBjoern A. Zeeb 2271*6d67aabdSBjoern A. Zeeb if (val1_i * val1_i + val1_q * val1_q >= 2272*6d67aabdSBjoern A. Zeeb (val2_i * val2_i + val2_q * val2_q) * 8 / 5) 2273*6d67aabdSBjoern A. Zeeb return true; 2274*6d67aabdSBjoern A. Zeeb 2275*6d67aabdSBjoern A. Zeeb return false; 2276*6d67aabdSBjoern A. Zeeb } 2277*6d67aabdSBjoern A. Zeeb 2278*6d67aabdSBjoern A. Zeeb static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2279*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx, u8 init_txagc, 2280*6d67aabdSBjoern A. Zeeb bool loss_only) 2281*6d67aabdSBjoern A. Zeeb { 2282*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2283*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2284*6d67aabdSBjoern A. Zeeb u8 goout = 0, agc_cnt = 0, limited_rxbb = 0, gl_cnt = 0; 2285*6d67aabdSBjoern A. Zeeb u8 tmp_txagc, tmp_rxbb, tmp_gl_idx = 0; 2286*6d67aabdSBjoern A. Zeeb u8 step = DPK_AGC_STEP_SYNC_DGAIN; 2287*6d67aabdSBjoern A. Zeeb int limit = 200; 2288*6d67aabdSBjoern A. Zeeb s8 offset = 0; 2289*6d67aabdSBjoern A. Zeeb u16 dgain = 0; 2290*6d67aabdSBjoern A. Zeeb u32 rf_18; 2291*6d67aabdSBjoern A. Zeeb 2292*6d67aabdSBjoern A. Zeeb tmp_txagc = init_txagc; 2293*6d67aabdSBjoern A. Zeeb 2294*6d67aabdSBjoern A. Zeeb tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB); 2295*6d67aabdSBjoern A. Zeeb rf_18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 2296*6d67aabdSBjoern A. Zeeb 2297*6d67aabdSBjoern A. Zeeb do { 2298*6d67aabdSBjoern A. Zeeb switch (step) { 2299*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_SYNC_DGAIN: 2300*6d67aabdSBjoern A. Zeeb _dpk_sync(rtwdev, phy, path, kidx); 2301*6d67aabdSBjoern A. Zeeb if (agc_cnt == 0) { 2302*6d67aabdSBjoern A. Zeeb if (chan->band_width < 2) 2303*6d67aabdSBjoern A. Zeeb _dpk_bypass_rxcfir(rtwdev, path, true); 2304*6d67aabdSBjoern A. Zeeb else 2305*6d67aabdSBjoern A. Zeeb _dpk_lbk_rxiqk(rtwdev, phy, path, 2306*6d67aabdSBjoern A. Zeeb tmp_rxbb, rf_18); 2307*6d67aabdSBjoern A. Zeeb } 2308*6d67aabdSBjoern A. Zeeb 2309*6d67aabdSBjoern A. Zeeb if (_dpk_sync_check(rtwdev, path, kidx) == true) { 2310*6d67aabdSBjoern A. Zeeb tmp_txagc = 0xff; 2311*6d67aabdSBjoern A. Zeeb goout = 1; 2312*6d67aabdSBjoern A. Zeeb break; 2313*6d67aabdSBjoern A. Zeeb } 2314*6d67aabdSBjoern A. Zeeb 2315*6d67aabdSBjoern A. Zeeb dgain = _dpk_dgain_read(rtwdev); 2316*6d67aabdSBjoern A. Zeeb offset = _dpk_dgain_mapping(rtwdev, dgain); 2317*6d67aabdSBjoern A. Zeeb 2318*6d67aabdSBjoern A. Zeeb if (loss_only == 1 || limited_rxbb == 1 || offset == 0) 2319*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GAIN_LOSS_IDX; 2320*6d67aabdSBjoern A. Zeeb else 2321*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GAIN_ADJ; 2322*6d67aabdSBjoern A. Zeeb break; 2323*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_GAIN_ADJ: 2324*6d67aabdSBjoern A. Zeeb tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB); 2325*6d67aabdSBjoern A. Zeeb 2326*6d67aabdSBjoern A. Zeeb if (tmp_rxbb + offset > 0x1f) { 2327*6d67aabdSBjoern A. Zeeb tmp_rxbb = 0x1f; 2328*6d67aabdSBjoern A. Zeeb limited_rxbb = 1; 2329*6d67aabdSBjoern A. Zeeb } else if (tmp_rxbb + offset < 0) { 2330*6d67aabdSBjoern A. Zeeb tmp_rxbb = 0; 2331*6d67aabdSBjoern A. Zeeb limited_rxbb = 1; 2332*6d67aabdSBjoern A. Zeeb } else { 2333*6d67aabdSBjoern A. Zeeb tmp_rxbb = tmp_rxbb + offset; 2334*6d67aabdSBjoern A. Zeeb } 2335*6d67aabdSBjoern A. Zeeb 2336*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB, tmp_rxbb); 2337*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2338*6d67aabdSBjoern A. Zeeb "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb); 2339*6d67aabdSBjoern A. Zeeb 2340*6d67aabdSBjoern A. Zeeb if (chan->band_width == RTW89_CHANNEL_WIDTH_80) 2341*6d67aabdSBjoern A. Zeeb _dpk_lbk_rxiqk(rtwdev, phy, path, tmp_rxbb, rf_18); 2342*6d67aabdSBjoern A. Zeeb if (dgain > 1922 || dgain < 342) 2343*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_SYNC_DGAIN; 2344*6d67aabdSBjoern A. Zeeb else 2345*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GAIN_LOSS_IDX; 2346*6d67aabdSBjoern A. Zeeb 2347*6d67aabdSBjoern A. Zeeb agc_cnt++; 2348*6d67aabdSBjoern A. Zeeb break; 2349*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_GAIN_LOSS_IDX: 2350*6d67aabdSBjoern A. Zeeb _dpk_gainloss(rtwdev, phy, path, kidx); 2351*6d67aabdSBjoern A. Zeeb 2352*6d67aabdSBjoern A. Zeeb tmp_gl_idx = _dpk_gainloss_read(rtwdev); 2353*6d67aabdSBjoern A. Zeeb 2354*6d67aabdSBjoern A. Zeeb if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, path, true)) || 2355*6d67aabdSBjoern A. Zeeb tmp_gl_idx >= 7) 2356*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GL_GT_CRITERION; 2357*6d67aabdSBjoern A. Zeeb else if (tmp_gl_idx == 0) 2358*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GL_LT_CRITERION; 2359*6d67aabdSBjoern A. Zeeb else 2360*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_SET_TX_GAIN; 2361*6d67aabdSBjoern A. Zeeb 2362*6d67aabdSBjoern A. Zeeb gl_cnt++; 2363*6d67aabdSBjoern A. Zeeb break; 2364*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_GL_GT_CRITERION: 2365*6d67aabdSBjoern A. Zeeb if (tmp_txagc == 0x2e || 2366*6d67aabdSBjoern A. Zeeb tmp_txagc == dpk->max_dpk_txagc[path]) { 2367*6d67aabdSBjoern A. Zeeb goout = 1; 2368*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2369*6d67aabdSBjoern A. Zeeb "[DPK] Txagc@lower bound!!\n"); 2370*6d67aabdSBjoern A. Zeeb } else { 2371*6d67aabdSBjoern A. Zeeb tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 2372*6d67aabdSBjoern A. Zeeb tmp_txagc, 0x3); 2373*6d67aabdSBjoern A. Zeeb } 2374*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GAIN_LOSS_IDX; 2375*6d67aabdSBjoern A. Zeeb agc_cnt++; 2376*6d67aabdSBjoern A. Zeeb break; 2377*6d67aabdSBjoern A. Zeeb 2378*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_GL_LT_CRITERION: 2379*6d67aabdSBjoern A. Zeeb if (tmp_txagc == 0x3f || tmp_txagc == dpk->max_dpk_txagc[path]) { 2380*6d67aabdSBjoern A. Zeeb goout = 1; 2381*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2382*6d67aabdSBjoern A. Zeeb "[DPK] Txagc@upper bound!!\n"); 2383*6d67aabdSBjoern A. Zeeb } else { 2384*6d67aabdSBjoern A. Zeeb tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 2385*6d67aabdSBjoern A. Zeeb tmp_txagc, 0xfe); 2386*6d67aabdSBjoern A. Zeeb } 2387*6d67aabdSBjoern A. Zeeb step = DPK_AGC_STEP_GAIN_LOSS_IDX; 2388*6d67aabdSBjoern A. Zeeb agc_cnt++; 2389*6d67aabdSBjoern A. Zeeb break; 2390*6d67aabdSBjoern A. Zeeb 2391*6d67aabdSBjoern A. Zeeb case DPK_AGC_STEP_SET_TX_GAIN: 2392*6d67aabdSBjoern A. Zeeb tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_txagc, 2393*6d67aabdSBjoern A. Zeeb tmp_gl_idx); 2394*6d67aabdSBjoern A. Zeeb goout = 1; 2395*6d67aabdSBjoern A. Zeeb agc_cnt++; 2396*6d67aabdSBjoern A. Zeeb break; 2397*6d67aabdSBjoern A. Zeeb 2398*6d67aabdSBjoern A. Zeeb default: 2399*6d67aabdSBjoern A. Zeeb goout = 1; 2400*6d67aabdSBjoern A. Zeeb break; 2401*6d67aabdSBjoern A. Zeeb } 2402*6d67aabdSBjoern A. Zeeb } while (!goout && agc_cnt < 6 && limit-- > 0); 2403*6d67aabdSBjoern A. Zeeb 2404*6d67aabdSBjoern A. Zeeb if (gl_cnt >= 6) 2405*6d67aabdSBjoern A. Zeeb _dpk_pas_read(rtwdev, path, false); 2406*6d67aabdSBjoern A. Zeeb 2407*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2408*6d67aabdSBjoern A. Zeeb "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc, tmp_rxbb); 2409*6d67aabdSBjoern A. Zeeb 2410*6d67aabdSBjoern A. Zeeb return tmp_txagc; 2411*6d67aabdSBjoern A. Zeeb } 2412*6d67aabdSBjoern A. Zeeb 2413*6d67aabdSBjoern A. Zeeb static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, 2414*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 order) 2415*6d67aabdSBjoern A. Zeeb { 2416*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2417*6d67aabdSBjoern A. Zeeb 2418*6d67aabdSBjoern A. Zeeb switch (order) { 2419*6d67aabdSBjoern A. Zeeb case 0: /* (5,3,1) */ 2420*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 2421*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3); 2422*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1); 2423*6d67aabdSBjoern A. Zeeb dpk->dpk_order[path] = 0x3; 2424*6d67aabdSBjoern A. Zeeb break; 2425*6d67aabdSBjoern A. Zeeb case 1: /* (5,3,0) */ 2426*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 2427*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0); 2428*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x0); 2429*6d67aabdSBjoern A. Zeeb dpk->dpk_order[path] = 0x1; 2430*6d67aabdSBjoern A. Zeeb break; 2431*6d67aabdSBjoern A. Zeeb case 2: /* (5,0,0) */ 2432*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 2433*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0); 2434*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x0); 2435*6d67aabdSBjoern A. Zeeb dpk->dpk_order[path] = 0x0; 2436*6d67aabdSBjoern A. Zeeb break; 2437*6d67aabdSBjoern A. Zeeb default: 2438*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2439*6d67aabdSBjoern A. Zeeb "[DPK] Wrong MDPD order!!(0x%x)\n", order); 2440*6d67aabdSBjoern A. Zeeb break; 2441*6d67aabdSBjoern A. Zeeb } 2442*6d67aabdSBjoern A. Zeeb 2443*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set %s for IDL\n", 2444*6d67aabdSBjoern A. Zeeb order == 0x0 ? "(5,3,1)" : 2445*6d67aabdSBjoern A. Zeeb order == 0x1 ? "(5,3,0)" : "(5,0,0)"); 2446*6d67aabdSBjoern A. Zeeb 2447*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2448*6d67aabdSBjoern A. Zeeb "[DPK] Set MDPD order to 0x%x for IDL\n", order); 2449*6d67aabdSBjoern A. Zeeb } 2450*6d67aabdSBjoern A. Zeeb 2451*6d67aabdSBjoern A. Zeeb static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2452*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx, u8 gain) 2453*6d67aabdSBjoern A. Zeeb { 2454*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2455*6d67aabdSBjoern A. Zeeb 2456*6d67aabdSBjoern A. Zeeb if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 && 2457*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].band == RTW89_BAND_5G) 2458*6d67aabdSBjoern A. Zeeb _dpk_set_mdpd_para(rtwdev, path, 0x2); 2459*6d67aabdSBjoern A. Zeeb else 2460*6d67aabdSBjoern A. Zeeb _dpk_set_mdpd_para(rtwdev, path, 0x0); 2461*6d67aabdSBjoern A. Zeeb 2462*6d67aabdSBjoern A. Zeeb _dpk_one_shot(rtwdev, phy, path, MDPK_IDL); 2463*6d67aabdSBjoern A. Zeeb } 2464*6d67aabdSBjoern A. Zeeb 2465*6d67aabdSBjoern A. Zeeb static void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2466*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc) 2467*6d67aabdSBjoern A. Zeeb { 2468*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2469*6d67aabdSBjoern A. Zeeb u8 gs = dpk->dpk_gs[phy]; 2470*6d67aabdSBjoern A. Zeeb u16 pwsf = 0x78; 2471*6d67aabdSBjoern A. Zeeb 2472*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), BIT(8), kidx); 2473*6d67aabdSBjoern A. Zeeb 2474*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2475*6d67aabdSBjoern A. Zeeb "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", 2476*6d67aabdSBjoern A. Zeeb txagc, pwsf, gs); 2477*6d67aabdSBjoern A. Zeeb 2478*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].txagc_dpk = txagc; 2479*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8), 2480*6d67aabdSBjoern A. Zeeb 0x3F << ((gain << 3) + (kidx << 4)), txagc); 2481*6d67aabdSBjoern A. Zeeb 2482*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].pwsf = pwsf; 2483*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 2484*6d67aabdSBjoern A. Zeeb 0x1FF << (gain << 4), pwsf); 2485*6d67aabdSBjoern A. Zeeb 2486*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); 2487*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0); 2488*6d67aabdSBjoern A. Zeeb 2489*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].gs = gs; 2490*6d67aabdSBjoern A. Zeeb if (dpk->dpk_gs[phy] == 0x7f) 2491*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 2492*6d67aabdSBjoern A. Zeeb R_DPD_CH0A + (path << 8) + (kidx << 2), 2493*6d67aabdSBjoern A. Zeeb MASKDWORD, 0x007f7f7f); 2494*6d67aabdSBjoern A. Zeeb else 2495*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 2496*6d67aabdSBjoern A. Zeeb R_DPD_CH0A + (path << 8) + (kidx << 2), 2497*6d67aabdSBjoern A. Zeeb MASKDWORD, 0x005b5b5b); 2498*6d67aabdSBjoern A. Zeeb 2499*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 2500*6d67aabdSBjoern A. Zeeb B_DPD_ORDER_V1, dpk->dpk_order[path]); 2501*6d67aabdSBjoern A. Zeeb 2502*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0); 2503*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0); 2504*6d67aabdSBjoern A. Zeeb } 2505*6d67aabdSBjoern A. Zeeb 2506*6d67aabdSBjoern A. Zeeb static bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2507*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2508*6d67aabdSBjoern A. Zeeb { 2509*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2510*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2511*6d67aabdSBjoern A. Zeeb u8 idx, cur_band, cur_ch; 2512*6d67aabdSBjoern A. Zeeb bool is_reload = false; 2513*6d67aabdSBjoern A. Zeeb 2514*6d67aabdSBjoern A. Zeeb cur_band = chan->band_type; 2515*6d67aabdSBjoern A. Zeeb cur_ch = chan->channel; 2516*6d67aabdSBjoern A. Zeeb 2517*6d67aabdSBjoern A. Zeeb for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) { 2518*6d67aabdSBjoern A. Zeeb if (cur_band != dpk->bp[path][idx].band || 2519*6d67aabdSBjoern A. Zeeb cur_ch != dpk->bp[path][idx].ch) 2520*6d67aabdSBjoern A. Zeeb continue; 2521*6d67aabdSBjoern A. Zeeb 2522*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 2523*6d67aabdSBjoern A. Zeeb B_COEF_SEL_MDPD, idx); 2524*6d67aabdSBjoern A. Zeeb dpk->cur_idx[path] = idx; 2525*6d67aabdSBjoern A. Zeeb is_reload = true; 2526*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2527*6d67aabdSBjoern A. Zeeb "[DPK] reload S%d[%d] success\n", path, idx); 2528*6d67aabdSBjoern A. Zeeb } 2529*6d67aabdSBjoern A. Zeeb 2530*6d67aabdSBjoern A. Zeeb return is_reload; 2531*6d67aabdSBjoern A. Zeeb } 2532*6d67aabdSBjoern A. Zeeb 2533*6d67aabdSBjoern A. Zeeb static 2534*6d67aabdSBjoern A. Zeeb void _rf_direct_cntrl(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool is_bybb) 2535*6d67aabdSBjoern A. Zeeb { 2536*6d67aabdSBjoern A. Zeeb if (is_bybb) 2537*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 2538*6d67aabdSBjoern A. Zeeb else 2539*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 2540*6d67aabdSBjoern A. Zeeb } 2541*6d67aabdSBjoern A. Zeeb 2542*6d67aabdSBjoern A. Zeeb static 2543*6d67aabdSBjoern A. Zeeb void _drf_direct_cntrl(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool is_bybb) 2544*6d67aabdSBjoern A. Zeeb { 2545*6d67aabdSBjoern A. Zeeb if (is_bybb) 2546*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 2547*6d67aabdSBjoern A. Zeeb else 2548*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 2549*6d67aabdSBjoern A. Zeeb } 2550*6d67aabdSBjoern A. Zeeb 2551*6d67aabdSBjoern A. Zeeb static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2552*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u8 gain) 2553*6d67aabdSBjoern A. Zeeb { 2554*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2555*6d67aabdSBjoern A. Zeeb u8 txagc = 0x38, kidx = dpk->cur_idx[path]; 2556*6d67aabdSBjoern A. Zeeb bool is_fail = false; 2557*6d67aabdSBjoern A. Zeeb 2558*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2559*6d67aabdSBjoern A. Zeeb "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx); 2560*6d67aabdSBjoern A. Zeeb 2561*6d67aabdSBjoern A. Zeeb _rf_direct_cntrl(rtwdev, path, false); 2562*6d67aabdSBjoern A. Zeeb _drf_direct_cntrl(rtwdev, path, false); 2563*6d67aabdSBjoern A. Zeeb 2564*6d67aabdSBjoern A. Zeeb _dpk_kip_pwr_clk_on(rtwdev, path); 2565*6d67aabdSBjoern A. Zeeb _dpk_kip_set_txagc(rtwdev, phy, path, txagc); 2566*6d67aabdSBjoern A. Zeeb _dpk_rf_setting(rtwdev, gain, path, kidx); 2567*6d67aabdSBjoern A. Zeeb _dpk_rx_dck(rtwdev, phy, path); 2568*6d67aabdSBjoern A. Zeeb _dpk_kip_preset(rtwdev, phy, path, kidx); 2569*6d67aabdSBjoern A. Zeeb _dpk_kip_set_rxagc(rtwdev, phy, path); 2570*6d67aabdSBjoern A. Zeeb _dpk_table_select(rtwdev, path, kidx, gain); 2571*6d67aabdSBjoern A. Zeeb 2572*6d67aabdSBjoern A. Zeeb txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false); 2573*6d67aabdSBjoern A. Zeeb 2574*6d67aabdSBjoern A. Zeeb _rfk_get_thermal(rtwdev, kidx, path); 2575*6d67aabdSBjoern A. Zeeb 2576*6d67aabdSBjoern A. Zeeb if (txagc == 0xff) { 2577*6d67aabdSBjoern A. Zeeb is_fail = true; 2578*6d67aabdSBjoern A. Zeeb goto _error; 2579*6d67aabdSBjoern A. Zeeb } 2580*6d67aabdSBjoern A. Zeeb 2581*6d67aabdSBjoern A. Zeeb _dpk_idl_mpa(rtwdev, phy, path, kidx, gain); 2582*6d67aabdSBjoern A. Zeeb 2583*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, RF_RX); 2584*6d67aabdSBjoern A. Zeeb _dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc); 2585*6d67aabdSBjoern A. Zeeb 2586*6d67aabdSBjoern A. Zeeb _error: 2587*6d67aabdSBjoern A. Zeeb if (!is_fail) 2588*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].path_ok = 1; 2589*6d67aabdSBjoern A. Zeeb else 2590*6d67aabdSBjoern A. Zeeb dpk->bp[path][kidx].path_ok = 0; 2591*6d67aabdSBjoern A. Zeeb 2592*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx, 2593*6d67aabdSBjoern A. Zeeb is_fail ? "Check" : "Success"); 2594*6d67aabdSBjoern A. Zeeb 2595*6d67aabdSBjoern A. Zeeb _dpk_onoff(rtwdev, path, is_fail); 2596*6d67aabdSBjoern A. Zeeb 2597*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx, 2598*6d67aabdSBjoern A. Zeeb is_fail ? "Check" : "Success"); 2599*6d67aabdSBjoern A. Zeeb 2600*6d67aabdSBjoern A. Zeeb return is_fail; 2601*6d67aabdSBjoern A. Zeeb } 2602*6d67aabdSBjoern A. Zeeb 2603*6d67aabdSBjoern A. Zeeb static void _dpk_cal_select(struct rtw89_dev *rtwdev, 2604*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, u8 kpath) 2605*6d67aabdSBjoern A. Zeeb { 2606*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2607*6d67aabdSBjoern A. Zeeb u32 backup_kip_val[BACKUP_KIP_REGS_NR]; 2608*6d67aabdSBjoern A. Zeeb u32 backup_bb_val[BACKUP_BB_REGS_NR]; 2609*6d67aabdSBjoern A. Zeeb u32 backup_rf_val[RTW8852BT_SS][BACKUP_RF_REGS_NR]; 2610*6d67aabdSBjoern A. Zeeb bool reloaded[2] = {false}; 2611*6d67aabdSBjoern A. Zeeb u8 path; 2612*6d67aabdSBjoern A. Zeeb 2613*6d67aabdSBjoern A. Zeeb for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) { 2614*6d67aabdSBjoern A. Zeeb reloaded[path] = _dpk_reload_check(rtwdev, phy, path); 2615*6d67aabdSBjoern A. Zeeb if (!reloaded[path] && dpk->bp[path][0].ch != 0) 2616*6d67aabdSBjoern A. Zeeb dpk->cur_idx[path] = !dpk->cur_idx[path]; 2617*6d67aabdSBjoern A. Zeeb else 2618*6d67aabdSBjoern A. Zeeb _dpk_onoff(rtwdev, path, false); 2619*6d67aabdSBjoern A. Zeeb } 2620*6d67aabdSBjoern A. Zeeb 2621*6d67aabdSBjoern A. Zeeb _rfk_backup_bb_reg(rtwdev, backup_bb_val); 2622*6d67aabdSBjoern A. Zeeb _rfk_backup_kip_reg(rtwdev, backup_kip_val); 2623*6d67aabdSBjoern A. Zeeb 2624*6d67aabdSBjoern A. Zeeb for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) { 2625*6d67aabdSBjoern A. Zeeb _rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path); 2626*6d67aabdSBjoern A. Zeeb _dpk_information(rtwdev, phy, path); 2627*6d67aabdSBjoern A. Zeeb if (rtwdev->is_tssi_mode[path]) 2628*6d67aabdSBjoern A. Zeeb _dpk_tssi_pause(rtwdev, path, true); 2629*6d67aabdSBjoern A. Zeeb } 2630*6d67aabdSBjoern A. Zeeb 2631*6d67aabdSBjoern A. Zeeb _rfk_bb_afe_setting(rtwdev, phy, path, kpath); 2632*6d67aabdSBjoern A. Zeeb 2633*6d67aabdSBjoern A. Zeeb for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) 2634*6d67aabdSBjoern A. Zeeb _dpk_main(rtwdev, phy, path, 1); 2635*6d67aabdSBjoern A. Zeeb 2636*6d67aabdSBjoern A. Zeeb _rfk_bb_afe_restore(rtwdev, phy, path, kpath); 2637*6d67aabdSBjoern A. Zeeb 2638*6d67aabdSBjoern A. Zeeb _dpk_kip_restore(rtwdev, path); 2639*6d67aabdSBjoern A. Zeeb _rfk_reload_bb_reg(rtwdev, backup_bb_val); 2640*6d67aabdSBjoern A. Zeeb _rfk_reload_kip_reg(rtwdev, backup_kip_val); 2641*6d67aabdSBjoern A. Zeeb 2642*6d67aabdSBjoern A. Zeeb for (path = 0; path < DPK_RF_PATH_MAX_8852BT; path++) { 2643*6d67aabdSBjoern A. Zeeb _rfk_reload_rf_reg(rtwdev, backup_rf_val[path], path); 2644*6d67aabdSBjoern A. Zeeb if (rtwdev->is_tssi_mode[path]) 2645*6d67aabdSBjoern A. Zeeb _dpk_tssi_pause(rtwdev, path, false); 2646*6d67aabdSBjoern A. Zeeb } 2647*6d67aabdSBjoern A. Zeeb } 2648*6d67aabdSBjoern A. Zeeb 2649*6d67aabdSBjoern A. Zeeb static bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 2650*6d67aabdSBjoern A. Zeeb { 2651*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2652*6d67aabdSBjoern A. Zeeb struct rtw89_fem_info *fem = &rtwdev->fem; 2653*6d67aabdSBjoern A. Zeeb 2654*6d67aabdSBjoern A. Zeeb if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) { 2655*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2656*6d67aabdSBjoern A. Zeeb "[DPK] Skip DPK due to 2G_ext_PA exist!!\n"); 2657*6d67aabdSBjoern A. Zeeb return true; 2658*6d67aabdSBjoern A. Zeeb } else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) { 2659*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2660*6d67aabdSBjoern A. Zeeb "[DPK] Skip DPK due to 5G_ext_PA exist!!\n"); 2661*6d67aabdSBjoern A. Zeeb return true; 2662*6d67aabdSBjoern A. Zeeb } else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) { 2663*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2664*6d67aabdSBjoern A. Zeeb "[DPK] Skip DPK due to 6G_ext_PA exist!!\n"); 2665*6d67aabdSBjoern A. Zeeb return true; 2666*6d67aabdSBjoern A. Zeeb } 2667*6d67aabdSBjoern A. Zeeb 2668*6d67aabdSBjoern A. Zeeb return false; 2669*6d67aabdSBjoern A. Zeeb } 2670*6d67aabdSBjoern A. Zeeb 2671*6d67aabdSBjoern A. Zeeb static void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 2672*6d67aabdSBjoern A. Zeeb { 2673*6d67aabdSBjoern A. Zeeb u8 path, kpath; 2674*6d67aabdSBjoern A. Zeeb 2675*6d67aabdSBjoern A. Zeeb kpath = _kpath(rtwdev, phy); 2676*6d67aabdSBjoern A. Zeeb 2677*6d67aabdSBjoern A. Zeeb for (path = 0; path < RTW8852BT_SS; path++) { 2678*6d67aabdSBjoern A. Zeeb if (kpath & BIT(path)) 2679*6d67aabdSBjoern A. Zeeb _dpk_onoff(rtwdev, path, true); 2680*6d67aabdSBjoern A. Zeeb } 2681*6d67aabdSBjoern A. Zeeb } 2682*6d67aabdSBjoern A. Zeeb 2683*6d67aabdSBjoern A. Zeeb static void _dpk_track(struct rtw89_dev *rtwdev) 2684*6d67aabdSBjoern A. Zeeb { 2685*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2686*6d67aabdSBjoern A. Zeeb s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst; 2687*6d67aabdSBjoern A. Zeeb s8 delta_ther[2] = {}; 2688*6d67aabdSBjoern A. Zeeb u8 trk_idx, txagc_rf; 2689*6d67aabdSBjoern A. Zeeb u8 path, kidx; 2690*6d67aabdSBjoern A. Zeeb u16 pwsf[2]; 2691*6d67aabdSBjoern A. Zeeb u8 cur_ther; 2692*6d67aabdSBjoern A. Zeeb u32 tmp; 2693*6d67aabdSBjoern A. Zeeb 2694*6d67aabdSBjoern A. Zeeb for (path = 0; path < RF_PATH_NUM_8852BT; path++) { 2695*6d67aabdSBjoern A. Zeeb kidx = dpk->cur_idx[path]; 2696*6d67aabdSBjoern A. Zeeb 2697*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2698*6d67aabdSBjoern A. Zeeb "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", 2699*6d67aabdSBjoern A. Zeeb path, kidx, dpk->bp[path][kidx].ch); 2700*6d67aabdSBjoern A. Zeeb 2701*6d67aabdSBjoern A. Zeeb cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 2702*6d67aabdSBjoern A. Zeeb 2703*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2704*6d67aabdSBjoern A. Zeeb "[DPK_TRK] thermal now = %d\n", cur_ther); 2705*6d67aabdSBjoern A. Zeeb 2706*6d67aabdSBjoern A. Zeeb if (dpk->bp[path][kidx].ch && cur_ther) 2707*6d67aabdSBjoern A. Zeeb delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther; 2708*6d67aabdSBjoern A. Zeeb 2709*6d67aabdSBjoern A. Zeeb if (dpk->bp[path][kidx].band == RTW89_BAND_2G) 2710*6d67aabdSBjoern A. Zeeb delta_ther[path] = delta_ther[path] * 3 / 2; 2711*6d67aabdSBjoern A. Zeeb else 2712*6d67aabdSBjoern A. Zeeb delta_ther[path] = delta_ther[path] * 5 / 2; 2713*6d67aabdSBjoern A. Zeeb 2714*6d67aabdSBjoern A. Zeeb txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 2715*6d67aabdSBjoern A. Zeeb B_TXAGC_RF); 2716*6d67aabdSBjoern A. Zeeb 2717*6d67aabdSBjoern A. Zeeb if (rtwdev->is_tssi_mode[path]) { 2718*6d67aabdSBjoern A. Zeeb trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK); 2719*6d67aabdSBjoern A. Zeeb 2720*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2721*6d67aabdSBjoern A. Zeeb "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n", 2722*6d67aabdSBjoern A. Zeeb txagc_rf, trk_idx); 2723*6d67aabdSBjoern A. Zeeb 2724*6d67aabdSBjoern A. Zeeb txagc_bb = 2725*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 2726*6d67aabdSBjoern A. Zeeb MASKBYTE2); 2727*6d67aabdSBjoern A. Zeeb txagc_bb_tp = 2728*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13), 2729*6d67aabdSBjoern A. Zeeb B_TXAGC_TP); 2730*6d67aabdSBjoern A. Zeeb 2731*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2732*6d67aabdSBjoern A. Zeeb "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", 2733*6d67aabdSBjoern A. Zeeb txagc_bb_tp, txagc_bb); 2734*6d67aabdSBjoern A. Zeeb 2735*6d67aabdSBjoern A. Zeeb txagc_ofst = 2736*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 2737*6d67aabdSBjoern A. Zeeb MASKBYTE3); 2738*6d67aabdSBjoern A. Zeeb 2739*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2740*6d67aabdSBjoern A. Zeeb "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n", 2741*6d67aabdSBjoern A. Zeeb txagc_ofst, delta_ther[path]); 2742*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8), 2743*6d67aabdSBjoern A. Zeeb B_DPD_COM_OF); 2744*6d67aabdSBjoern A. Zeeb if (tmp == 0x1) { 2745*6d67aabdSBjoern A. Zeeb txagc_ofst = 0; 2746*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2747*6d67aabdSBjoern A. Zeeb "[DPK_TRK] HW txagc offset mode\n"); 2748*6d67aabdSBjoern A. Zeeb } 2749*6d67aabdSBjoern A. Zeeb 2750*6d67aabdSBjoern A. Zeeb if (txagc_rf && cur_ther) 2751*6d67aabdSBjoern A. Zeeb ini_diff = txagc_ofst + (delta_ther[path]); 2752*6d67aabdSBjoern A. Zeeb 2753*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, 2754*6d67aabdSBjoern A. Zeeb R_P0_TXDPD + (path << 13), 2755*6d67aabdSBjoern A. Zeeb B_P0_TXDPD); 2756*6d67aabdSBjoern A. Zeeb if (tmp == 0x0) { 2757*6d67aabdSBjoern A. Zeeb pwsf[0] = dpk->bp[path][kidx].pwsf + 2758*6d67aabdSBjoern A. Zeeb txagc_bb_tp - txagc_bb + ini_diff; 2759*6d67aabdSBjoern A. Zeeb pwsf[1] = dpk->bp[path][kidx].pwsf + 2760*6d67aabdSBjoern A. Zeeb txagc_bb_tp - txagc_bb + ini_diff; 2761*6d67aabdSBjoern A. Zeeb } else { 2762*6d67aabdSBjoern A. Zeeb pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff; 2763*6d67aabdSBjoern A. Zeeb pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff; 2764*6d67aabdSBjoern A. Zeeb } 2765*6d67aabdSBjoern A. Zeeb } else { 2766*6d67aabdSBjoern A. Zeeb pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 2767*6d67aabdSBjoern A. Zeeb pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 2768*6d67aabdSBjoern A. Zeeb } 2769*6d67aabdSBjoern A. Zeeb 2770*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS); 2771*6d67aabdSBjoern A. Zeeb if (!tmp && txagc_rf) { 2772*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 2773*6d67aabdSBjoern A. Zeeb "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n", 2774*6d67aabdSBjoern A. Zeeb pwsf[0], pwsf[1]); 2775*6d67aabdSBjoern A. Zeeb 2776*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 2777*6d67aabdSBjoern A. Zeeb R_DPD_BND + (path << 8) + (kidx << 2), 2778*6d67aabdSBjoern A. Zeeb B_DPD_BND_0, pwsf[0]); 2779*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, 2780*6d67aabdSBjoern A. Zeeb R_DPD_BND + (path << 8) + (kidx << 2), 2781*6d67aabdSBjoern A. Zeeb B_DPD_BND_1, pwsf[1]); 2782*6d67aabdSBjoern A. Zeeb } 2783*6d67aabdSBjoern A. Zeeb } 2784*6d67aabdSBjoern A. Zeeb } 2785*6d67aabdSBjoern A. Zeeb 2786*6d67aabdSBjoern A. Zeeb static void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 2787*6d67aabdSBjoern A. Zeeb { 2788*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2789*6d67aabdSBjoern A. Zeeb u8 tx_scale, ofdm_bkof, path, kpath; 2790*6d67aabdSBjoern A. Zeeb 2791*6d67aabdSBjoern A. Zeeb kpath = _kpath(rtwdev, phy); 2792*6d67aabdSBjoern A. Zeeb 2793*6d67aabdSBjoern A. Zeeb ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM); 2794*6d67aabdSBjoern A. Zeeb tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA); 2795*6d67aabdSBjoern A. Zeeb 2796*6d67aabdSBjoern A. Zeeb if (ofdm_bkof + tx_scale >= 44) { 2797*6d67aabdSBjoern A. Zeeb /* move dpd backoff to bb, and set dpd backoff to 0 */ 2798*6d67aabdSBjoern A. Zeeb dpk->dpk_gs[phy] = 0x7f; 2799*6d67aabdSBjoern A. Zeeb for (path = 0; path < RF_PATH_NUM_8852BT; path++) { 2800*6d67aabdSBjoern A. Zeeb if (!(kpath & BIT(path))) 2801*6d67aabdSBjoern A. Zeeb continue; 2802*6d67aabdSBjoern A. Zeeb 2803*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8), 2804*6d67aabdSBjoern A. Zeeb B_DPD_CFG, 0x7f7f7f); 2805*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 2806*6d67aabdSBjoern A. Zeeb "[RFK] Set S%d DPD backoff to 0dB\n", path); 2807*6d67aabdSBjoern A. Zeeb } 2808*6d67aabdSBjoern A. Zeeb } else { 2809*6d67aabdSBjoern A. Zeeb dpk->dpk_gs[phy] = 0x5b; 2810*6d67aabdSBjoern A. Zeeb } 2811*6d67aabdSBjoern A. Zeeb } 2812*6d67aabdSBjoern A. Zeeb 2813*6d67aabdSBjoern A. Zeeb static void _tssi_dpk_off(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 2814*6d67aabdSBjoern A. Zeeb { 2815*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A, BIT(24), 0x0); 2816*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_DPD_CH0B, BIT(24), 0x0); 2817*6d67aabdSBjoern A. Zeeb } 2818*6d67aabdSBjoern A. Zeeb 2819*6d67aabdSBjoern A. Zeeb static void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2820*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2821*6d67aabdSBjoern A. Zeeb { 2822*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2823*6d67aabdSBjoern A. Zeeb enum rtw89_band band = chan->band_type; 2824*6d67aabdSBjoern A. Zeeb 2825*6d67aabdSBjoern A. Zeeb if (band == RTW89_BAND_2G) 2826*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1); 2827*6d67aabdSBjoern A. Zeeb else 2828*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1); 2829*6d67aabdSBjoern A. Zeeb } 2830*6d67aabdSBjoern A. Zeeb 2831*6d67aabdSBjoern A. Zeeb static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2832*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2833*6d67aabdSBjoern A. Zeeb { 2834*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2835*6d67aabdSBjoern A. Zeeb enum rtw89_band band = chan->band_type; 2836*6d67aabdSBjoern A. Zeeb 2837*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser(rtwdev, &rtw8852bt_tssi_sys_defs_tbl); 2838*6d67aabdSBjoern A. Zeeb 2839*6d67aabdSBjoern A. Zeeb if (chan->band_width == RTW89_CHANNEL_WIDTH_80) 2840*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_BW80, 0x1); 2841*6d67aabdSBjoern A. Zeeb else 2842*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_RSTB_ASYNC, B_RSTB_ASYNC_BW80, 0x0); 2843*6d67aabdSBjoern A. Zeeb 2844*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 2845*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 2846*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_sys_a_defs_2g_tbl, 2847*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_sys_a_defs_5g_tbl); 2848*6d67aabdSBjoern A. Zeeb else 2849*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 2850*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_sys_b_defs_2g_tbl, 2851*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_sys_b_defs_5g_tbl); 2852*6d67aabdSBjoern A. Zeeb } 2853*6d67aabdSBjoern A. Zeeb 2854*6d67aabdSBjoern A. Zeeb static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, 2855*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, 2856*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2857*6d67aabdSBjoern A. Zeeb { 2858*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 2859*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_init_txpwr_defs_a_tbl, 2860*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_init_txpwr_defs_b_tbl); 2861*6d67aabdSBjoern A. Zeeb } 2862*6d67aabdSBjoern A. Zeeb 2863*6d67aabdSBjoern A. Zeeb static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, 2864*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, 2865*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2866*6d67aabdSBjoern A. Zeeb { 2867*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 2868*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_init_txpwr_he_tb_defs_a_tbl, 2869*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_init_txpwr_he_tb_defs_b_tbl); 2870*6d67aabdSBjoern A. Zeeb } 2871*6d67aabdSBjoern A. Zeeb 2872*6d67aabdSBjoern A. Zeeb static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2873*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2874*6d67aabdSBjoern A. Zeeb { 2875*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 2876*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_dck_defs_a_tbl, 2877*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_dck_defs_b_tbl); 2878*6d67aabdSBjoern A. Zeeb } 2879*6d67aabdSBjoern A. Zeeb 2880*6d67aabdSBjoern A. Zeeb static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2881*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 2882*6d67aabdSBjoern A. Zeeb { 2883*6d67aabdSBjoern A. Zeeb #define RTW8852BT_TSSI_GET_VAL(ptr, idx) \ 2884*6d67aabdSBjoern A. Zeeb ({ \ 2885*6d67aabdSBjoern A. Zeeb s8 *__ptr = (ptr); \ 2886*6d67aabdSBjoern A. Zeeb u8 __idx = (idx), __i, __v; \ 2887*6d67aabdSBjoern A. Zeeb u32 __val = 0; \ 2888*6d67aabdSBjoern A. Zeeb for (__i = 0; __i < 4; __i++) { \ 2889*6d67aabdSBjoern A. Zeeb __v = (__ptr[__idx + __i]); \ 2890*6d67aabdSBjoern A. Zeeb __val |= (__v << (8 * __i)); \ 2891*6d67aabdSBjoern A. Zeeb } \ 2892*6d67aabdSBjoern A. Zeeb __val; \ 2893*6d67aabdSBjoern A. Zeeb }) 2894*6d67aabdSBjoern A. Zeeb struct rtw89_fw_txpwr_track_cfg *trk = rtwdev->fw.elm_info.txpwr_trk; 2895*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 2896*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 2897*6d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 2898*6d67aabdSBjoern A. Zeeb u8 subband = chan->subband_type; 2899*6d67aabdSBjoern A. Zeeb const s8 *thm_up_a = NULL; 2900*6d67aabdSBjoern A. Zeeb const s8 *thm_down_a = NULL; 2901*6d67aabdSBjoern A. Zeeb const s8 *thm_up_b = NULL; 2902*6d67aabdSBjoern A. Zeeb const s8 *thm_down_b = NULL; 2903*6d67aabdSBjoern A. Zeeb u8 thermal = 0xff; 2904*6d67aabdSBjoern A. Zeeb s8 thm_ofst[64] = {0}; 2905*6d67aabdSBjoern A. Zeeb u32 tmp = 0; 2906*6d67aabdSBjoern A. Zeeb u8 i, j; 2907*6d67aabdSBjoern A. Zeeb 2908*6d67aabdSBjoern A. Zeeb switch (subband) { 2909*6d67aabdSBjoern A. Zeeb default: 2910*6d67aabdSBjoern A. Zeeb case RTW89_CH_2G: 2911*6d67aabdSBjoern A. Zeeb thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_P][0]; 2912*6d67aabdSBjoern A. Zeeb thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GA_N][0]; 2913*6d67aabdSBjoern A. Zeeb thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_P][0]; 2914*6d67aabdSBjoern A. Zeeb thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_2GB_N][0]; 2915*6d67aabdSBjoern A. Zeeb break; 2916*6d67aabdSBjoern A. Zeeb case RTW89_CH_5G_BAND_1: 2917*6d67aabdSBjoern A. Zeeb thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][0]; 2918*6d67aabdSBjoern A. Zeeb thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][0]; 2919*6d67aabdSBjoern A. Zeeb thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][0]; 2920*6d67aabdSBjoern A. Zeeb thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][0]; 2921*6d67aabdSBjoern A. Zeeb break; 2922*6d67aabdSBjoern A. Zeeb case RTW89_CH_5G_BAND_3: 2923*6d67aabdSBjoern A. Zeeb thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][1]; 2924*6d67aabdSBjoern A. Zeeb thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][1]; 2925*6d67aabdSBjoern A. Zeeb thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][1]; 2926*6d67aabdSBjoern A. Zeeb thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][1]; 2927*6d67aabdSBjoern A. Zeeb break; 2928*6d67aabdSBjoern A. Zeeb case RTW89_CH_5G_BAND_4: 2929*6d67aabdSBjoern A. Zeeb thm_up_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_P][2]; 2930*6d67aabdSBjoern A. Zeeb thm_down_a = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GA_N][2]; 2931*6d67aabdSBjoern A. Zeeb thm_up_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_P][2]; 2932*6d67aabdSBjoern A. Zeeb thm_down_b = trk->delta[RTW89_FW_TXPWR_TRK_TYPE_5GB_N][2]; 2933*6d67aabdSBjoern A. Zeeb break; 2934*6d67aabdSBjoern A. Zeeb } 2935*6d67aabdSBjoern A. Zeeb 2936*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) { 2937*6d67aabdSBjoern A. Zeeb thermal = tssi_info->thermal[RF_PATH_A]; 2938*6d67aabdSBjoern A. Zeeb 2939*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 2940*6d67aabdSBjoern A. Zeeb "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); 2941*6d67aabdSBjoern A. Zeeb 2942*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); 2943*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); 2944*6d67aabdSBjoern A. Zeeb 2945*6d67aabdSBjoern A. Zeeb if (thermal == 0xff) { 2946*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); 2947*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); 2948*6d67aabdSBjoern A. Zeeb 2949*6d67aabdSBjoern A. Zeeb for (i = 0; i < 64; i += 4) { 2950*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); 2951*6d67aabdSBjoern A. Zeeb 2952*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 2953*6d67aabdSBjoern A. Zeeb "[TSSI] write 0x%x val=0x%08x\n", 2954*6d67aabdSBjoern A. Zeeb R_P0_TSSI_BASE + i, 0x0); 2955*6d67aabdSBjoern A. Zeeb } 2956*6d67aabdSBjoern A. Zeeb 2957*6d67aabdSBjoern A. Zeeb } else { 2958*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 2959*6d67aabdSBjoern A. Zeeb thermal); 2960*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 2961*6d67aabdSBjoern A. Zeeb thermal); 2962*6d67aabdSBjoern A. Zeeb 2963*6d67aabdSBjoern A. Zeeb i = 0; 2964*6d67aabdSBjoern A. Zeeb for (j = 0; j < 32; j++) 2965*6d67aabdSBjoern A. Zeeb thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 2966*6d67aabdSBjoern A. Zeeb -thm_down_a[i++] : 2967*6d67aabdSBjoern A. Zeeb -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; 2968*6d67aabdSBjoern A. Zeeb 2969*6d67aabdSBjoern A. Zeeb i = 1; 2970*6d67aabdSBjoern A. Zeeb for (j = 63; j >= 32; j--) 2971*6d67aabdSBjoern A. Zeeb thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 2972*6d67aabdSBjoern A. Zeeb thm_up_a[i++] : 2973*6d67aabdSBjoern A. Zeeb thm_up_a[DELTA_SWINGIDX_SIZE - 1]; 2974*6d67aabdSBjoern A. Zeeb 2975*6d67aabdSBjoern A. Zeeb for (i = 0; i < 64; i += 4) { 2976*6d67aabdSBjoern A. Zeeb tmp = RTW8852BT_TSSI_GET_VAL(thm_ofst, i); 2977*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); 2978*6d67aabdSBjoern A. Zeeb 2979*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 2980*6d67aabdSBjoern A. Zeeb "[TSSI] write 0x%x val=0x%08x\n", 2981*6d67aabdSBjoern A. Zeeb 0x5c00 + i, tmp); 2982*6d67aabdSBjoern A. Zeeb } 2983*6d67aabdSBjoern A. Zeeb } 2984*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); 2985*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); 2986*6d67aabdSBjoern A. Zeeb 2987*6d67aabdSBjoern A. Zeeb } else { 2988*6d67aabdSBjoern A. Zeeb thermal = tssi_info->thermal[RF_PATH_B]; 2989*6d67aabdSBjoern A. Zeeb 2990*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 2991*6d67aabdSBjoern A. Zeeb "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal); 2992*6d67aabdSBjoern A. Zeeb 2993*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0); 2994*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1); 2995*6d67aabdSBjoern A. Zeeb 2996*6d67aabdSBjoern A. Zeeb if (thermal == 0xff) { 2997*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32); 2998*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32); 2999*6d67aabdSBjoern A. Zeeb 3000*6d67aabdSBjoern A. Zeeb for (i = 0; i < 64; i += 4) { 3001*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0); 3002*6d67aabdSBjoern A. Zeeb 3003*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3004*6d67aabdSBjoern A. Zeeb "[TSSI] write 0x%x val=0x%08x\n", 3005*6d67aabdSBjoern A. Zeeb 0x7c00 + i, 0x0); 3006*6d67aabdSBjoern A. Zeeb } 3007*6d67aabdSBjoern A. Zeeb 3008*6d67aabdSBjoern A. Zeeb } else { 3009*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 3010*6d67aabdSBjoern A. Zeeb thermal); 3011*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 3012*6d67aabdSBjoern A. Zeeb thermal); 3013*6d67aabdSBjoern A. Zeeb 3014*6d67aabdSBjoern A. Zeeb i = 0; 3015*6d67aabdSBjoern A. Zeeb for (j = 0; j < 32; j++) 3016*6d67aabdSBjoern A. Zeeb thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 3017*6d67aabdSBjoern A. Zeeb -thm_down_b[i++] : 3018*6d67aabdSBjoern A. Zeeb -thm_down_b[DELTA_SWINGIDX_SIZE - 1]; 3019*6d67aabdSBjoern A. Zeeb 3020*6d67aabdSBjoern A. Zeeb i = 1; 3021*6d67aabdSBjoern A. Zeeb for (j = 63; j >= 32; j--) 3022*6d67aabdSBjoern A. Zeeb thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 3023*6d67aabdSBjoern A. Zeeb thm_up_b[i++] : 3024*6d67aabdSBjoern A. Zeeb thm_up_b[DELTA_SWINGIDX_SIZE - 1]; 3025*6d67aabdSBjoern A. Zeeb 3026*6d67aabdSBjoern A. Zeeb for (i = 0; i < 64; i += 4) { 3027*6d67aabdSBjoern A. Zeeb tmp = RTW8852BT_TSSI_GET_VAL(thm_ofst, i); 3028*6d67aabdSBjoern A. Zeeb rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp); 3029*6d67aabdSBjoern A. Zeeb 3030*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3031*6d67aabdSBjoern A. Zeeb "[TSSI] write 0x%x val=0x%08x\n", 3032*6d67aabdSBjoern A. Zeeb 0x7c00 + i, tmp); 3033*6d67aabdSBjoern A. Zeeb } 3034*6d67aabdSBjoern A. Zeeb } 3035*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1); 3036*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0); 3037*6d67aabdSBjoern A. Zeeb } 3038*6d67aabdSBjoern A. Zeeb #undef RTW8852BT_TSSI_GET_VAL 3039*6d67aabdSBjoern A. Zeeb } 3040*6d67aabdSBjoern A. Zeeb 3041*6d67aabdSBjoern A. Zeeb static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3042*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3043*6d67aabdSBjoern A. Zeeb { 3044*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 3045*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_dac_gain_defs_a_tbl, 3046*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_dac_gain_defs_b_tbl); 3047*6d67aabdSBjoern A. Zeeb } 3048*6d67aabdSBjoern A. Zeeb 3049*6d67aabdSBjoern A. Zeeb static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3050*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3051*6d67aabdSBjoern A. Zeeb { 3052*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3053*6d67aabdSBjoern A. Zeeb enum rtw89_band band = chan->band_type; 3054*6d67aabdSBjoern A. Zeeb 3055*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 3056*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 3057*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_a_defs_2g_tbl, 3058*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_a_defs_5g_tbl); 3059*6d67aabdSBjoern A. Zeeb else 3060*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 3061*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_b_defs_2g_tbl, 3062*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_b_defs_5g_tbl); 3063*6d67aabdSBjoern A. Zeeb } 3064*6d67aabdSBjoern A. Zeeb 3065*6d67aabdSBjoern A. Zeeb static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3066*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, bool all) 3067*6d67aabdSBjoern A. Zeeb { 3068*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3069*6d67aabdSBjoern A. Zeeb enum rtw89_band band = chan->band_type; 3070*6d67aabdSBjoern A. Zeeb const struct rtw89_rfk_tbl *tbl = NULL; 3071*6d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 3072*6d67aabdSBjoern A. Zeeb 3073*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) { 3074*6d67aabdSBjoern A. Zeeb if (band == RTW89_BAND_2G) 3075*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_a_2g_all_defs_tbl; 3076*6d67aabdSBjoern A. Zeeb else if (ch >= 36 && ch <= 64) 3077*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_a_5g1_all_defs_tbl; 3078*6d67aabdSBjoern A. Zeeb else if (ch >= 100 && ch <= 144) 3079*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_a_5g2_all_defs_tbl; 3080*6d67aabdSBjoern A. Zeeb else if (ch >= 149 && ch <= 177) 3081*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_a_5g3_all_defs_tbl; 3082*6d67aabdSBjoern A. Zeeb } else { 3083*6d67aabdSBjoern A. Zeeb if (ch >= 1 && ch <= 14) 3084*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_b_2g_all_defs_tbl; 3085*6d67aabdSBjoern A. Zeeb else if (ch >= 36 && ch <= 64) 3086*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_b_5g1_all_defs_tbl; 3087*6d67aabdSBjoern A. Zeeb else if (ch >= 100 && ch <= 144) 3088*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_b_5g2_all_defs_tbl; 3089*6d67aabdSBjoern A. Zeeb else if (ch >= 149 && ch <= 177) 3090*6d67aabdSBjoern A. Zeeb tbl = &rtw8852bt_tssi_align_b_5g3_all_defs_tbl; 3091*6d67aabdSBjoern A. Zeeb } 3092*6d67aabdSBjoern A. Zeeb 3093*6d67aabdSBjoern A. Zeeb if (tbl) 3094*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser(rtwdev, tbl); 3095*6d67aabdSBjoern A. Zeeb } 3096*6d67aabdSBjoern A. Zeeb 3097*6d67aabdSBjoern A. Zeeb static void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3098*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3099*6d67aabdSBjoern A. Zeeb { 3100*6d67aabdSBjoern A. Zeeb rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 3101*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_defs_a_tbl, 3102*6d67aabdSBjoern A. Zeeb &rtw8852bt_tssi_slope_defs_b_tbl); 3103*6d67aabdSBjoern A. Zeeb } 3104*6d67aabdSBjoern A. Zeeb 3105*6d67aabdSBjoern A. Zeeb static void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3106*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3107*6d67aabdSBjoern A. Zeeb { 3108*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 3109*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0); 3110*6d67aabdSBjoern A. Zeeb else 3111*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0); 3112*6d67aabdSBjoern A. Zeeb } 3113*6d67aabdSBjoern A. Zeeb 3114*6d67aabdSBjoern A. Zeeb static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, 3115*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, 3116*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3117*6d67aabdSBjoern A. Zeeb { 3118*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s path=%d\n", __func__, 3119*6d67aabdSBjoern A. Zeeb path); 3120*6d67aabdSBjoern A. Zeeb 3121*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 3122*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, 3123*6d67aabdSBjoern A. Zeeb B_P0_TSSI_MV_MIX, 0x010); 3124*6d67aabdSBjoern A. Zeeb else 3125*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, 3126*6d67aabdSBjoern A. Zeeb B_P1_RFCTM_DEL, 0x010); 3127*6d67aabdSBjoern A. Zeeb } 3128*6d67aabdSBjoern A. Zeeb 3129*6d67aabdSBjoern A. Zeeb static void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 3130*6d67aabdSBjoern A. Zeeb { 3131*6d67aabdSBjoern A. Zeeb u8 i; 3132*6d67aabdSBjoern A. Zeeb 3133*6d67aabdSBjoern A. Zeeb for (i = 0; i < RF_PATH_NUM_8852BT; i++) { 3134*6d67aabdSBjoern A. Zeeb _tssi_set_tssi_track(rtwdev, phy, i); 3135*6d67aabdSBjoern A. Zeeb _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i); 3136*6d67aabdSBjoern A. Zeeb 3137*6d67aabdSBjoern A. Zeeb if (i == RF_PATH_A) { 3138*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, 3139*6d67aabdSBjoern A. Zeeb B_P0_TSSI_MV_CLR, 0x0); 3140*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, 3141*6d67aabdSBjoern A. Zeeb B_P0_TSSI_EN, 0x0); 3142*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, 3143*6d67aabdSBjoern A. Zeeb B_P0_TSSI_EN, 0x1); 3144*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, i, RR_TXGA_V1, 3145*6d67aabdSBjoern A. Zeeb RR_TXGA_V1_TRK_EN, 0x1); 3146*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 3147*6d67aabdSBjoern A. Zeeb B_P0_TSSI_RFC, 0x3); 3148*6d67aabdSBjoern A. Zeeb 3149*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 3150*6d67aabdSBjoern A. Zeeb B_P0_TSSI_OFT, 0xc0); 3151*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 3152*6d67aabdSBjoern A. Zeeb B_P0_TSSI_OFT_EN, 0x0); 3153*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 3154*6d67aabdSBjoern A. Zeeb B_P0_TSSI_OFT_EN, 0x1); 3155*6d67aabdSBjoern A. Zeeb 3156*6d67aabdSBjoern A. Zeeb rtwdev->is_tssi_mode[RF_PATH_A] = true; 3157*6d67aabdSBjoern A. Zeeb } else { 3158*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, 3159*6d67aabdSBjoern A. Zeeb B_P1_TSSI_MV_CLR, 0x0); 3160*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, 3161*6d67aabdSBjoern A. Zeeb B_P1_TSSI_EN, 0x0); 3162*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, 3163*6d67aabdSBjoern A. Zeeb B_P1_TSSI_EN, 0x1); 3164*6d67aabdSBjoern A. Zeeb rtw89_write_rf(rtwdev, i, RR_TXGA_V1, 3165*6d67aabdSBjoern A. Zeeb RR_TXGA_V1_TRK_EN, 0x1); 3166*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 3167*6d67aabdSBjoern A. Zeeb B_P1_TSSI_RFC, 0x3); 3168*6d67aabdSBjoern A. Zeeb 3169*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 3170*6d67aabdSBjoern A. Zeeb B_P1_TSSI_OFT, 0xc0); 3171*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 3172*6d67aabdSBjoern A. Zeeb B_P1_TSSI_OFT_EN, 0x0); 3173*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 3174*6d67aabdSBjoern A. Zeeb B_P1_TSSI_OFT_EN, 0x1); 3175*6d67aabdSBjoern A. Zeeb 3176*6d67aabdSBjoern A. Zeeb rtwdev->is_tssi_mode[RF_PATH_B] = true; 3177*6d67aabdSBjoern A. Zeeb } 3178*6d67aabdSBjoern A. Zeeb } 3179*6d67aabdSBjoern A. Zeeb } 3180*6d67aabdSBjoern A. Zeeb 3181*6d67aabdSBjoern A. Zeeb static void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 3182*6d67aabdSBjoern A. Zeeb { 3183*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0); 3184*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1); 3185*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1); 3186*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0); 3187*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1); 3188*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1); 3189*6d67aabdSBjoern A. Zeeb 3190*6d67aabdSBjoern A. Zeeb rtwdev->is_tssi_mode[RF_PATH_A] = false; 3191*6d67aabdSBjoern A. Zeeb rtwdev->is_tssi_mode[RF_PATH_B] = false; 3192*6d67aabdSBjoern A. Zeeb } 3193*6d67aabdSBjoern A. Zeeb 3194*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) 3195*6d67aabdSBjoern A. Zeeb { 3196*6d67aabdSBjoern A. Zeeb switch (ch) { 3197*6d67aabdSBjoern A. Zeeb case 1 ... 2: 3198*6d67aabdSBjoern A. Zeeb return 0; 3199*6d67aabdSBjoern A. Zeeb case 3 ... 5: 3200*6d67aabdSBjoern A. Zeeb return 1; 3201*6d67aabdSBjoern A. Zeeb case 6 ... 8: 3202*6d67aabdSBjoern A. Zeeb return 2; 3203*6d67aabdSBjoern A. Zeeb case 9 ... 11: 3204*6d67aabdSBjoern A. Zeeb return 3; 3205*6d67aabdSBjoern A. Zeeb case 12 ... 13: 3206*6d67aabdSBjoern A. Zeeb return 4; 3207*6d67aabdSBjoern A. Zeeb case 14: 3208*6d67aabdSBjoern A. Zeeb return 5; 3209*6d67aabdSBjoern A. Zeeb } 3210*6d67aabdSBjoern A. Zeeb 3211*6d67aabdSBjoern A. Zeeb return 0; 3212*6d67aabdSBjoern A. Zeeb } 3213*6d67aabdSBjoern A. Zeeb 3214*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GROUP_BIT (BIT(31)) 3215*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) 3216*6d67aabdSBjoern A. Zeeb #define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) 3217*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) 3218*6d67aabdSBjoern A. Zeeb #define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) 3219*6d67aabdSBjoern A. Zeeb 3220*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 3221*6d67aabdSBjoern A. Zeeb { 3222*6d67aabdSBjoern A. Zeeb switch (ch) { 3223*6d67aabdSBjoern A. Zeeb case 1 ... 2: 3224*6d67aabdSBjoern A. Zeeb return 0; 3225*6d67aabdSBjoern A. Zeeb case 3 ... 5: 3226*6d67aabdSBjoern A. Zeeb return 1; 3227*6d67aabdSBjoern A. Zeeb case 6 ... 8: 3228*6d67aabdSBjoern A. Zeeb return 2; 3229*6d67aabdSBjoern A. Zeeb case 9 ... 11: 3230*6d67aabdSBjoern A. Zeeb return 3; 3231*6d67aabdSBjoern A. Zeeb case 12 ... 14: 3232*6d67aabdSBjoern A. Zeeb return 4; 3233*6d67aabdSBjoern A. Zeeb case 36 ... 40: 3234*6d67aabdSBjoern A. Zeeb return 5; 3235*6d67aabdSBjoern A. Zeeb case 41 ... 43: 3236*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(5); 3237*6d67aabdSBjoern A. Zeeb case 44 ... 48: 3238*6d67aabdSBjoern A. Zeeb return 6; 3239*6d67aabdSBjoern A. Zeeb case 49 ... 51: 3240*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(6); 3241*6d67aabdSBjoern A. Zeeb case 52 ... 56: 3242*6d67aabdSBjoern A. Zeeb return 7; 3243*6d67aabdSBjoern A. Zeeb case 57 ... 59: 3244*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(7); 3245*6d67aabdSBjoern A. Zeeb case 60 ... 64: 3246*6d67aabdSBjoern A. Zeeb return 8; 3247*6d67aabdSBjoern A. Zeeb case 100 ... 104: 3248*6d67aabdSBjoern A. Zeeb return 9; 3249*6d67aabdSBjoern A. Zeeb case 105 ... 107: 3250*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(9); 3251*6d67aabdSBjoern A. Zeeb case 108 ... 112: 3252*6d67aabdSBjoern A. Zeeb return 10; 3253*6d67aabdSBjoern A. Zeeb case 113 ... 115: 3254*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(10); 3255*6d67aabdSBjoern A. Zeeb case 116 ... 120: 3256*6d67aabdSBjoern A. Zeeb return 11; 3257*6d67aabdSBjoern A. Zeeb case 121 ... 123: 3258*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(11); 3259*6d67aabdSBjoern A. Zeeb case 124 ... 128: 3260*6d67aabdSBjoern A. Zeeb return 12; 3261*6d67aabdSBjoern A. Zeeb case 129 ... 131: 3262*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(12); 3263*6d67aabdSBjoern A. Zeeb case 132 ... 136: 3264*6d67aabdSBjoern A. Zeeb return 13; 3265*6d67aabdSBjoern A. Zeeb case 137 ... 139: 3266*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(13); 3267*6d67aabdSBjoern A. Zeeb case 140 ... 144: 3268*6d67aabdSBjoern A. Zeeb return 14; 3269*6d67aabdSBjoern A. Zeeb case 149 ... 153: 3270*6d67aabdSBjoern A. Zeeb return 15; 3271*6d67aabdSBjoern A. Zeeb case 154 ... 156: 3272*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(15); 3273*6d67aabdSBjoern A. Zeeb case 157 ... 161: 3274*6d67aabdSBjoern A. Zeeb return 16; 3275*6d67aabdSBjoern A. Zeeb case 162 ... 164: 3276*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(16); 3277*6d67aabdSBjoern A. Zeeb case 165 ... 169: 3278*6d67aabdSBjoern A. Zeeb return 17; 3279*6d67aabdSBjoern A. Zeeb case 170 ... 172: 3280*6d67aabdSBjoern A. Zeeb return TSSI_EXTRA_GROUP(17); 3281*6d67aabdSBjoern A. Zeeb case 173 ... 177: 3282*6d67aabdSBjoern A. Zeeb return 18; 3283*6d67aabdSBjoern A. Zeeb } 3284*6d67aabdSBjoern A. Zeeb 3285*6d67aabdSBjoern A. Zeeb return 0; 3286*6d67aabdSBjoern A. Zeeb } 3287*6d67aabdSBjoern A. Zeeb 3288*6d67aabdSBjoern A. Zeeb static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) 3289*6d67aabdSBjoern A. Zeeb { 3290*6d67aabdSBjoern A. Zeeb switch (ch) { 3291*6d67aabdSBjoern A. Zeeb case 1 ... 8: 3292*6d67aabdSBjoern A. Zeeb return 0; 3293*6d67aabdSBjoern A. Zeeb case 9 ... 14: 3294*6d67aabdSBjoern A. Zeeb return 1; 3295*6d67aabdSBjoern A. Zeeb case 36 ... 48: 3296*6d67aabdSBjoern A. Zeeb return 2; 3297*6d67aabdSBjoern A. Zeeb case 52 ... 64: 3298*6d67aabdSBjoern A. Zeeb return 3; 3299*6d67aabdSBjoern A. Zeeb case 100 ... 112: 3300*6d67aabdSBjoern A. Zeeb return 4; 3301*6d67aabdSBjoern A. Zeeb case 116 ... 128: 3302*6d67aabdSBjoern A. Zeeb return 5; 3303*6d67aabdSBjoern A. Zeeb case 132 ... 144: 3304*6d67aabdSBjoern A. Zeeb return 6; 3305*6d67aabdSBjoern A. Zeeb case 149 ... 177: 3306*6d67aabdSBjoern A. Zeeb return 7; 3307*6d67aabdSBjoern A. Zeeb } 3308*6d67aabdSBjoern A. Zeeb 3309*6d67aabdSBjoern A. Zeeb return 0; 3310*6d67aabdSBjoern A. Zeeb } 3311*6d67aabdSBjoern A. Zeeb 3312*6d67aabdSBjoern A. Zeeb static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3313*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3314*6d67aabdSBjoern A. Zeeb { 3315*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3316*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3317*6d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 3318*6d67aabdSBjoern A. Zeeb u32 gidx, gidx_1st, gidx_2nd; 3319*6d67aabdSBjoern A. Zeeb s8 de_1st; 3320*6d67aabdSBjoern A. Zeeb s8 de_2nd; 3321*6d67aabdSBjoern A. Zeeb s8 val; 3322*6d67aabdSBjoern A. Zeeb 3323*6d67aabdSBjoern A. Zeeb gidx = _tssi_get_ofdm_group(rtwdev, ch); 3324*6d67aabdSBjoern A. Zeeb 3325*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3326*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx); 3327*6d67aabdSBjoern A. Zeeb 3328*6d67aabdSBjoern A. Zeeb if (IS_TSSI_EXTRA_GROUP(gidx)) { 3329*6d67aabdSBjoern A. Zeeb gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 3330*6d67aabdSBjoern A. Zeeb gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 3331*6d67aabdSBjoern A. Zeeb de_1st = tssi_info->tssi_mcs[path][gidx_1st]; 3332*6d67aabdSBjoern A. Zeeb de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; 3333*6d67aabdSBjoern A. Zeeb val = (de_1st + de_2nd) / 2; 3334*6d67aabdSBjoern A. Zeeb 3335*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3336*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 3337*6d67aabdSBjoern A. Zeeb path, val, de_1st, de_2nd); 3338*6d67aabdSBjoern A. Zeeb } else { 3339*6d67aabdSBjoern A. Zeeb val = tssi_info->tssi_mcs[path][gidx]; 3340*6d67aabdSBjoern A. Zeeb 3341*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3342*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 3343*6d67aabdSBjoern A. Zeeb } 3344*6d67aabdSBjoern A. Zeeb 3345*6d67aabdSBjoern A. Zeeb return val; 3346*6d67aabdSBjoern A. Zeeb } 3347*6d67aabdSBjoern A. Zeeb 3348*6d67aabdSBjoern A. Zeeb static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3349*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3350*6d67aabdSBjoern A. Zeeb { 3351*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3352*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3353*6d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 3354*6d67aabdSBjoern A. Zeeb u32 tgidx, tgidx_1st, tgidx_2nd; 3355*6d67aabdSBjoern A. Zeeb s8 tde_1st; 3356*6d67aabdSBjoern A. Zeeb s8 tde_2nd; 3357*6d67aabdSBjoern A. Zeeb s8 val; 3358*6d67aabdSBjoern A. Zeeb 3359*6d67aabdSBjoern A. Zeeb tgidx = _tssi_get_trim_group(rtwdev, ch); 3360*6d67aabdSBjoern A. Zeeb 3361*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3362*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 3363*6d67aabdSBjoern A. Zeeb path, tgidx); 3364*6d67aabdSBjoern A. Zeeb 3365*6d67aabdSBjoern A. Zeeb if (IS_TSSI_EXTRA_GROUP(tgidx)) { 3366*6d67aabdSBjoern A. Zeeb tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 3367*6d67aabdSBjoern A. Zeeb tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 3368*6d67aabdSBjoern A. Zeeb tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; 3369*6d67aabdSBjoern A. Zeeb tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; 3370*6d67aabdSBjoern A. Zeeb val = (tde_1st + tde_2nd) / 2; 3371*6d67aabdSBjoern A. Zeeb 3372*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3373*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 3374*6d67aabdSBjoern A. Zeeb path, val, tde_1st, tde_2nd); 3375*6d67aabdSBjoern A. Zeeb } else { 3376*6d67aabdSBjoern A. Zeeb val = tssi_info->tssi_trim[path][tgidx]; 3377*6d67aabdSBjoern A. Zeeb 3378*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3379*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 3380*6d67aabdSBjoern A. Zeeb path, val); 3381*6d67aabdSBjoern A. Zeeb } 3382*6d67aabdSBjoern A. Zeeb 3383*6d67aabdSBjoern A. Zeeb return val; 3384*6d67aabdSBjoern A. Zeeb } 3385*6d67aabdSBjoern A. Zeeb 3386*6d67aabdSBjoern A. Zeeb static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 3387*6d67aabdSBjoern A. Zeeb { 3388*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3389*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3390*6d67aabdSBjoern A. Zeeb u8 ch = chan->channel; 3391*6d67aabdSBjoern A. Zeeb u8 gidx; 3392*6d67aabdSBjoern A. Zeeb s8 ofdm_de; 3393*6d67aabdSBjoern A. Zeeb s8 trim_de; 3394*6d67aabdSBjoern A. Zeeb s32 val; 3395*6d67aabdSBjoern A. Zeeb u32 i; 3396*6d67aabdSBjoern A. Zeeb 3397*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", 3398*6d67aabdSBjoern A. Zeeb phy, ch); 3399*6d67aabdSBjoern A. Zeeb 3400*6d67aabdSBjoern A. Zeeb for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) { 3401*6d67aabdSBjoern A. Zeeb gidx = _tssi_get_cck_group(rtwdev, ch); 3402*6d67aabdSBjoern A. Zeeb trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 3403*6d67aabdSBjoern A. Zeeb val = tssi_info->tssi_cck[i][gidx] + trim_de; 3404*6d67aabdSBjoern A. Zeeb 3405*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3406*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", 3407*6d67aabdSBjoern A. Zeeb i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); 3408*6d67aabdSBjoern A. Zeeb 3409*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val); 3410*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val); 3411*6d67aabdSBjoern A. Zeeb 3412*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3413*6d67aabdSBjoern A. Zeeb "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", 3414*6d67aabdSBjoern A. Zeeb _tssi_de_cck_long[i], 3415*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i], 3416*6d67aabdSBjoern A. Zeeb _TSSI_DE_MASK)); 3417*6d67aabdSBjoern A. Zeeb 3418*6d67aabdSBjoern A. Zeeb ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); 3419*6d67aabdSBjoern A. Zeeb trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 3420*6d67aabdSBjoern A. Zeeb val = ofdm_de + trim_de; 3421*6d67aabdSBjoern A. Zeeb 3422*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3423*6d67aabdSBjoern A. Zeeb "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", 3424*6d67aabdSBjoern A. Zeeb i, ofdm_de, trim_de); 3425*6d67aabdSBjoern A. Zeeb 3426*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val); 3427*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val); 3428*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val); 3429*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], 3430*6d67aabdSBjoern A. Zeeb _TSSI_DE_MASK, val); 3431*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val); 3432*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val); 3433*6d67aabdSBjoern A. Zeeb 3434*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, 3435*6d67aabdSBjoern A. Zeeb "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", 3436*6d67aabdSBjoern A. Zeeb _tssi_de_mcs_20m[i], 3437*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i], 3438*6d67aabdSBjoern A. Zeeb _TSSI_DE_MASK)); 3439*6d67aabdSBjoern A. Zeeb } 3440*6d67aabdSBjoern A. Zeeb } 3441*6d67aabdSBjoern A. Zeeb 3442*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 3443*6d67aabdSBjoern A. Zeeb { 3444*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3445*6d67aabdSBjoern A. Zeeb "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n" 3446*6d67aabdSBjoern A. Zeeb "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n", 3447*6d67aabdSBjoern A. Zeeb R_TSSI_PA_K1 + (path << 13), 3448*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_TSSI_PA_K1 + (path << 13)), 3449*6d67aabdSBjoern A. Zeeb R_TSSI_PA_K2 + (path << 13), 3450*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_TSSI_PA_K2 + (path << 13)), 3451*6d67aabdSBjoern A. Zeeb R_P0_TSSI_ALIM1 + (path << 13), 3452*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM1 + (path << 13)), 3453*6d67aabdSBjoern A. Zeeb R_P0_TSSI_ALIM3 + (path << 13), 3454*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM3 + (path << 13)), 3455*6d67aabdSBjoern A. Zeeb R_TSSI_PA_K5 + (path << 13), 3456*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_TSSI_PA_K5 + (path << 13)), 3457*6d67aabdSBjoern A. Zeeb R_P0_TSSI_ALIM2 + (path << 13), 3458*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM2 + (path << 13)), 3459*6d67aabdSBjoern A. Zeeb R_P0_TSSI_ALIM4 + (path << 13), 3460*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_P0_TSSI_ALIM4 + (path << 13)), 3461*6d67aabdSBjoern A. Zeeb R_TSSI_PA_K8 + (path << 13), 3462*6d67aabdSBjoern A. Zeeb rtw89_phy_read32(rtwdev, R_TSSI_PA_K8 + (path << 13))); 3463*6d67aabdSBjoern A. Zeeb } 3464*6d67aabdSBjoern A. Zeeb 3465*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk_done(struct rtw89_dev *rtwdev, 3466*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, enum rtw89_rf_path path) 3467*6d67aabdSBjoern A. Zeeb { 3468*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3469*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3470*6d67aabdSBjoern A. Zeeb u8 channel = chan->channel; 3471*6d67aabdSBjoern A. Zeeb u8 band; 3472*6d67aabdSBjoern A. Zeeb 3473*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3474*6d67aabdSBjoern A. Zeeb "======>%s phy=%d path=%d\n", __func__, phy, path); 3475*6d67aabdSBjoern A. Zeeb 3476*6d67aabdSBjoern A. Zeeb if (channel >= 1 && channel <= 14) 3477*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3478*6d67aabdSBjoern A. Zeeb else if (channel >= 36 && channel <= 64) 3479*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GL; 3480*6d67aabdSBjoern A. Zeeb else if (channel >= 100 && channel <= 144) 3481*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GM; 3482*6d67aabdSBjoern A. Zeeb else if (channel >= 149 && channel <= 177) 3483*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GH; 3484*6d67aabdSBjoern A. Zeeb else 3485*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3486*6d67aabdSBjoern A. Zeeb 3487*6d67aabdSBjoern A. Zeeb if (tssi_info->alignment_done[path][band]) { 3488*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, 3489*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][0]); 3490*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, 3491*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][1]); 3492*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, 3493*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][2]); 3494*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, 3495*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][3]); 3496*6d67aabdSBjoern A. Zeeb } 3497*6d67aabdSBjoern A. Zeeb 3498*6d67aabdSBjoern A. Zeeb _tssi_alimentk_dump_result(rtwdev, path); 3499*6d67aabdSBjoern A. Zeeb } 3500*6d67aabdSBjoern A. Zeeb 3501*6d67aabdSBjoern A. Zeeb static void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3502*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm, 3503*6d67aabdSBjoern A. Zeeb u8 enable) 3504*6d67aabdSBjoern A. Zeeb { 3505*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path_bit rx_path; 3506*6d67aabdSBjoern A. Zeeb 3507*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) 3508*6d67aabdSBjoern A. Zeeb rx_path = RF_A; 3509*6d67aabdSBjoern A. Zeeb else if (path == RF_PATH_B) 3510*6d67aabdSBjoern A. Zeeb rx_path = RF_B; 3511*6d67aabdSBjoern A. Zeeb else if (path == RF_PATH_AB) 3512*6d67aabdSBjoern A. Zeeb rx_path = RF_AB; 3513*6d67aabdSBjoern A. Zeeb else 3514*6d67aabdSBjoern A. Zeeb rx_path = RF_ABCD; /* don't change path, but still set others */ 3515*6d67aabdSBjoern A. Zeeb 3516*6d67aabdSBjoern A. Zeeb if (enable) { 3517*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_set_plcp_tx(rtwdev); 3518*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_cfg_tx_path(rtwdev, path); 3519*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_ctrl_rx_path(rtwdev, rx_path); 3520*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_set_power(rtwdev, pwr_dbm, phy); 3521*6d67aabdSBjoern A. Zeeb } 3522*6d67aabdSBjoern A. Zeeb 3523*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy); 3524*6d67aabdSBjoern A. Zeeb } 3525*6d67aabdSBjoern A. Zeeb 3526*6d67aabdSBjoern A. Zeeb static void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev, 3527*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, const u32 reg[], 3528*6d67aabdSBjoern A. Zeeb u32 reg_backup[], u32 reg_num) 3529*6d67aabdSBjoern A. Zeeb { 3530*6d67aabdSBjoern A. Zeeb u32 i; 3531*6d67aabdSBjoern A. Zeeb 3532*6d67aabdSBjoern A. Zeeb for (i = 0; i < reg_num; i++) { 3533*6d67aabdSBjoern A. Zeeb reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD); 3534*6d67aabdSBjoern A. Zeeb 3535*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3536*6d67aabdSBjoern A. Zeeb "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i], 3537*6d67aabdSBjoern A. Zeeb reg_backup[i]); 3538*6d67aabdSBjoern A. Zeeb } 3539*6d67aabdSBjoern A. Zeeb } 3540*6d67aabdSBjoern A. Zeeb 3541*6d67aabdSBjoern A. Zeeb static void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev, 3542*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, const u32 reg[], 3543*6d67aabdSBjoern A. Zeeb u32 reg_backup[], u32 reg_num) 3544*6d67aabdSBjoern A. Zeeb 3545*6d67aabdSBjoern A. Zeeb { 3546*6d67aabdSBjoern A. Zeeb u32 i; 3547*6d67aabdSBjoern A. Zeeb 3548*6d67aabdSBjoern A. Zeeb for (i = 0; i < reg_num; i++) { 3549*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]); 3550*6d67aabdSBjoern A. Zeeb 3551*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3552*6d67aabdSBjoern A. Zeeb "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i], 3553*6d67aabdSBjoern A. Zeeb reg_backup[i]); 3554*6d67aabdSBjoern A. Zeeb } 3555*6d67aabdSBjoern A. Zeeb } 3556*6d67aabdSBjoern A. Zeeb 3557*6d67aabdSBjoern A. Zeeb static u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel) 3558*6d67aabdSBjoern A. Zeeb { 3559*6d67aabdSBjoern A. Zeeb u8 channel_index; 3560*6d67aabdSBjoern A. Zeeb 3561*6d67aabdSBjoern A. Zeeb if (channel >= 1 && channel <= 14) 3562*6d67aabdSBjoern A. Zeeb channel_index = channel - 1; 3563*6d67aabdSBjoern A. Zeeb else if (channel >= 36 && channel <= 64) 3564*6d67aabdSBjoern A. Zeeb channel_index = (channel - 36) / 2 + 14; 3565*6d67aabdSBjoern A. Zeeb else if (channel >= 100 && channel <= 144) 3566*6d67aabdSBjoern A. Zeeb channel_index = ((channel - 100) / 2) + 15 + 14; 3567*6d67aabdSBjoern A. Zeeb else if (channel >= 149 && channel <= 177) 3568*6d67aabdSBjoern A. Zeeb channel_index = ((channel - 149) / 2) + 38 + 14; 3569*6d67aabdSBjoern A. Zeeb else 3570*6d67aabdSBjoern A. Zeeb channel_index = 0; 3571*6d67aabdSBjoern A. Zeeb 3572*6d67aabdSBjoern A. Zeeb return channel_index; 3573*6d67aabdSBjoern A. Zeeb } 3574*6d67aabdSBjoern A. Zeeb 3575*6d67aabdSBjoern A. Zeeb static bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3576*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path, const s16 *power, 3577*6d67aabdSBjoern A. Zeeb u32 *tssi_cw_rpt) 3578*6d67aabdSBjoern A. Zeeb { 3579*6d67aabdSBjoern A. Zeeb u32 tx_counter, tx_counter_tmp; 3580*6d67aabdSBjoern A. Zeeb const int retry = 100; 3581*6d67aabdSBjoern A. Zeeb u32 tmp; 3582*6d67aabdSBjoern A. Zeeb int j, k; 3583*6d67aabdSBjoern A. Zeeb 3584*6d67aabdSBjoern A. Zeeb for (j = 0; j < RTW8852BT_TSSI_PATH_NR; j++) { 3585*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0); 3586*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1); 3587*6d67aabdSBjoern A. Zeeb 3588*6d67aabdSBjoern A. Zeeb tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 3589*6d67aabdSBjoern A. Zeeb 3590*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD); 3591*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3592*6d67aabdSBjoern A. Zeeb "[TSSI PA K] 0x%x = 0x%08x path=%d\n", 3593*6d67aabdSBjoern A. Zeeb _tssi_trigger[path], tmp, path); 3594*6d67aabdSBjoern A. Zeeb 3595*6d67aabdSBjoern A. Zeeb if (j == 0) 3596*6d67aabdSBjoern A. Zeeb _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true); 3597*6d67aabdSBjoern A. Zeeb else 3598*6d67aabdSBjoern A. Zeeb _tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true); 3599*6d67aabdSBjoern A. Zeeb 3600*6d67aabdSBjoern A. Zeeb tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 3601*6d67aabdSBjoern A. Zeeb tx_counter_tmp -= tx_counter; 3602*6d67aabdSBjoern A. Zeeb 3603*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3604*6d67aabdSBjoern A. Zeeb "[TSSI PA K] First HWTXcounter=%d path=%d\n", 3605*6d67aabdSBjoern A. Zeeb tx_counter_tmp, path); 3606*6d67aabdSBjoern A. Zeeb 3607*6d67aabdSBjoern A. Zeeb for (k = 0; k < retry; k++) { 3608*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], 3609*6d67aabdSBjoern A. Zeeb B_TSSI_CWRPT_RDY); 3610*6d67aabdSBjoern A. Zeeb if (tmp) 3611*6d67aabdSBjoern A. Zeeb break; 3612*6d67aabdSBjoern A. Zeeb 3613*6d67aabdSBjoern A. Zeeb udelay(30); 3614*6d67aabdSBjoern A. Zeeb 3615*6d67aabdSBjoern A. Zeeb tx_counter_tmp = 3616*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 3617*6d67aabdSBjoern A. Zeeb tx_counter_tmp -= tx_counter; 3618*6d67aabdSBjoern A. Zeeb 3619*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3620*6d67aabdSBjoern A. Zeeb "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n", 3621*6d67aabdSBjoern A. Zeeb k, tx_counter_tmp, path); 3622*6d67aabdSBjoern A. Zeeb } 3623*6d67aabdSBjoern A. Zeeb 3624*6d67aabdSBjoern A. Zeeb if (k >= retry) { 3625*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3626*6d67aabdSBjoern A. Zeeb "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n", 3627*6d67aabdSBjoern A. Zeeb k, path); 3628*6d67aabdSBjoern A. Zeeb 3629*6d67aabdSBjoern A. Zeeb _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); 3630*6d67aabdSBjoern A. Zeeb return false; 3631*6d67aabdSBjoern A. Zeeb } 3632*6d67aabdSBjoern A. Zeeb 3633*6d67aabdSBjoern A. Zeeb tssi_cw_rpt[j] = 3634*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], 3635*6d67aabdSBjoern A. Zeeb B_TSSI_CWRPT); 3636*6d67aabdSBjoern A. Zeeb 3637*6d67aabdSBjoern A. Zeeb _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); 3638*6d67aabdSBjoern A. Zeeb 3639*6d67aabdSBjoern A. Zeeb tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 3640*6d67aabdSBjoern A. Zeeb tx_counter_tmp -= tx_counter; 3641*6d67aabdSBjoern A. Zeeb 3642*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3643*6d67aabdSBjoern A. Zeeb "[TSSI PA K] Final HWTXcounter=%d path=%d\n", 3644*6d67aabdSBjoern A. Zeeb tx_counter_tmp, path); 3645*6d67aabdSBjoern A. Zeeb } 3646*6d67aabdSBjoern A. Zeeb 3647*6d67aabdSBjoern A. Zeeb return true; 3648*6d67aabdSBjoern A. Zeeb } 3649*6d67aabdSBjoern A. Zeeb 3650*6d67aabdSBjoern A. Zeeb static void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3651*6d67aabdSBjoern A. Zeeb enum rtw89_rf_path path) 3652*6d67aabdSBjoern A. Zeeb { 3653*6d67aabdSBjoern A. Zeeb static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4, 3654*6d67aabdSBjoern A. Zeeb 0x78e4, 0x49c0, 0x0d18, 0x0d80}; 3655*6d67aabdSBjoern A. Zeeb static const s16 power_2g[4] = {48, 20, 4, -8}; 3656*6d67aabdSBjoern A. Zeeb static const s16 power_5g[4] = {48, 20, 4, 4}; 3657*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3658*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3659*6d67aabdSBjoern A. Zeeb s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3; 3660*6d67aabdSBjoern A. Zeeb u32 tssi_cw_rpt[RTW8852BT_TSSI_PATH_NR] = {}; 3661*6d67aabdSBjoern A. Zeeb u8 channel = chan->channel; 3662*6d67aabdSBjoern A. Zeeb u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel); 3663*6d67aabdSBjoern A. Zeeb struct rtw8852bx_bb_tssi_bak tssi_bak; 3664*6d67aabdSBjoern A. Zeeb s32 aliment_diff, tssi_cw_default; 3665*6d67aabdSBjoern A. Zeeb u32 start_time, finish_time; 3666*6d67aabdSBjoern A. Zeeb u32 bb_reg_backup[8] = {}; 3667*6d67aabdSBjoern A. Zeeb const s16 *power; 3668*6d67aabdSBjoern A. Zeeb u8 band; 3669*6d67aabdSBjoern A. Zeeb bool ok; 3670*6d67aabdSBjoern A. Zeeb u32 tmp; 3671*6d67aabdSBjoern A. Zeeb u8 j; 3672*6d67aabdSBjoern A. Zeeb 3673*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3674*6d67aabdSBjoern A. Zeeb "======> %s channel=%d path=%d\n", __func__, channel, 3675*6d67aabdSBjoern A. Zeeb path); 3676*6d67aabdSBjoern A. Zeeb 3677*6d67aabdSBjoern A. Zeeb start_time = ktime_get_ns(); 3678*6d67aabdSBjoern A. Zeeb 3679*6d67aabdSBjoern A. Zeeb if (chan->band_type == RTW89_BAND_2G) 3680*6d67aabdSBjoern A. Zeeb power = power_2g; 3681*6d67aabdSBjoern A. Zeeb else 3682*6d67aabdSBjoern A. Zeeb power = power_5g; 3683*6d67aabdSBjoern A. Zeeb 3684*6d67aabdSBjoern A. Zeeb if (channel >= 1 && channel <= 14) 3685*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3686*6d67aabdSBjoern A. Zeeb else if (channel >= 36 && channel <= 64) 3687*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GL; 3688*6d67aabdSBjoern A. Zeeb else if (channel >= 100 && channel <= 144) 3689*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GM; 3690*6d67aabdSBjoern A. Zeeb else if (channel >= 149 && channel <= 177) 3691*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GH; 3692*6d67aabdSBjoern A. Zeeb else 3693*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3694*6d67aabdSBjoern A. Zeeb 3695*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_backup_tssi(rtwdev, phy, &tssi_bak); 3696*6d67aabdSBjoern A. Zeeb _tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, 3697*6d67aabdSBjoern A. Zeeb ARRAY_SIZE(bb_reg_backup)); 3698*6d67aabdSBjoern A. Zeeb 3699*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8); 3700*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8); 3701*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2); 3702*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2); 3703*6d67aabdSBjoern A. Zeeb 3704*6d67aabdSBjoern A. Zeeb ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt); 3705*6d67aabdSBjoern A. Zeeb if (!ok) 3706*6d67aabdSBjoern A. Zeeb goto out; 3707*6d67aabdSBjoern A. Zeeb 3708*6d67aabdSBjoern A. Zeeb for (j = 0; j < RTW8852BT_TSSI_PATH_NR; j++) { 3709*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3710*6d67aabdSBjoern A. Zeeb "[TSSI PA K] power[%d]=%d tssi_cw_rpt[%d]=%d\n", j, 3711*6d67aabdSBjoern A. Zeeb power[j], j, tssi_cw_rpt[j]); 3712*6d67aabdSBjoern A. Zeeb } 3713*6d67aabdSBjoern A. Zeeb 3714*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1], 3715*6d67aabdSBjoern A. Zeeb _tssi_cw_default_mask[1]); 3716*6d67aabdSBjoern A. Zeeb tssi_cw_default = sign_extend32(tmp, 8); 3717*6d67aabdSBjoern A. Zeeb tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) - 3718*6d67aabdSBjoern A. Zeeb tssi_cw_rpt[1] + tssi_cw_default; 3719*6d67aabdSBjoern A. Zeeb aliment_diff = tssi_alim_offset_1 - tssi_cw_default; 3720*6d67aabdSBjoern A. Zeeb 3721*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2], 3722*6d67aabdSBjoern A. Zeeb _tssi_cw_default_mask[2]); 3723*6d67aabdSBjoern A. Zeeb tssi_cw_default = sign_extend32(tmp, 8); 3724*6d67aabdSBjoern A. Zeeb tssi_alim_offset_2 = tssi_cw_default + aliment_diff; 3725*6d67aabdSBjoern A. Zeeb 3726*6d67aabdSBjoern A. Zeeb tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3], 3727*6d67aabdSBjoern A. Zeeb _tssi_cw_default_mask[3]); 3728*6d67aabdSBjoern A. Zeeb tssi_cw_default = sign_extend32(tmp, 8); 3729*6d67aabdSBjoern A. Zeeb tssi_alim_offset_3 = tssi_cw_default + aliment_diff; 3730*6d67aabdSBjoern A. Zeeb 3731*6d67aabdSBjoern A. Zeeb if (path == RF_PATH_A) { 3732*6d67aabdSBjoern A. Zeeb tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | 3733*6d67aabdSBjoern A. Zeeb FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | 3734*6d67aabdSBjoern A. Zeeb FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); 3735*6d67aabdSBjoern A. Zeeb 3736*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp); 3737*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp); 3738*6d67aabdSBjoern A. Zeeb 3739*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3740*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", 3741*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31), 3742*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11), 3743*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12), 3744*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13)); 3745*6d67aabdSBjoern A. Zeeb } else { 3746*6d67aabdSBjoern A. Zeeb tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | 3747*6d67aabdSBjoern A. Zeeb FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | 3748*6d67aabdSBjoern A. Zeeb FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); 3749*6d67aabdSBjoern A. Zeeb 3750*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp); 3751*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp); 3752*6d67aabdSBjoern A. Zeeb 3753*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3754*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", 3755*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31), 3756*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11), 3757*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12), 3758*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13)); 3759*6d67aabdSBjoern A. Zeeb } 3760*6d67aabdSBjoern A. Zeeb 3761*6d67aabdSBjoern A. Zeeb tssi_info->alignment_done[path][band] = true; 3762*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][0] = 3763*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); 3764*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][1] = 3765*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); 3766*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][2] = 3767*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); 3768*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][3] = 3769*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); 3770*6d67aabdSBjoern A. Zeeb 3771*6d67aabdSBjoern A. Zeeb tssi_info->check_backup_aligmk[path][ch_idx] = true; 3772*6d67aabdSBjoern A. Zeeb tssi_info->alignment_backup_by_ch[path][ch_idx][0] = 3773*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); 3774*6d67aabdSBjoern A. Zeeb tssi_info->alignment_backup_by_ch[path][ch_idx][1] = 3775*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); 3776*6d67aabdSBjoern A. Zeeb tssi_info->alignment_backup_by_ch[path][ch_idx][2] = 3777*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); 3778*6d67aabdSBjoern A. Zeeb tssi_info->alignment_backup_by_ch[path][ch_idx][3] = 3779*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); 3780*6d67aabdSBjoern A. Zeeb 3781*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3782*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n", 3783*6d67aabdSBjoern A. Zeeb path, band, R_P0_TSSI_ALIM1 + (path << 13), 3784*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][0]); 3785*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3786*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n", 3787*6d67aabdSBjoern A. Zeeb path, band, R_P0_TSSI_ALIM3 + (path << 13), 3788*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][1]); 3789*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3790*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n", 3791*6d67aabdSBjoern A. Zeeb path, band, R_P0_TSSI_ALIM2 + (path << 13), 3792*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][2]); 3793*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3794*6d67aabdSBjoern A. Zeeb "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n", 3795*6d67aabdSBjoern A. Zeeb path, band, R_P0_TSSI_ALIM4 + (path << 13), 3796*6d67aabdSBjoern A. Zeeb tssi_info->alignment_value[path][band][3]); 3797*6d67aabdSBjoern A. Zeeb 3798*6d67aabdSBjoern A. Zeeb out: 3799*6d67aabdSBjoern A. Zeeb _tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, 3800*6d67aabdSBjoern A. Zeeb ARRAY_SIZE(bb_reg_backup)); 3801*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_restore_tssi(rtwdev, phy, &tssi_bak); 3802*6d67aabdSBjoern A. Zeeb rtw8852bx_bb_tx_mode_switch(rtwdev, phy, 0); 3803*6d67aabdSBjoern A. Zeeb 3804*6d67aabdSBjoern A. Zeeb finish_time = ktime_get_ns(); 3805*6d67aabdSBjoern A. Zeeb tssi_info->tssi_alimk_time += finish_time - start_time; 3806*6d67aabdSBjoern A. Zeeb 3807*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3808*6d67aabdSBjoern A. Zeeb "[TSSI PA K] %s processing time = %d ms\n", __func__, 3809*6d67aabdSBjoern A. Zeeb tssi_info->tssi_alimk_time); 3810*6d67aabdSBjoern A. Zeeb } 3811*6d67aabdSBjoern A. Zeeb 3812*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk_init(struct rtw89_dev *rtwdev) 3813*6d67aabdSBjoern A. Zeeb { 3814*6d67aabdSBjoern A. Zeeb struct rtw89_dpk_info *dpk = &rtwdev->dpk; 3815*6d67aabdSBjoern A. Zeeb 3816*6d67aabdSBjoern A. Zeeb u8 path; 3817*6d67aabdSBjoern A. Zeeb 3818*6d67aabdSBjoern A. Zeeb for (path = 0; path < 2; path++) { 3819*6d67aabdSBjoern A. Zeeb dpk->cur_idx[path] = 0; 3820*6d67aabdSBjoern A. Zeeb dpk->max_dpk_txagc[path] = 0x3F; 3821*6d67aabdSBjoern A. Zeeb } 3822*6d67aabdSBjoern A. Zeeb 3823*6d67aabdSBjoern A. Zeeb dpk->is_dpk_enable = true; 3824*6d67aabdSBjoern A. Zeeb dpk->is_dpk_reload_en = false; 3825*6d67aabdSBjoern A. Zeeb _set_dpd_backoff(rtwdev, RTW89_PHY_0); 3826*6d67aabdSBjoern A. Zeeb } 3827*6d67aabdSBjoern A. Zeeb 3828*6d67aabdSBjoern A. Zeeb void rtw8852bt_rck(struct rtw89_dev *rtwdev) 3829*6d67aabdSBjoern A. Zeeb { 3830*6d67aabdSBjoern A. Zeeb u8 path; 3831*6d67aabdSBjoern A. Zeeb 3832*6d67aabdSBjoern A. Zeeb for (path = 0; path < RF_PATH_NUM_8852BT; path++) 3833*6d67aabdSBjoern A. Zeeb _rck(rtwdev, path); 3834*6d67aabdSBjoern A. Zeeb } 3835*6d67aabdSBjoern A. Zeeb 3836*6d67aabdSBjoern A. Zeeb void rtw8852bt_dack(struct rtw89_dev *rtwdev) 3837*6d67aabdSBjoern A. Zeeb { 3838*6d67aabdSBjoern A. Zeeb u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0); 3839*6d67aabdSBjoern A. Zeeb 3840*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START); 3841*6d67aabdSBjoern A. Zeeb _dac_cal(rtwdev, false); 3842*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP); 3843*6d67aabdSBjoern A. Zeeb } 3844*6d67aabdSBjoern A. Zeeb 3845*6d67aabdSBjoern A. Zeeb void rtw8852bt_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 3846*6d67aabdSBjoern A. Zeeb { 3847*6d67aabdSBjoern A. Zeeb u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3848*6d67aabdSBjoern A. Zeeb u32 tx_en; 3849*6d67aabdSBjoern A. Zeeb 3850*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 3851*6d67aabdSBjoern A. Zeeb rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3852*6d67aabdSBjoern A. Zeeb _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 3853*6d67aabdSBjoern A. Zeeb 3854*6d67aabdSBjoern A. Zeeb _iqk_init(rtwdev); 3855*6d67aabdSBjoern A. Zeeb _iqk(rtwdev, phy_idx, false); 3856*6d67aabdSBjoern A. Zeeb 3857*6d67aabdSBjoern A. Zeeb rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3858*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 3859*6d67aabdSBjoern A. Zeeb } 3860*6d67aabdSBjoern A. Zeeb 3861*6d67aabdSBjoern A. Zeeb void rtw8852bt_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 3862*6d67aabdSBjoern A. Zeeb { 3863*6d67aabdSBjoern A. Zeeb u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3864*6d67aabdSBjoern A. Zeeb u32 tx_en; 3865*6d67aabdSBjoern A. Zeeb 3866*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 3867*6d67aabdSBjoern A. Zeeb rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3868*6d67aabdSBjoern A. Zeeb _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 3869*6d67aabdSBjoern A. Zeeb 3870*6d67aabdSBjoern A. Zeeb _rx_dck(rtwdev, phy_idx); 3871*6d67aabdSBjoern A. Zeeb 3872*6d67aabdSBjoern A. Zeeb rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3873*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 3874*6d67aabdSBjoern A. Zeeb } 3875*6d67aabdSBjoern A. Zeeb 3876*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 3877*6d67aabdSBjoern A. Zeeb { 3878*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3879*6d67aabdSBjoern A. Zeeb "[DPK] ****** DPK Start (Ver: 0x%x) ******\n", RTW8852BT_DPK_VER); 3880*6d67aabdSBjoern A. Zeeb 3881*6d67aabdSBjoern A. Zeeb if (_dpk_bypass_check(rtwdev, phy_idx)) 3882*6d67aabdSBjoern A. Zeeb _dpk_force_bypass(rtwdev, phy_idx); 3883*6d67aabdSBjoern A. Zeeb else 3884*6d67aabdSBjoern A. Zeeb _dpk_cal_select(rtwdev, phy_idx, RF_AB); 3885*6d67aabdSBjoern A. Zeeb } 3886*6d67aabdSBjoern A. Zeeb 3887*6d67aabdSBjoern A. Zeeb void rtw8852bt_dpk_track(struct rtw89_dev *rtwdev) 3888*6d67aabdSBjoern A. Zeeb { 3889*6d67aabdSBjoern A. Zeeb _dpk_track(rtwdev); 3890*6d67aabdSBjoern A. Zeeb } 3891*6d67aabdSBjoern A. Zeeb 3892*6d67aabdSBjoern A. Zeeb void rtw8852bt_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en) 3893*6d67aabdSBjoern A. Zeeb { 3894*6d67aabdSBjoern A. Zeeb static const u32 reg[2] = {R_DPD_CH0A, R_DPD_CH0B}; 3895*6d67aabdSBjoern A. Zeeb u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB); 3896*6d67aabdSBjoern A. Zeeb u32 reg_backup[2] = {}; 3897*6d67aabdSBjoern A. Zeeb u32 tx_en; 3898*6d67aabdSBjoern A. Zeeb u8 i; 3899*6d67aabdSBjoern A. Zeeb 3900*6d67aabdSBjoern A. Zeeb _tssi_backup_bb_registers(rtwdev, phy, reg, reg_backup, 2); 3901*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy); 3902*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 3903*6d67aabdSBjoern A. Zeeb 3904*6d67aabdSBjoern A. Zeeb _tssi_dpk_off(rtwdev, phy); 3905*6d67aabdSBjoern A. Zeeb _tssi_disable(rtwdev, phy); 3906*6d67aabdSBjoern A. Zeeb 3907*6d67aabdSBjoern A. Zeeb for (i = RF_PATH_A; i < RF_PATH_NUM_8852BT; i++) { 3908*6d67aabdSBjoern A. Zeeb _tssi_rf_setting(rtwdev, phy, i); 3909*6d67aabdSBjoern A. Zeeb _tssi_set_sys(rtwdev, phy, i); 3910*6d67aabdSBjoern A. Zeeb _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); 3911*6d67aabdSBjoern A. Zeeb _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); 3912*6d67aabdSBjoern A. Zeeb _tssi_set_dck(rtwdev, phy, i); 3913*6d67aabdSBjoern A. Zeeb _tssi_set_tmeter_tbl(rtwdev, phy, i); 3914*6d67aabdSBjoern A. Zeeb _tssi_set_dac_gain_tbl(rtwdev, phy, i); 3915*6d67aabdSBjoern A. Zeeb _tssi_slope_cal_org(rtwdev, phy, i); 3916*6d67aabdSBjoern A. Zeeb _tssi_alignment_default(rtwdev, phy, i, true); 3917*6d67aabdSBjoern A. Zeeb _tssi_set_tssi_slope(rtwdev, phy, i); 3918*6d67aabdSBjoern A. Zeeb 3919*6d67aabdSBjoern A. Zeeb rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); 3920*6d67aabdSBjoern A. Zeeb _tmac_tx_pause(rtwdev, phy, true); 3921*6d67aabdSBjoern A. Zeeb if (hwtx_en) 3922*6d67aabdSBjoern A. Zeeb _tssi_alimentk(rtwdev, phy, i); 3923*6d67aabdSBjoern A. Zeeb _tmac_tx_pause(rtwdev, phy, false); 3924*6d67aabdSBjoern A. Zeeb rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en); 3925*6d67aabdSBjoern A. Zeeb } 3926*6d67aabdSBjoern A. Zeeb 3927*6d67aabdSBjoern A. Zeeb _tssi_enable(rtwdev, phy); 3928*6d67aabdSBjoern A. Zeeb _tssi_set_efuse_to_de(rtwdev, phy); 3929*6d67aabdSBjoern A. Zeeb 3930*6d67aabdSBjoern A. Zeeb _tssi_reload_bb_registers(rtwdev, phy, reg, reg_backup, 2); 3931*6d67aabdSBjoern A. Zeeb 3932*6d67aabdSBjoern A. Zeeb rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 3933*6d67aabdSBjoern A. Zeeb } 3934*6d67aabdSBjoern A. Zeeb 3935*6d67aabdSBjoern A. Zeeb void rtw8852bt_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 3936*6d67aabdSBjoern A. Zeeb { 3937*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3938*6d67aabdSBjoern A. Zeeb struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 3939*6d67aabdSBjoern A. Zeeb u8 channel = chan->channel; 3940*6d67aabdSBjoern A. Zeeb u8 band; 3941*6d67aabdSBjoern A. Zeeb u32 i; 3942*6d67aabdSBjoern A. Zeeb 3943*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3944*6d67aabdSBjoern A. Zeeb "======>%s phy=%d channel=%d\n", __func__, phy, channel); 3945*6d67aabdSBjoern A. Zeeb 3946*6d67aabdSBjoern A. Zeeb if (channel >= 1 && channel <= 14) 3947*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3948*6d67aabdSBjoern A. Zeeb else if (channel >= 36 && channel <= 64) 3949*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GL; 3950*6d67aabdSBjoern A. Zeeb else if (channel >= 100 && channel <= 144) 3951*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GM; 3952*6d67aabdSBjoern A. Zeeb else if (channel >= 149 && channel <= 177) 3953*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_5GH; 3954*6d67aabdSBjoern A. Zeeb else 3955*6d67aabdSBjoern A. Zeeb band = TSSI_ALIMK_2G; 3956*6d67aabdSBjoern A. Zeeb 3957*6d67aabdSBjoern A. Zeeb _tssi_disable(rtwdev, phy); 3958*6d67aabdSBjoern A. Zeeb 3959*6d67aabdSBjoern A. Zeeb for (i = RF_PATH_A; i < RTW8852BT_TSSI_PATH_NR; i++) { 3960*6d67aabdSBjoern A. Zeeb _tssi_rf_setting(rtwdev, phy, i); 3961*6d67aabdSBjoern A. Zeeb _tssi_set_sys(rtwdev, phy, i); 3962*6d67aabdSBjoern A. Zeeb _tssi_set_tmeter_tbl(rtwdev, phy, i); 3963*6d67aabdSBjoern A. Zeeb 3964*6d67aabdSBjoern A. Zeeb if (tssi_info->alignment_done[i][band]) 3965*6d67aabdSBjoern A. Zeeb _tssi_alimentk_done(rtwdev, phy, i); 3966*6d67aabdSBjoern A. Zeeb else 3967*6d67aabdSBjoern A. Zeeb _tssi_alignment_default(rtwdev, phy, i, true); 3968*6d67aabdSBjoern A. Zeeb } 3969*6d67aabdSBjoern A. Zeeb 3970*6d67aabdSBjoern A. Zeeb _tssi_enable(rtwdev, phy); 3971*6d67aabdSBjoern A. Zeeb _tssi_set_efuse_to_de(rtwdev, phy); 3972*6d67aabdSBjoern A. Zeeb } 3973*6d67aabdSBjoern A. Zeeb 3974*6d67aabdSBjoern A. Zeeb static void rtw8852bt_tssi_default_txagc(struct rtw89_dev *rtwdev, 3975*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy, bool enable) 3976*6d67aabdSBjoern A. Zeeb { 3977*6d67aabdSBjoern A. Zeeb const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 3978*6d67aabdSBjoern A. Zeeb u8 channel = chan->channel; 3979*6d67aabdSBjoern A. Zeeb 3980*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n", 3981*6d67aabdSBjoern A. Zeeb __func__, channel); 3982*6d67aabdSBjoern A. Zeeb 3983*6d67aabdSBjoern A. Zeeb if (enable) 3984*6d67aabdSBjoern A. Zeeb return; 3985*6d67aabdSBjoern A. Zeeb 3986*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 3987*6d67aabdSBjoern A. Zeeb "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", 3988*6d67aabdSBjoern A. Zeeb __func__, 3989*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), 3990*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); 3991*6d67aabdSBjoern A. Zeeb 3992*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0); 3993*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT, 0xc0); 3994*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 3995*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 3996*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0); 3997*6d67aabdSBjoern A. Zeeb rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1); 3998*6d67aabdSBjoern A. Zeeb 3999*6d67aabdSBjoern A. Zeeb _tssi_alimentk_done(rtwdev, phy, RF_PATH_A); 4000*6d67aabdSBjoern A. Zeeb _tssi_alimentk_done(rtwdev, phy, RF_PATH_B); 4001*6d67aabdSBjoern A. Zeeb 4002*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 4003*6d67aabdSBjoern A. Zeeb "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", 4004*6d67aabdSBjoern A. Zeeb __func__, 4005*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), 4006*6d67aabdSBjoern A. Zeeb rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); 4007*6d67aabdSBjoern A. Zeeb 4008*6d67aabdSBjoern A. Zeeb rtw89_debug(rtwdev, RTW89_DBG_RFK, 4009*6d67aabdSBjoern A. Zeeb "======> %s SCAN_END\n", __func__); 4010*6d67aabdSBjoern A. Zeeb } 4011*6d67aabdSBjoern A. Zeeb 4012*6d67aabdSBjoern A. Zeeb void rtw8852bt_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start, 4013*6d67aabdSBjoern A. Zeeb enum rtw89_phy_idx phy_idx) 4014*6d67aabdSBjoern A. Zeeb { 4015*6d67aabdSBjoern A. Zeeb if (scan_start) 4016*6d67aabdSBjoern A. Zeeb rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, true); 4017*6d67aabdSBjoern A. Zeeb else 4018*6d67aabdSBjoern A. Zeeb rtw8852bt_tssi_default_txagc(rtwdev, phy_idx, false); 4019*6d67aabdSBjoern A. Zeeb } 4020