162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2019-2022 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "coex.h" 662306a36Sopenharmony_ci#include "debug.h" 762306a36Sopenharmony_ci#include "mac.h" 862306a36Sopenharmony_ci#include "phy.h" 962306a36Sopenharmony_ci#include "reg.h" 1062306a36Sopenharmony_ci#include "rtw8852b.h" 1162306a36Sopenharmony_ci#include "rtw8852b_rfk.h" 1262306a36Sopenharmony_ci#include "rtw8852b_rfk_table.h" 1362306a36Sopenharmony_ci#include "rtw8852b_table.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define RTW8852B_RXDCK_VER 0x1 1662306a36Sopenharmony_ci#define RTW8852B_IQK_VER 0x2a 1762306a36Sopenharmony_ci#define RTW8852B_IQK_SS 2 1862306a36Sopenharmony_ci#define RTW8852B_RXK_GROUP_NR 4 1962306a36Sopenharmony_ci#define RTW8852B_TSSI_PATH_NR 2 2062306a36Sopenharmony_ci#define RTW8852B_RF_REL_VERSION 34 2162306a36Sopenharmony_ci#define RTW8852B_DPK_VER 0x0d 2262306a36Sopenharmony_ci#define RTW8852B_DPK_RF_PATH 2 2362306a36Sopenharmony_ci#define RTW8852B_DPK_KIP_REG_NUM 2 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci#define _TSSI_DE_MASK GENMASK(21, 12) 2662306a36Sopenharmony_ci#define ADDC_T_AVG 100 2762306a36Sopenharmony_ci#define DPK_TXAGC_LOWER 0x2e 2862306a36Sopenharmony_ci#define DPK_TXAGC_UPPER 0x3f 2962306a36Sopenharmony_ci#define DPK_TXAGC_INVAL 0xff 3062306a36Sopenharmony_ci#define RFREG_MASKRXBB 0x003e0 3162306a36Sopenharmony_ci#define RFREG_MASKMODE 0xf0000 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cienum rtw8852b_dpk_id { 3462306a36Sopenharmony_ci LBK_RXIQK = 0x06, 3562306a36Sopenharmony_ci SYNC = 0x10, 3662306a36Sopenharmony_ci MDPK_IDL = 0x11, 3762306a36Sopenharmony_ci MDPK_MPA = 0x12, 3862306a36Sopenharmony_ci GAIN_LOSS = 0x13, 3962306a36Sopenharmony_ci GAIN_CAL = 0x14, 4062306a36Sopenharmony_ci DPK_RXAGC = 0x15, 4162306a36Sopenharmony_ci KIP_PRESET = 0x16, 4262306a36Sopenharmony_ci KIP_RESTORE = 0x17, 4362306a36Sopenharmony_ci DPK_TXAGC = 0x19, 4462306a36Sopenharmony_ci D_KIP_PRESET = 0x28, 4562306a36Sopenharmony_ci D_TXAGC = 0x29, 4662306a36Sopenharmony_ci D_RXAGC = 0x2a, 4762306a36Sopenharmony_ci D_SYNC = 0x2b, 4862306a36Sopenharmony_ci D_GAIN_LOSS = 0x2c, 4962306a36Sopenharmony_ci D_MDPK_IDL = 0x2d, 5062306a36Sopenharmony_ci D_GAIN_NORM = 0x2f, 5162306a36Sopenharmony_ci D_KIP_THERMAL = 0x30, 5262306a36Sopenharmony_ci D_KIP_RESTORE = 0x31 5362306a36Sopenharmony_ci}; 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cienum dpk_agc_step { 5662306a36Sopenharmony_ci DPK_AGC_STEP_SYNC_DGAIN, 5762306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_ADJ, 5862306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_LOSS_IDX, 5962306a36Sopenharmony_ci DPK_AGC_STEP_GL_GT_CRITERION, 6062306a36Sopenharmony_ci DPK_AGC_STEP_GL_LT_CRITERION, 6162306a36Sopenharmony_ci DPK_AGC_STEP_SET_TX_GAIN, 6262306a36Sopenharmony_ci}; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cienum rtw8852b_iqk_type { 6562306a36Sopenharmony_ci ID_TXAGC = 0x0, 6662306a36Sopenharmony_ci ID_FLOK_COARSE = 0x1, 6762306a36Sopenharmony_ci ID_FLOK_FINE = 0x2, 6862306a36Sopenharmony_ci ID_TXK = 0x3, 6962306a36Sopenharmony_ci ID_RXAGC = 0x4, 7062306a36Sopenharmony_ci ID_RXK = 0x5, 7162306a36Sopenharmony_ci ID_NBTXK = 0x6, 7262306a36Sopenharmony_ci ID_NBRXK = 0x7, 7362306a36Sopenharmony_ci ID_FLOK_VBUFFER = 0x8, 7462306a36Sopenharmony_ci ID_A_FLOK_COARSE = 0x9, 7562306a36Sopenharmony_ci ID_G_FLOK_COARSE = 0xa, 7662306a36Sopenharmony_ci ID_A_FLOK_FINE = 0xb, 7762306a36Sopenharmony_ci ID_G_FLOK_FINE = 0xc, 7862306a36Sopenharmony_ci ID_IQK_RESTORE = 0x10, 7962306a36Sopenharmony_ci}; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistatic const u32 _tssi_trigger[RTW8852B_TSSI_PATH_NR] = {0x5820, 0x7820}; 8262306a36Sopenharmony_cistatic const u32 _tssi_cw_rpt_addr[RTW8852B_TSSI_PATH_NR] = {0x1c18, 0x3c18}; 8362306a36Sopenharmony_cistatic const u32 _tssi_cw_default_addr[RTW8852B_TSSI_PATH_NR][4] = { 8462306a36Sopenharmony_ci {0x5634, 0x5630, 0x5630, 0x5630}, 8562306a36Sopenharmony_ci {0x7634, 0x7630, 0x7630, 0x7630} }; 8662306a36Sopenharmony_cistatic const u32 _tssi_cw_default_mask[4] = { 8762306a36Sopenharmony_ci 0x000003ff, 0x3ff00000, 0x000ffc00, 0x000003ff}; 8862306a36Sopenharmony_cistatic const u32 _tssi_de_cck_long[RF_PATH_NUM_8852B] = {0x5858, 0x7858}; 8962306a36Sopenharmony_cistatic const u32 _tssi_de_cck_short[RF_PATH_NUM_8852B] = {0x5860, 0x7860}; 9062306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852B] = {0x5838, 0x7838}; 9162306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852B] = {0x5840, 0x7840}; 9262306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852B] = {0x5848, 0x7848}; 9362306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852B] = {0x5850, 0x7850}; 9462306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852B] = {0x5828, 0x7828}; 9562306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852B] = {0x5830, 0x7830}; 9662306a36Sopenharmony_cistatic const u32 _a_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x190, 0x198, 0x350, 0x352}; 9762306a36Sopenharmony_cistatic const u32 _a_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x0f, 0x0f, 0x3f, 0x7f}; 9862306a36Sopenharmony_cistatic const u32 _a_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x1, 0x0, 0x0}; 9962306a36Sopenharmony_cistatic const u32 _g_idxrxgain[RTW8852B_RXK_GROUP_NR] = {0x212, 0x21c, 0x350, 0x360}; 10062306a36Sopenharmony_cistatic const u32 _g_idxattc2[RTW8852B_RXK_GROUP_NR] = {0x00, 0x00, 0x28, 0x5f}; 10162306a36Sopenharmony_cistatic const u32 _g_idxattc1[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x2, 0x1}; 10262306a36Sopenharmony_cistatic const u32 _a_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0}; 10362306a36Sopenharmony_cistatic const u32 _a_track_range[RTW8852B_RXK_GROUP_NR] = {0x3, 0x3, 0x6, 0x6}; 10462306a36Sopenharmony_cistatic const u32 _a_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e}; 10562306a36Sopenharmony_cistatic const u32 _a_itqt[RTW8852B_RXK_GROUP_NR] = {0x12, 0x12, 0x12, 0x1b}; 10662306a36Sopenharmony_cistatic const u32 _g_power_range[RTW8852B_RXK_GROUP_NR] = {0x0, 0x0, 0x0, 0x0}; 10762306a36Sopenharmony_cistatic const u32 _g_track_range[RTW8852B_RXK_GROUP_NR] = {0x4, 0x4, 0x6, 0x6}; 10862306a36Sopenharmony_cistatic const u32 _g_gain_bb[RTW8852B_RXK_GROUP_NR] = {0x08, 0x0e, 0x06, 0x0e}; 10962306a36Sopenharmony_cistatic const u32 _g_itqt[RTW8852B_RXK_GROUP_NR] = {0x09, 0x12, 0x1b, 0x24}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic const u32 rtw8852b_backup_bb_regs[] = {0x2344, 0x5800, 0x7800}; 11262306a36Sopenharmony_cistatic const u32 rtw8852b_backup_rf_regs[] = { 11362306a36Sopenharmony_ci 0xde, 0xdf, 0x8b, 0x90, 0x97, 0x85, 0x1e, 0x0, 0x2, 0x5, 0x10005 11462306a36Sopenharmony_ci}; 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852b_backup_bb_regs) 11762306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852b_backup_rf_regs) 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic const struct rtw89_reg3_def rtw8852b_set_nondbcc_path01[] = { 12062306a36Sopenharmony_ci {0x20fc, 0xffff0000, 0x0303}, 12162306a36Sopenharmony_ci {0x5864, 0x18000000, 0x3}, 12262306a36Sopenharmony_ci {0x7864, 0x18000000, 0x3}, 12362306a36Sopenharmony_ci {0x12b8, 0x40000000, 0x1}, 12462306a36Sopenharmony_ci {0x32b8, 0x40000000, 0x1}, 12562306a36Sopenharmony_ci {0x030c, 0xff000000, 0x13}, 12662306a36Sopenharmony_ci {0x032c, 0xffff0000, 0x0041}, 12762306a36Sopenharmony_ci {0x12b8, 0x10000000, 0x1}, 12862306a36Sopenharmony_ci {0x58c8, 0x01000000, 0x1}, 12962306a36Sopenharmony_ci {0x78c8, 0x01000000, 0x1}, 13062306a36Sopenharmony_ci {0x5864, 0xc0000000, 0x3}, 13162306a36Sopenharmony_ci {0x7864, 0xc0000000, 0x3}, 13262306a36Sopenharmony_ci {0x2008, 0x01ffffff, 0x1ffffff}, 13362306a36Sopenharmony_ci {0x0c1c, 0x00000004, 0x1}, 13462306a36Sopenharmony_ci {0x0700, 0x08000000, 0x1}, 13562306a36Sopenharmony_ci {0x0c70, 0x000003ff, 0x3ff}, 13662306a36Sopenharmony_ci {0x0c60, 0x00000003, 0x3}, 13762306a36Sopenharmony_ci {0x0c6c, 0x00000001, 0x1}, 13862306a36Sopenharmony_ci {0x58ac, 0x08000000, 0x1}, 13962306a36Sopenharmony_ci {0x78ac, 0x08000000, 0x1}, 14062306a36Sopenharmony_ci {0x0c3c, 0x00000200, 0x1}, 14162306a36Sopenharmony_ci {0x2344, 0x80000000, 0x1}, 14262306a36Sopenharmony_ci {0x4490, 0x80000000, 0x1}, 14362306a36Sopenharmony_ci {0x12a0, 0x00007000, 0x7}, 14462306a36Sopenharmony_ci {0x12a0, 0x00008000, 0x1}, 14562306a36Sopenharmony_ci {0x12a0, 0x00070000, 0x3}, 14662306a36Sopenharmony_ci {0x12a0, 0x00080000, 0x1}, 14762306a36Sopenharmony_ci {0x32a0, 0x00070000, 0x3}, 14862306a36Sopenharmony_ci {0x32a0, 0x00080000, 0x1}, 14962306a36Sopenharmony_ci {0x0700, 0x01000000, 0x1}, 15062306a36Sopenharmony_ci {0x0700, 0x06000000, 0x2}, 15162306a36Sopenharmony_ci {0x20fc, 0xffff0000, 0x3333}, 15262306a36Sopenharmony_ci}; 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistatic const struct rtw89_reg3_def rtw8852b_restore_nondbcc_path01[] = { 15562306a36Sopenharmony_ci {0x20fc, 0xffff0000, 0x0303}, 15662306a36Sopenharmony_ci {0x12b8, 0x40000000, 0x0}, 15762306a36Sopenharmony_ci {0x32b8, 0x40000000, 0x0}, 15862306a36Sopenharmony_ci {0x5864, 0xc0000000, 0x0}, 15962306a36Sopenharmony_ci {0x7864, 0xc0000000, 0x0}, 16062306a36Sopenharmony_ci {0x2008, 0x01ffffff, 0x0000000}, 16162306a36Sopenharmony_ci {0x0c1c, 0x00000004, 0x0}, 16262306a36Sopenharmony_ci {0x0700, 0x08000000, 0x0}, 16362306a36Sopenharmony_ci {0x0c70, 0x0000001f, 0x03}, 16462306a36Sopenharmony_ci {0x0c70, 0x000003e0, 0x03}, 16562306a36Sopenharmony_ci {0x12a0, 0x000ff000, 0x00}, 16662306a36Sopenharmony_ci {0x32a0, 0x000ff000, 0x00}, 16762306a36Sopenharmony_ci {0x0700, 0x07000000, 0x0}, 16862306a36Sopenharmony_ci {0x20fc, 0xffff0000, 0x0000}, 16962306a36Sopenharmony_ci {0x58c8, 0x01000000, 0x0}, 17062306a36Sopenharmony_ci {0x78c8, 0x01000000, 0x0}, 17162306a36Sopenharmony_ci {0x0c3c, 0x00000200, 0x0}, 17262306a36Sopenharmony_ci {0x2344, 0x80000000, 0x0}, 17362306a36Sopenharmony_ci}; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) 17662306a36Sopenharmony_ci{ 17762306a36Sopenharmony_ci u32 i; 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 18062306a36Sopenharmony_ci backup_bb_reg_val[i] = 18162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, rtw8852b_backup_bb_regs[i], 18262306a36Sopenharmony_ci MASKDWORD); 18362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 18462306a36Sopenharmony_ci "[RFK]backup bb reg : %x, value =%x\n", 18562306a36Sopenharmony_ci rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]); 18662306a36Sopenharmony_ci } 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], 19062306a36Sopenharmony_ci u8 rf_path) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci u32 i; 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 19562306a36Sopenharmony_ci backup_rf_reg_val[i] = 19662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, rf_path, 19762306a36Sopenharmony_ci rtw8852b_backup_rf_regs[i], RFREG_MASK); 19862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 19962306a36Sopenharmony_ci "[RFK]backup rf S%d reg : %x, value =%x\n", rf_path, 20062306a36Sopenharmony_ci rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]); 20162306a36Sopenharmony_ci } 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev, 20562306a36Sopenharmony_ci const u32 backup_bb_reg_val[]) 20662306a36Sopenharmony_ci{ 20762306a36Sopenharmony_ci u32 i; 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 21062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, rtw8852b_backup_bb_regs[i], 21162306a36Sopenharmony_ci MASKDWORD, backup_bb_reg_val[i]); 21262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 21362306a36Sopenharmony_ci "[RFK]restore bb reg : %x, value =%x\n", 21462306a36Sopenharmony_ci rtw8852b_backup_bb_regs[i], backup_bb_reg_val[i]); 21562306a36Sopenharmony_ci } 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev, 21962306a36Sopenharmony_ci const u32 backup_rf_reg_val[], u8 rf_path) 22062306a36Sopenharmony_ci{ 22162306a36Sopenharmony_ci u32 i; 22262306a36Sopenharmony_ci 22362306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 22462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, rf_path, rtw8852b_backup_rf_regs[i], 22562306a36Sopenharmony_ci RFREG_MASK, backup_rf_reg_val[i]); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 22862306a36Sopenharmony_ci "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path, 22962306a36Sopenharmony_ci rtw8852b_backup_rf_regs[i], backup_rf_reg_val[i]); 23062306a36Sopenharmony_ci } 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev, 23462306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 23562306a36Sopenharmony_ci{ 23662306a36Sopenharmony_ci if (is_bybb) 23762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 23862306a36Sopenharmony_ci else 23962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_cistatic void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev, 24362306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci if (is_bybb) 24662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 24762306a36Sopenharmony_ci else 24862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci bool fail = true; 25462306a36Sopenharmony_ci u32 val; 25562306a36Sopenharmony_ci int ret; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 25862306a36Sopenharmony_ci 1, 8200, false, rtwdev, 0xbff8, MASKBYTE0); 25962306a36Sopenharmony_ci if (ret) 26062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]NCTL1 IQK timeout!!!\n"); 26162306a36Sopenharmony_ci 26262306a36Sopenharmony_ci udelay(200); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci if (!ret) 26562306a36Sopenharmony_ci fail = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 26662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret); 26962306a36Sopenharmony_ci val = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD); 27062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8008 = 0x%x\n", path, val); 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci return fail; 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci u8 val; 27862306a36Sopenharmony_ci 27962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x,PHY%d\n", 28062306a36Sopenharmony_ci rtwdev->dbcc_en, phy_idx); 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci if (!rtwdev->dbcc_en) { 28362306a36Sopenharmony_ci val = RF_AB; 28462306a36Sopenharmony_ci } else { 28562306a36Sopenharmony_ci if (phy_idx == RTW89_PHY_0) 28662306a36Sopenharmony_ci val = RF_A; 28762306a36Sopenharmony_ci else 28862306a36Sopenharmony_ci val = RF_B; 28962306a36Sopenharmony_ci } 29062306a36Sopenharmony_ci return val; 29162306a36Sopenharmony_ci} 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 29462306a36Sopenharmony_ci enum rtw89_rf_path path) 29562306a36Sopenharmony_ci{ 29662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0); 29762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 29862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 29962306a36Sopenharmony_ci mdelay(1); 30062306a36Sopenharmony_ci} 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci u8 path, dck_tune; 30562306a36Sopenharmony_ci u32 rf_reg5; 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 30862306a36Sopenharmony_ci "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, CV : 0x%x) ******\n", 30962306a36Sopenharmony_ci RTW8852B_RXDCK_VER, rtwdev->hal.cv); 31062306a36Sopenharmony_ci 31162306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852B; path++) { 31262306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 31362306a36Sopenharmony_ci dck_tune = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 31662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 31762306a36Sopenharmony_ci R_P0_TSSI_TRK + (path << 13), 31862306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x1); 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 32162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); 32262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 32362306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path); 32462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune); 32562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 32862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 32962306a36Sopenharmony_ci R_P0_TSSI_TRK + (path << 13), 33062306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x0); 33162306a36Sopenharmony_ci } 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 33562306a36Sopenharmony_ci{ 33662306a36Sopenharmony_ci u32 rf_reg5; 33762306a36Sopenharmony_ci u32 rck_val; 33862306a36Sopenharmony_ci u32 val; 33962306a36Sopenharmony_ci int ret; 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 34462306a36Sopenharmony_ci 34562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 34662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n", 34962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci /* RCK trigger */ 35262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30, 35562306a36Sopenharmony_ci false, rtwdev, path, RR_RCKS, BIT(3)); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n", 36062306a36Sopenharmony_ci rck_val, ret); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); 36362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n", 36662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK)); 36762306a36Sopenharmony_ci} 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_cistatic void _afe_init(struct rtw89_dev *rtwdev) 37062306a36Sopenharmony_ci{ 37162306a36Sopenharmony_ci rtw89_write32(rtwdev, R_AX_PHYREG_SET, 0xf); 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_afe_init_defs_tbl); 37462306a36Sopenharmony_ci} 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_cistatic void _drck(struct rtw89_dev *rtwdev) 37762306a36Sopenharmony_ci{ 37862306a36Sopenharmony_ci u32 rck_d; 37962306a36Sopenharmony_ci u32 val; 38062306a36Sopenharmony_ci int ret; 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n"); 38362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x1); 38462306a36Sopenharmony_ci 38562306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 38662306a36Sopenharmony_ci false, rtwdev, R_DRCK_RS, B_DRCK_RS_DONE); 38762306a36Sopenharmony_ci if (ret) 38862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n"); 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_KICK, 0x0); 39162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1); 39262306a36Sopenharmony_ci udelay(1); 39362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0); 39462306a36Sopenharmony_ci rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RS, B_DRCK_RS_LPS); 39562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_SEL, 0x0); 39662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_V1, B_DRCK_V1_CV, rck_d); 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0cc = 0x%x\n", 39962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DRCK_V1, MASKDWORD)); 40062306a36Sopenharmony_ci} 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev) 40362306a36Sopenharmony_ci{ 40462306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0); 40762306a36Sopenharmony_ci dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0); 40862306a36Sopenharmony_ci dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1); 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0); 41162306a36Sopenharmony_ci dack->addck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A0); 41262306a36Sopenharmony_ci dack->addck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, B_ADDCKR1_A1); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev) 41662306a36Sopenharmony_ci{ 41762306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_ci /* S0 */ 42062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL, dack->addck_d[0][0]); 42162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_VAL, dack->addck_d[0][1] >> 6); 42262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0D, B_ADDCK0D_VAL2, dack->addck_d[0][1] & 0x3f); 42362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x3); 42462306a36Sopenharmony_ci 42562306a36Sopenharmony_ci /* S1 */ 42662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL, dack->addck_d[1][0]); 42762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK0_VAL, dack->addck_d[1][1] >> 6); 42862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1D, B_ADDCK1D_VAL2, dack->addck_d[1][1] & 0x3f); 42962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_MAN, 0x3); 43062306a36Sopenharmony_ci} 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev) 43362306a36Sopenharmony_ci{ 43462306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 43562306a36Sopenharmony_ci u8 i; 43662306a36Sopenharmony_ci 43762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 43862306a36Sopenharmony_ci 43962306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 44062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i); 44162306a36Sopenharmony_ci dack->msbk_d[0][0][i] = 44262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0); 44362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i); 44462306a36Sopenharmony_ci dack->msbk_d[0][1][i] = 44562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1); 44662306a36Sopenharmony_ci } 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci dack->biask_d[0][0] = 44962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00); 45062306a36Sopenharmony_ci dack->biask_d[0][1] = 45162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01); 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_ci dack->dadck_d[0][0] = 45462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00); 45562306a36Sopenharmony_ci dack->dadck_d[0][1] = 45662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01); 45762306a36Sopenharmony_ci} 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_cistatic void _dack_backup_s1(struct rtw89_dev *rtwdev) 46062306a36Sopenharmony_ci{ 46162306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 46262306a36Sopenharmony_ci u8 i; 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 46762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i); 46862306a36Sopenharmony_ci dack->msbk_d[1][0][i] = 46962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK10S); 47062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i); 47162306a36Sopenharmony_ci dack->msbk_d[1][1][i] = 47262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK11S); 47362306a36Sopenharmony_ci } 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ci dack->biask_d[1][0] = 47662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, B_DACK_BIAS10); 47762306a36Sopenharmony_ci dack->biask_d[1][1] = 47862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, B_DACK_BIAS11); 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci dack->dadck_d[1][0] = 48162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, B_DACK_DADCK10); 48262306a36Sopenharmony_ci dack->dadck_d[1][1] = 48362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, B_DACK_DADCK11); 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci s32 dc_re = 0, dc_im = 0; 48962306a36Sopenharmony_ci u32 tmp; 49062306a36Sopenharmony_ci u32 i; 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 49362306a36Sopenharmony_ci &rtw8852b_check_addc_defs_a_tbl, 49462306a36Sopenharmony_ci &rtw8852b_check_addc_defs_b_tbl); 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci for (i = 0; i < ADDC_T_AVG; i++) { 49762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD); 49862306a36Sopenharmony_ci dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11); 49962306a36Sopenharmony_ci dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11); 50062306a36Sopenharmony_ci } 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci dc_re /= ADDC_T_AVG; 50362306a36Sopenharmony_ci dc_im /= ADDC_T_AVG; 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 50662306a36Sopenharmony_ci "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im); 50762306a36Sopenharmony_ci} 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev) 51062306a36Sopenharmony_ci{ 51162306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 51262306a36Sopenharmony_ci u32 val; 51362306a36Sopenharmony_ci int ret; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci /* S0 */ 51662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_MAN, 0x0); 51762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, 0x30, 0x0); 51862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 51962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); 52062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); 52162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); 52262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); 52362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); 52462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x1); 52562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n"); 52862306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_A); 52962306a36Sopenharmony_ci 53062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x1); 53162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_TRG, 0x0); 53262306a36Sopenharmony_ci udelay(1); 53362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1); 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 53662306a36Sopenharmony_ci false, rtwdev, R_ADDCKR0, BIT(0)); 53762306a36Sopenharmony_ci if (ret) { 53862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); 53962306a36Sopenharmony_ci dack->addck_timeout[0] = true; 54062306a36Sopenharmony_ci } 54162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); 54262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n"); 54362306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_A); 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH0_SAMPL_DLY_T_V1, BIT(1), 0x0); 54662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); 54762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); 54862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); 54962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci /* S1 */ 55262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 55362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x0); 55462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); 55562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); 55662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xf); 55762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x0); 55862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x1); 55962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n"); 56262306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_B); 56362306a36Sopenharmony_ci 56462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x1); 56562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_TRG, 0x0); 56662306a36Sopenharmony_ci udelay(1); 56762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1); 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 57062306a36Sopenharmony_ci false, rtwdev, R_ADDCKR1, BIT(0)); 57162306a36Sopenharmony_ci if (ret) { 57262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n"); 57362306a36Sopenharmony_ci dack->addck_timeout[1] = true; 57462306a36Sopenharmony_ci } 57562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); 57662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n"); 57762306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_B); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH1_SAMPL_DLY_T_V1, BIT(1), 0x0); 58062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_EN, 0x1); 58162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0xc); 58262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK, 0x1); 58362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 58962306a36Sopenharmony_ci &rtw8852b_check_dadc_en_defs_a_tbl, 59062306a36Sopenharmony_ci &rtw8852b_check_dadc_en_defs_b_tbl); 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci _check_addc(rtwdev, path); 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 59562306a36Sopenharmony_ci &rtw8852b_check_dadc_dis_defs_a_tbl, 59662306a36Sopenharmony_ci &rtw8852b_check_dadc_dis_defs_b_tbl); 59762306a36Sopenharmony_ci} 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_cistatic bool _dack_s0_check_done(struct rtw89_dev *rtwdev, bool part1) 60062306a36Sopenharmony_ci{ 60162306a36Sopenharmony_ci if (part1) { 60262306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 || 60362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0) 60462306a36Sopenharmony_ci return false; 60562306a36Sopenharmony_ci } else { 60662306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 || 60762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0) 60862306a36Sopenharmony_ci return false; 60962306a36Sopenharmony_ci } 61062306a36Sopenharmony_ci 61162306a36Sopenharmony_ci return true; 61262306a36Sopenharmony_ci} 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev) 61562306a36Sopenharmony_ci{ 61662306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 61762306a36Sopenharmony_ci bool done; 61862306a36Sopenharmony_ci int ret; 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_1_defs_tbl); 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000, 62362306a36Sopenharmony_ci false, rtwdev, true); 62462306a36Sopenharmony_ci if (ret) { 62562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n"); 62662306a36Sopenharmony_ci dack->msbk_timeout[0] = true; 62762306a36Sopenharmony_ci } 62862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_2_defs_tbl); 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_dack_s0_check_done, done, done, 1, 10000, 63362306a36Sopenharmony_ci false, rtwdev, false); 63462306a36Sopenharmony_ci if (ret) { 63562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n"); 63662306a36Sopenharmony_ci dack->dadck_timeout[0] = true; 63762306a36Sopenharmony_ci } 63862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s0_3_defs_tbl); 64162306a36Sopenharmony_ci 64262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n"); 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_ci _dack_backup_s0(rtwdev); 64562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 64662306a36Sopenharmony_ci} 64762306a36Sopenharmony_ci 64862306a36Sopenharmony_cistatic bool _dack_s1_check_done(struct rtw89_dev *rtwdev, bool part1) 64962306a36Sopenharmony_ci{ 65062306a36Sopenharmony_ci if (part1) { 65162306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 && 65262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0) 65362306a36Sopenharmony_ci return false; 65462306a36Sopenharmony_ci } else { 65562306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK10S, B_DACK_S1P2_OK) == 0 && 65662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK11S, B_DACK_S1P3_OK) == 0) 65762306a36Sopenharmony_ci return false; 65862306a36Sopenharmony_ci } 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci return true; 66162306a36Sopenharmony_ci} 66262306a36Sopenharmony_ci 66362306a36Sopenharmony_cistatic void _dack_s1(struct rtw89_dev *rtwdev) 66462306a36Sopenharmony_ci{ 66562306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 66662306a36Sopenharmony_ci bool done; 66762306a36Sopenharmony_ci int ret; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_1_defs_tbl); 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000, 67262306a36Sopenharmony_ci false, rtwdev, true); 67362306a36Sopenharmony_ci if (ret) { 67462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n"); 67562306a36Sopenharmony_ci dack->msbk_timeout[1] = true; 67662306a36Sopenharmony_ci } 67762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 67862306a36Sopenharmony_ci 67962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_2_defs_tbl); 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_dack_s1_check_done, done, done, 1, 10000, 68262306a36Sopenharmony_ci false, rtwdev, false); 68362306a36Sopenharmony_ci if (ret) { 68462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n"); 68562306a36Sopenharmony_ci dack->dadck_timeout[1] = true; 68662306a36Sopenharmony_ci } 68762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dack_s1_3_defs_tbl); 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n"); 69262306a36Sopenharmony_ci 69362306a36Sopenharmony_ci _check_dadc(rtwdev, RF_PATH_B); 69462306a36Sopenharmony_ci _dack_backup_s1(rtwdev); 69562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 69662306a36Sopenharmony_ci} 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev) 69962306a36Sopenharmony_ci{ 70062306a36Sopenharmony_ci _dack_s0(rtwdev); 70162306a36Sopenharmony_ci _dack_s1(rtwdev); 70262306a36Sopenharmony_ci} 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev) 70562306a36Sopenharmony_ci{ 70662306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 70762306a36Sopenharmony_ci u8 i; 70862306a36Sopenharmony_ci u8 t; 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 71162306a36Sopenharmony_ci "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", 71262306a36Sopenharmony_ci dack->addck_d[0][0], dack->addck_d[0][1]); 71362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 71462306a36Sopenharmony_ci "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n", 71562306a36Sopenharmony_ci dack->addck_d[1][0], dack->addck_d[1][1]); 71662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 71762306a36Sopenharmony_ci "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", 71862306a36Sopenharmony_ci dack->dadck_d[0][0], dack->dadck_d[0][1]); 71962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 72062306a36Sopenharmony_ci "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n", 72162306a36Sopenharmony_ci dack->dadck_d[1][0], dack->dadck_d[1][1]); 72262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 72362306a36Sopenharmony_ci "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", 72462306a36Sopenharmony_ci dack->biask_d[0][0], dack->biask_d[0][1]); 72562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 72662306a36Sopenharmony_ci "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n", 72762306a36Sopenharmony_ci dack->biask_d[1][0], dack->biask_d[1][1]); 72862306a36Sopenharmony_ci 72962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); 73062306a36Sopenharmony_ci for (i = 0; i < 0x10; i++) { 73162306a36Sopenharmony_ci t = dack->msbk_d[0][0][i]; 73262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 73362306a36Sopenharmony_ci } 73462306a36Sopenharmony_ci 73562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); 73662306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 73762306a36Sopenharmony_ci t = dack->msbk_d[0][1][i]; 73862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 73962306a36Sopenharmony_ci } 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n"); 74262306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 74362306a36Sopenharmony_ci t = dack->msbk_d[1][0][i]; 74462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 74562306a36Sopenharmony_ci } 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n"); 74862306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 74962306a36Sopenharmony_ci t = dack->msbk_d[1][1][i]; 75062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 75162306a36Sopenharmony_ci } 75262306a36Sopenharmony_ci} 75362306a36Sopenharmony_ci 75462306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force) 75562306a36Sopenharmony_ci{ 75662306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 75762306a36Sopenharmony_ci u32 rf0_0, rf1_0; 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci dack->dack_done = false; 76062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x1\n"); 76162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); 76262306a36Sopenharmony_ci 76362306a36Sopenharmony_ci rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK); 76462306a36Sopenharmony_ci rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK); 76562306a36Sopenharmony_ci _afe_init(rtwdev); 76662306a36Sopenharmony_ci _drck(rtwdev); 76762306a36Sopenharmony_ci 76862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0); 76962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0); 77062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1); 77162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1); 77262306a36Sopenharmony_ci _addck(rtwdev); 77362306a36Sopenharmony_ci _addck_backup(rtwdev); 77462306a36Sopenharmony_ci _addck_reload(rtwdev); 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0); 77762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0); 77862306a36Sopenharmony_ci _dack(rtwdev); 77962306a36Sopenharmony_ci _dack_dump(rtwdev); 78062306a36Sopenharmony_ci dack->dack_done = true; 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0); 78362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0); 78462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1); 78562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1); 78662306a36Sopenharmony_ci dack->dack_cnt++; 78762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); 78862306a36Sopenharmony_ci} 78962306a36Sopenharmony_ci 79062306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) 79162306a36Sopenharmony_ci{ 79262306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 79362306a36Sopenharmony_ci u32 tmp; 79462306a36Sopenharmony_ci 79562306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 79662306a36Sopenharmony_ci case RTW89_BAND_2G: 79762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 79862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1); 79962306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 80062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); 80162306a36Sopenharmony_ci break; 80262306a36Sopenharmony_ci case RTW89_BAND_5G: 80362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 80462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1); 80562306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 80662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); 80762306a36Sopenharmony_ci break; 80862306a36Sopenharmony_ci default: 80962306a36Sopenharmony_ci break; 81062306a36Sopenharmony_ci } 81162306a36Sopenharmony_ci} 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 81462306a36Sopenharmony_ci u8 path, u8 ktype) 81562306a36Sopenharmony_ci{ 81662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 81762306a36Sopenharmony_ci u32 iqk_cmd; 81862306a36Sopenharmony_ci bool fail; 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci switch (ktype) { 82162306a36Sopenharmony_ci case ID_FLOK_COARSE: 82262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 82362306a36Sopenharmony_ci iqk_cmd = 0x108 | (1 << (4 + path)); 82462306a36Sopenharmony_ci break; 82562306a36Sopenharmony_ci case ID_FLOK_FINE: 82662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 82762306a36Sopenharmony_ci iqk_cmd = 0x208 | (1 << (4 + path)); 82862306a36Sopenharmony_ci break; 82962306a36Sopenharmony_ci case ID_FLOK_VBUFFER: 83062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 83162306a36Sopenharmony_ci iqk_cmd = 0x308 | (1 << (4 + path)); 83262306a36Sopenharmony_ci break; 83362306a36Sopenharmony_ci case ID_TXK: 83462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 83562306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 83662306a36Sopenharmony_ci (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8); 83762306a36Sopenharmony_ci break; 83862306a36Sopenharmony_ci case ID_RXAGC: 83962306a36Sopenharmony_ci iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1); 84062306a36Sopenharmony_ci break; 84162306a36Sopenharmony_ci case ID_RXK: 84262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 84362306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 84462306a36Sopenharmony_ci (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8); 84562306a36Sopenharmony_ci break; 84662306a36Sopenharmony_ci case ID_NBTXK: 84762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 84862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x011); 84962306a36Sopenharmony_ci iqk_cmd = 0x408 | (1 << (4 + path)); 85062306a36Sopenharmony_ci break; 85162306a36Sopenharmony_ci case ID_NBRXK: 85262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 85362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 85462306a36Sopenharmony_ci iqk_cmd = 0x608 | (1 << (4 + path)); 85562306a36Sopenharmony_ci break; 85662306a36Sopenharmony_ci default: 85762306a36Sopenharmony_ci return false; 85862306a36Sopenharmony_ci } 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); 86162306a36Sopenharmony_ci udelay(1); 86262306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path); 86362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci return fail; 86662306a36Sopenharmony_ci} 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_cistatic bool _rxk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 86962306a36Sopenharmony_ci u8 path) 87062306a36Sopenharmony_ci{ 87162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 87262306a36Sopenharmony_ci bool kfail = false; 87362306a36Sopenharmony_ci bool fail; 87462306a36Sopenharmony_ci u8 gp; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_ci for (gp = 0; gp < RTW8852B_RXK_GROUP_NR; gp++) { 87762306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 87862306a36Sopenharmony_ci case RTW89_BAND_2G: 87962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, 88062306a36Sopenharmony_ci _g_idxrxgain[gp]); 88162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, 88262306a36Sopenharmony_ci _g_idxattc2[gp]); 88362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, 88462306a36Sopenharmony_ci _g_idxattc1[gp]); 88562306a36Sopenharmony_ci break; 88662306a36Sopenharmony_ci case RTW89_BAND_5G: 88762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, 88862306a36Sopenharmony_ci _a_idxrxgain[gp]); 88962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, 89062306a36Sopenharmony_ci _a_idxattc2[gp]); 89162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, 89262306a36Sopenharmony_ci _a_idxattc1[gp]); 89362306a36Sopenharmony_ci break; 89462306a36Sopenharmony_ci default: 89562306a36Sopenharmony_ci break; 89662306a36Sopenharmony_ci } 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 89962306a36Sopenharmony_ci B_CFIR_LUT_SEL, 0x1); 90062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 90162306a36Sopenharmony_ci B_CFIR_LUT_SET, 0x0); 90262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 90362306a36Sopenharmony_ci B_CFIR_LUT_GP_V1, gp); 90462306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 90562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, 90662306a36Sopenharmony_ci BIT(16 + gp + path * 4), fail); 90762306a36Sopenharmony_ci kfail |= fail; 90862306a36Sopenharmony_ci } 90962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_ci if (kfail) { 91262306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000002; 91362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 91462306a36Sopenharmony_ci B_IQK_RES_RXCFIR, 0x0); 91562306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 91662306a36Sopenharmony_ci } else { 91762306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000000; 91862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 91962306a36Sopenharmony_ci B_IQK_RES_RXCFIR, 0x5); 92062306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = true; 92162306a36Sopenharmony_ci } 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_ci return kfail; 92462306a36Sopenharmony_ci} 92562306a36Sopenharmony_ci 92662306a36Sopenharmony_cistatic bool _iqk_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 92762306a36Sopenharmony_ci u8 path) 92862306a36Sopenharmony_ci{ 92962306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 93062306a36Sopenharmony_ci const u8 gp = 0x3; 93162306a36Sopenharmony_ci bool kfail = false; 93262306a36Sopenharmony_ci bool fail; 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 93562306a36Sopenharmony_ci case RTW89_BAND_2G: 93662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, 93762306a36Sopenharmony_ci _g_idxrxgain[gp]); 93862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, 93962306a36Sopenharmony_ci _g_idxattc2[gp]); 94062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, 94162306a36Sopenharmony_ci _g_idxattc1[gp]); 94262306a36Sopenharmony_ci break; 94362306a36Sopenharmony_ci case RTW89_BAND_5G: 94462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, 94562306a36Sopenharmony_ci _a_idxrxgain[gp]); 94662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_HATT, 94762306a36Sopenharmony_ci _a_idxattc2[gp]); 94862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_CC2, 94962306a36Sopenharmony_ci _a_idxattc1[gp]); 95062306a36Sopenharmony_ci break; 95162306a36Sopenharmony_ci default: 95262306a36Sopenharmony_ci break; 95362306a36Sopenharmony_ci } 95462306a36Sopenharmony_ci 95562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); 95662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x0); 95762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP_V1, gp); 95862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 95962306a36Sopenharmony_ci udelay(1); 96062306a36Sopenharmony_ci 96162306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 96262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail); 96362306a36Sopenharmony_ci kfail |= fail; 96462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_ci if (!kfail) 96762306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 96862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD) | 0x2; 96962306a36Sopenharmony_ci else 97062306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000002; 97162306a36Sopenharmony_ci 97262306a36Sopenharmony_ci return kfail; 97362306a36Sopenharmony_ci} 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_cistatic void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path) 97662306a36Sopenharmony_ci{ 97762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_ci if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) { 98062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 98162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 98262306a36Sopenharmony_ci udelay(1); 98362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f); 98462306a36Sopenharmony_ci udelay(1); 98562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03); 98662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001); 98762306a36Sopenharmony_ci udelay(1); 98862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); 98962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x2); 99062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1); 99162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x2); 99262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1); 99362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1); 99462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1); 99562306a36Sopenharmony_ci } else { 99662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 99762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 99862306a36Sopenharmony_ci udelay(1); 99962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x0f); 100062306a36Sopenharmony_ci udelay(1); 100162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x03); 100262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa001); 100362306a36Sopenharmony_ci udelay(1); 100462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); 100562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_VAL, 0x1); 100662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK, B_P0_RXCK_ON, 0x1); 100762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_VAL, 0x1); 100862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RXCK, B_P1_RXCK_ON, 0x1); 100962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON, 0x1); 101062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x0); 101162306a36Sopenharmony_ci } 101262306a36Sopenharmony_ci} 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_cistatic bool _txk_group_sel(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 101562306a36Sopenharmony_ci{ 101662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 101762306a36Sopenharmony_ci bool kfail = false; 101862306a36Sopenharmony_ci bool fail; 101962306a36Sopenharmony_ci u8 gp; 102062306a36Sopenharmony_ci 102162306a36Sopenharmony_ci for (gp = 0x0; gp < RTW8852B_RXK_GROUP_NR; gp++) { 102262306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 102362306a36Sopenharmony_ci case RTW89_BAND_2G: 102462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 102562306a36Sopenharmony_ci _g_power_range[gp]); 102662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 102762306a36Sopenharmony_ci _g_track_range[gp]); 102862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 102962306a36Sopenharmony_ci _g_gain_bb[gp]); 103062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 103162306a36Sopenharmony_ci MASKDWORD, _g_itqt[gp]); 103262306a36Sopenharmony_ci break; 103362306a36Sopenharmony_ci case RTW89_BAND_5G: 103462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 103562306a36Sopenharmony_ci _a_power_range[gp]); 103662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 103762306a36Sopenharmony_ci _a_track_range[gp]); 103862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 103962306a36Sopenharmony_ci _a_gain_bb[gp]); 104062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 104162306a36Sopenharmony_ci MASKDWORD, _a_itqt[gp]); 104262306a36Sopenharmony_ci break; 104362306a36Sopenharmony_ci default: 104462306a36Sopenharmony_ci break; 104562306a36Sopenharmony_ci } 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 104862306a36Sopenharmony_ci B_CFIR_LUT_SEL, 0x1); 104962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 105062306a36Sopenharmony_ci B_CFIR_LUT_SET, 0x1); 105162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 105262306a36Sopenharmony_ci B_CFIR_LUT_G2, 0x0); 105362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 105462306a36Sopenharmony_ci B_CFIR_LUT_GP, gp); 105562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 105662306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 105762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, 105862306a36Sopenharmony_ci BIT(8 + gp + path * 4), fail); 105962306a36Sopenharmony_ci kfail |= fail; 106062306a36Sopenharmony_ci } 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci if (kfail) { 106362306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000002; 106462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 106562306a36Sopenharmony_ci B_IQK_RES_TXCFIR, 0x0); 106662306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 106762306a36Sopenharmony_ci } else { 106862306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000000; 106962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 107062306a36Sopenharmony_ci B_IQK_RES_TXCFIR, 0x5); 107162306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 107262306a36Sopenharmony_ci } 107362306a36Sopenharmony_ci 107462306a36Sopenharmony_ci return kfail; 107562306a36Sopenharmony_ci} 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_cistatic bool _iqk_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 107862306a36Sopenharmony_ci{ 107962306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 108062306a36Sopenharmony_ci bool kfail; 108162306a36Sopenharmony_ci u8 gp = 0x2; 108262306a36Sopenharmony_ci 108362306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 108462306a36Sopenharmony_ci case RTW89_BAND_2G: 108562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 108662306a36Sopenharmony_ci _g_power_range[gp]); 108762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 108862306a36Sopenharmony_ci _g_track_range[gp]); 108962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 109062306a36Sopenharmony_ci _g_gain_bb[gp]); 109162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 109262306a36Sopenharmony_ci MASKDWORD, _g_itqt[gp]); 109362306a36Sopenharmony_ci break; 109462306a36Sopenharmony_ci case RTW89_BAND_5G: 109562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 109662306a36Sopenharmony_ci _a_power_range[gp]); 109762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 109862306a36Sopenharmony_ci _a_track_range[gp]); 109962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 110062306a36Sopenharmony_ci _a_gain_bb[gp]); 110162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 110262306a36Sopenharmony_ci MASKDWORD, _a_itqt[gp]); 110362306a36Sopenharmony_ci break; 110462306a36Sopenharmony_ci default: 110562306a36Sopenharmony_ci break; 110662306a36Sopenharmony_ci } 110762306a36Sopenharmony_ci 110862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); 110962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x1); 111062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G2, 0x0); 111162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp); 111262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 111362306a36Sopenharmony_ci kfail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci if (!kfail) 111662306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 111762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), 111862306a36Sopenharmony_ci MASKDWORD) | 0x2; 111962306a36Sopenharmony_ci else 112062306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000002; 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_ci return kfail; 112362306a36Sopenharmony_ci} 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_cistatic void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias) 112662306a36Sopenharmony_ci{ 112762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 112862306a36Sopenharmony_ci 112962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 113062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias); 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2); 113362306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 113462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0); 113562306a36Sopenharmony_ci else 113662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1); 113762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias); 113862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0); 113962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXVBUF, RR_TXVBUF_DACEN, 0x1); 114062306a36Sopenharmony_ci 114162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x7c = %x\n", path, 114262306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_TXVBUF, RFREG_MASK)); 114362306a36Sopenharmony_ci} 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_cistatic bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path) 114662306a36Sopenharmony_ci{ 114762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 114862306a36Sopenharmony_ci bool is_fail1, is_fail2; 114962306a36Sopenharmony_ci u32 vbuff_i; 115062306a36Sopenharmony_ci u32 vbuff_q; 115162306a36Sopenharmony_ci u32 core_i; 115262306a36Sopenharmony_ci u32 core_q; 115362306a36Sopenharmony_ci u32 tmp; 115462306a36Sopenharmony_ci u8 ch; 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK); 115762306a36Sopenharmony_ci core_i = FIELD_GET(RR_TXMO_COI, tmp); 115862306a36Sopenharmony_ci core_q = FIELD_GET(RR_TXMO_COQ, tmp); 115962306a36Sopenharmony_ci ch = (iqk_info->iqk_times / 2) % RTW89_IQK_CHS_NR; 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_ci if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d) 116262306a36Sopenharmony_ci is_fail1 = true; 116362306a36Sopenharmony_ci else 116462306a36Sopenharmony_ci is_fail1 = false; 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_ci iqk_info->lok_idac[ch][path] = tmp; 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK); 116962306a36Sopenharmony_ci vbuff_i = FIELD_GET(RR_LOKVB_COI, tmp); 117062306a36Sopenharmony_ci vbuff_q = FIELD_GET(RR_LOKVB_COQ, tmp); 117162306a36Sopenharmony_ci 117262306a36Sopenharmony_ci if (vbuff_i < 0x2 || vbuff_i > 0x3d || vbuff_q < 0x2 || vbuff_q > 0x3d) 117362306a36Sopenharmony_ci is_fail2 = true; 117462306a36Sopenharmony_ci else 117562306a36Sopenharmony_ci is_fail2 = false; 117662306a36Sopenharmony_ci 117762306a36Sopenharmony_ci iqk_info->lok_vbuf[ch][path] = tmp; 117862306a36Sopenharmony_ci 117962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 118062306a36Sopenharmony_ci "[IQK]S%x, lok_idac[%x][%x] = 0x%x\n", path, ch, path, 118162306a36Sopenharmony_ci iqk_info->lok_idac[ch][path]); 118262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 118362306a36Sopenharmony_ci "[IQK]S%x, lok_vbuf[%x][%x] = 0x%x\n", path, ch, path, 118462306a36Sopenharmony_ci iqk_info->lok_vbuf[ch][path]); 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci return is_fail1 | is_fail2; 118762306a36Sopenharmony_ci} 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_cistatic bool _iqk_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 119062306a36Sopenharmony_ci{ 119162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 119262306a36Sopenharmony_ci bool tmp; 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 119762306a36Sopenharmony_ci case RTW89_BAND_2G: 119862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 119962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6); 120062306a36Sopenharmony_ci break; 120162306a36Sopenharmony_ci case RTW89_BAND_5G: 120262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 120362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x4); 120462306a36Sopenharmony_ci break; 120562306a36Sopenharmony_ci default: 120662306a36Sopenharmony_ci break; 120762306a36Sopenharmony_ci } 120862306a36Sopenharmony_ci 120962306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 121062306a36Sopenharmony_ci case RTW89_BAND_2G: 121162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 121262306a36Sopenharmony_ci break; 121362306a36Sopenharmony_ci case RTW89_BAND_5G: 121462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 121562306a36Sopenharmony_ci break; 121662306a36Sopenharmony_ci default: 121762306a36Sopenharmony_ci break; 121862306a36Sopenharmony_ci } 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9); 122162306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE); 122262306a36Sopenharmony_ci iqk_info->lok_cor_fail[0][path] = tmp; 122362306a36Sopenharmony_ci 122462306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 122562306a36Sopenharmony_ci case RTW89_BAND_2G: 122662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 122762306a36Sopenharmony_ci break; 122862306a36Sopenharmony_ci case RTW89_BAND_5G: 122962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 123062306a36Sopenharmony_ci break; 123162306a36Sopenharmony_ci default: 123262306a36Sopenharmony_ci break; 123362306a36Sopenharmony_ci } 123462306a36Sopenharmony_ci 123562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24); 123662306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 123962306a36Sopenharmony_ci case RTW89_BAND_2G: 124062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 124162306a36Sopenharmony_ci break; 124262306a36Sopenharmony_ci case RTW89_BAND_5G: 124362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x0); 124462306a36Sopenharmony_ci break; 124562306a36Sopenharmony_ci default: 124662306a36Sopenharmony_ci break; 124762306a36Sopenharmony_ci } 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x9); 125062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 125162306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE); 125262306a36Sopenharmony_ci iqk_info->lok_fin_fail[0][path] = tmp; 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 125562306a36Sopenharmony_ci case RTW89_BAND_2G: 125662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 125762306a36Sopenharmony_ci break; 125862306a36Sopenharmony_ci case RTW89_BAND_5G: 125962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 126062306a36Sopenharmony_ci break; 126162306a36Sopenharmony_ci default: 126262306a36Sopenharmony_ci break; 126362306a36Sopenharmony_ci } 126462306a36Sopenharmony_ci 126562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, 0x24); 126662306a36Sopenharmony_ci _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); 126762306a36Sopenharmony_ci 126862306a36Sopenharmony_ci return _lok_finetune_check(rtwdev, path); 126962306a36Sopenharmony_ci} 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) 127262306a36Sopenharmony_ci{ 127362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 127662306a36Sopenharmony_ci case RTW89_BAND_2G: 127762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW2, 0x00); 127862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0); 127962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0); 128062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1); 128162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 128262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 128362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x00); 128462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); 128562306a36Sopenharmony_ci udelay(1); 128662306a36Sopenharmony_ci break; 128762306a36Sopenharmony_ci case RTW89_BAND_5G: 128862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00); 128962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x1); 129062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 129162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 129262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M1, 0x80); 129362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_IQK, 0x403e); 129462306a36Sopenharmony_ci udelay(1); 129562306a36Sopenharmony_ci break; 129662306a36Sopenharmony_ci default: 129762306a36Sopenharmony_ci break; 129862306a36Sopenharmony_ci } 129962306a36Sopenharmony_ci} 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_cistatic void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path) 130262306a36Sopenharmony_ci{ 130362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 130462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 130562306a36Sopenharmony_ci udelay(1); 130662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); 130762306a36Sopenharmony_ci udelay(1); 130862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); 130962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001); 131062306a36Sopenharmony_ci udelay(1); 131162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); 131262306a36Sopenharmony_ci} 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_cistatic void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 131562306a36Sopenharmony_ci{ 131662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 131762306a36Sopenharmony_ci u32 tmp; 131862306a36Sopenharmony_ci bool flag; 131962306a36Sopenharmony_ci 132062306a36Sopenharmony_ci flag = iqk_info->lok_cor_fail[0][path]; 132162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FCOR << (path * 4), flag); 132262306a36Sopenharmony_ci flag = iqk_info->lok_fin_fail[0][path]; 132362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FFIN << (path * 4), flag); 132462306a36Sopenharmony_ci flag = iqk_info->iqk_tx_fail[0][path]; 132562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FTX << (path * 4), flag); 132662306a36Sopenharmony_ci flag = iqk_info->iqk_rx_fail[0][path]; 132762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_F_RX << (path * 4), flag); 132862306a36Sopenharmony_ci 132962306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD); 133062306a36Sopenharmony_ci iqk_info->bp_iqkenable[path] = tmp; 133162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 133262306a36Sopenharmony_ci iqk_info->bp_txkresult[path] = tmp; 133362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD); 133462306a36Sopenharmony_ci iqk_info->bp_rxkresult[path] = tmp; 133562306a36Sopenharmony_ci 133662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, iqk_info->iqk_times); 133762306a36Sopenharmony_ci 133862306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, B_IQKINF_FAIL << (path * 4)); 133962306a36Sopenharmony_ci if (tmp) 134062306a36Sopenharmony_ci iqk_info->iqk_fail_cnt++; 134162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_FCNT << (path * 4), 134262306a36Sopenharmony_ci iqk_info->iqk_fail_cnt); 134362306a36Sopenharmony_ci} 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_cistatic void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 134662306a36Sopenharmony_ci{ 134762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 134862306a36Sopenharmony_ci bool lok_is_fail = false; 134962306a36Sopenharmony_ci const int try = 3; 135062306a36Sopenharmony_ci u8 ibias = 0x1; 135162306a36Sopenharmony_ci u8 i; 135262306a36Sopenharmony_ci 135362306a36Sopenharmony_ci _iqk_txclk_setting(rtwdev, path); 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_ci /* LOK */ 135662306a36Sopenharmony_ci for (i = 0; i < try; i++) { 135762306a36Sopenharmony_ci _lok_res_table(rtwdev, path, ibias++); 135862306a36Sopenharmony_ci _iqk_txk_setting(rtwdev, path); 135962306a36Sopenharmony_ci lok_is_fail = _iqk_lok(rtwdev, phy_idx, path); 136062306a36Sopenharmony_ci if (!lok_is_fail) 136162306a36Sopenharmony_ci break; 136262306a36Sopenharmony_ci } 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci if (lok_is_fail) 136562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] LOK (%d) fail\n", path); 136662306a36Sopenharmony_ci 136762306a36Sopenharmony_ci /* TXK */ 136862306a36Sopenharmony_ci if (iqk_info->is_nbiqk) 136962306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path); 137062306a36Sopenharmony_ci else 137162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path); 137262306a36Sopenharmony_ci 137362306a36Sopenharmony_ci /* RX */ 137462306a36Sopenharmony_ci _iqk_rxclk_setting(rtwdev, path); 137562306a36Sopenharmony_ci _iqk_rxk_setting(rtwdev, path); 137662306a36Sopenharmony_ci if (iqk_info->is_nbiqk) 137762306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path); 137862306a36Sopenharmony_ci else 137962306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path); 138062306a36Sopenharmony_ci 138162306a36Sopenharmony_ci _iqk_info_iqk(rtwdev, phy_idx, path); 138262306a36Sopenharmony_ci} 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path) 138562306a36Sopenharmony_ci{ 138662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 138762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 138862306a36Sopenharmony_ci u32 reg_rf18; 138962306a36Sopenharmony_ci u32 reg_35c; 139062306a36Sopenharmony_ci u8 idx; 139162306a36Sopenharmony_ci u8 get_empty_table = false; 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 139462306a36Sopenharmony_ci if (iqk_info->iqk_mcc_ch[idx][path] == 0) { 139562306a36Sopenharmony_ci get_empty_table = true; 139662306a36Sopenharmony_ci break; 139762306a36Sopenharmony_ci } 139862306a36Sopenharmony_ci } 139962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (1)idx = %x\n", idx); 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci if (!get_empty_table) { 140262306a36Sopenharmony_ci idx = iqk_info->iqk_table_idx[path] + 1; 140362306a36Sopenharmony_ci if (idx > 1) 140462306a36Sopenharmony_ci idx = 0; 140562306a36Sopenharmony_ci } 140662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (2)idx = %x\n", idx); 140762306a36Sopenharmony_ci 140862306a36Sopenharmony_ci reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 140962306a36Sopenharmony_ci reg_35c = rtw89_phy_read32_mask(rtwdev, R_CIRST, B_CIRST_SYN); 141062306a36Sopenharmony_ci 141162306a36Sopenharmony_ci iqk_info->iqk_band[path] = chan->band_type; 141262306a36Sopenharmony_ci iqk_info->iqk_bw[path] = chan->band_width; 141362306a36Sopenharmony_ci iqk_info->iqk_ch[path] = chan->channel; 141462306a36Sopenharmony_ci iqk_info->iqk_mcc_ch[idx][path] = chan->channel; 141562306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = idx; 141662306a36Sopenharmony_ci 141762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x, idx = %x\n", 141862306a36Sopenharmony_ci path, reg_rf18, idx); 141962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x18= 0x%x\n", 142062306a36Sopenharmony_ci path, reg_rf18); 142162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n", 142262306a36Sopenharmony_ci iqk_info->iqk_times, idx); 142362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_mcc_ch[%x][%x] = 0x%x\n", 142462306a36Sopenharmony_ci idx, path, iqk_info->iqk_mcc_ch[idx][path]); 142562306a36Sopenharmony_ci 142662306a36Sopenharmony_ci if (reg_35c == 0x01) 142762306a36Sopenharmony_ci iqk_info->syn1to2 = 0x1; 142862306a36Sopenharmony_ci else 142962306a36Sopenharmony_ci iqk_info->syn1to2 = 0x0; 143062306a36Sopenharmony_ci 143162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 143262306a36Sopenharmony_ci "[IQK]S%x, iqk_info->syn1to2= 0x%x\n", path, 143362306a36Sopenharmony_ci iqk_info->syn1to2); 143462306a36Sopenharmony_ci 143562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852B_IQK_VER); 143662306a36Sopenharmony_ci /* 2GHz/5GHz/6GHz = 0/1/2 */ 143762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BAND << (path * 16), 143862306a36Sopenharmony_ci iqk_info->iqk_band[path]); 143962306a36Sopenharmony_ci /* 20/40/80 = 0/1/2 */ 144062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BW << (path * 16), 144162306a36Sopenharmony_ci iqk_info->iqk_bw[path]); 144262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_CH << (path * 16), 144362306a36Sopenharmony_ci iqk_info->iqk_ch[path]); 144462306a36Sopenharmony_ci} 144562306a36Sopenharmony_ci 144662306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 144762306a36Sopenharmony_ci{ 144862306a36Sopenharmony_ci _iqk_by_path(rtwdev, phy_idx, path); 144962306a36Sopenharmony_ci} 145062306a36Sopenharmony_ci 145162306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) 145262306a36Sopenharmony_ci{ 145362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 145462306a36Sopenharmony_ci bool fail; 145562306a36Sopenharmony_ci 145662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 145762306a36Sopenharmony_ci iqk_info->nb_txcfir[path]); 145862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 145962306a36Sopenharmony_ci iqk_info->nb_rxcfir[path]); 146062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 146162306a36Sopenharmony_ci 0x00000e19 + (path << 4)); 146262306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path); 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "%s result =%x\n", __func__, fail); 146562306a36Sopenharmony_ci 146662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 146762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 146862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 146962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS, B_IQK_RES_K, 0x0); 147062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K1, 0x0); 147162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQRSN, B_IQRSN_K2, 0x0); 147262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 147362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 147462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0x3); 147562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 147662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 147762306a36Sopenharmony_ci} 147862306a36Sopenharmony_ci 147962306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev, 148062306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 148162306a36Sopenharmony_ci{ 148262306a36Sopenharmony_ci const struct rtw89_reg3_def *def; 148362306a36Sopenharmony_ci int size; 148462306a36Sopenharmony_ci u8 kpath; 148562306a36Sopenharmony_ci int i; 148662306a36Sopenharmony_ci 148762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "===> %s\n", __func__); 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy_idx); 149062306a36Sopenharmony_ci 149162306a36Sopenharmony_ci switch (kpath) { 149262306a36Sopenharmony_ci case RF_A: 149362306a36Sopenharmony_ci case RF_B: 149462306a36Sopenharmony_ci return; 149562306a36Sopenharmony_ci default: 149662306a36Sopenharmony_ci size = ARRAY_SIZE(rtw8852b_restore_nondbcc_path01); 149762306a36Sopenharmony_ci def = rtw8852b_restore_nondbcc_path01; 149862306a36Sopenharmony_ci break; 149962306a36Sopenharmony_ci } 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ci for (i = 0; i < size; i++, def++) 150262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); 150362306a36Sopenharmony_ci} 150462306a36Sopenharmony_ci 150562306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) 150662306a36Sopenharmony_ci{ 150762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 150862306a36Sopenharmony_ci u8 idx; 150962306a36Sopenharmony_ci 151062306a36Sopenharmony_ci idx = iqk_info->iqk_table_idx[path]; 151162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] (3)idx = %x\n", idx); 151262306a36Sopenharmony_ci 151362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx); 151462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx); 151562306a36Sopenharmony_ci 151662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 151762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 151862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 151962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x54 = 0x%x\n", path, 1 << path, 152262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_CFIR_LUT + (path << 8), MASKDWORD)); 152362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK](1)S%x, 0x8%x04 = 0x%x\n", path, 1 << path, 152462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_COEF_SEL + (path << 8), MASKDWORD)); 152562306a36Sopenharmony_ci} 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev, 152862306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 152962306a36Sopenharmony_ci{ 153062306a36Sopenharmony_ci const struct rtw89_reg3_def *def; 153162306a36Sopenharmony_ci int size; 153262306a36Sopenharmony_ci u8 kpath; 153362306a36Sopenharmony_ci int i; 153462306a36Sopenharmony_ci 153562306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy_idx); 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci switch (kpath) { 153862306a36Sopenharmony_ci case RF_A: 153962306a36Sopenharmony_ci case RF_B: 154062306a36Sopenharmony_ci return; 154162306a36Sopenharmony_ci default: 154262306a36Sopenharmony_ci size = ARRAY_SIZE(rtw8852b_set_nondbcc_path01); 154362306a36Sopenharmony_ci def = rtw8852b_set_nondbcc_path01; 154462306a36Sopenharmony_ci break; 154562306a36Sopenharmony_ci } 154662306a36Sopenharmony_ci 154762306a36Sopenharmony_ci for (i = 0; i < size; i++, def++) 154862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, def->addr, def->mask, def->data); 154962306a36Sopenharmony_ci} 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev) 155262306a36Sopenharmony_ci{ 155362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 155462306a36Sopenharmony_ci u8 idx, path; 155562306a36Sopenharmony_ci 155662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0); 155762306a36Sopenharmony_ci if (iqk_info->is_iqk_init) 155862306a36Sopenharmony_ci return; 155962306a36Sopenharmony_ci 156062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 156162306a36Sopenharmony_ci iqk_info->is_iqk_init = true; 156262306a36Sopenharmony_ci iqk_info->is_nbiqk = false; 156362306a36Sopenharmony_ci iqk_info->iqk_fft_en = false; 156462306a36Sopenharmony_ci iqk_info->iqk_sram_en = false; 156562306a36Sopenharmony_ci iqk_info->iqk_cfir_en = false; 156662306a36Sopenharmony_ci iqk_info->iqk_xym_en = false; 156762306a36Sopenharmony_ci iqk_info->iqk_times = 0x0; 156862306a36Sopenharmony_ci 156962306a36Sopenharmony_ci for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 157062306a36Sopenharmony_ci iqk_info->iqk_channel[idx] = 0x0; 157162306a36Sopenharmony_ci for (path = 0; path < RTW8852B_IQK_SS; path++) { 157262306a36Sopenharmony_ci iqk_info->lok_cor_fail[idx][path] = false; 157362306a36Sopenharmony_ci iqk_info->lok_fin_fail[idx][path] = false; 157462306a36Sopenharmony_ci iqk_info->iqk_tx_fail[idx][path] = false; 157562306a36Sopenharmony_ci iqk_info->iqk_rx_fail[idx][path] = false; 157662306a36Sopenharmony_ci iqk_info->iqk_mcc_ch[idx][path] = 0x0; 157762306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = 0x0; 157862306a36Sopenharmony_ci } 157962306a36Sopenharmony_ci } 158062306a36Sopenharmony_ci} 158162306a36Sopenharmony_ci 158262306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) 158362306a36Sopenharmony_ci{ 158462306a36Sopenharmony_ci u32 rf_mode; 158562306a36Sopenharmony_ci u8 path; 158662306a36Sopenharmony_ci int ret; 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_ci for (path = 0; path < RF_PATH_MAX; path++) { 158962306a36Sopenharmony_ci if (!(kpath & BIT(path))) 159062306a36Sopenharmony_ci continue; 159162306a36Sopenharmony_ci 159262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, 159362306a36Sopenharmony_ci rf_mode != 2, 2, 5000, false, 159462306a36Sopenharmony_ci rtwdev, path, RR_MOD, RR_MOD_MASK); 159562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 159662306a36Sopenharmony_ci "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", path, ret); 159762306a36Sopenharmony_ci } 159862306a36Sopenharmony_ci} 159962306a36Sopenharmony_ci 160062306a36Sopenharmony_cistatic void _tmac_tx_pause(struct rtw89_dev *rtwdev, enum rtw89_phy_idx band_idx, 160162306a36Sopenharmony_ci bool is_pause) 160262306a36Sopenharmony_ci{ 160362306a36Sopenharmony_ci if (!is_pause) 160462306a36Sopenharmony_ci return; 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, band_idx)); 160762306a36Sopenharmony_ci} 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_cistatic void _doiqk(struct rtw89_dev *rtwdev, bool force, 161062306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 161162306a36Sopenharmony_ci{ 161262306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 161362306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 161462306a36Sopenharmony_ci u32 backup_rf_val[RTW8852B_IQK_SS][BACKUP_RF_REGS_NR]; 161562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 161862306a36Sopenharmony_ci 161962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 162062306a36Sopenharmony_ci "[IQK]==========IQK start!!!!!==========\n"); 162162306a36Sopenharmony_ci iqk_info->iqk_times++; 162262306a36Sopenharmony_ci iqk_info->version = RTW8852B_IQK_VER; 162362306a36Sopenharmony_ci 162462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); 162562306a36Sopenharmony_ci _iqk_get_ch_info(rtwdev, phy_idx, path); 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); 162862306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); 162962306a36Sopenharmony_ci _iqk_macbb_setting(rtwdev, phy_idx, path); 163062306a36Sopenharmony_ci _iqk_preset(rtwdev, path); 163162306a36Sopenharmony_ci _iqk_start_iqk(rtwdev, phy_idx, path); 163262306a36Sopenharmony_ci _iqk_restore(rtwdev, path); 163362306a36Sopenharmony_ci _iqk_afebb_restore(rtwdev, phy_idx, path); 163462306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); 163562306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 163862306a36Sopenharmony_ci} 163962306a36Sopenharmony_ci 164062306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) 164162306a36Sopenharmony_ci{ 164262306a36Sopenharmony_ci u8 kpath = _kpath(rtwdev, phy_idx); 164362306a36Sopenharmony_ci 164462306a36Sopenharmony_ci switch (kpath) { 164562306a36Sopenharmony_ci case RF_A: 164662306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 164762306a36Sopenharmony_ci break; 164862306a36Sopenharmony_ci case RF_B: 164962306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 165062306a36Sopenharmony_ci break; 165162306a36Sopenharmony_ci case RF_AB: 165262306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 165362306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 165462306a36Sopenharmony_ci break; 165562306a36Sopenharmony_ci default: 165662306a36Sopenharmony_ci break; 165762306a36Sopenharmony_ci } 165862306a36Sopenharmony_ci} 165962306a36Sopenharmony_ci 166062306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 reg[], 166162306a36Sopenharmony_ci u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path) 166262306a36Sopenharmony_ci{ 166362306a36Sopenharmony_ci u8 i; 166462306a36Sopenharmony_ci 166562306a36Sopenharmony_ci for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) { 166662306a36Sopenharmony_ci reg_bkup[path][i] = 166762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD); 166862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", 166962306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 167062306a36Sopenharmony_ci } 167162306a36Sopenharmony_ci} 167262306a36Sopenharmony_ci 167362306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 reg[], 167462306a36Sopenharmony_ci const u32 reg_bkup[][RTW8852B_DPK_KIP_REG_NUM], u8 path) 167562306a36Sopenharmony_ci{ 167662306a36Sopenharmony_ci u8 i; 167762306a36Sopenharmony_ci 167862306a36Sopenharmony_ci for (i = 0; i < RTW8852B_DPK_KIP_REG_NUM; i++) { 167962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD, 168062306a36Sopenharmony_ci reg_bkup[path][i]); 168162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n", 168262306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 168362306a36Sopenharmony_ci } 168462306a36Sopenharmony_ci} 168562306a36Sopenharmony_ci 168662306a36Sopenharmony_cistatic u8 _dpk_order_convert(struct rtw89_dev *rtwdev) 168762306a36Sopenharmony_ci{ 168862306a36Sopenharmony_ci u8 order; 168962306a36Sopenharmony_ci u8 val; 169062306a36Sopenharmony_ci 169162306a36Sopenharmony_ci order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP); 169262306a36Sopenharmony_ci val = 0x3 >> order; 169362306a36Sopenharmony_ci 169462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val); 169562306a36Sopenharmony_ci 169662306a36Sopenharmony_ci return val; 169762306a36Sopenharmony_ci} 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, bool off) 170062306a36Sopenharmony_ci{ 170162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 170262306a36Sopenharmony_ci u8 val, kidx = dpk->cur_idx[path]; 170362306a36Sopenharmony_ci 170462306a36Sopenharmony_ci val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok; 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 170762306a36Sopenharmony_ci MASKBYTE3, _dpk_order_convert(rtwdev) << 1 | val); 170862306a36Sopenharmony_ci 170962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, 171062306a36Sopenharmony_ci kidx, dpk->is_dpk_enable && !off ? "enable" : "disable"); 171162306a36Sopenharmony_ci} 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_cistatic void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 171462306a36Sopenharmony_ci enum rtw89_rf_path path, enum rtw8852b_dpk_id id) 171562306a36Sopenharmony_ci{ 171662306a36Sopenharmony_ci u16 dpk_cmd; 171762306a36Sopenharmony_ci u32 val; 171862306a36Sopenharmony_ci int ret; 171962306a36Sopenharmony_ci 172062306a36Sopenharmony_ci dpk_cmd = (id << 8) | (0x19 + (path << 4)); 172162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); 172262306a36Sopenharmony_ci 172362306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 172462306a36Sopenharmony_ci 1, 20000, false, 172562306a36Sopenharmony_ci rtwdev, 0xbff8, MASKBYTE0); 172662306a36Sopenharmony_ci if (ret) 172762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n"); 172862306a36Sopenharmony_ci 172962306a36Sopenharmony_ci udelay(1); 173062306a36Sopenharmony_ci 173162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00030000); 173262306a36Sopenharmony_ci 173362306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, 173462306a36Sopenharmony_ci 1, 2000, false, 173562306a36Sopenharmony_ci rtwdev, 0x80fc, MASKLWORD); 173662306a36Sopenharmony_ci if (ret) 173762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot over 20ms!!!!\n"); 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 174062306a36Sopenharmony_ci 174162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 174262306a36Sopenharmony_ci "[DPK] one-shot for %s = 0x%x\n", 174362306a36Sopenharmony_ci id == 0x06 ? "LBK_RXIQK" : 174462306a36Sopenharmony_ci id == 0x10 ? "SYNC" : 174562306a36Sopenharmony_ci id == 0x11 ? "MDPK_IDL" : 174662306a36Sopenharmony_ci id == 0x12 ? "MDPK_MPA" : 174762306a36Sopenharmony_ci id == 0x13 ? "GAIN_LOSS" : 174862306a36Sopenharmony_ci id == 0x14 ? "PWR_CAL" : 174962306a36Sopenharmony_ci id == 0x15 ? "DPK_RXAGC" : 175062306a36Sopenharmony_ci id == 0x16 ? "KIP_PRESET" : 175162306a36Sopenharmony_ci id == 0x17 ? "KIP_RESTORE" : "DPK_TXAGC", 175262306a36Sopenharmony_ci dpk_cmd); 175362306a36Sopenharmony_ci} 175462306a36Sopenharmony_ci 175562306a36Sopenharmony_cistatic void _dpk_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 175662306a36Sopenharmony_ci enum rtw89_rf_path path) 175762306a36Sopenharmony_ci{ 175862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3); 175962306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path); 176062306a36Sopenharmony_ci} 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 176362306a36Sopenharmony_ci enum rtw89_rf_path path) 176462306a36Sopenharmony_ci{ 176562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 176662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 176762306a36Sopenharmony_ci 176862306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 176962306a36Sopenharmony_ci 177062306a36Sopenharmony_ci dpk->bp[path][kidx].band = chan->band_type; 177162306a36Sopenharmony_ci dpk->bp[path][kidx].ch = chan->channel; 177262306a36Sopenharmony_ci dpk->bp[path][kidx].bw = chan->band_width; 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 177562306a36Sopenharmony_ci "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", 177662306a36Sopenharmony_ci path, dpk->cur_idx[path], phy, 177762306a36Sopenharmony_ci rtwdev->is_tssi_mode[path] ? "on" : "off", 177862306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 177962306a36Sopenharmony_ci dpk->bp[path][kidx].band == 0 ? "2G" : 178062306a36Sopenharmony_ci dpk->bp[path][kidx].band == 1 ? "5G" : "6G", 178162306a36Sopenharmony_ci dpk->bp[path][kidx].ch, 178262306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 0 ? "20M" : 178362306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 1 ? "40M" : "80M"); 178462306a36Sopenharmony_ci} 178562306a36Sopenharmony_ci 178662306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, 178762306a36Sopenharmony_ci enum rtw89_phy_idx phy, 178862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kpath) 178962306a36Sopenharmony_ci{ 179062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 179162306a36Sopenharmony_ci 179262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_defs_tbl); 179362306a36Sopenharmony_ci 179462306a36Sopenharmony_ci if (chan->band_width == RTW89_CHANNEL_WIDTH_80) { 179562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x1); 179662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x1); 179762306a36Sopenharmony_ci } 179862306a36Sopenharmony_ci 179962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 180062306a36Sopenharmony_ci "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); 180162306a36Sopenharmony_ci} 180262306a36Sopenharmony_ci 180362306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, 180462306a36Sopenharmony_ci enum rtw89_phy_idx phy, 180562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kpath) 180662306a36Sopenharmony_ci{ 180762306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 180862306a36Sopenharmony_ci 180962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_afe_restore_defs_tbl); 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 181262306a36Sopenharmony_ci "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); 181362306a36Sopenharmony_ci 181462306a36Sopenharmony_ci if (chan->band_width == RTW89_CHANNEL_WIDTH_80) { 181562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1, B_P0_CFCH_EX, 0x0); 181662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_PATH1_BW_SEL_V1, B_PATH1_BW_SEL_EX, 0x0); 181762306a36Sopenharmony_ci } 181862306a36Sopenharmony_ci} 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev, 182162306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_pause) 182262306a36Sopenharmony_ci{ 182362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 182462306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, is_pause); 182562306a36Sopenharmony_ci 182662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, 182762306a36Sopenharmony_ci is_pause ? "pause" : "resume"); 182862306a36Sopenharmony_ci} 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev, 183162306a36Sopenharmony_ci enum rtw89_rf_path path) 183262306a36Sopenharmony_ci{ 183362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_dpk_kip_defs_tbl); 183462306a36Sopenharmony_ci 183562306a36Sopenharmony_ci if (rtwdev->hal.cv > CHIP_CAV) 183662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), B_DPD_COM_OF, 0x1); 183762306a36Sopenharmony_ci 183862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); 183962306a36Sopenharmony_ci} 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 184262306a36Sopenharmony_ci enum rtw89_rf_path path) 184362306a36Sopenharmony_ci{ 184462306a36Sopenharmony_ci u8 cur_rxbb; 184562306a36Sopenharmony_ci u32 tmp; 184662306a36Sopenharmony_ci 184762306a36Sopenharmony_ci cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB); 184862306a36Sopenharmony_ci 184962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1); 185062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR, 0x0); 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 185362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); 185462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0xd); 185562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1); 185662306a36Sopenharmony_ci 185762306a36Sopenharmony_ci if (cur_rxbb >= 0x11) 185862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x13); 185962306a36Sopenharmony_ci else if (cur_rxbb <= 0xa) 186062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x00); 186162306a36Sopenharmony_ci else 186262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT1, 0x05); 186362306a36Sopenharmony_ci 186462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x0); 186562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 186662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80014); 186762306a36Sopenharmony_ci udelay(70); 186862306a36Sopenharmony_ci 186962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 187062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x025); 187162306a36Sopenharmony_ci 187262306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path, 187562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD)); 187662306a36Sopenharmony_ci 187762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 187862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0); 187962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0); 188062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0); 188162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1); 188262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKMODE, 0x5); 188362306a36Sopenharmony_ci} 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_cistatic void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, enum rtw89_rf_path path) 188662306a36Sopenharmony_ci{ 188762306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 188862306a36Sopenharmony_ci 188962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); 189062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x0); 189162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TM, RR_TM_TRI, 0x1); 189262306a36Sopenharmony_ci 189362306a36Sopenharmony_ci udelay(200); 189462306a36Sopenharmony_ci 189562306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk = rtw89_read_rf(rtwdev, path, RR_TM, RR_TM_VAL); 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n", 189862306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk); 189962306a36Sopenharmony_ci} 190062306a36Sopenharmony_ci 190162306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain, 190262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 190362306a36Sopenharmony_ci{ 190462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { 190762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); 190862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_FATT, 0xf2); 190962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 191062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 191162306a36Sopenharmony_ci } else { 191262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50220); 191362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SWATT, 0x5); 191462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 191562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 191662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA_LNA, RFREG_MASK, 0x920FC); 191762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XALNA2, RFREG_MASK, 0x002C0); 191862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_IQGEN, RFREG_MASK, 0x38800); 191962306a36Sopenharmony_ci } 192062306a36Sopenharmony_ci 192162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1); 192262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1); 192362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0); 192462306a36Sopenharmony_ci 192562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 192662306a36Sopenharmony_ci "[DPK] ARF 0x0/0x11/0x1a = 0x%x/ 0x%x/ 0x%x\n", 192762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK), 192862306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK), 192962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK)); 193062306a36Sopenharmony_ci} 193162306a36Sopenharmony_ci 193262306a36Sopenharmony_cistatic void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev, 193362306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bypass) 193462306a36Sopenharmony_ci{ 193562306a36Sopenharmony_ci if (is_bypass) { 193662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 193762306a36Sopenharmony_ci B_RXIQC_BYPASS2, 0x1); 193862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 193962306a36Sopenharmony_ci B_RXIQC_BYPASS, 0x1); 194062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 194162306a36Sopenharmony_ci "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path, 194262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 194362306a36Sopenharmony_ci MASKDWORD)); 194462306a36Sopenharmony_ci } else { 194562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2); 194662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS); 194762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 194862306a36Sopenharmony_ci "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path, 194962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 195062306a36Sopenharmony_ci MASKDWORD)); 195162306a36Sopenharmony_ci } 195262306a36Sopenharmony_ci} 195362306a36Sopenharmony_ci 195462306a36Sopenharmony_cistatic 195562306a36Sopenharmony_civoid _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 195662306a36Sopenharmony_ci{ 195762306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 195862306a36Sopenharmony_ci 195962306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) 196062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F); 196162306a36Sopenharmony_ci else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) 196262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); 196362306a36Sopenharmony_ci else 196462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n", 196762306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : 196862306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); 196962306a36Sopenharmony_ci} 197062306a36Sopenharmony_ci 197162306a36Sopenharmony_cistatic void _dpk_table_select(struct rtw89_dev *rtwdev, 197262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain) 197362306a36Sopenharmony_ci{ 197462306a36Sopenharmony_ci u8 val; 197562306a36Sopenharmony_ci 197662306a36Sopenharmony_ci val = 0x80 + kidx * 0x20 + gain * 0x10; 197762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val); 197862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 197962306a36Sopenharmony_ci "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx, 198062306a36Sopenharmony_ci gain, val); 198162306a36Sopenharmony_ci} 198262306a36Sopenharmony_ci 198362306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 198462306a36Sopenharmony_ci{ 198562306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_I 200 198662306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_Q 200 198762306a36Sopenharmony_ci#define DPK_SYNC_TH_CORR 170 198862306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 198962306a36Sopenharmony_ci u16 dc_i, dc_q; 199062306a36Sopenharmony_ci u8 corr_val, corr_idx; 199162306a36Sopenharmony_ci 199262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL); 199362306a36Sopenharmony_ci 199462306a36Sopenharmony_ci corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI); 199562306a36Sopenharmony_ci corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV); 199662306a36Sopenharmony_ci 199762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 199862306a36Sopenharmony_ci "[DPK] S%d Corr_idx / Corr_val = %d / %d\n", 199962306a36Sopenharmony_ci path, corr_idx, corr_val); 200062306a36Sopenharmony_ci 200162306a36Sopenharmony_ci dpk->corr_idx[path][kidx] = corr_idx; 200262306a36Sopenharmony_ci dpk->corr_val[path][kidx] = corr_val; 200362306a36Sopenharmony_ci 200462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); 200562306a36Sopenharmony_ci 200662306a36Sopenharmony_ci dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 200762306a36Sopenharmony_ci dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); 200862306a36Sopenharmony_ci 200962306a36Sopenharmony_ci dc_i = abs(sign_extend32(dc_i, 11)); 201062306a36Sopenharmony_ci dc_q = abs(sign_extend32(dc_q, 11)); 201162306a36Sopenharmony_ci 201262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n", 201362306a36Sopenharmony_ci path, dc_i, dc_q); 201462306a36Sopenharmony_ci 201562306a36Sopenharmony_ci dpk->dc_i[path][kidx] = dc_i; 201662306a36Sopenharmony_ci dpk->dc_q[path][kidx] = dc_q; 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q || 201962306a36Sopenharmony_ci corr_val < DPK_SYNC_TH_CORR) 202062306a36Sopenharmony_ci return true; 202162306a36Sopenharmony_ci else 202262306a36Sopenharmony_ci return false; 202362306a36Sopenharmony_ci} 202462306a36Sopenharmony_ci 202562306a36Sopenharmony_cistatic bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 202662306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 202762306a36Sopenharmony_ci{ 202862306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, SYNC); 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_ci return _dpk_sync_check(rtwdev, path, kidx); 203162306a36Sopenharmony_ci} 203262306a36Sopenharmony_ci 203362306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) 203462306a36Sopenharmony_ci{ 203562306a36Sopenharmony_ci u16 dgain; 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain); 204262306a36Sopenharmony_ci 204362306a36Sopenharmony_ci return dgain; 204462306a36Sopenharmony_ci} 204562306a36Sopenharmony_ci 204662306a36Sopenharmony_cistatic s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain) 204762306a36Sopenharmony_ci{ 204862306a36Sopenharmony_ci static const u16 bnd[15] = { 204962306a36Sopenharmony_ci 0xbf1, 0xaa5, 0x97d, 0x875, 0x789, 0x6b7, 0x5fc, 0x556, 205062306a36Sopenharmony_ci 0x4c1, 0x43d, 0x3c7, 0x35e, 0x2ac, 0x262, 0x220 205162306a36Sopenharmony_ci }; 205262306a36Sopenharmony_ci s8 offset; 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci if (dgain >= bnd[0]) 205562306a36Sopenharmony_ci offset = 0x6; 205662306a36Sopenharmony_ci else if (bnd[0] > dgain && dgain >= bnd[1]) 205762306a36Sopenharmony_ci offset = 0x6; 205862306a36Sopenharmony_ci else if (bnd[1] > dgain && dgain >= bnd[2]) 205962306a36Sopenharmony_ci offset = 0x5; 206062306a36Sopenharmony_ci else if (bnd[2] > dgain && dgain >= bnd[3]) 206162306a36Sopenharmony_ci offset = 0x4; 206262306a36Sopenharmony_ci else if (bnd[3] > dgain && dgain >= bnd[4]) 206362306a36Sopenharmony_ci offset = 0x3; 206462306a36Sopenharmony_ci else if (bnd[4] > dgain && dgain >= bnd[5]) 206562306a36Sopenharmony_ci offset = 0x2; 206662306a36Sopenharmony_ci else if (bnd[5] > dgain && dgain >= bnd[6]) 206762306a36Sopenharmony_ci offset = 0x1; 206862306a36Sopenharmony_ci else if (bnd[6] > dgain && dgain >= bnd[7]) 206962306a36Sopenharmony_ci offset = 0x0; 207062306a36Sopenharmony_ci else if (bnd[7] > dgain && dgain >= bnd[8]) 207162306a36Sopenharmony_ci offset = 0xff; 207262306a36Sopenharmony_ci else if (bnd[8] > dgain && dgain >= bnd[9]) 207362306a36Sopenharmony_ci offset = 0xfe; 207462306a36Sopenharmony_ci else if (bnd[9] > dgain && dgain >= bnd[10]) 207562306a36Sopenharmony_ci offset = 0xfd; 207662306a36Sopenharmony_ci else if (bnd[10] > dgain && dgain >= bnd[11]) 207762306a36Sopenharmony_ci offset = 0xfc; 207862306a36Sopenharmony_ci else if (bnd[11] > dgain && dgain >= bnd[12]) 207962306a36Sopenharmony_ci offset = 0xfb; 208062306a36Sopenharmony_ci else if (bnd[12] > dgain && dgain >= bnd[13]) 208162306a36Sopenharmony_ci offset = 0xfa; 208262306a36Sopenharmony_ci else if (bnd[13] > dgain && dgain >= bnd[14]) 208362306a36Sopenharmony_ci offset = 0xf9; 208462306a36Sopenharmony_ci else if (bnd[14] > dgain) 208562306a36Sopenharmony_ci offset = 0xf8; 208662306a36Sopenharmony_ci else 208762306a36Sopenharmony_ci offset = 0x0; 208862306a36Sopenharmony_ci 208962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain offset = %d\n", offset); 209062306a36Sopenharmony_ci 209162306a36Sopenharmony_ci return offset; 209262306a36Sopenharmony_ci} 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) 209562306a36Sopenharmony_ci{ 209662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 209762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 209862306a36Sopenharmony_ci 209962306a36Sopenharmony_ci return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); 210062306a36Sopenharmony_ci} 210162306a36Sopenharmony_ci 210262306a36Sopenharmony_cistatic void _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 210362306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 210462306a36Sopenharmony_ci{ 210562306a36Sopenharmony_ci _dpk_table_select(rtwdev, path, kidx, 1); 210662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, GAIN_LOSS); 210762306a36Sopenharmony_ci} 210862306a36Sopenharmony_ci 210962306a36Sopenharmony_cistatic void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 211062306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 211162306a36Sopenharmony_ci{ 211262306a36Sopenharmony_ci _dpk_tpg_sel(rtwdev, path, kidx); 211362306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, KIP_PRESET); 211462306a36Sopenharmony_ci} 211562306a36Sopenharmony_ci 211662306a36Sopenharmony_cistatic void _dpk_kip_pwr_clk_on(struct rtw89_dev *rtwdev, 211762306a36Sopenharmony_ci enum rtw89_rf_path path) 211862306a36Sopenharmony_ci{ 211962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 212062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a); 212162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08); 212262306a36Sopenharmony_ci 212362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP Power/CLK on\n"); 212462306a36Sopenharmony_ci} 212562306a36Sopenharmony_ci 212662306a36Sopenharmony_cistatic void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 212762306a36Sopenharmony_ci enum rtw89_rf_path path, u8 txagc) 212862306a36Sopenharmony_ci{ 212962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXAGC, RFREG_MASK, txagc); 213062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 213162306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, DPK_TXAGC); 213262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 213362306a36Sopenharmony_ci 213462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set TXAGC = 0x%x\n", txagc); 213562306a36Sopenharmony_ci} 213662306a36Sopenharmony_ci 213762306a36Sopenharmony_cistatic void _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 213862306a36Sopenharmony_ci enum rtw89_rf_path path) 213962306a36Sopenharmony_ci{ 214062306a36Sopenharmony_ci u32 tmp; 214162306a36Sopenharmony_ci 214262306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 214362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, tmp); 214462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x1); 214562306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, DPK_RXAGC); 214662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_EN, 0x0); 214762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL_V1, 0x8); 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 215062306a36Sopenharmony_ci "[DPK] set RXBB = 0x%x (RF0x0[9:5] = 0x%x)\n", 215162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB_V1), 215262306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB)); 215362306a36Sopenharmony_ci} 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_cistatic u8 _dpk_set_offset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 215662306a36Sopenharmony_ci enum rtw89_rf_path path, s8 gain_offset) 215762306a36Sopenharmony_ci{ 215862306a36Sopenharmony_ci u8 txagc; 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_ci txagc = rtw89_read_rf(rtwdev, path, RR_TXAGC, RFREG_MASK); 216162306a36Sopenharmony_ci 216262306a36Sopenharmony_ci if (txagc - gain_offset < DPK_TXAGC_LOWER) 216362306a36Sopenharmony_ci txagc = DPK_TXAGC_LOWER; 216462306a36Sopenharmony_ci else if (txagc - gain_offset > DPK_TXAGC_UPPER) 216562306a36Sopenharmony_ci txagc = DPK_TXAGC_UPPER; 216662306a36Sopenharmony_ci else 216762306a36Sopenharmony_ci txagc = txagc - gain_offset; 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, txagc); 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n", 217262306a36Sopenharmony_ci gain_offset, txagc); 217362306a36Sopenharmony_ci return txagc; 217462306a36Sopenharmony_ci} 217562306a36Sopenharmony_ci 217662306a36Sopenharmony_cistatic bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) 217762306a36Sopenharmony_ci{ 217862306a36Sopenharmony_ci u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 217962306a36Sopenharmony_ci u8 i; 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); 218262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0); 218362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08); 218462306a36Sopenharmony_ci 218562306a36Sopenharmony_ci if (is_check) { 218662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); 218762306a36Sopenharmony_ci val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 218862306a36Sopenharmony_ci val1_i = abs(sign_extend32(val1_i, 11)); 218962306a36Sopenharmony_ci val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 219062306a36Sopenharmony_ci val1_q = abs(sign_extend32(val1_q, 11)); 219162306a36Sopenharmony_ci 219262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); 219362306a36Sopenharmony_ci val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 219462306a36Sopenharmony_ci val2_i = abs(sign_extend32(val2_i, 11)); 219562306a36Sopenharmony_ci val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 219662306a36Sopenharmony_ci val2_q = abs(sign_extend32(val2_q, 11)); 219762306a36Sopenharmony_ci 219862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", 219962306a36Sopenharmony_ci phy_div(val1_i * val1_i + val1_q * val1_q, 220062306a36Sopenharmony_ci val2_i * val2_i + val2_q * val2_q)); 220162306a36Sopenharmony_ci } else { 220262306a36Sopenharmony_ci for (i = 0; i < 32; i++) { 220362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); 220462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 220562306a36Sopenharmony_ci "[DPK] PAS_Read[%02d]= 0x%08x\n", i, 220662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 220762306a36Sopenharmony_ci } 220862306a36Sopenharmony_ci } 220962306a36Sopenharmony_ci 221062306a36Sopenharmony_ci if (val1_i * val1_i + val1_q * val1_q >= 221162306a36Sopenharmony_ci (val2_i * val2_i + val2_q * val2_q) * 8 / 5) 221262306a36Sopenharmony_ci return true; 221362306a36Sopenharmony_ci 221462306a36Sopenharmony_ci return false; 221562306a36Sopenharmony_ci} 221662306a36Sopenharmony_ci 221762306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 221862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 init_txagc, 221962306a36Sopenharmony_ci bool loss_only) 222062306a36Sopenharmony_ci{ 222162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 222262306a36Sopenharmony_ci u8 step = DPK_AGC_STEP_SYNC_DGAIN; 222362306a36Sopenharmony_ci u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0; 222462306a36Sopenharmony_ci u8 goout = 0, agc_cnt = 0, limited_rxbb = 0; 222562306a36Sopenharmony_ci u16 dgain = 0; 222662306a36Sopenharmony_ci s8 offset; 222762306a36Sopenharmony_ci int limit = 200; 222862306a36Sopenharmony_ci 222962306a36Sopenharmony_ci tmp_txagc = init_txagc; 223062306a36Sopenharmony_ci 223162306a36Sopenharmony_ci do { 223262306a36Sopenharmony_ci switch (step) { 223362306a36Sopenharmony_ci case DPK_AGC_STEP_SYNC_DGAIN: 223462306a36Sopenharmony_ci if (_dpk_sync(rtwdev, phy, path, kidx)) { 223562306a36Sopenharmony_ci tmp_txagc = 0xff; 223662306a36Sopenharmony_ci goout = 1; 223762306a36Sopenharmony_ci break; 223862306a36Sopenharmony_ci } 223962306a36Sopenharmony_ci 224062306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 224162306a36Sopenharmony_ci 224262306a36Sopenharmony_ci if (loss_only == 1 || limited_rxbb == 1) 224362306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 224462306a36Sopenharmony_ci else 224562306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_ADJ; 224662306a36Sopenharmony_ci break; 224762306a36Sopenharmony_ci 224862306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_ADJ: 224962306a36Sopenharmony_ci tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, 225062306a36Sopenharmony_ci RFREG_MASKRXBB); 225162306a36Sopenharmony_ci offset = _dpk_dgain_mapping(rtwdev, dgain); 225262306a36Sopenharmony_ci 225362306a36Sopenharmony_ci if (tmp_rxbb + offset > 0x1f) { 225462306a36Sopenharmony_ci tmp_rxbb = 0x1f; 225562306a36Sopenharmony_ci limited_rxbb = 1; 225662306a36Sopenharmony_ci } else if (tmp_rxbb + offset < 0) { 225762306a36Sopenharmony_ci tmp_rxbb = 0; 225862306a36Sopenharmony_ci limited_rxbb = 1; 225962306a36Sopenharmony_ci } else { 226062306a36Sopenharmony_ci tmp_rxbb = tmp_rxbb + offset; 226162306a36Sopenharmony_ci } 226262306a36Sopenharmony_ci 226362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASKRXBB, 226462306a36Sopenharmony_ci tmp_rxbb); 226562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 226662306a36Sopenharmony_ci "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, tmp_rxbb); 226762306a36Sopenharmony_ci if (offset || agc_cnt == 0) { 226862306a36Sopenharmony_ci if (chan->band_width < RTW89_CHANNEL_WIDTH_80) 226962306a36Sopenharmony_ci _dpk_bypass_rxcfir(rtwdev, path, true); 227062306a36Sopenharmony_ci else 227162306a36Sopenharmony_ci _dpk_lbk_rxiqk(rtwdev, phy, path); 227262306a36Sopenharmony_ci } 227362306a36Sopenharmony_ci if (dgain > 1922 || dgain < 342) 227462306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 227562306a36Sopenharmony_ci else 227662306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 227762306a36Sopenharmony_ci 227862306a36Sopenharmony_ci agc_cnt++; 227962306a36Sopenharmony_ci break; 228062306a36Sopenharmony_ci 228162306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_LOSS_IDX: 228262306a36Sopenharmony_ci _dpk_gainloss(rtwdev, phy, path, kidx); 228362306a36Sopenharmony_ci tmp_gl_idx = _dpk_gainloss_read(rtwdev); 228462306a36Sopenharmony_ci 228562306a36Sopenharmony_ci if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) || 228662306a36Sopenharmony_ci tmp_gl_idx >= 7) 228762306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_GT_CRITERION; 228862306a36Sopenharmony_ci else if (tmp_gl_idx == 0) 228962306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 229062306a36Sopenharmony_ci else 229162306a36Sopenharmony_ci step = DPK_AGC_STEP_SET_TX_GAIN; 229262306a36Sopenharmony_ci break; 229362306a36Sopenharmony_ci 229462306a36Sopenharmony_ci case DPK_AGC_STEP_GL_GT_CRITERION: 229562306a36Sopenharmony_ci if (tmp_txagc == 0x2e) { 229662306a36Sopenharmony_ci goout = 1; 229762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 229862306a36Sopenharmony_ci "[DPK] Txagc@lower bound!!\n"); 229962306a36Sopenharmony_ci } else { 230062306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0x3); 230162306a36Sopenharmony_ci } 230262306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 230362306a36Sopenharmony_ci agc_cnt++; 230462306a36Sopenharmony_ci break; 230562306a36Sopenharmony_ci 230662306a36Sopenharmony_ci case DPK_AGC_STEP_GL_LT_CRITERION: 230762306a36Sopenharmony_ci if (tmp_txagc == 0x3f) { 230862306a36Sopenharmony_ci goout = 1; 230962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 231062306a36Sopenharmony_ci "[DPK] Txagc@upper bound!!\n"); 231162306a36Sopenharmony_ci } else { 231262306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, phy, path, 0xfe); 231362306a36Sopenharmony_ci } 231462306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 231562306a36Sopenharmony_ci agc_cnt++; 231662306a36Sopenharmony_ci break; 231762306a36Sopenharmony_ci case DPK_AGC_STEP_SET_TX_GAIN: 231862306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, phy, path, tmp_gl_idx); 231962306a36Sopenharmony_ci goout = 1; 232062306a36Sopenharmony_ci agc_cnt++; 232162306a36Sopenharmony_ci break; 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_ci default: 232462306a36Sopenharmony_ci goout = 1; 232562306a36Sopenharmony_ci break; 232662306a36Sopenharmony_ci } 232762306a36Sopenharmony_ci } while (!goout && agc_cnt < 6 && limit-- > 0); 232862306a36Sopenharmony_ci 232962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 233062306a36Sopenharmony_ci "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc, 233162306a36Sopenharmony_ci tmp_rxbb); 233262306a36Sopenharmony_ci 233362306a36Sopenharmony_ci return tmp_txagc; 233462306a36Sopenharmony_ci} 233562306a36Sopenharmony_ci 233662306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order) 233762306a36Sopenharmony_ci{ 233862306a36Sopenharmony_ci switch (order) { 233962306a36Sopenharmony_ci case 0: 234062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 234162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3); 234262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1); 234362306a36Sopenharmony_ci break; 234462306a36Sopenharmony_ci case 1: 234562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 234662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); 234762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); 234862306a36Sopenharmony_ci break; 234962306a36Sopenharmony_ci case 2: 235062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 235162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); 235262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); 235362306a36Sopenharmony_ci break; 235462306a36Sopenharmony_ci default: 235562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 235662306a36Sopenharmony_ci "[DPK] Wrong MDPD order!!(0x%x)\n", order); 235762306a36Sopenharmony_ci break; 235862306a36Sopenharmony_ci } 235962306a36Sopenharmony_ci 236062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 236162306a36Sopenharmony_ci "[DPK] Set MDPD order to 0x%x for IDL\n", order); 236262306a36Sopenharmony_ci} 236362306a36Sopenharmony_ci 236462306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 236562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain) 236662306a36Sopenharmony_ci{ 236762306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 236862306a36Sopenharmony_ci 236962306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw < RTW89_CHANNEL_WIDTH_80 && 237062306a36Sopenharmony_ci dpk->bp[path][kidx].band == RTW89_BAND_5G) 237162306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x2); 237262306a36Sopenharmony_ci else 237362306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x0); 237462306a36Sopenharmony_ci 237562306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, MDPK_IDL); 237662306a36Sopenharmony_ci} 237762306a36Sopenharmony_ci 237862306a36Sopenharmony_cistatic void _dpk_fill_result(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 237962306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain, u8 txagc) 238062306a36Sopenharmony_ci{ 238162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 238262306a36Sopenharmony_ci const u16 pwsf = 0x78; 238362306a36Sopenharmony_ci u8 gs = dpk->dpk_gs[phy]; 238462306a36Sopenharmony_ci 238562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 238662306a36Sopenharmony_ci B_COEF_SEL_MDPD, kidx); 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 238962306a36Sopenharmony_ci "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc, 239062306a36Sopenharmony_ci pwsf, gs); 239162306a36Sopenharmony_ci 239262306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk = txagc; 239362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8), 239462306a36Sopenharmony_ci 0x3F << ((gain << 3) + (kidx << 4)), txagc); 239562306a36Sopenharmony_ci 239662306a36Sopenharmony_ci dpk->bp[path][kidx].pwsf = pwsf; 239762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 239862306a36Sopenharmony_ci 0x1FF << (gain << 4), pwsf); 239962306a36Sopenharmony_ci 240062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); 240162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0); 240262306a36Sopenharmony_ci 240362306a36Sopenharmony_ci dpk->bp[path][kidx].gs = gs; 240462306a36Sopenharmony_ci if (dpk->dpk_gs[phy] == 0x7f) 240562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 240662306a36Sopenharmony_ci MASKDWORD, 0x007f7f7f); 240762306a36Sopenharmony_ci else 240862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 240962306a36Sopenharmony_ci MASKDWORD, 0x005b5b5b); 241062306a36Sopenharmony_ci 241162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 241262306a36Sopenharmony_ci B_DPD_ORDER_V1, _dpk_order_convert(rtwdev)); 241362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD, 0x0); 241462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL, 0x0); 241562306a36Sopenharmony_ci} 241662306a36Sopenharmony_ci 241762306a36Sopenharmony_cistatic bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 241862306a36Sopenharmony_ci enum rtw89_rf_path path) 241962306a36Sopenharmony_ci{ 242062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 242162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 242262306a36Sopenharmony_ci bool is_reload = false; 242362306a36Sopenharmony_ci u8 idx, cur_band, cur_ch; 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_ci cur_band = chan->band_type; 242662306a36Sopenharmony_ci cur_ch = chan->channel; 242762306a36Sopenharmony_ci 242862306a36Sopenharmony_ci for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) { 242962306a36Sopenharmony_ci if (cur_band != dpk->bp[path][idx].band || 243062306a36Sopenharmony_ci cur_ch != dpk->bp[path][idx].ch) 243162306a36Sopenharmony_ci continue; 243262306a36Sopenharmony_ci 243362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 243462306a36Sopenharmony_ci B_COEF_SEL_MDPD, idx); 243562306a36Sopenharmony_ci dpk->cur_idx[path] = idx; 243662306a36Sopenharmony_ci is_reload = true; 243762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 243862306a36Sopenharmony_ci "[DPK] reload S%d[%d] success\n", path, idx); 243962306a36Sopenharmony_ci } 244062306a36Sopenharmony_ci 244162306a36Sopenharmony_ci return is_reload; 244262306a36Sopenharmony_ci} 244362306a36Sopenharmony_ci 244462306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 244562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 gain) 244662306a36Sopenharmony_ci{ 244762306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 244862306a36Sopenharmony_ci u8 txagc = 0x38, kidx = dpk->cur_idx[path]; 244962306a36Sopenharmony_ci bool is_fail = false; 245062306a36Sopenharmony_ci 245162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 245262306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx); 245362306a36Sopenharmony_ci 245462306a36Sopenharmony_ci _rfk_rf_direct_cntrl(rtwdev, path, false); 245562306a36Sopenharmony_ci _rfk_drf_direct_cntrl(rtwdev, path, false); 245662306a36Sopenharmony_ci 245762306a36Sopenharmony_ci _dpk_kip_pwr_clk_on(rtwdev, path); 245862306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, txagc); 245962306a36Sopenharmony_ci _dpk_rf_setting(rtwdev, gain, path, kidx); 246062306a36Sopenharmony_ci _dpk_rx_dck(rtwdev, phy, path); 246162306a36Sopenharmony_ci 246262306a36Sopenharmony_ci _dpk_kip_preset(rtwdev, phy, path, kidx); 246362306a36Sopenharmony_ci _dpk_kip_set_rxagc(rtwdev, phy, path); 246462306a36Sopenharmony_ci _dpk_table_select(rtwdev, path, kidx, gain); 246562306a36Sopenharmony_ci 246662306a36Sopenharmony_ci txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false); 246762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust txagc = 0x%x\n", txagc); 246862306a36Sopenharmony_ci 246962306a36Sopenharmony_ci if (txagc == 0xff) { 247062306a36Sopenharmony_ci is_fail = true; 247162306a36Sopenharmony_ci } else { 247262306a36Sopenharmony_ci _dpk_get_thermal(rtwdev, kidx, path); 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_ci _dpk_idl_mpa(rtwdev, phy, path, kidx, gain); 247562306a36Sopenharmony_ci 247662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 247762306a36Sopenharmony_ci 247862306a36Sopenharmony_ci _dpk_fill_result(rtwdev, phy, path, kidx, gain, txagc); 247962306a36Sopenharmony_ci } 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci if (!is_fail) 248262306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = true; 248362306a36Sopenharmony_ci else 248462306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = false; 248562306a36Sopenharmony_ci 248662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx, 248762306a36Sopenharmony_ci is_fail ? "Check" : "Success"); 248862306a36Sopenharmony_ci 248962306a36Sopenharmony_ci return is_fail; 249062306a36Sopenharmony_ci} 249162306a36Sopenharmony_ci 249262306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force, 249362306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 kpath) 249462306a36Sopenharmony_ci{ 249562306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 249662306a36Sopenharmony_ci static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120}; 249762306a36Sopenharmony_ci u32 kip_bkup[RTW8852B_DPK_RF_PATH][RTW8852B_DPK_KIP_REG_NUM] = {}; 249862306a36Sopenharmony_ci u32 backup_rf_val[RTW8852B_DPK_RF_PATH][BACKUP_RF_REGS_NR]; 249962306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 250062306a36Sopenharmony_ci bool is_fail = true, reloaded[RTW8852B_DPK_RF_PATH] = {}; 250162306a36Sopenharmony_ci u8 path; 250262306a36Sopenharmony_ci 250362306a36Sopenharmony_ci if (dpk->is_dpk_reload_en) { 250462306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { 250562306a36Sopenharmony_ci reloaded[path] = _dpk_reload_check(rtwdev, phy, path); 250662306a36Sopenharmony_ci if (!reloaded[path] && dpk->bp[path][0].ch) 250762306a36Sopenharmony_ci dpk->cur_idx[path] = !dpk->cur_idx[path]; 250862306a36Sopenharmony_ci else 250962306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, false); 251062306a36Sopenharmony_ci } 251162306a36Sopenharmony_ci } else { 251262306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) 251362306a36Sopenharmony_ci dpk->cur_idx[path] = 0; 251462306a36Sopenharmony_ci } 251562306a36Sopenharmony_ci 251662306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); 251762306a36Sopenharmony_ci 251862306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { 251962306a36Sopenharmony_ci _dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path); 252062306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); 252162306a36Sopenharmony_ci _dpk_information(rtwdev, phy, path); 252262306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 252362306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, true); 252462306a36Sopenharmony_ci } 252562306a36Sopenharmony_ci 252662306a36Sopenharmony_ci _dpk_bb_afe_setting(rtwdev, phy, path, kpath); 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { 252962306a36Sopenharmony_ci is_fail = _dpk_main(rtwdev, phy, path, 1); 253062306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, is_fail); 253162306a36Sopenharmony_ci } 253262306a36Sopenharmony_ci 253362306a36Sopenharmony_ci _dpk_bb_afe_restore(rtwdev, phy, path, kpath); 253462306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { 253762306a36Sopenharmony_ci _dpk_kip_restore(rtwdev, path); 253862306a36Sopenharmony_ci _dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path); 253962306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); 254062306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 254162306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, false); 254262306a36Sopenharmony_ci } 254362306a36Sopenharmony_ci} 254462306a36Sopenharmony_ci 254562306a36Sopenharmony_cistatic bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 254662306a36Sopenharmony_ci{ 254762306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 254862306a36Sopenharmony_ci struct rtw89_fem_info *fem = &rtwdev->fem; 254962306a36Sopenharmony_ci 255062306a36Sopenharmony_ci if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) { 255162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 255262306a36Sopenharmony_ci "[DPK] Skip DPK due to 2G_ext_PA exist!!\n"); 255362306a36Sopenharmony_ci return true; 255462306a36Sopenharmony_ci } else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) { 255562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 255662306a36Sopenharmony_ci "[DPK] Skip DPK due to 5G_ext_PA exist!!\n"); 255762306a36Sopenharmony_ci return true; 255862306a36Sopenharmony_ci } else if (fem->epa_6g && chan->band_type == RTW89_BAND_6G) { 255962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 256062306a36Sopenharmony_ci "[DPK] Skip DPK due to 6G_ext_PA exist!!\n"); 256162306a36Sopenharmony_ci return true; 256262306a36Sopenharmony_ci } 256362306a36Sopenharmony_ci 256462306a36Sopenharmony_ci return false; 256562306a36Sopenharmony_ci} 256662306a36Sopenharmony_ci 256762306a36Sopenharmony_cistatic void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 256862306a36Sopenharmony_ci{ 256962306a36Sopenharmony_ci u8 path, kpath; 257062306a36Sopenharmony_ci 257162306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 257262306a36Sopenharmony_ci 257362306a36Sopenharmony_ci for (path = 0; path < RTW8852B_DPK_RF_PATH; path++) { 257462306a36Sopenharmony_ci if (kpath & BIT(path)) 257562306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, true); 257662306a36Sopenharmony_ci } 257762306a36Sopenharmony_ci} 257862306a36Sopenharmony_ci 257962306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force) 258062306a36Sopenharmony_ci{ 258162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 258262306a36Sopenharmony_ci "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n", 258362306a36Sopenharmony_ci RTW8852B_DPK_VER, rtwdev->hal.cv, 258462306a36Sopenharmony_ci RTW8852B_RF_REL_VERSION); 258562306a36Sopenharmony_ci 258662306a36Sopenharmony_ci if (_dpk_bypass_check(rtwdev, phy)) 258762306a36Sopenharmony_ci _dpk_force_bypass(rtwdev, phy); 258862306a36Sopenharmony_ci else 258962306a36Sopenharmony_ci _dpk_cal_select(rtwdev, force, phy, RF_AB); 259062306a36Sopenharmony_ci} 259162306a36Sopenharmony_ci 259262306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev) 259362306a36Sopenharmony_ci{ 259462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 259562306a36Sopenharmony_ci s8 txagc_bb, txagc_bb_tp, ini_diff = 0, txagc_ofst; 259662306a36Sopenharmony_ci s8 delta_ther[2] = {}; 259762306a36Sopenharmony_ci u8 trk_idx, txagc_rf; 259862306a36Sopenharmony_ci u8 path, kidx; 259962306a36Sopenharmony_ci u16 pwsf[2]; 260062306a36Sopenharmony_ci u8 cur_ther; 260162306a36Sopenharmony_ci u32 tmp; 260262306a36Sopenharmony_ci 260362306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852B; path++) { 260462306a36Sopenharmony_ci kidx = dpk->cur_idx[path]; 260562306a36Sopenharmony_ci 260662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 260762306a36Sopenharmony_ci "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", 260862306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].ch); 260962306a36Sopenharmony_ci 261062306a36Sopenharmony_ci cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 261162306a36Sopenharmony_ci 261262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 261362306a36Sopenharmony_ci "[DPK_TRK] thermal now = %d\n", cur_ther); 261462306a36Sopenharmony_ci 261562306a36Sopenharmony_ci if (dpk->bp[path][kidx].ch && cur_ther) 261662306a36Sopenharmony_ci delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther; 261762306a36Sopenharmony_ci 261862306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) 261962306a36Sopenharmony_ci delta_ther[path] = delta_ther[path] * 3 / 2; 262062306a36Sopenharmony_ci else 262162306a36Sopenharmony_ci delta_ther[path] = delta_ther[path] * 5 / 2; 262262306a36Sopenharmony_ci 262362306a36Sopenharmony_ci txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 262462306a36Sopenharmony_ci 0x0000003f); 262562306a36Sopenharmony_ci 262662306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) { 262762306a36Sopenharmony_ci trk_idx = rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK); 262862306a36Sopenharmony_ci 262962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 263062306a36Sopenharmony_ci "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n", 263162306a36Sopenharmony_ci txagc_rf, trk_idx); 263262306a36Sopenharmony_ci 263362306a36Sopenharmony_ci txagc_bb = 263462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 263562306a36Sopenharmony_ci MASKBYTE2); 263662306a36Sopenharmony_ci txagc_bb_tp = 263762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_TP + (path << 13), 263862306a36Sopenharmony_ci B_TXAGC_TP); 263962306a36Sopenharmony_ci 264062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 264162306a36Sopenharmony_ci "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", 264262306a36Sopenharmony_ci txagc_bb_tp, txagc_bb); 264362306a36Sopenharmony_ci 264462306a36Sopenharmony_ci txagc_ofst = 264562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 264662306a36Sopenharmony_ci MASKBYTE3); 264762306a36Sopenharmony_ci 264862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 264962306a36Sopenharmony_ci "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n", 265062306a36Sopenharmony_ci txagc_ofst, delta_ther[path]); 265162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8), 265262306a36Sopenharmony_ci B_DPD_COM_OF); 265362306a36Sopenharmony_ci if (tmp == 0x1) { 265462306a36Sopenharmony_ci txagc_ofst = 0; 265562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 265662306a36Sopenharmony_ci "[DPK_TRK] HW txagc offset mode\n"); 265762306a36Sopenharmony_ci } 265862306a36Sopenharmony_ci 265962306a36Sopenharmony_ci if (txagc_rf && cur_ther) 266062306a36Sopenharmony_ci ini_diff = txagc_ofst + (delta_ther[path]); 266162306a36Sopenharmony_ci 266262306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, 266362306a36Sopenharmony_ci R_P0_TXDPD + (path << 13), 266462306a36Sopenharmony_ci B_P0_TXDPD); 266562306a36Sopenharmony_ci if (tmp == 0x0) { 266662306a36Sopenharmony_ci pwsf[0] = dpk->bp[path][kidx].pwsf + 266762306a36Sopenharmony_ci txagc_bb_tp - txagc_bb + ini_diff; 266862306a36Sopenharmony_ci pwsf[1] = dpk->bp[path][kidx].pwsf + 266962306a36Sopenharmony_ci txagc_bb_tp - txagc_bb + ini_diff; 267062306a36Sopenharmony_ci } else { 267162306a36Sopenharmony_ci pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff; 267262306a36Sopenharmony_ci pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff; 267362306a36Sopenharmony_ci } 267462306a36Sopenharmony_ci 267562306a36Sopenharmony_ci } else { 267662306a36Sopenharmony_ci pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 267762306a36Sopenharmony_ci pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 267862306a36Sopenharmony_ci } 267962306a36Sopenharmony_ci 268062306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS); 268162306a36Sopenharmony_ci if (!tmp && txagc_rf) { 268262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 268362306a36Sopenharmony_ci "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n", 268462306a36Sopenharmony_ci pwsf[0], pwsf[1]); 268562306a36Sopenharmony_ci 268662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 268762306a36Sopenharmony_ci R_DPD_BND + (path << 8) + (kidx << 2), 268862306a36Sopenharmony_ci B_DPD_BND_0, pwsf[0]); 268962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 269062306a36Sopenharmony_ci R_DPD_BND + (path << 8) + (kidx << 2), 269162306a36Sopenharmony_ci B_DPD_BND_1, pwsf[1]); 269262306a36Sopenharmony_ci } 269362306a36Sopenharmony_ci } 269462306a36Sopenharmony_ci} 269562306a36Sopenharmony_ci 269662306a36Sopenharmony_cistatic void _set_dpd_backoff(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 269762306a36Sopenharmony_ci{ 269862306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 269962306a36Sopenharmony_ci u8 tx_scale, ofdm_bkof, path, kpath; 270062306a36Sopenharmony_ci 270162306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 270262306a36Sopenharmony_ci 270362306a36Sopenharmony_ci ofdm_bkof = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_OFDM); 270462306a36Sopenharmony_ci tx_scale = rtw89_phy_read32_mask(rtwdev, R_DPD_BF + (phy << 13), B_DPD_BF_SCA); 270562306a36Sopenharmony_ci 270662306a36Sopenharmony_ci if (ofdm_bkof + tx_scale >= 44) { 270762306a36Sopenharmony_ci /* move dpd backoff to bb, and set dpd backoff to 0 */ 270862306a36Sopenharmony_ci dpk->dpk_gs[phy] = 0x7f; 270962306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852B; path++) { 271062306a36Sopenharmony_ci if (!(kpath & BIT(path))) 271162306a36Sopenharmony_ci continue; 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8), 271462306a36Sopenharmony_ci B_DPD_CFG, 0x7f7f7f); 271562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 271662306a36Sopenharmony_ci "[RFK] Set S%d DPD backoff to 0dB\n", path); 271762306a36Sopenharmony_ci } 271862306a36Sopenharmony_ci } else { 271962306a36Sopenharmony_ci dpk->dpk_gs[phy] = 0x5b; 272062306a36Sopenharmony_ci } 272162306a36Sopenharmony_ci} 272262306a36Sopenharmony_ci 272362306a36Sopenharmony_cistatic void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 272462306a36Sopenharmony_ci enum rtw89_rf_path path) 272562306a36Sopenharmony_ci{ 272662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 272762306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 272862306a36Sopenharmony_ci 272962306a36Sopenharmony_ci if (band == RTW89_BAND_2G) 273062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1); 273162306a36Sopenharmony_ci else 273262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1); 273362306a36Sopenharmony_ci} 273462306a36Sopenharmony_ci 273562306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 273662306a36Sopenharmony_ci enum rtw89_rf_path path) 273762306a36Sopenharmony_ci{ 273862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 273962306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852b_tssi_sys_defs_tbl); 274262306a36Sopenharmony_ci 274362306a36Sopenharmony_ci if (path == RF_PATH_A) 274462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 274562306a36Sopenharmony_ci &rtw8852b_tssi_sys_a_defs_2g_tbl, 274662306a36Sopenharmony_ci &rtw8852b_tssi_sys_a_defs_5g_tbl); 274762306a36Sopenharmony_ci else 274862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 274962306a36Sopenharmony_ci &rtw8852b_tssi_sys_b_defs_2g_tbl, 275062306a36Sopenharmony_ci &rtw8852b_tssi_sys_b_defs_5g_tbl); 275162306a36Sopenharmony_ci} 275262306a36Sopenharmony_ci 275362306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, 275462306a36Sopenharmony_ci enum rtw89_phy_idx phy, 275562306a36Sopenharmony_ci enum rtw89_rf_path path) 275662306a36Sopenharmony_ci{ 275762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 275862306a36Sopenharmony_ci &rtw8852b_tssi_init_txpwr_defs_a_tbl, 275962306a36Sopenharmony_ci &rtw8852b_tssi_init_txpwr_defs_b_tbl); 276062306a36Sopenharmony_ci} 276162306a36Sopenharmony_ci 276262306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, 276362306a36Sopenharmony_ci enum rtw89_phy_idx phy, 276462306a36Sopenharmony_ci enum rtw89_rf_path path) 276562306a36Sopenharmony_ci{ 276662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 276762306a36Sopenharmony_ci &rtw8852b_tssi_init_txpwr_he_tb_defs_a_tbl, 276862306a36Sopenharmony_ci &rtw8852b_tssi_init_txpwr_he_tb_defs_b_tbl); 276962306a36Sopenharmony_ci} 277062306a36Sopenharmony_ci 277162306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 277262306a36Sopenharmony_ci enum rtw89_rf_path path) 277362306a36Sopenharmony_ci{ 277462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 277562306a36Sopenharmony_ci &rtw8852b_tssi_dck_defs_a_tbl, 277662306a36Sopenharmony_ci &rtw8852b_tssi_dck_defs_b_tbl); 277762306a36Sopenharmony_ci} 277862306a36Sopenharmony_ci 277962306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 278062306a36Sopenharmony_ci enum rtw89_rf_path path) 278162306a36Sopenharmony_ci{ 278262306a36Sopenharmony_ci#define RTW8852B_TSSI_GET_VAL(ptr, idx) \ 278362306a36Sopenharmony_ci({ \ 278462306a36Sopenharmony_ci s8 *__ptr = (ptr); \ 278562306a36Sopenharmony_ci u8 __idx = (idx), __i, __v; \ 278662306a36Sopenharmony_ci u32 __val = 0; \ 278762306a36Sopenharmony_ci for (__i = 0; __i < 4; __i++) { \ 278862306a36Sopenharmony_ci __v = (__ptr[__idx + __i]); \ 278962306a36Sopenharmony_ci __val |= (__v << (8 * __i)); \ 279062306a36Sopenharmony_ci } \ 279162306a36Sopenharmony_ci __val; \ 279262306a36Sopenharmony_ci}) 279362306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 279462306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 279562306a36Sopenharmony_ci u8 ch = chan->channel; 279662306a36Sopenharmony_ci u8 subband = chan->subband_type; 279762306a36Sopenharmony_ci const s8 *thm_up_a = NULL; 279862306a36Sopenharmony_ci const s8 *thm_down_a = NULL; 279962306a36Sopenharmony_ci const s8 *thm_up_b = NULL; 280062306a36Sopenharmony_ci const s8 *thm_down_b = NULL; 280162306a36Sopenharmony_ci u8 thermal = 0xff; 280262306a36Sopenharmony_ci s8 thm_ofst[64] = {0}; 280362306a36Sopenharmony_ci u32 tmp = 0; 280462306a36Sopenharmony_ci u8 i, j; 280562306a36Sopenharmony_ci 280662306a36Sopenharmony_ci switch (subband) { 280762306a36Sopenharmony_ci default: 280862306a36Sopenharmony_ci case RTW89_CH_2G: 280962306a36Sopenharmony_ci thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_p; 281062306a36Sopenharmony_ci thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_2ga_n; 281162306a36Sopenharmony_ci thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_p; 281262306a36Sopenharmony_ci thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_2gb_n; 281362306a36Sopenharmony_ci break; 281462306a36Sopenharmony_ci case RTW89_CH_5G_BAND_1: 281562306a36Sopenharmony_ci thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[0]; 281662306a36Sopenharmony_ci thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[0]; 281762306a36Sopenharmony_ci thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[0]; 281862306a36Sopenharmony_ci thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[0]; 281962306a36Sopenharmony_ci break; 282062306a36Sopenharmony_ci case RTW89_CH_5G_BAND_3: 282162306a36Sopenharmony_ci thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[1]; 282262306a36Sopenharmony_ci thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[1]; 282362306a36Sopenharmony_ci thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[1]; 282462306a36Sopenharmony_ci thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[1]; 282562306a36Sopenharmony_ci break; 282662306a36Sopenharmony_ci case RTW89_CH_5G_BAND_4: 282762306a36Sopenharmony_ci thm_up_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_p[2]; 282862306a36Sopenharmony_ci thm_down_a = rtw89_8852b_trk_cfg.delta_swingidx_5ga_n[2]; 282962306a36Sopenharmony_ci thm_up_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_p[2]; 283062306a36Sopenharmony_ci thm_down_b = rtw89_8852b_trk_cfg.delta_swingidx_5gb_n[2]; 283162306a36Sopenharmony_ci break; 283262306a36Sopenharmony_ci } 283362306a36Sopenharmony_ci 283462306a36Sopenharmony_ci if (path == RF_PATH_A) { 283562306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_A]; 283662306a36Sopenharmony_ci 283762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 283862306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); 283962306a36Sopenharmony_ci 284062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); 284162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); 284262306a36Sopenharmony_ci 284362306a36Sopenharmony_ci if (thermal == 0xff) { 284462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); 284562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); 284662306a36Sopenharmony_ci 284762306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 284862306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); 284962306a36Sopenharmony_ci 285062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 285162306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 285262306a36Sopenharmony_ci R_P0_TSSI_BASE + i, 0x0); 285362306a36Sopenharmony_ci } 285462306a36Sopenharmony_ci 285562306a36Sopenharmony_ci } else { 285662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal); 285762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 285862306a36Sopenharmony_ci thermal); 285962306a36Sopenharmony_ci 286062306a36Sopenharmony_ci i = 0; 286162306a36Sopenharmony_ci for (j = 0; j < 32; j++) 286262306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 286362306a36Sopenharmony_ci -thm_down_a[i++] : 286462306a36Sopenharmony_ci -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; 286562306a36Sopenharmony_ci 286662306a36Sopenharmony_ci i = 1; 286762306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 286862306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 286962306a36Sopenharmony_ci thm_up_a[i++] : 287062306a36Sopenharmony_ci thm_up_a[DELTA_SWINGIDX_SIZE - 1]; 287162306a36Sopenharmony_ci 287262306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 287362306a36Sopenharmony_ci tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i); 287462306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); 287562306a36Sopenharmony_ci 287662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 287762306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 287862306a36Sopenharmony_ci 0x5c00 + i, tmp); 287962306a36Sopenharmony_ci } 288062306a36Sopenharmony_ci } 288162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); 288262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); 288362306a36Sopenharmony_ci 288462306a36Sopenharmony_ci } else { 288562306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_B]; 288662306a36Sopenharmony_ci 288762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 288862306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal); 288962306a36Sopenharmony_ci 289062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0); 289162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1); 289262306a36Sopenharmony_ci 289362306a36Sopenharmony_ci if (thermal == 0xff) { 289462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32); 289562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32); 289662306a36Sopenharmony_ci 289762306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 289862306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0); 289962306a36Sopenharmony_ci 290062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 290162306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 290262306a36Sopenharmony_ci 0x7c00 + i, 0x0); 290362306a36Sopenharmony_ci } 290462306a36Sopenharmony_ci 290562306a36Sopenharmony_ci } else { 290662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal); 290762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 290862306a36Sopenharmony_ci thermal); 290962306a36Sopenharmony_ci 291062306a36Sopenharmony_ci i = 0; 291162306a36Sopenharmony_ci for (j = 0; j < 32; j++) 291262306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 291362306a36Sopenharmony_ci -thm_down_b[i++] : 291462306a36Sopenharmony_ci -thm_down_b[DELTA_SWINGIDX_SIZE - 1]; 291562306a36Sopenharmony_ci 291662306a36Sopenharmony_ci i = 1; 291762306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 291862306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 291962306a36Sopenharmony_ci thm_up_b[i++] : 292062306a36Sopenharmony_ci thm_up_b[DELTA_SWINGIDX_SIZE - 1]; 292162306a36Sopenharmony_ci 292262306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 292362306a36Sopenharmony_ci tmp = RTW8852B_TSSI_GET_VAL(thm_ofst, i); 292462306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp); 292562306a36Sopenharmony_ci 292662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 292762306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 292862306a36Sopenharmony_ci 0x7c00 + i, tmp); 292962306a36Sopenharmony_ci } 293062306a36Sopenharmony_ci } 293162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1); 293262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0); 293362306a36Sopenharmony_ci } 293462306a36Sopenharmony_ci#undef RTW8852B_TSSI_GET_VAL 293562306a36Sopenharmony_ci} 293662306a36Sopenharmony_ci 293762306a36Sopenharmony_cistatic void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 293862306a36Sopenharmony_ci enum rtw89_rf_path path) 293962306a36Sopenharmony_ci{ 294062306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 294162306a36Sopenharmony_ci &rtw8852b_tssi_dac_gain_defs_a_tbl, 294262306a36Sopenharmony_ci &rtw8852b_tssi_dac_gain_defs_b_tbl); 294362306a36Sopenharmony_ci} 294462306a36Sopenharmony_ci 294562306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 294662306a36Sopenharmony_ci enum rtw89_rf_path path) 294762306a36Sopenharmony_ci{ 294862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 294962306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 295062306a36Sopenharmony_ci 295162306a36Sopenharmony_ci if (path == RF_PATH_A) 295262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 295362306a36Sopenharmony_ci &rtw8852b_tssi_slope_a_defs_2g_tbl, 295462306a36Sopenharmony_ci &rtw8852b_tssi_slope_a_defs_5g_tbl); 295562306a36Sopenharmony_ci else 295662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 295762306a36Sopenharmony_ci &rtw8852b_tssi_slope_b_defs_2g_tbl, 295862306a36Sopenharmony_ci &rtw8852b_tssi_slope_b_defs_5g_tbl); 295962306a36Sopenharmony_ci} 296062306a36Sopenharmony_ci 296162306a36Sopenharmony_cistatic void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 296262306a36Sopenharmony_ci enum rtw89_rf_path path, bool all) 296362306a36Sopenharmony_ci{ 296462306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 296562306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 296662306a36Sopenharmony_ci const struct rtw89_rfk_tbl *tbl = NULL; 296762306a36Sopenharmony_ci u8 ch = chan->channel; 296862306a36Sopenharmony_ci 296962306a36Sopenharmony_ci if (path == RF_PATH_A) { 297062306a36Sopenharmony_ci if (band == RTW89_BAND_2G) { 297162306a36Sopenharmony_ci if (all) 297262306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_2g_all_defs_tbl; 297362306a36Sopenharmony_ci else 297462306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_2g_part_defs_tbl; 297562306a36Sopenharmony_ci } else if (ch >= 36 && ch <= 64) { 297662306a36Sopenharmony_ci if (all) 297762306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g1_all_defs_tbl; 297862306a36Sopenharmony_ci else 297962306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g1_part_defs_tbl; 298062306a36Sopenharmony_ci } else if (ch >= 100 && ch <= 144) { 298162306a36Sopenharmony_ci if (all) 298262306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g2_all_defs_tbl; 298362306a36Sopenharmony_ci else 298462306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g2_part_defs_tbl; 298562306a36Sopenharmony_ci } else if (ch >= 149 && ch <= 177) { 298662306a36Sopenharmony_ci if (all) 298762306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g3_all_defs_tbl; 298862306a36Sopenharmony_ci else 298962306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_a_5g3_part_defs_tbl; 299062306a36Sopenharmony_ci } 299162306a36Sopenharmony_ci } else { 299262306a36Sopenharmony_ci if (ch >= 1 && ch <= 14) { 299362306a36Sopenharmony_ci if (all) 299462306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_2g_all_defs_tbl; 299562306a36Sopenharmony_ci else 299662306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_2g_part_defs_tbl; 299762306a36Sopenharmony_ci } else if (ch >= 36 && ch <= 64) { 299862306a36Sopenharmony_ci if (all) 299962306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g1_all_defs_tbl; 300062306a36Sopenharmony_ci else 300162306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g1_part_defs_tbl; 300262306a36Sopenharmony_ci } else if (ch >= 100 && ch <= 144) { 300362306a36Sopenharmony_ci if (all) 300462306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g2_all_defs_tbl; 300562306a36Sopenharmony_ci else 300662306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g2_part_defs_tbl; 300762306a36Sopenharmony_ci } else if (ch >= 149 && ch <= 177) { 300862306a36Sopenharmony_ci if (all) 300962306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g3_all_defs_tbl; 301062306a36Sopenharmony_ci else 301162306a36Sopenharmony_ci tbl = &rtw8852b_tssi_align_b_5g3_part_defs_tbl; 301262306a36Sopenharmony_ci } 301362306a36Sopenharmony_ci } 301462306a36Sopenharmony_ci 301562306a36Sopenharmony_ci if (tbl) 301662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, tbl); 301762306a36Sopenharmony_ci} 301862306a36Sopenharmony_ci 301962306a36Sopenharmony_cistatic void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 302062306a36Sopenharmony_ci enum rtw89_rf_path path) 302162306a36Sopenharmony_ci{ 302262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 302362306a36Sopenharmony_ci &rtw8852b_tssi_slope_defs_a_tbl, 302462306a36Sopenharmony_ci &rtw8852b_tssi_slope_defs_b_tbl); 302562306a36Sopenharmony_ci} 302662306a36Sopenharmony_ci 302762306a36Sopenharmony_cistatic void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 302862306a36Sopenharmony_ci enum rtw89_rf_path path) 302962306a36Sopenharmony_ci{ 303062306a36Sopenharmony_ci if (path == RF_PATH_A) 303162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSIC, B_P0_TSSIC_BYPASS, 0x0); 303262306a36Sopenharmony_ci else 303362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSIC, B_P1_TSSIC_BYPASS, 0x0); 303462306a36Sopenharmony_ci} 303562306a36Sopenharmony_ci 303662306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, 303762306a36Sopenharmony_ci enum rtw89_phy_idx phy, 303862306a36Sopenharmony_ci enum rtw89_rf_path path) 303962306a36Sopenharmony_ci{ 304062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "======>%s path=%d\n", __func__, 304162306a36Sopenharmony_ci path); 304262306a36Sopenharmony_ci 304362306a36Sopenharmony_ci if (path == RF_PATH_A) 304462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_MIX, 0x010); 304562306a36Sopenharmony_ci else 304662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_RFCTM_DEL, 0x010); 304762306a36Sopenharmony_ci} 304862306a36Sopenharmony_ci 304962306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 305062306a36Sopenharmony_ci{ 305162306a36Sopenharmony_ci u8 i; 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci for (i = 0; i < RF_PATH_NUM_8852B; i++) { 305462306a36Sopenharmony_ci _tssi_set_tssi_track(rtwdev, phy, i); 305562306a36Sopenharmony_ci _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i); 305662306a36Sopenharmony_ci 305762306a36Sopenharmony_ci if (i == RF_PATH_A) { 305862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, 305962306a36Sopenharmony_ci B_P0_TSSI_MV_CLR, 0x0); 306062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, 306162306a36Sopenharmony_ci B_P0_TSSI_EN, 0x0); 306262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, 306362306a36Sopenharmony_ci B_P0_TSSI_EN, 0x1); 306462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, i, RR_TXGA_V1, 306562306a36Sopenharmony_ci RR_TXGA_V1_TRK_EN, 0x1); 306662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 306762306a36Sopenharmony_ci B_P0_TSSI_RFC, 0x3); 306862306a36Sopenharmony_ci 306962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 307062306a36Sopenharmony_ci B_P0_TSSI_OFT, 0xc0); 307162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 307262306a36Sopenharmony_ci B_P0_TSSI_OFT_EN, 0x0); 307362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, 307462306a36Sopenharmony_ci B_P0_TSSI_OFT_EN, 0x1); 307562306a36Sopenharmony_ci 307662306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = true; 307762306a36Sopenharmony_ci } else { 307862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, 307962306a36Sopenharmony_ci B_P1_TSSI_MV_CLR, 0x0); 308062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, 308162306a36Sopenharmony_ci B_P1_TSSI_EN, 0x0); 308262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, 308362306a36Sopenharmony_ci B_P1_TSSI_EN, 0x1); 308462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, i, RR_TXGA_V1, 308562306a36Sopenharmony_ci RR_TXGA_V1_TRK_EN, 0x1); 308662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 308762306a36Sopenharmony_ci B_P1_TSSI_RFC, 0x3); 308862306a36Sopenharmony_ci 308962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 309062306a36Sopenharmony_ci B_P1_TSSI_OFT, 0xc0); 309162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 309262306a36Sopenharmony_ci B_P1_TSSI_OFT_EN, 0x0); 309362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, 309462306a36Sopenharmony_ci B_P1_TSSI_OFT_EN, 0x1); 309562306a36Sopenharmony_ci 309662306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_B] = true; 309762306a36Sopenharmony_ci } 309862306a36Sopenharmony_ci } 309962306a36Sopenharmony_ci} 310062306a36Sopenharmony_ci 310162306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 310262306a36Sopenharmony_ci{ 310362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0); 310462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x1); 310562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1); 310662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_EN, 0x0); 310762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_RFC, 0x1); 310862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_CLR, 0x1); 310962306a36Sopenharmony_ci 311062306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = false; 311162306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_B] = false; 311262306a36Sopenharmony_ci} 311362306a36Sopenharmony_ci 311462306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) 311562306a36Sopenharmony_ci{ 311662306a36Sopenharmony_ci switch (ch) { 311762306a36Sopenharmony_ci case 1 ... 2: 311862306a36Sopenharmony_ci return 0; 311962306a36Sopenharmony_ci case 3 ... 5: 312062306a36Sopenharmony_ci return 1; 312162306a36Sopenharmony_ci case 6 ... 8: 312262306a36Sopenharmony_ci return 2; 312362306a36Sopenharmony_ci case 9 ... 11: 312462306a36Sopenharmony_ci return 3; 312562306a36Sopenharmony_ci case 12 ... 13: 312662306a36Sopenharmony_ci return 4; 312762306a36Sopenharmony_ci case 14: 312862306a36Sopenharmony_ci return 5; 312962306a36Sopenharmony_ci } 313062306a36Sopenharmony_ci 313162306a36Sopenharmony_ci return 0; 313262306a36Sopenharmony_ci} 313362306a36Sopenharmony_ci 313462306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31)) 313562306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) 313662306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) 313762306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) 313862306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) 313962306a36Sopenharmony_ci 314062306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 314162306a36Sopenharmony_ci{ 314262306a36Sopenharmony_ci switch (ch) { 314362306a36Sopenharmony_ci case 1 ... 2: 314462306a36Sopenharmony_ci return 0; 314562306a36Sopenharmony_ci case 3 ... 5: 314662306a36Sopenharmony_ci return 1; 314762306a36Sopenharmony_ci case 6 ... 8: 314862306a36Sopenharmony_ci return 2; 314962306a36Sopenharmony_ci case 9 ... 11: 315062306a36Sopenharmony_ci return 3; 315162306a36Sopenharmony_ci case 12 ... 14: 315262306a36Sopenharmony_ci return 4; 315362306a36Sopenharmony_ci case 36 ... 40: 315462306a36Sopenharmony_ci return 5; 315562306a36Sopenharmony_ci case 41 ... 43: 315662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(5); 315762306a36Sopenharmony_ci case 44 ... 48: 315862306a36Sopenharmony_ci return 6; 315962306a36Sopenharmony_ci case 49 ... 51: 316062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 316162306a36Sopenharmony_ci case 52 ... 56: 316262306a36Sopenharmony_ci return 7; 316362306a36Sopenharmony_ci case 57 ... 59: 316462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(7); 316562306a36Sopenharmony_ci case 60 ... 64: 316662306a36Sopenharmony_ci return 8; 316762306a36Sopenharmony_ci case 100 ... 104: 316862306a36Sopenharmony_ci return 9; 316962306a36Sopenharmony_ci case 105 ... 107: 317062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(9); 317162306a36Sopenharmony_ci case 108 ... 112: 317262306a36Sopenharmony_ci return 10; 317362306a36Sopenharmony_ci case 113 ... 115: 317462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 317562306a36Sopenharmony_ci case 116 ... 120: 317662306a36Sopenharmony_ci return 11; 317762306a36Sopenharmony_ci case 121 ... 123: 317862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(11); 317962306a36Sopenharmony_ci case 124 ... 128: 318062306a36Sopenharmony_ci return 12; 318162306a36Sopenharmony_ci case 129 ... 131: 318262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 318362306a36Sopenharmony_ci case 132 ... 136: 318462306a36Sopenharmony_ci return 13; 318562306a36Sopenharmony_ci case 137 ... 139: 318662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(13); 318762306a36Sopenharmony_ci case 140 ... 144: 318862306a36Sopenharmony_ci return 14; 318962306a36Sopenharmony_ci case 149 ... 153: 319062306a36Sopenharmony_ci return 15; 319162306a36Sopenharmony_ci case 154 ... 156: 319262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(15); 319362306a36Sopenharmony_ci case 157 ... 161: 319462306a36Sopenharmony_ci return 16; 319562306a36Sopenharmony_ci case 162 ... 164: 319662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(16); 319762306a36Sopenharmony_ci case 165 ... 169: 319862306a36Sopenharmony_ci return 17; 319962306a36Sopenharmony_ci case 170 ... 172: 320062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(17); 320162306a36Sopenharmony_ci case 173 ... 177: 320262306a36Sopenharmony_ci return 18; 320362306a36Sopenharmony_ci } 320462306a36Sopenharmony_ci 320562306a36Sopenharmony_ci return 0; 320662306a36Sopenharmony_ci} 320762306a36Sopenharmony_ci 320862306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) 320962306a36Sopenharmony_ci{ 321062306a36Sopenharmony_ci switch (ch) { 321162306a36Sopenharmony_ci case 1 ... 8: 321262306a36Sopenharmony_ci return 0; 321362306a36Sopenharmony_ci case 9 ... 14: 321462306a36Sopenharmony_ci return 1; 321562306a36Sopenharmony_ci case 36 ... 48: 321662306a36Sopenharmony_ci return 2; 321762306a36Sopenharmony_ci case 52 ... 64: 321862306a36Sopenharmony_ci return 3; 321962306a36Sopenharmony_ci case 100 ... 112: 322062306a36Sopenharmony_ci return 4; 322162306a36Sopenharmony_ci case 116 ... 128: 322262306a36Sopenharmony_ci return 5; 322362306a36Sopenharmony_ci case 132 ... 144: 322462306a36Sopenharmony_ci return 6; 322562306a36Sopenharmony_ci case 149 ... 177: 322662306a36Sopenharmony_ci return 7; 322762306a36Sopenharmony_ci } 322862306a36Sopenharmony_ci 322962306a36Sopenharmony_ci return 0; 323062306a36Sopenharmony_ci} 323162306a36Sopenharmony_ci 323262306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 323362306a36Sopenharmony_ci enum rtw89_rf_path path) 323462306a36Sopenharmony_ci{ 323562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 323662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 323762306a36Sopenharmony_ci u8 ch = chan->channel; 323862306a36Sopenharmony_ci u32 gidx, gidx_1st, gidx_2nd; 323962306a36Sopenharmony_ci s8 de_1st; 324062306a36Sopenharmony_ci s8 de_2nd; 324162306a36Sopenharmony_ci s8 val; 324262306a36Sopenharmony_ci 324362306a36Sopenharmony_ci gidx = _tssi_get_ofdm_group(rtwdev, ch); 324462306a36Sopenharmony_ci 324562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 324662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx); 324762306a36Sopenharmony_ci 324862306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(gidx)) { 324962306a36Sopenharmony_ci gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 325062306a36Sopenharmony_ci gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 325162306a36Sopenharmony_ci de_1st = tssi_info->tssi_mcs[path][gidx_1st]; 325262306a36Sopenharmony_ci de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; 325362306a36Sopenharmony_ci val = (de_1st + de_2nd) / 2; 325462306a36Sopenharmony_ci 325562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 325662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 325762306a36Sopenharmony_ci path, val, de_1st, de_2nd); 325862306a36Sopenharmony_ci } else { 325962306a36Sopenharmony_ci val = tssi_info->tssi_mcs[path][gidx]; 326062306a36Sopenharmony_ci 326162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 326262306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 326362306a36Sopenharmony_ci } 326462306a36Sopenharmony_ci 326562306a36Sopenharmony_ci return val; 326662306a36Sopenharmony_ci} 326762306a36Sopenharmony_ci 326862306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 326962306a36Sopenharmony_ci enum rtw89_rf_path path) 327062306a36Sopenharmony_ci{ 327162306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 327262306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 327362306a36Sopenharmony_ci u8 ch = chan->channel; 327462306a36Sopenharmony_ci u32 tgidx, tgidx_1st, tgidx_2nd; 327562306a36Sopenharmony_ci s8 tde_1st; 327662306a36Sopenharmony_ci s8 tde_2nd; 327762306a36Sopenharmony_ci s8 val; 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci tgidx = _tssi_get_trim_group(rtwdev, ch); 328062306a36Sopenharmony_ci 328162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 328262306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 328362306a36Sopenharmony_ci path, tgidx); 328462306a36Sopenharmony_ci 328562306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(tgidx)) { 328662306a36Sopenharmony_ci tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 328762306a36Sopenharmony_ci tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 328862306a36Sopenharmony_ci tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; 328962306a36Sopenharmony_ci tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; 329062306a36Sopenharmony_ci val = (tde_1st + tde_2nd) / 2; 329162306a36Sopenharmony_ci 329262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 329362306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 329462306a36Sopenharmony_ci path, val, tde_1st, tde_2nd); 329562306a36Sopenharmony_ci } else { 329662306a36Sopenharmony_ci val = tssi_info->tssi_trim[path][tgidx]; 329762306a36Sopenharmony_ci 329862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 329962306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 330062306a36Sopenharmony_ci path, val); 330162306a36Sopenharmony_ci } 330262306a36Sopenharmony_ci 330362306a36Sopenharmony_ci return val; 330462306a36Sopenharmony_ci} 330562306a36Sopenharmony_ci 330662306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 330762306a36Sopenharmony_ci{ 330862306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 330962306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 331062306a36Sopenharmony_ci u8 ch = chan->channel; 331162306a36Sopenharmony_ci u8 gidx; 331262306a36Sopenharmony_ci s8 ofdm_de; 331362306a36Sopenharmony_ci s8 trim_de; 331462306a36Sopenharmony_ci s32 val; 331562306a36Sopenharmony_ci u32 i; 331662306a36Sopenharmony_ci 331762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", 331862306a36Sopenharmony_ci phy, ch); 331962306a36Sopenharmony_ci 332062306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) { 332162306a36Sopenharmony_ci gidx = _tssi_get_cck_group(rtwdev, ch); 332262306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 332362306a36Sopenharmony_ci val = tssi_info->tssi_cck[i][gidx] + trim_de; 332462306a36Sopenharmony_ci 332562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 332662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", 332762306a36Sopenharmony_ci i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); 332862306a36Sopenharmony_ci 332962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val); 333062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val); 333162306a36Sopenharmony_ci 333262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 333362306a36Sopenharmony_ci "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", 333462306a36Sopenharmony_ci _tssi_de_cck_long[i], 333562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i], 333662306a36Sopenharmony_ci _TSSI_DE_MASK)); 333762306a36Sopenharmony_ci 333862306a36Sopenharmony_ci ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); 333962306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 334062306a36Sopenharmony_ci val = ofdm_de + trim_de; 334162306a36Sopenharmony_ci 334262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 334362306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", 334462306a36Sopenharmony_ci i, ofdm_de, trim_de); 334562306a36Sopenharmony_ci 334662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val); 334762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val); 334862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val); 334962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val); 335062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val); 335162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val); 335262306a36Sopenharmony_ci 335362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 335462306a36Sopenharmony_ci "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", 335562306a36Sopenharmony_ci _tssi_de_mcs_20m[i], 335662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i], 335762306a36Sopenharmony_ci _TSSI_DE_MASK)); 335862306a36Sopenharmony_ci } 335962306a36Sopenharmony_ci} 336062306a36Sopenharmony_ci 336162306a36Sopenharmony_cistatic void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 336262306a36Sopenharmony_ci{ 336362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 336462306a36Sopenharmony_ci "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n" 336562306a36Sopenharmony_ci "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n", 336662306a36Sopenharmony_ci R_TSSI_PA_K1 + (path << 13), 336762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD), 336862306a36Sopenharmony_ci R_TSSI_PA_K2 + (path << 13), 336962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD), 337062306a36Sopenharmony_ci R_P0_TSSI_ALIM1 + (path << 13), 337162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD), 337262306a36Sopenharmony_ci R_P0_TSSI_ALIM3 + (path << 13), 337362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD), 337462306a36Sopenharmony_ci R_TSSI_PA_K5 + (path << 13), 337562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD), 337662306a36Sopenharmony_ci R_P0_TSSI_ALIM2 + (path << 13), 337762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD), 337862306a36Sopenharmony_ci R_P0_TSSI_ALIM4 + (path << 13), 337962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD), 338062306a36Sopenharmony_ci R_TSSI_PA_K8 + (path << 13), 338162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD)); 338262306a36Sopenharmony_ci} 338362306a36Sopenharmony_ci 338462306a36Sopenharmony_cistatic void _tssi_alimentk_done(struct rtw89_dev *rtwdev, 338562306a36Sopenharmony_ci enum rtw89_phy_idx phy, enum rtw89_rf_path path) 338662306a36Sopenharmony_ci{ 338762306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 338862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 338962306a36Sopenharmony_ci u8 channel = chan->channel; 339062306a36Sopenharmony_ci u8 band; 339162306a36Sopenharmony_ci 339262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 339362306a36Sopenharmony_ci "======>%s phy=%d path=%d\n", __func__, phy, path); 339462306a36Sopenharmony_ci 339562306a36Sopenharmony_ci if (channel >= 1 && channel <= 14) 339662306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 339762306a36Sopenharmony_ci else if (channel >= 36 && channel <= 64) 339862306a36Sopenharmony_ci band = TSSI_ALIMK_5GL; 339962306a36Sopenharmony_ci else if (channel >= 100 && channel <= 144) 340062306a36Sopenharmony_ci band = TSSI_ALIMK_5GM; 340162306a36Sopenharmony_ci else if (channel >= 149 && channel <= 177) 340262306a36Sopenharmony_ci band = TSSI_ALIMK_5GH; 340362306a36Sopenharmony_ci else 340462306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 340562306a36Sopenharmony_ci 340662306a36Sopenharmony_ci if (tssi_info->alignment_done[path][band]) { 340762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, 340862306a36Sopenharmony_ci tssi_info->alignment_value[path][band][0]); 340962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, 341062306a36Sopenharmony_ci tssi_info->alignment_value[path][band][1]); 341162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, 341262306a36Sopenharmony_ci tssi_info->alignment_value[path][band][2]); 341362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, 341462306a36Sopenharmony_ci tssi_info->alignment_value[path][band][3]); 341562306a36Sopenharmony_ci } 341662306a36Sopenharmony_ci 341762306a36Sopenharmony_ci _tssi_alimentk_dump_result(rtwdev, path); 341862306a36Sopenharmony_ci} 341962306a36Sopenharmony_ci 342062306a36Sopenharmony_cistatic void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 342162306a36Sopenharmony_ci enum rtw89_rf_path path, u16 cnt, u16 period, s16 pwr_dbm, 342262306a36Sopenharmony_ci u8 enable) 342362306a36Sopenharmony_ci{ 342462306a36Sopenharmony_ci enum rtw89_rf_path_bit rx_path; 342562306a36Sopenharmony_ci 342662306a36Sopenharmony_ci if (path == RF_PATH_A) 342762306a36Sopenharmony_ci rx_path = RF_A; 342862306a36Sopenharmony_ci else if (path == RF_PATH_B) 342962306a36Sopenharmony_ci rx_path = RF_B; 343062306a36Sopenharmony_ci else if (path == RF_PATH_AB) 343162306a36Sopenharmony_ci rx_path = RF_AB; 343262306a36Sopenharmony_ci else 343362306a36Sopenharmony_ci rx_path = RF_ABCD; /* don't change path, but still set others */ 343462306a36Sopenharmony_ci 343562306a36Sopenharmony_ci if (enable) { 343662306a36Sopenharmony_ci rtw8852b_bb_set_plcp_tx(rtwdev); 343762306a36Sopenharmony_ci rtw8852b_bb_cfg_tx_path(rtwdev, path); 343862306a36Sopenharmony_ci rtw8852b_bb_ctrl_rx_path(rtwdev, rx_path); 343962306a36Sopenharmony_ci rtw8852b_bb_set_power(rtwdev, pwr_dbm, phy); 344062306a36Sopenharmony_ci } 344162306a36Sopenharmony_ci 344262306a36Sopenharmony_ci rtw8852b_bb_set_pmac_pkt_tx(rtwdev, enable, cnt, period, 20, phy); 344362306a36Sopenharmony_ci} 344462306a36Sopenharmony_ci 344562306a36Sopenharmony_cistatic void _tssi_backup_bb_registers(struct rtw89_dev *rtwdev, 344662306a36Sopenharmony_ci enum rtw89_phy_idx phy, const u32 reg[], 344762306a36Sopenharmony_ci u32 reg_backup[], u32 reg_num) 344862306a36Sopenharmony_ci{ 344962306a36Sopenharmony_ci u32 i; 345062306a36Sopenharmony_ci 345162306a36Sopenharmony_ci for (i = 0; i < reg_num; i++) { 345262306a36Sopenharmony_ci reg_backup[i] = rtw89_phy_read32_mask(rtwdev, reg[i], MASKDWORD); 345362306a36Sopenharmony_ci 345462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 345562306a36Sopenharmony_ci "[TSSI] Backup BB 0x%x = 0x%x\n", reg[i], 345662306a36Sopenharmony_ci reg_backup[i]); 345762306a36Sopenharmony_ci } 345862306a36Sopenharmony_ci} 345962306a36Sopenharmony_ci 346062306a36Sopenharmony_cistatic void _tssi_reload_bb_registers(struct rtw89_dev *rtwdev, 346162306a36Sopenharmony_ci enum rtw89_phy_idx phy, const u32 reg[], 346262306a36Sopenharmony_ci u32 reg_backup[], u32 reg_num) 346362306a36Sopenharmony_ci 346462306a36Sopenharmony_ci{ 346562306a36Sopenharmony_ci u32 i; 346662306a36Sopenharmony_ci 346762306a36Sopenharmony_ci for (i = 0; i < reg_num; i++) { 346862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[i], MASKDWORD, reg_backup[i]); 346962306a36Sopenharmony_ci 347062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 347162306a36Sopenharmony_ci "[TSSI] Reload BB 0x%x = 0x%x\n", reg[i], 347262306a36Sopenharmony_ci reg_backup[i]); 347362306a36Sopenharmony_ci } 347462306a36Sopenharmony_ci} 347562306a36Sopenharmony_ci 347662306a36Sopenharmony_cistatic u8 _tssi_ch_to_idx(struct rtw89_dev *rtwdev, u8 channel) 347762306a36Sopenharmony_ci{ 347862306a36Sopenharmony_ci u8 channel_index; 347962306a36Sopenharmony_ci 348062306a36Sopenharmony_ci if (channel >= 1 && channel <= 14) 348162306a36Sopenharmony_ci channel_index = channel - 1; 348262306a36Sopenharmony_ci else if (channel >= 36 && channel <= 64) 348362306a36Sopenharmony_ci channel_index = (channel - 36) / 2 + 14; 348462306a36Sopenharmony_ci else if (channel >= 100 && channel <= 144) 348562306a36Sopenharmony_ci channel_index = ((channel - 100) / 2) + 15 + 14; 348662306a36Sopenharmony_ci else if (channel >= 149 && channel <= 177) 348762306a36Sopenharmony_ci channel_index = ((channel - 149) / 2) + 38 + 14; 348862306a36Sopenharmony_ci else 348962306a36Sopenharmony_ci channel_index = 0; 349062306a36Sopenharmony_ci 349162306a36Sopenharmony_ci return channel_index; 349262306a36Sopenharmony_ci} 349362306a36Sopenharmony_ci 349462306a36Sopenharmony_cistatic bool _tssi_get_cw_report(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 349562306a36Sopenharmony_ci enum rtw89_rf_path path, const s16 *power, 349662306a36Sopenharmony_ci u32 *tssi_cw_rpt) 349762306a36Sopenharmony_ci{ 349862306a36Sopenharmony_ci u32 tx_counter, tx_counter_tmp; 349962306a36Sopenharmony_ci const int retry = 100; 350062306a36Sopenharmony_ci u32 tmp; 350162306a36Sopenharmony_ci int j, k; 350262306a36Sopenharmony_ci 350362306a36Sopenharmony_ci for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) { 350462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x0); 350562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_trigger[path], B_P0_TSSI_EN, 0x1); 350662306a36Sopenharmony_ci 350762306a36Sopenharmony_ci tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 350862306a36Sopenharmony_ci 350962306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, _tssi_trigger[path], MASKDWORD); 351062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 351162306a36Sopenharmony_ci "[TSSI PA K] 0x%x = 0x%08x path=%d\n", 351262306a36Sopenharmony_ci _tssi_trigger[path], tmp, path); 351362306a36Sopenharmony_ci 351462306a36Sopenharmony_ci if (j == 0) 351562306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], true); 351662306a36Sopenharmony_ci else 351762306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, RF_PATH_ABCD, 100, 5000, power[j], true); 351862306a36Sopenharmony_ci 351962306a36Sopenharmony_ci tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 352062306a36Sopenharmony_ci tx_counter_tmp -= tx_counter; 352162306a36Sopenharmony_ci 352262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 352362306a36Sopenharmony_ci "[TSSI PA K] First HWTXcounter=%d path=%d\n", 352462306a36Sopenharmony_ci tx_counter_tmp, path); 352562306a36Sopenharmony_ci 352662306a36Sopenharmony_ci for (k = 0; k < retry; k++) { 352762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], 352862306a36Sopenharmony_ci B_TSSI_CWRPT_RDY); 352962306a36Sopenharmony_ci if (tmp) 353062306a36Sopenharmony_ci break; 353162306a36Sopenharmony_ci 353262306a36Sopenharmony_ci udelay(30); 353362306a36Sopenharmony_ci 353462306a36Sopenharmony_ci tx_counter_tmp = 353562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 353662306a36Sopenharmony_ci tx_counter_tmp -= tx_counter; 353762306a36Sopenharmony_ci 353862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 353962306a36Sopenharmony_ci "[TSSI PA K] Flow k = %d HWTXcounter=%d path=%d\n", 354062306a36Sopenharmony_ci k, tx_counter_tmp, path); 354162306a36Sopenharmony_ci } 354262306a36Sopenharmony_ci 354362306a36Sopenharmony_ci if (k >= retry) { 354462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 354562306a36Sopenharmony_ci "[TSSI PA K] TSSI finish bit k > %d mp:100ms normal:30us path=%d\n", 354662306a36Sopenharmony_ci k, path); 354762306a36Sopenharmony_ci 354862306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); 354962306a36Sopenharmony_ci return false; 355062306a36Sopenharmony_ci } 355162306a36Sopenharmony_ci 355262306a36Sopenharmony_ci tssi_cw_rpt[j] = 355362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_cw_rpt_addr[path], B_TSSI_CWRPT); 355462306a36Sopenharmony_ci 355562306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, path, 100, 5000, power[j], false); 355662306a36Sopenharmony_ci 355762306a36Sopenharmony_ci tx_counter_tmp = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 355862306a36Sopenharmony_ci tx_counter_tmp -= tx_counter; 355962306a36Sopenharmony_ci 356062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 356162306a36Sopenharmony_ci "[TSSI PA K] Final HWTXcounter=%d path=%d\n", 356262306a36Sopenharmony_ci tx_counter_tmp, path); 356362306a36Sopenharmony_ci } 356462306a36Sopenharmony_ci 356562306a36Sopenharmony_ci return true; 356662306a36Sopenharmony_ci} 356762306a36Sopenharmony_ci 356862306a36Sopenharmony_cistatic void _tssi_alimentk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 356962306a36Sopenharmony_ci enum rtw89_rf_path path) 357062306a36Sopenharmony_ci{ 357162306a36Sopenharmony_ci static const u32 bb_reg[8] = {0x5820, 0x7820, 0x4978, 0x58e4, 357262306a36Sopenharmony_ci 0x78e4, 0x49c0, 0x0d18, 0x0d80}; 357362306a36Sopenharmony_ci static const s16 power_2g[4] = {48, 20, 4, 4}; 357462306a36Sopenharmony_ci static const s16 power_5g[4] = {48, 20, 4, 4}; 357562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 357662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 357762306a36Sopenharmony_ci s32 tssi_alim_offset_1, tssi_alim_offset_2, tssi_alim_offset_3; 357862306a36Sopenharmony_ci u32 tssi_cw_rpt[RTW8852B_TSSI_PATH_NR] = {0}; 357962306a36Sopenharmony_ci u8 channel = chan->channel; 358062306a36Sopenharmony_ci u8 ch_idx = _tssi_ch_to_idx(rtwdev, channel); 358162306a36Sopenharmony_ci struct rtw8852b_bb_tssi_bak tssi_bak; 358262306a36Sopenharmony_ci s32 aliment_diff, tssi_cw_default; 358362306a36Sopenharmony_ci u32 start_time, finish_time; 358462306a36Sopenharmony_ci u32 bb_reg_backup[8] = {0}; 358562306a36Sopenharmony_ci const s16 *power; 358662306a36Sopenharmony_ci u8 band; 358762306a36Sopenharmony_ci bool ok; 358862306a36Sopenharmony_ci u32 tmp; 358962306a36Sopenharmony_ci u8 j; 359062306a36Sopenharmony_ci 359162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 359262306a36Sopenharmony_ci "======> %s channel=%d path=%d\n", __func__, channel, 359362306a36Sopenharmony_ci path); 359462306a36Sopenharmony_ci 359562306a36Sopenharmony_ci if (tssi_info->check_backup_aligmk[path][ch_idx]) { 359662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, 359762306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][0]); 359862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, 359962306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][1]); 360062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, 360162306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][2]); 360262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, 360362306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][3]); 360462306a36Sopenharmony_ci 360562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 360662306a36Sopenharmony_ci "======> %s Reload TSSI Alignment !!!\n", __func__); 360762306a36Sopenharmony_ci _tssi_alimentk_dump_result(rtwdev, path); 360862306a36Sopenharmony_ci return; 360962306a36Sopenharmony_ci } 361062306a36Sopenharmony_ci 361162306a36Sopenharmony_ci start_time = ktime_get_ns(); 361262306a36Sopenharmony_ci 361362306a36Sopenharmony_ci if (chan->band_type == RTW89_BAND_2G) 361462306a36Sopenharmony_ci power = power_2g; 361562306a36Sopenharmony_ci else 361662306a36Sopenharmony_ci power = power_5g; 361762306a36Sopenharmony_ci 361862306a36Sopenharmony_ci if (channel >= 1 && channel <= 14) 361962306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 362062306a36Sopenharmony_ci else if (channel >= 36 && channel <= 64) 362162306a36Sopenharmony_ci band = TSSI_ALIMK_5GL; 362262306a36Sopenharmony_ci else if (channel >= 100 && channel <= 144) 362362306a36Sopenharmony_ci band = TSSI_ALIMK_5GM; 362462306a36Sopenharmony_ci else if (channel >= 149 && channel <= 177) 362562306a36Sopenharmony_ci band = TSSI_ALIMK_5GH; 362662306a36Sopenharmony_ci else 362762306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 362862306a36Sopenharmony_ci 362962306a36Sopenharmony_ci rtw8852b_bb_backup_tssi(rtwdev, phy, &tssi_bak); 363062306a36Sopenharmony_ci _tssi_backup_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup)); 363162306a36Sopenharmony_ci 363262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x8); 363362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x8); 363462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2); 363562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2); 363662306a36Sopenharmony_ci 363762306a36Sopenharmony_ci ok = _tssi_get_cw_report(rtwdev, phy, path, power, tssi_cw_rpt); 363862306a36Sopenharmony_ci if (!ok) 363962306a36Sopenharmony_ci goto out; 364062306a36Sopenharmony_ci 364162306a36Sopenharmony_ci for (j = 0; j < RTW8852B_TSSI_PATH_NR; j++) { 364262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 364362306a36Sopenharmony_ci "[TSSI PA K] power[%d]=%d tssi_cw_rpt[%d]=%d\n", j, 364462306a36Sopenharmony_ci power[j], j, tssi_cw_rpt[j]); 364562306a36Sopenharmony_ci } 364662306a36Sopenharmony_ci 364762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][1], 364862306a36Sopenharmony_ci _tssi_cw_default_mask[1]); 364962306a36Sopenharmony_ci tssi_cw_default = sign_extend32(tmp, 8); 365062306a36Sopenharmony_ci tssi_alim_offset_1 = tssi_cw_rpt[0] - ((power[0] - power[1]) * 2) - 365162306a36Sopenharmony_ci tssi_cw_rpt[1] + tssi_cw_default; 365262306a36Sopenharmony_ci aliment_diff = tssi_alim_offset_1 - tssi_cw_default; 365362306a36Sopenharmony_ci 365462306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][2], 365562306a36Sopenharmony_ci _tssi_cw_default_mask[2]); 365662306a36Sopenharmony_ci tssi_cw_default = sign_extend32(tmp, 8); 365762306a36Sopenharmony_ci tssi_alim_offset_2 = tssi_cw_default + aliment_diff; 365862306a36Sopenharmony_ci 365962306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, _tssi_cw_default_addr[path][3], 366062306a36Sopenharmony_ci _tssi_cw_default_mask[3]); 366162306a36Sopenharmony_ci tssi_cw_default = sign_extend32(tmp, 8); 366262306a36Sopenharmony_ci tssi_alim_offset_3 = tssi_cw_default + aliment_diff; 366362306a36Sopenharmony_ci 366462306a36Sopenharmony_ci if (path == RF_PATH_A) { 366562306a36Sopenharmony_ci tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | 366662306a36Sopenharmony_ci FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | 366762306a36Sopenharmony_ci FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); 366862306a36Sopenharmony_ci 366962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM1, tmp); 367062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2, B_P0_TSSI_ALIM2, tmp); 367162306a36Sopenharmony_ci 367262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 367362306a36Sopenharmony_ci "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", 367462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3, B_P0_TSSI_ALIM31), 367562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM11), 367662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM12), 367762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1, B_P0_TSSI_ALIM13)); 367862306a36Sopenharmony_ci } else { 367962306a36Sopenharmony_ci tmp = FIELD_PREP(B_P1_TSSI_ALIM11, tssi_alim_offset_1) | 368062306a36Sopenharmony_ci FIELD_PREP(B_P1_TSSI_ALIM12, tssi_alim_offset_2) | 368162306a36Sopenharmony_ci FIELD_PREP(B_P1_TSSI_ALIM13, tssi_alim_offset_3); 368262306a36Sopenharmony_ci 368362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM1, tmp); 368462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_ALIM2, B_P1_TSSI_ALIM2, tmp); 368562306a36Sopenharmony_ci 368662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 368762306a36Sopenharmony_ci "[TSSI PA K] tssi_alim_offset = 0x%x 0x%x 0x%x 0x%x\n", 368862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM3, B_P1_TSSI_ALIM31), 368962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM11), 369062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM12), 369162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_ALIM1, B_P1_TSSI_ALIM13)); 369262306a36Sopenharmony_ci } 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci tssi_info->alignment_done[path][band] = true; 369562306a36Sopenharmony_ci tssi_info->alignment_value[path][band][0] = 369662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); 369762306a36Sopenharmony_ci tssi_info->alignment_value[path][band][1] = 369862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); 369962306a36Sopenharmony_ci tssi_info->alignment_value[path][band][2] = 370062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); 370162306a36Sopenharmony_ci tssi_info->alignment_value[path][band][3] = 370262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); 370362306a36Sopenharmony_ci 370462306a36Sopenharmony_ci tssi_info->check_backup_aligmk[path][ch_idx] = true; 370562306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][0] = 370662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD); 370762306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][1] = 370862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD); 370962306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][2] = 371062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD); 371162306a36Sopenharmony_ci tssi_info->alignment_backup_by_ch[path][ch_idx][3] = 371262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD); 371362306a36Sopenharmony_ci 371462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 371562306a36Sopenharmony_ci "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][0], 0x%x = 0x%08x\n", 371662306a36Sopenharmony_ci path, band, R_P0_TSSI_ALIM1 + (path << 13), 371762306a36Sopenharmony_ci tssi_info->alignment_value[path][band][0]); 371862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 371962306a36Sopenharmony_ci "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][1], 0x%x = 0x%08x\n", 372062306a36Sopenharmony_ci path, band, R_P0_TSSI_ALIM3 + (path << 13), 372162306a36Sopenharmony_ci tssi_info->alignment_value[path][band][1]); 372262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 372362306a36Sopenharmony_ci "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][2], 0x%x = 0x%08x\n", 372462306a36Sopenharmony_ci path, band, R_P0_TSSI_ALIM2 + (path << 13), 372562306a36Sopenharmony_ci tssi_info->alignment_value[path][band][2]); 372662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 372762306a36Sopenharmony_ci "[TSSI PA K] tssi_info->alignment_value[path=%d][band=%d][3], 0x%x = 0x%08x\n", 372862306a36Sopenharmony_ci path, band, R_P0_TSSI_ALIM4 + (path << 13), 372962306a36Sopenharmony_ci tssi_info->alignment_value[path][band][3]); 373062306a36Sopenharmony_ci 373162306a36Sopenharmony_ciout: 373262306a36Sopenharmony_ci _tssi_reload_bb_registers(rtwdev, phy, bb_reg, bb_reg_backup, ARRAY_SIZE(bb_reg_backup)); 373362306a36Sopenharmony_ci rtw8852b_bb_restore_tssi(rtwdev, phy, &tssi_bak); 373462306a36Sopenharmony_ci rtw8852b_bb_tx_mode_switch(rtwdev, phy, 0); 373562306a36Sopenharmony_ci 373662306a36Sopenharmony_ci finish_time = ktime_get_ns(); 373762306a36Sopenharmony_ci tssi_info->tssi_alimk_time += finish_time - start_time; 373862306a36Sopenharmony_ci 373962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 374062306a36Sopenharmony_ci "[TSSI PA K] %s processing time = %d ms\n", __func__, 374162306a36Sopenharmony_ci tssi_info->tssi_alimk_time); 374262306a36Sopenharmony_ci} 374362306a36Sopenharmony_ci 374462306a36Sopenharmony_civoid rtw8852b_dpk_init(struct rtw89_dev *rtwdev) 374562306a36Sopenharmony_ci{ 374662306a36Sopenharmony_ci _set_dpd_backoff(rtwdev, RTW89_PHY_0); 374762306a36Sopenharmony_ci} 374862306a36Sopenharmony_ci 374962306a36Sopenharmony_civoid rtw8852b_rck(struct rtw89_dev *rtwdev) 375062306a36Sopenharmony_ci{ 375162306a36Sopenharmony_ci u8 path; 375262306a36Sopenharmony_ci 375362306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852B; path++) 375462306a36Sopenharmony_ci _rck(rtwdev, path); 375562306a36Sopenharmony_ci} 375662306a36Sopenharmony_ci 375762306a36Sopenharmony_civoid rtw8852b_dack(struct rtw89_dev *rtwdev) 375862306a36Sopenharmony_ci{ 375962306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0); 376062306a36Sopenharmony_ci 376162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START); 376262306a36Sopenharmony_ci _dac_cal(rtwdev, false); 376362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP); 376462306a36Sopenharmony_ci} 376562306a36Sopenharmony_ci 376662306a36Sopenharmony_civoid rtw8852b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 376762306a36Sopenharmony_ci{ 376862306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 376962306a36Sopenharmony_ci u32 tx_en; 377062306a36Sopenharmony_ci 377162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 377262306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 377362306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 377462306a36Sopenharmony_ci 377562306a36Sopenharmony_ci _iqk_init(rtwdev); 377662306a36Sopenharmony_ci _iqk(rtwdev, phy_idx, false); 377762306a36Sopenharmony_ci 377862306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 377962306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 378062306a36Sopenharmony_ci} 378162306a36Sopenharmony_ci 378262306a36Sopenharmony_civoid rtw8852b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 378362306a36Sopenharmony_ci{ 378462306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 378562306a36Sopenharmony_ci u32 tx_en; 378662306a36Sopenharmony_ci 378762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 378862306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 378962306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 379062306a36Sopenharmony_ci 379162306a36Sopenharmony_ci _rx_dck(rtwdev, phy_idx); 379262306a36Sopenharmony_ci 379362306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 379462306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 379562306a36Sopenharmony_ci} 379662306a36Sopenharmony_ci 379762306a36Sopenharmony_civoid rtw8852b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 379862306a36Sopenharmony_ci{ 379962306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 380062306a36Sopenharmony_ci u32 tx_en; 380162306a36Sopenharmony_ci 380262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 380362306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 380462306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 380562306a36Sopenharmony_ci 380662306a36Sopenharmony_ci rtwdev->dpk.is_dpk_enable = true; 380762306a36Sopenharmony_ci rtwdev->dpk.is_dpk_reload_en = false; 380862306a36Sopenharmony_ci _dpk(rtwdev, phy_idx, false); 380962306a36Sopenharmony_ci 381062306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 381162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 381262306a36Sopenharmony_ci} 381362306a36Sopenharmony_ci 381462306a36Sopenharmony_civoid rtw8852b_dpk_track(struct rtw89_dev *rtwdev) 381562306a36Sopenharmony_ci{ 381662306a36Sopenharmony_ci _dpk_track(rtwdev); 381762306a36Sopenharmony_ci} 381862306a36Sopenharmony_ci 381962306a36Sopenharmony_civoid rtw8852b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en) 382062306a36Sopenharmony_ci{ 382162306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_AB); 382262306a36Sopenharmony_ci u32 tx_en; 382362306a36Sopenharmony_ci u8 i; 382462306a36Sopenharmony_ci 382562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy); 382662306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 382762306a36Sopenharmony_ci 382862306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 382962306a36Sopenharmony_ci 383062306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8852B; i++) { 383162306a36Sopenharmony_ci _tssi_rf_setting(rtwdev, phy, i); 383262306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 383362306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); 383462306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); 383562306a36Sopenharmony_ci _tssi_set_dck(rtwdev, phy, i); 383662306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 383762306a36Sopenharmony_ci _tssi_set_dac_gain_tbl(rtwdev, phy, i); 383862306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 383962306a36Sopenharmony_ci _tssi_alignment_default(rtwdev, phy, i, true); 384062306a36Sopenharmony_ci _tssi_set_tssi_slope(rtwdev, phy, i); 384162306a36Sopenharmony_ci 384262306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); 384362306a36Sopenharmony_ci _tmac_tx_pause(rtwdev, phy, true); 384462306a36Sopenharmony_ci if (hwtx_en) 384562306a36Sopenharmony_ci _tssi_alimentk(rtwdev, phy, i); 384662306a36Sopenharmony_ci _tmac_tx_pause(rtwdev, phy, false); 384762306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en); 384862306a36Sopenharmony_ci } 384962306a36Sopenharmony_ci 385062306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 385162306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 385262306a36Sopenharmony_ci 385362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 385462306a36Sopenharmony_ci} 385562306a36Sopenharmony_ci 385662306a36Sopenharmony_civoid rtw8852b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 385762306a36Sopenharmony_ci{ 385862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 385962306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 386062306a36Sopenharmony_ci u8 channel = chan->channel; 386162306a36Sopenharmony_ci u8 band; 386262306a36Sopenharmony_ci u32 i; 386362306a36Sopenharmony_ci 386462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 386562306a36Sopenharmony_ci "======>%s phy=%d channel=%d\n", __func__, phy, channel); 386662306a36Sopenharmony_ci 386762306a36Sopenharmony_ci if (channel >= 1 && channel <= 14) 386862306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 386962306a36Sopenharmony_ci else if (channel >= 36 && channel <= 64) 387062306a36Sopenharmony_ci band = TSSI_ALIMK_5GL; 387162306a36Sopenharmony_ci else if (channel >= 100 && channel <= 144) 387262306a36Sopenharmony_ci band = TSSI_ALIMK_5GM; 387362306a36Sopenharmony_ci else if (channel >= 149 && channel <= 177) 387462306a36Sopenharmony_ci band = TSSI_ALIMK_5GH; 387562306a36Sopenharmony_ci else 387662306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 387762306a36Sopenharmony_ci 387862306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 387962306a36Sopenharmony_ci 388062306a36Sopenharmony_ci for (i = RF_PATH_A; i < RTW8852B_TSSI_PATH_NR; i++) { 388162306a36Sopenharmony_ci _tssi_rf_setting(rtwdev, phy, i); 388262306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 388362306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 388462306a36Sopenharmony_ci 388562306a36Sopenharmony_ci if (tssi_info->alignment_done[i][band]) 388662306a36Sopenharmony_ci _tssi_alimentk_done(rtwdev, phy, i); 388762306a36Sopenharmony_ci else 388862306a36Sopenharmony_ci _tssi_alignment_default(rtwdev, phy, i, true); 388962306a36Sopenharmony_ci } 389062306a36Sopenharmony_ci 389162306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 389262306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 389362306a36Sopenharmony_ci} 389462306a36Sopenharmony_ci 389562306a36Sopenharmony_cistatic void rtw8852b_tssi_default_txagc(struct rtw89_dev *rtwdev, 389662306a36Sopenharmony_ci enum rtw89_phy_idx phy, bool enable) 389762306a36Sopenharmony_ci{ 389862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 389962306a36Sopenharmony_ci u8 channel = chan->channel; 390062306a36Sopenharmony_ci 390162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n", 390262306a36Sopenharmony_ci __func__, channel); 390362306a36Sopenharmony_ci 390462306a36Sopenharmony_ci if (enable) { 390562306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 390662306a36Sopenharmony_ci rtw8852b_tssi(rtwdev, phy, true); 390762306a36Sopenharmony_ci return; 390862306a36Sopenharmony_ci } 390962306a36Sopenharmony_ci 391062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 391162306a36Sopenharmony_ci "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", 391262306a36Sopenharmony_ci __func__, 391362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), 391462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); 391562306a36Sopenharmony_ci 391662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0); 391762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT, 0xc0); 391862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 391962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 392062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0); 392162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1); 392262306a36Sopenharmony_ci 392362306a36Sopenharmony_ci _tssi_alimentk_done(rtwdev, phy, RF_PATH_A); 392462306a36Sopenharmony_ci _tssi_alimentk_done(rtwdev, phy, RF_PATH_B); 392562306a36Sopenharmony_ci 392662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 392762306a36Sopenharmony_ci "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x 0x7818[7:0]=0x%x\n", 392862306a36Sopenharmony_ci __func__, 392962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT), 393062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT)); 393162306a36Sopenharmony_ci 393262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 393362306a36Sopenharmony_ci "======> %s SCAN_END\n", __func__); 393462306a36Sopenharmony_ci} 393562306a36Sopenharmony_ci 393662306a36Sopenharmony_civoid rtw8852b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start, 393762306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 393862306a36Sopenharmony_ci{ 393962306a36Sopenharmony_ci if (scan_start) 394062306a36Sopenharmony_ci rtw8852b_tssi_default_txagc(rtwdev, phy_idx, true); 394162306a36Sopenharmony_ci else 394262306a36Sopenharmony_ci rtw8852b_tssi_default_txagc(rtwdev, phy_idx, false); 394362306a36Sopenharmony_ci} 394462306a36Sopenharmony_ci 394562306a36Sopenharmony_cistatic void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 394662306a36Sopenharmony_ci enum rtw89_bandwidth bw, bool dav) 394762306a36Sopenharmony_ci{ 394862306a36Sopenharmony_ci u32 rf_reg18; 394962306a36Sopenharmony_ci u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; 395062306a36Sopenharmony_ci 395162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); 395262306a36Sopenharmony_ci 395362306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); 395462306a36Sopenharmony_ci if (rf_reg18 == INV_RF_DATA) { 395562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 395662306a36Sopenharmony_ci "[RFK]Invalid RF_0x18 for Path-%d\n", path); 395762306a36Sopenharmony_ci return; 395862306a36Sopenharmony_ci } 395962306a36Sopenharmony_ci rf_reg18 &= ~RR_CFGCH_BW; 396062306a36Sopenharmony_ci 396162306a36Sopenharmony_ci switch (bw) { 396262306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_5: 396362306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_10: 396462306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_20: 396562306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M); 396662306a36Sopenharmony_ci break; 396762306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_40: 396862306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M); 396962306a36Sopenharmony_ci break; 397062306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_80: 397162306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M); 397262306a36Sopenharmony_ci break; 397362306a36Sopenharmony_ci default: 397462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n"); 397562306a36Sopenharmony_ci } 397662306a36Sopenharmony_ci 397762306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | 397862306a36Sopenharmony_ci RR_CFGCH_BW2) & RFREG_MASK; 397962306a36Sopenharmony_ci rf_reg18 |= RR_CFGCH_BW2; 398062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); 398162306a36Sopenharmony_ci 398262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n", 398362306a36Sopenharmony_ci bw, path, reg18_addr, 398462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); 398562306a36Sopenharmony_ci} 398662306a36Sopenharmony_ci 398762306a36Sopenharmony_cistatic void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 398862306a36Sopenharmony_ci enum rtw89_bandwidth bw) 398962306a36Sopenharmony_ci{ 399062306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_A, bw, true); 399162306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_B, bw, true); 399262306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_A, bw, false); 399362306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_B, bw, false); 399462306a36Sopenharmony_ci} 399562306a36Sopenharmony_ci 399662306a36Sopenharmony_cistatic bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val) 399762306a36Sopenharmony_ci{ 399862306a36Sopenharmony_ci u32 bak; 399962306a36Sopenharmony_ci u32 tmp; 400062306a36Sopenharmony_ci int ret; 400162306a36Sopenharmony_ci 400262306a36Sopenharmony_ci bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK); 400362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1); 400462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val); 400562306a36Sopenharmony_ci 400662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000, 400762306a36Sopenharmony_ci false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY); 400862306a36Sopenharmony_ci if (ret) 400962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n"); 401062306a36Sopenharmony_ci 401162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak); 401262306a36Sopenharmony_ci 401362306a36Sopenharmony_ci return !!ret; 401462306a36Sopenharmony_ci} 401562306a36Sopenharmony_ci 401662306a36Sopenharmony_cistatic void _lck_check(struct rtw89_dev *rtwdev) 401762306a36Sopenharmony_ci{ 401862306a36Sopenharmony_ci u32 tmp; 401962306a36Sopenharmony_ci 402062306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 402162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n"); 402262306a36Sopenharmony_ci 402362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1); 402462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0); 402562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1); 402662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0); 402762306a36Sopenharmony_ci } 402862306a36Sopenharmony_ci 402962306a36Sopenharmony_ci udelay(10); 403062306a36Sopenharmony_ci 403162306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 403262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n"); 403362306a36Sopenharmony_ci 403462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 403562306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 403662306a36Sopenharmony_ci _set_s0_arfc18(rtwdev, tmp); 403762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); 403862306a36Sopenharmony_ci } 403962306a36Sopenharmony_ci 404062306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 404162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n"); 404262306a36Sopenharmony_ci 404362306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK); 404462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp); 404562306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK); 404662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp); 404762306a36Sopenharmony_ci 404862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1); 404962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0); 405062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3); 405162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0); 405262306a36Sopenharmony_ci 405362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 405462306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 405562306a36Sopenharmony_ci _set_s0_arfc18(rtwdev, tmp); 405662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); 405762306a36Sopenharmony_ci 405862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n", 405962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK), 406062306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK)); 406162306a36Sopenharmony_ci } 406262306a36Sopenharmony_ci} 406362306a36Sopenharmony_ci 406462306a36Sopenharmony_cistatic void _set_ch(struct rtw89_dev *rtwdev, u32 val) 406562306a36Sopenharmony_ci{ 406662306a36Sopenharmony_ci bool timeout; 406762306a36Sopenharmony_ci 406862306a36Sopenharmony_ci timeout = _set_s0_arfc18(rtwdev, val); 406962306a36Sopenharmony_ci if (!timeout) 407062306a36Sopenharmony_ci _lck_check(rtwdev); 407162306a36Sopenharmony_ci} 407262306a36Sopenharmony_ci 407362306a36Sopenharmony_cistatic void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 407462306a36Sopenharmony_ci u8 central_ch, bool dav) 407562306a36Sopenharmony_ci{ 407662306a36Sopenharmony_ci u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; 407762306a36Sopenharmony_ci bool is_2g_ch = central_ch <= 14; 407862306a36Sopenharmony_ci u32 rf_reg18; 407962306a36Sopenharmony_ci 408062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); 408162306a36Sopenharmony_ci 408262306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); 408362306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | 408462306a36Sopenharmony_ci RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH); 408562306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch); 408662306a36Sopenharmony_ci 408762306a36Sopenharmony_ci if (!is_2g_ch) 408862306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) | 408962306a36Sopenharmony_ci FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G); 409062306a36Sopenharmony_ci 409162306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | 409262306a36Sopenharmony_ci RR_CFGCH_BW2) & RFREG_MASK; 409362306a36Sopenharmony_ci rf_reg18 |= RR_CFGCH_BW2; 409462306a36Sopenharmony_ci 409562306a36Sopenharmony_ci if (path == RF_PATH_A && dav) 409662306a36Sopenharmony_ci _set_ch(rtwdev, rf_reg18); 409762306a36Sopenharmony_ci else 409862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); 409962306a36Sopenharmony_ci 410062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0); 410162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1); 410262306a36Sopenharmony_ci 410362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 410462306a36Sopenharmony_ci "[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n", 410562306a36Sopenharmony_ci central_ch, path, reg18_addr, 410662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); 410762306a36Sopenharmony_ci} 410862306a36Sopenharmony_ci 410962306a36Sopenharmony_cistatic void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch) 411062306a36Sopenharmony_ci{ 411162306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_A, central_ch, true); 411262306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_B, central_ch, true); 411362306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_A, central_ch, false); 411462306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_B, central_ch, false); 411562306a36Sopenharmony_ci} 411662306a36Sopenharmony_ci 411762306a36Sopenharmony_cistatic void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw, 411862306a36Sopenharmony_ci enum rtw89_rf_path path) 411962306a36Sopenharmony_ci{ 412062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1); 412162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12); 412262306a36Sopenharmony_ci 412362306a36Sopenharmony_ci if (bw == RTW89_CHANNEL_WIDTH_20) 412462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b); 412562306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_40) 412662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13); 412762306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_80) 412862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb); 412962306a36Sopenharmony_ci else 413062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3); 413162306a36Sopenharmony_ci 413262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path, 413362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB)); 413462306a36Sopenharmony_ci 413562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0); 413662306a36Sopenharmony_ci} 413762306a36Sopenharmony_ci 413862306a36Sopenharmony_cistatic void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 413962306a36Sopenharmony_ci enum rtw89_bandwidth bw) 414062306a36Sopenharmony_ci{ 414162306a36Sopenharmony_ci u8 kpath, path; 414262306a36Sopenharmony_ci 414362306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 414462306a36Sopenharmony_ci 414562306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852B; path++) { 414662306a36Sopenharmony_ci if (!(kpath & BIT(path))) 414762306a36Sopenharmony_ci continue; 414862306a36Sopenharmony_ci 414962306a36Sopenharmony_ci _set_rxbb_bw(rtwdev, bw, path); 415062306a36Sopenharmony_ci } 415162306a36Sopenharmony_ci} 415262306a36Sopenharmony_ci 415362306a36Sopenharmony_cistatic void rtw8852b_ctrl_bw_ch(struct rtw89_dev *rtwdev, 415462306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 central_ch, 415562306a36Sopenharmony_ci enum rtw89_band band, enum rtw89_bandwidth bw) 415662306a36Sopenharmony_ci{ 415762306a36Sopenharmony_ci _ctrl_ch(rtwdev, central_ch); 415862306a36Sopenharmony_ci _ctrl_bw(rtwdev, phy, bw); 415962306a36Sopenharmony_ci _rxbb_bw(rtwdev, phy, bw); 416062306a36Sopenharmony_ci} 416162306a36Sopenharmony_ci 416262306a36Sopenharmony_civoid rtw8852b_set_channel_rf(struct rtw89_dev *rtwdev, 416362306a36Sopenharmony_ci const struct rtw89_chan *chan, 416462306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 416562306a36Sopenharmony_ci{ 416662306a36Sopenharmony_ci rtw8852b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type, 416762306a36Sopenharmony_ci chan->band_width); 416862306a36Sopenharmony_ci} 4169