162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2022-2023 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 "rtw8851b.h" 1162306a36Sopenharmony_ci#include "rtw8851b_rfk.h" 1262306a36Sopenharmony_ci#include "rtw8851b_rfk_table.h" 1362306a36Sopenharmony_ci#include "rtw8851b_table.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define DPK_VER_8851B 0x5 1662306a36Sopenharmony_ci#define DPK_KIP_REG_NUM_8851B 7 1762306a36Sopenharmony_ci#define DPK_RF_REG_NUM_8851B 4 1862306a36Sopenharmony_ci#define DPK_KSET_NUM 4 1962306a36Sopenharmony_ci#define RTW8851B_RXK_GROUP_NR 4 2062306a36Sopenharmony_ci#define RTW8851B_RXK_GROUP_IDX_NR 2 2162306a36Sopenharmony_ci#define RTW8851B_TXK_GROUP_NR 1 2262306a36Sopenharmony_ci#define RTW8851B_IQK_VER 0x2a 2362306a36Sopenharmony_ci#define RTW8851B_IQK_SS 1 2462306a36Sopenharmony_ci#define RTW8851B_LOK_GRAM 10 2562306a36Sopenharmony_ci#define RTW8851B_TSSI_PATH_NR 1 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define _TSSI_DE_MASK GENMASK(21, 12) 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cienum dpk_id { 3062306a36Sopenharmony_ci LBK_RXIQK = 0x06, 3162306a36Sopenharmony_ci SYNC = 0x10, 3262306a36Sopenharmony_ci MDPK_IDL = 0x11, 3362306a36Sopenharmony_ci MDPK_MPA = 0x12, 3462306a36Sopenharmony_ci GAIN_LOSS = 0x13, 3562306a36Sopenharmony_ci GAIN_CAL = 0x14, 3662306a36Sopenharmony_ci DPK_RXAGC = 0x15, 3762306a36Sopenharmony_ci KIP_PRESET = 0x16, 3862306a36Sopenharmony_ci KIP_RESTORE = 0x17, 3962306a36Sopenharmony_ci DPK_TXAGC = 0x19, 4062306a36Sopenharmony_ci D_KIP_PRESET = 0x28, 4162306a36Sopenharmony_ci D_TXAGC = 0x29, 4262306a36Sopenharmony_ci D_RXAGC = 0x2a, 4362306a36Sopenharmony_ci D_SYNC = 0x2b, 4462306a36Sopenharmony_ci D_GAIN_LOSS = 0x2c, 4562306a36Sopenharmony_ci D_MDPK_IDL = 0x2d, 4662306a36Sopenharmony_ci D_MDPK_LDL = 0x2e, 4762306a36Sopenharmony_ci D_GAIN_NORM = 0x2f, 4862306a36Sopenharmony_ci D_KIP_THERMAL = 0x30, 4962306a36Sopenharmony_ci D_KIP_RESTORE = 0x31 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cienum dpk_agc_step { 5362306a36Sopenharmony_ci DPK_AGC_STEP_SYNC_DGAIN, 5462306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_LOSS_IDX, 5562306a36Sopenharmony_ci DPK_AGC_STEP_GL_GT_CRITERION, 5662306a36Sopenharmony_ci DPK_AGC_STEP_GL_LT_CRITERION, 5762306a36Sopenharmony_ci DPK_AGC_STEP_SET_TX_GAIN, 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cienum rtw8851b_iqk_type { 6162306a36Sopenharmony_ci ID_TXAGC = 0x0, 6262306a36Sopenharmony_ci ID_FLOK_COARSE = 0x1, 6362306a36Sopenharmony_ci ID_FLOK_FINE = 0x2, 6462306a36Sopenharmony_ci ID_TXK = 0x3, 6562306a36Sopenharmony_ci ID_RXAGC = 0x4, 6662306a36Sopenharmony_ci ID_RXK = 0x5, 6762306a36Sopenharmony_ci ID_NBTXK = 0x6, 6862306a36Sopenharmony_ci ID_NBRXK = 0x7, 6962306a36Sopenharmony_ci ID_FLOK_VBUFFER = 0x8, 7062306a36Sopenharmony_ci ID_A_FLOK_COARSE = 0x9, 7162306a36Sopenharmony_ci ID_G_FLOK_COARSE = 0xa, 7262306a36Sopenharmony_ci ID_A_FLOK_FINE = 0xb, 7362306a36Sopenharmony_ci ID_G_FLOK_FINE = 0xc, 7462306a36Sopenharmony_ci ID_IQK_RESTORE = 0x10, 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cienum rf_mode { 7862306a36Sopenharmony_ci RF_SHUT_DOWN = 0x0, 7962306a36Sopenharmony_ci RF_STANDBY = 0x1, 8062306a36Sopenharmony_ci RF_TX = 0x2, 8162306a36Sopenharmony_ci RF_RX = 0x3, 8262306a36Sopenharmony_ci RF_TXIQK = 0x4, 8362306a36Sopenharmony_ci RF_DPK = 0x5, 8462306a36Sopenharmony_ci RF_RXK1 = 0x6, 8562306a36Sopenharmony_ci RF_RXK2 = 0x7, 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_cistatic const u32 _tssi_de_cck_long[RF_PATH_NUM_8851B] = {0x5858}; 8962306a36Sopenharmony_cistatic const u32 _tssi_de_cck_short[RF_PATH_NUM_8851B] = {0x5860}; 9062306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8851B] = {0x5838}; 9162306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8851B] = {0x5840}; 9262306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8851B] = {0x5848}; 9362306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8851B] = {0x5850}; 9462306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8851B] = {0x5828}; 9562306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8851B] = {0x5830}; 9662306a36Sopenharmony_cistatic const u32 g_idxrxgain[RTW8851B_RXK_GROUP_NR] = {0x10e, 0x116, 0x28e, 0x296}; 9762306a36Sopenharmony_cistatic const u32 g_idxattc2[RTW8851B_RXK_GROUP_NR] = {0x0, 0xf, 0x0, 0xf}; 9862306a36Sopenharmony_cistatic const u32 g_idxrxagc[RTW8851B_RXK_GROUP_NR] = {0x0, 0x1, 0x2, 0x3}; 9962306a36Sopenharmony_cistatic const u32 a_idxrxgain[RTW8851B_RXK_GROUP_IDX_NR] = {0x10C, 0x28c}; 10062306a36Sopenharmony_cistatic const u32 a_idxattc2[RTW8851B_RXK_GROUP_IDX_NR] = {0xf, 0xf}; 10162306a36Sopenharmony_cistatic const u32 a_idxrxagc[RTW8851B_RXK_GROUP_IDX_NR] = {0x4, 0x6}; 10262306a36Sopenharmony_cistatic const u32 a_power_range[RTW8851B_TXK_GROUP_NR] = {0x0}; 10362306a36Sopenharmony_cistatic const u32 a_track_range[RTW8851B_TXK_GROUP_NR] = {0x6}; 10462306a36Sopenharmony_cistatic const u32 a_gain_bb[RTW8851B_TXK_GROUP_NR] = {0x0a}; 10562306a36Sopenharmony_cistatic const u32 a_itqt[RTW8851B_TXK_GROUP_NR] = {0x12}; 10662306a36Sopenharmony_cistatic const u32 g_power_range[RTW8851B_TXK_GROUP_NR] = {0x0}; 10762306a36Sopenharmony_cistatic const u32 g_track_range[RTW8851B_TXK_GROUP_NR] = {0x6}; 10862306a36Sopenharmony_cistatic const u32 g_gain_bb[RTW8851B_TXK_GROUP_NR] = {0x10}; 10962306a36Sopenharmony_cistatic const u32 g_itqt[RTW8851B_TXK_GROUP_NR] = {0x12}; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic const u32 rtw8851b_backup_bb_regs[] = {0xc0d4, 0xc0d8, 0xc0c4, 0xc0ec, 0xc0e8}; 11262306a36Sopenharmony_cistatic const u32 rtw8851b_backup_rf_regs[] = { 11362306a36Sopenharmony_ci 0xef, 0xde, 0x0, 0x1e, 0x2, 0x85, 0x90, 0x5}; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8851b_backup_bb_regs) 11662306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8851b_backup_rf_regs) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic const u32 dpk_kip_reg[DPK_KIP_REG_NUM_8851B] = { 11962306a36Sopenharmony_ci 0x813c, 0x8124, 0xc0ec, 0xc0e8, 0xc0c4, 0xc0d4, 0xc0d8}; 12062306a36Sopenharmony_cistatic const u32 dpk_rf_reg[DPK_RF_REG_NUM_8851B] = {0xde, 0x8f, 0x5, 0x10005}; 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_cistatic void _set_ch(struct rtw89_dev *rtwdev, u32 val); 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic u8 _rxk_5ghz_group_from_idx(u8 idx) 12562306a36Sopenharmony_ci{ 12662306a36Sopenharmony_ci /* There are four RXK groups (RTW8851B_RXK_GROUP_NR), but only group 0 12762306a36Sopenharmony_ci * and 2 are used in 5 GHz band, so reduce elements to 2. 12862306a36Sopenharmony_ci */ 12962306a36Sopenharmony_ci if (idx < RTW8851B_RXK_GROUP_IDX_NR) 13062306a36Sopenharmony_ci return idx * 2; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci return 0; 13362306a36Sopenharmony_ci} 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci return RF_A; 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_cistatic void _adc_fifo_rst(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 14162306a36Sopenharmony_ci u8 path) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0101); 14462306a36Sopenharmony_ci fsleep(10); 14562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x1111); 14662306a36Sopenharmony_ci} 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev, 14962306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci if (is_bybb) 15262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 15362306a36Sopenharmony_ci else 15462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev, 15862306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci if (is_bybb) 16162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 16262306a36Sopenharmony_ci else 16362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 16462306a36Sopenharmony_ci} 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) 16762306a36Sopenharmony_ci{ 16862306a36Sopenharmony_ci u32 rf_mode; 16962306a36Sopenharmony_ci u8 path; 17062306a36Sopenharmony_ci int ret; 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci for (path = 0; path < RF_PATH_MAX; path++) { 17362306a36Sopenharmony_ci if (!(kpath & BIT(path))) 17462306a36Sopenharmony_ci continue; 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, 17762306a36Sopenharmony_ci rf_mode != 2, 2, 5000, false, 17862306a36Sopenharmony_ci rtwdev, path, 0x00, RR_MOD_MASK); 17962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 18062306a36Sopenharmony_ci "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", 18162306a36Sopenharmony_ci path, ret); 18262306a36Sopenharmony_ci } 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic void _dack_reset(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 18662306a36Sopenharmony_ci{ 18762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x0); 18862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x1); 18962306a36Sopenharmony_ci} 19062306a36Sopenharmony_ci 19162306a36Sopenharmony_cistatic void _drck(struct rtw89_dev *rtwdev) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci u32 rck_d; 19462306a36Sopenharmony_ci u32 val; 19562306a36Sopenharmony_ci int ret; 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n"); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x1); 20062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x1); 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 20362306a36Sopenharmony_ci 1, 10000, false, 20462306a36Sopenharmony_ci rtwdev, R_DRCK_RES, B_DRCK_POL); 20562306a36Sopenharmony_ci if (ret) 20662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n"); 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x0); 20962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1); 21062306a36Sopenharmony_ci udelay(1); 21162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RES, 0x7c00); 21462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x0); 21562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_VAL, rck_d); 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0c4 = 0x%x\n", 21862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD)); 21962306a36Sopenharmony_ci} 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev) 22262306a36Sopenharmony_ci{ 22362306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0); 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0); 22862306a36Sopenharmony_ci dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1); 22962306a36Sopenharmony_ci} 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev) 23262306a36Sopenharmony_ci{ 23362306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL1, dack->addck_d[0][0]); 23662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL0, dack->addck_d[0][1]); 23762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x3); 23862306a36Sopenharmony_ci} 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 24362306a36Sopenharmony_ci u8 i; 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 24862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i); 24962306a36Sopenharmony_ci dack->msbk_d[0][0][i] = 25062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0); 25162306a36Sopenharmony_ci 25262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i); 25362306a36Sopenharmony_ci dack->msbk_d[0][1][i] = 25462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1); 25562306a36Sopenharmony_ci } 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci dack->biask_d[0][0] = 25862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00); 25962306a36Sopenharmony_ci dack->biask_d[0][1] = 26062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01); 26162306a36Sopenharmony_ci dack->dadck_d[0][0] = 26262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00) + 24; 26362306a36Sopenharmony_ci dack->dadck_d[0][1] = 26462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01) + 24; 26562306a36Sopenharmony_ci} 26662306a36Sopenharmony_ci 26762306a36Sopenharmony_cistatic void _dack_reload_by_path(struct rtw89_dev *rtwdev, 26862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 index) 26962306a36Sopenharmony_ci{ 27062306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 27162306a36Sopenharmony_ci u32 idx_offset, path_offset; 27262306a36Sopenharmony_ci u32 offset, reg; 27362306a36Sopenharmony_ci u32 tmp; 27462306a36Sopenharmony_ci u8 i; 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_ci if (index == 0) 27762306a36Sopenharmony_ci idx_offset = 0; 27862306a36Sopenharmony_ci else 27962306a36Sopenharmony_ci idx_offset = 0x14; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci if (path == RF_PATH_A) 28262306a36Sopenharmony_ci path_offset = 0; 28362306a36Sopenharmony_ci else 28462306a36Sopenharmony_ci path_offset = 0x28; 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci offset = idx_offset + path_offset; 28762306a36Sopenharmony_ci 28862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_RST, 0x1); 28962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_RST, 0x1); 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci /* msbk_d: 15/14/13/12 */ 29262306a36Sopenharmony_ci tmp = 0x0; 29362306a36Sopenharmony_ci for (i = 0; i < 4; i++) 29462306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 12] << (i * 8); 29562306a36Sopenharmony_ci reg = 0xc200 + offset; 29662306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, reg, tmp); 29762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg, 29862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD)); 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci /* msbk_d: 11/10/9/8 */ 30162306a36Sopenharmony_ci tmp = 0x0; 30262306a36Sopenharmony_ci for (i = 0; i < 4; i++) 30362306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 8] << (i * 8); 30462306a36Sopenharmony_ci reg = 0xc204 + offset; 30562306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, reg, tmp); 30662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg, 30762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD)); 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci /* msbk_d: 7/6/5/4 */ 31062306a36Sopenharmony_ci tmp = 0x0; 31162306a36Sopenharmony_ci for (i = 0; i < 4; i++) 31262306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 4] << (i * 8); 31362306a36Sopenharmony_ci reg = 0xc208 + offset; 31462306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, reg, tmp); 31562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg, 31662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD)); 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci /* msbk_d: 3/2/1/0 */ 31962306a36Sopenharmony_ci tmp = 0x0; 32062306a36Sopenharmony_ci for (i = 0; i < 4; i++) 32162306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i] << (i * 8); 32262306a36Sopenharmony_ci reg = 0xc20c + offset; 32362306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, reg, tmp); 32462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg, 32562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD)); 32662306a36Sopenharmony_ci 32762306a36Sopenharmony_ci /* dadak_d/biask_d */ 32862306a36Sopenharmony_ci tmp = 0x0; 32962306a36Sopenharmony_ci tmp = (dack->biask_d[path][index] << 22) | 33062306a36Sopenharmony_ci (dack->dadck_d[path][index] << 14); 33162306a36Sopenharmony_ci reg = 0xc210 + offset; 33262306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, reg, tmp); 33362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg, 33462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD)); 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL + offset, B_DACKN0_EN, 0x1); 33762306a36Sopenharmony_ci} 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_cistatic void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci u8 index; 34262306a36Sopenharmony_ci 34362306a36Sopenharmony_ci for (index = 0; index < 2; index++) 34462306a36Sopenharmony_ci _dack_reload_by_path(rtwdev, path, index); 34562306a36Sopenharmony_ci} 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 35062306a36Sopenharmony_ci u32 val; 35162306a36Sopenharmony_ci int ret; 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x1); 35462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x1); 35562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x0); 35662306a36Sopenharmony_ci udelay(1); 35762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 36062306a36Sopenharmony_ci 1, 10000, false, 36162306a36Sopenharmony_ci rtwdev, R_ADDCKR0, BIT(0)); 36262306a36Sopenharmony_ci if (ret) { 36362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); 36462306a36Sopenharmony_ci dack->addck_timeout[0] = true; 36562306a36Sopenharmony_ci } 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x0); 37062306a36Sopenharmony_ci} 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_cistatic void _new_dadck(struct rtw89_dev *rtwdev) 37362306a36Sopenharmony_ci{ 37462306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 37562306a36Sopenharmony_ci u32 i_dc, q_dc, ic, qc; 37662306a36Sopenharmony_ci u32 val; 37762306a36Sopenharmony_ci int ret; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_dadck_setup_defs_tbl); 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 38262306a36Sopenharmony_ci 1, 10000, false, 38362306a36Sopenharmony_ci rtwdev, R_ADDCKR0, BIT(0)); 38462306a36Sopenharmony_ci if (ret) { 38562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n"); 38662306a36Sopenharmony_ci dack->addck_timeout[0] = true; 38762306a36Sopenharmony_ci } 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DADCK ret = %d\n", ret); 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_IQ, 0x0); 39262306a36Sopenharmony_ci i_dc = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_DC); 39362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_IQ, 0x1); 39462306a36Sopenharmony_ci q_dc = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_DC); 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci ic = 0x80 - sign_extend32(i_dc, 11) * 6; 39762306a36Sopenharmony_ci qc = 0x80 - sign_extend32(q_dc, 11) * 6; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 40062306a36Sopenharmony_ci "[DACK]before DADCK, i_dc=0x%x, q_dc=0x%x\n", i_dc, q_dc); 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci dack->dadck_d[0][0] = ic; 40362306a36Sopenharmony_ci dack->dadck_d[0][1] = qc; 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL, B_DACKN0_V, dack->dadck_d[0][0]); 40662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACKN1_CTL, B_DACKN1_V, dack->dadck_d[0][1]); 40762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 40862306a36Sopenharmony_ci "[DACK]after DADCK, 0xc210=0x%x, 0xc224=0x%x\n", 40962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACKN0_CTL, MASKDWORD), 41062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACKN1_CTL, MASKDWORD)); 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_dadck_post_defs_tbl); 41362306a36Sopenharmony_ci} 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_cistatic bool _dack_s0_poll(struct rtw89_dev *rtwdev) 41662306a36Sopenharmony_ci{ 41762306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 || 41862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0 || 41962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 || 42062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0) 42162306a36Sopenharmony_ci return false; 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_ci return true; 42462306a36Sopenharmony_ci} 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev) 42762306a36Sopenharmony_ci{ 42862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 42962306a36Sopenharmony_ci bool done; 43062306a36Sopenharmony_ci int ret; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_dack_s0_1_defs_tbl); 43362306a36Sopenharmony_ci _dack_reset(rtwdev, RF_PATH_A); 43462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x1); 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_dack_s0_poll, done, done, 43762306a36Sopenharmony_ci 1, 10000, false, rtwdev); 43862306a36Sopenharmony_ci if (ret) { 43962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DACK timeout\n"); 44062306a36Sopenharmony_ci dack->msbk_timeout[0] = true; 44162306a36Sopenharmony_ci } 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_dack_s0_2_defs_tbl); 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n"); 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci _dack_backup_s0(rtwdev); 45062306a36Sopenharmony_ci _dack_reload(rtwdev, RF_PATH_A); 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 45362306a36Sopenharmony_ci} 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev) 45662306a36Sopenharmony_ci{ 45762306a36Sopenharmony_ci _dack_s0(rtwdev); 45862306a36Sopenharmony_ci} 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev) 46162306a36Sopenharmony_ci{ 46262306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 46362306a36Sopenharmony_ci u8 i; 46462306a36Sopenharmony_ci u8 t; 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", 46762306a36Sopenharmony_ci dack->addck_d[0][0], dack->addck_d[0][1]); 46862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", 46962306a36Sopenharmony_ci dack->dadck_d[0][0], dack->dadck_d[0][1]); 47062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", 47162306a36Sopenharmony_ci dack->biask_d[0][0], dack->biask_d[0][1]); 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); 47462306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 47562306a36Sopenharmony_ci t = dack->msbk_d[0][0][i]; 47662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 47762306a36Sopenharmony_ci } 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); 48062306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 48162306a36Sopenharmony_ci t = dack->msbk_d[0][1][i]; 48262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 48362306a36Sopenharmony_ci } 48462306a36Sopenharmony_ci} 48562306a36Sopenharmony_ci 48662306a36Sopenharmony_cistatic void _dack_manual_off(struct rtw89_dev *rtwdev) 48762306a36Sopenharmony_ci{ 48862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_dack_manual_off_defs_tbl); 48962306a36Sopenharmony_ci} 49062306a36Sopenharmony_ci 49162306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force) 49262306a36Sopenharmony_ci{ 49362306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 49462306a36Sopenharmony_ci u32 rf0_0; 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_ci dack->dack_done = false; 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x2\n"); 49962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); 50062306a36Sopenharmony_ci rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK); 50162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]RF0=0x%x\n", rf0_0); 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci _drck(rtwdev); 50462306a36Sopenharmony_ci _dack_manual_off(rtwdev); 50562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1); 50662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0); 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci _addck(rtwdev); 50962306a36Sopenharmony_ci _addck_backup(rtwdev); 51062306a36Sopenharmony_ci _addck_reload(rtwdev); 51162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x40001); 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci _dack(rtwdev); 51462306a36Sopenharmony_ci _new_dadck(rtwdev); 51562306a36Sopenharmony_ci _dack_dump(rtwdev); 51662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1); 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci dack->dack_done = true; 51962306a36Sopenharmony_ci dack->dack_cnt++; 52062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); 52162306a36Sopenharmony_ci} 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_cistatic void _rx_dck_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 52462306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_afe) 52562306a36Sopenharmony_ci{ 52662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 52962306a36Sopenharmony_ci "[RX_DCK] ==== S%d RX DCK (%s / CH%d / %s / by %s)====\n", path, 53062306a36Sopenharmony_ci chan->band_type == RTW89_BAND_2G ? "2G" : 53162306a36Sopenharmony_ci chan->band_type == RTW89_BAND_5G ? "5G" : "6G", 53262306a36Sopenharmony_ci chan->channel, 53362306a36Sopenharmony_ci chan->band_width == RTW89_CHANNEL_WIDTH_20 ? "20M" : 53462306a36Sopenharmony_ci chan->band_width == RTW89_CHANNEL_WIDTH_40 ? "40M" : "80M", 53562306a36Sopenharmony_ci is_afe ? "AFE" : "RFC"); 53662306a36Sopenharmony_ci} 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_cistatic void _rxbb_ofst_swap(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 rf_mode) 53962306a36Sopenharmony_ci{ 54062306a36Sopenharmony_ci u32 val, val_i, val_q; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci val_i = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_S1); 54362306a36Sopenharmony_ci val_q = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_S1); 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_ci val = val_q << 4 | val_i; 54662306a36Sopenharmony_ci 54762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_DIS, 0x1); 54862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, rf_mode); 54962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, val); 55062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_DIS, 0x0); 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 55362306a36Sopenharmony_ci "[RX_DCK] val_i = 0x%x, val_q = 0x%x, 0x3F = 0x%x\n", 55462306a36Sopenharmony_ci val_i, val_q, val); 55562306a36Sopenharmony_ci} 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 rf_mode) 55862306a36Sopenharmony_ci{ 55962306a36Sopenharmony_ci u32 val; 56062306a36Sopenharmony_ci int ret; 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 56362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 56662306a36Sopenharmony_ci 2, 2000, false, 56762306a36Sopenharmony_ci rtwdev, path, RR_DCK, BIT(8)); 56862306a36Sopenharmony_ci 56962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] S%d RXDCK finish (ret = %d)\n", 57262306a36Sopenharmony_ci path, ret); 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_ci _rxbb_ofst_swap(rtwdev, path, rf_mode); 57562306a36Sopenharmony_ci} 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe) 57862306a36Sopenharmony_ci{ 57962306a36Sopenharmony_ci u32 rf_reg5; 58062306a36Sopenharmony_ci u8 path; 58162306a36Sopenharmony_ci 58262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 58362306a36Sopenharmony_ci "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, Cv: %d) ******\n", 58462306a36Sopenharmony_ci 0x2, rtwdev->hal.cv); 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 58762306a36Sopenharmony_ci _rx_dck_info(rtwdev, phy, path, is_afe); 58862306a36Sopenharmony_ci 58962306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 59262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 59362306a36Sopenharmony_ci R_P0_TSSI_TRK + (path << 13), 59462306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x1); 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 59762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RF_RX); 59862306a36Sopenharmony_ci _set_rx_dck(rtwdev, path, RF_RX); 59962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 60262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 60362306a36Sopenharmony_ci R_P0_TSSI_TRK + (path << 13), 60462306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x0); 60562306a36Sopenharmony_ci } 60662306a36Sopenharmony_ci} 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_cistatic void _iqk_sram(struct rtw89_dev *rtwdev, u8 path) 60962306a36Sopenharmony_ci{ 61062306a36Sopenharmony_ci u32 i; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00020000); 61562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, MASKDWORD, 0x80000000); 61662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000080); 61762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000); 61862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci for (i = 0; i <= 0x9f; i++) { 62162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 62262306a36Sopenharmony_ci 0x00010000 + i); 62362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", 62462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI)); 62562306a36Sopenharmony_ci } 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ci for (i = 0; i <= 0x9f; i++) { 62862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 62962306a36Sopenharmony_ci 0x00010000 + i); 63062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", 63162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ)); 63262306a36Sopenharmony_ci } 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000000); 63562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00000000); 63662306a36Sopenharmony_ci} 63762306a36Sopenharmony_ci 63862306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) 63962306a36Sopenharmony_ci{ 64062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 64162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 64262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1); 64362306a36Sopenharmony_ci} 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path) 64662306a36Sopenharmony_ci{ 64762306a36Sopenharmony_ci bool fail1 = false, fail2 = false; 64862306a36Sopenharmony_ci u32 val; 64962306a36Sopenharmony_ci int ret; 65062306a36Sopenharmony_ci 65162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 65262306a36Sopenharmony_ci 10, 8200, false, 65362306a36Sopenharmony_ci rtwdev, 0xbff8, MASKBYTE0); 65462306a36Sopenharmony_ci if (ret) { 65562306a36Sopenharmony_ci fail1 = true; 65662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 65762306a36Sopenharmony_ci "[IQK]NCTL1 IQK timeout!!!\n"); 65862306a36Sopenharmony_ci } 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci fsleep(10); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, 66362306a36Sopenharmony_ci 10, 200, false, 66462306a36Sopenharmony_ci rtwdev, R_RPT_COM, B_RPT_COM_RDY); 66562306a36Sopenharmony_ci if (ret) { 66662306a36Sopenharmony_ci fail2 = true; 66762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 66862306a36Sopenharmony_ci "[IQK]NCTL2 IQK timeout!!!\n"); 66962306a36Sopenharmony_ci } 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_ci fsleep(10); 67262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 67362306a36Sopenharmony_ci 67462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 67562306a36Sopenharmony_ci "[IQK]S%x, ret = %d, notready = %x fail=%d,%d\n", 67662306a36Sopenharmony_ci path, ret, fail1 || fail2, fail1, fail2); 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci return fail1 || fail2; 67962306a36Sopenharmony_ci} 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 68262306a36Sopenharmony_ci u8 path, u8 ktype) 68362306a36Sopenharmony_ci{ 68462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 68562306a36Sopenharmony_ci bool notready; 68662306a36Sopenharmony_ci u32 iqk_cmd; 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci switch (ktype) { 68962306a36Sopenharmony_ci case ID_A_FLOK_COARSE: 69062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 69162306a36Sopenharmony_ci "[IQK]============ S%d ID_A_FLOK_COARSE ============\n", path); 69262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 69362306a36Sopenharmony_ci iqk_cmd = 0x108 | (1 << (4 + path)); 69462306a36Sopenharmony_ci break; 69562306a36Sopenharmony_ci case ID_G_FLOK_COARSE: 69662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 69762306a36Sopenharmony_ci "[IQK]============ S%d ID_G_FLOK_COARSE ============\n", path); 69862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 69962306a36Sopenharmony_ci iqk_cmd = 0x108 | (1 << (4 + path)); 70062306a36Sopenharmony_ci break; 70162306a36Sopenharmony_ci case ID_A_FLOK_FINE: 70262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 70362306a36Sopenharmony_ci "[IQK]============ S%d ID_A_FLOK_FINE ============\n", path); 70462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 70562306a36Sopenharmony_ci iqk_cmd = 0x308 | (1 << (4 + path)); 70662306a36Sopenharmony_ci break; 70762306a36Sopenharmony_ci case ID_G_FLOK_FINE: 70862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 70962306a36Sopenharmony_ci "[IQK]============ S%d ID_G_FLOK_FINE ============\n", path); 71062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 71162306a36Sopenharmony_ci iqk_cmd = 0x308 | (1 << (4 + path)); 71262306a36Sopenharmony_ci break; 71362306a36Sopenharmony_ci case ID_TXK: 71462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 71562306a36Sopenharmony_ci "[IQK]============ S%d ID_TXK ============\n", path); 71662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0); 71762306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 71862306a36Sopenharmony_ci (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8); 71962306a36Sopenharmony_ci break; 72062306a36Sopenharmony_ci case ID_RXAGC: 72162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 72262306a36Sopenharmony_ci "[IQK]============ S%d ID_RXAGC ============\n", path); 72362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 72462306a36Sopenharmony_ci iqk_cmd = 0x708 | (1 << (4 + path)) | (path << 1); 72562306a36Sopenharmony_ci break; 72662306a36Sopenharmony_ci case ID_RXK: 72762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 72862306a36Sopenharmony_ci "[IQK]============ S%d ID_RXK ============\n", path); 72962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 73062306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 73162306a36Sopenharmony_ci (((0xc + iqk_info->iqk_bw[path]) & 0xf) << 8); 73262306a36Sopenharmony_ci break; 73362306a36Sopenharmony_ci case ID_NBTXK: 73462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 73562306a36Sopenharmony_ci "[IQK]============ S%d ID_NBTXK ============\n", path); 73662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0); 73762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 73862306a36Sopenharmony_ci 0x00b); 73962306a36Sopenharmony_ci iqk_cmd = 0x408 | (1 << (4 + path)); 74062306a36Sopenharmony_ci break; 74162306a36Sopenharmony_ci case ID_NBRXK: 74262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 74362306a36Sopenharmony_ci "[IQK]============ S%d ID_NBRXK ============\n", path); 74462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 74562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 74662306a36Sopenharmony_ci 0x011); 74762306a36Sopenharmony_ci iqk_cmd = 0x608 | (1 << (4 + path)); 74862306a36Sopenharmony_ci break; 74962306a36Sopenharmony_ci default: 75062306a36Sopenharmony_ci return false; 75162306a36Sopenharmony_ci } 75262306a36Sopenharmony_ci 75362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); 75462306a36Sopenharmony_ci notready = _iqk_check_cal(rtwdev, path); 75562306a36Sopenharmony_ci if (iqk_info->iqk_sram_en && 75662306a36Sopenharmony_ci (ktype == ID_NBRXK || ktype == ID_RXK)) 75762306a36Sopenharmony_ci _iqk_sram(rtwdev, path); 75862306a36Sopenharmony_ci 75962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0); 76062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 76162306a36Sopenharmony_ci "[IQK]S%x, ktype= %x, id = %x, notready = %x\n", 76262306a36Sopenharmony_ci path, ktype, iqk_cmd + 1, notready); 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci return notready; 76562306a36Sopenharmony_ci} 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_cistatic bool _rxk_2g_group_sel(struct rtw89_dev *rtwdev, 76862306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 76962306a36Sopenharmony_ci{ 77062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 77162306a36Sopenharmony_ci bool kfail = false; 77262306a36Sopenharmony_ci bool notready; 77362306a36Sopenharmony_ci u32 rf_0; 77462306a36Sopenharmony_ci u8 gp; 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 77762306a36Sopenharmony_ci 77862306a36Sopenharmony_ci for (gp = 0; gp < RTW8851B_RXK_GROUP_NR; gp++) { 77962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp); 78062306a36Sopenharmony_ci 78162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]); 78262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2, g_idxattc2[gp]); 78362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 78462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0); 78562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp); 78662306a36Sopenharmony_ci 78762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 78862306a36Sopenharmony_ci fsleep(10); 78962306a36Sopenharmony_ci rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 79062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0); 79162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]); 79262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 79762306a36Sopenharmony_ci "[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path, 79862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD), 79962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0)); 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 80262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 80362306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 80462306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 80562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2; 80662306a36Sopenharmony_ci 80762306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 81062306a36Sopenharmony_ci "[IQK]S%x, WBRXK 0x8008 = 0x%x\n", path, 81162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 81262306a36Sopenharmony_ci } 81362306a36Sopenharmony_ci 81462306a36Sopenharmony_ci if (!notready) 81562306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 81662306a36Sopenharmony_ci 81762306a36Sopenharmony_ci if (kfail) 81862306a36Sopenharmony_ci _iqk_sram(rtwdev, path); 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci if (kfail) { 82162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 82262306a36Sopenharmony_ci MASKDWORD, iqk_info->nb_rxcfir[path] | 0x2); 82362306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 82462306a36Sopenharmony_ci } else { 82562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 82662306a36Sopenharmony_ci MASKDWORD, 0x40000000); 82762306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 82862306a36Sopenharmony_ci } 82962306a36Sopenharmony_ci 83062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 83162306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail, 83262306a36Sopenharmony_ci 1 << path, iqk_info->nb_rxcfir[path]); 83362306a36Sopenharmony_ci return kfail; 83462306a36Sopenharmony_ci} 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_cistatic bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev, 83762306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 83862306a36Sopenharmony_ci{ 83962306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 84062306a36Sopenharmony_ci bool kfail = false; 84162306a36Sopenharmony_ci bool notready; 84262306a36Sopenharmony_ci u32 rf_0; 84362306a36Sopenharmony_ci u8 idx; 84462306a36Sopenharmony_ci u8 gp; 84562306a36Sopenharmony_ci 84662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci for (idx = 0; idx < RTW8851B_RXK_GROUP_IDX_NR; idx++) { 84962306a36Sopenharmony_ci gp = _rxk_5ghz_group_from_idx(idx); 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp); 85262306a36Sopenharmony_ci 85362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_RGM, a_idxrxgain[idx]); 85462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, RR_RXA2_ATT, a_idxattc2[idx]); 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 85762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0); 85862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp); 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 86162306a36Sopenharmony_ci fsleep(100); 86262306a36Sopenharmony_ci rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 86362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0); 86462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[idx]); 86562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 86662306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 86762306a36Sopenharmony_ci 86862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 86962306a36Sopenharmony_ci "[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path, 87062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD), 87162306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB)); 87262306a36Sopenharmony_ci 87362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 87462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 87562306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 87662306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 87762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2; 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 88062306a36Sopenharmony_ci "[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path, 88162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 88662306a36Sopenharmony_ci "[IQK]S%x, WBRXK 0x8008 = 0x%x\n", path, 88762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 88862306a36Sopenharmony_ci } 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_ci if (!notready) 89162306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 89262306a36Sopenharmony_ci 89362306a36Sopenharmony_ci if (kfail) 89462306a36Sopenharmony_ci _iqk_sram(rtwdev, path); 89562306a36Sopenharmony_ci 89662306a36Sopenharmony_ci if (kfail) { 89762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 89862306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] | 0x2); 89962306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 90062306a36Sopenharmony_ci } else { 90162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 90262306a36Sopenharmony_ci 0x40000000); 90362306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 90462306a36Sopenharmony_ci } 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 90762306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail, 90862306a36Sopenharmony_ci 1 << path, iqk_info->nb_rxcfir[path]); 90962306a36Sopenharmony_ci return kfail; 91062306a36Sopenharmony_ci} 91162306a36Sopenharmony_ci 91262306a36Sopenharmony_cistatic bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 91362306a36Sopenharmony_ci u8 path) 91462306a36Sopenharmony_ci{ 91562306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 91662306a36Sopenharmony_ci bool kfail = false; 91762306a36Sopenharmony_ci bool notready; 91862306a36Sopenharmony_ci u8 idx = 0x1; 91962306a36Sopenharmony_ci u32 rf_0; 92062306a36Sopenharmony_ci u8 gp; 92162306a36Sopenharmony_ci 92262306a36Sopenharmony_ci gp = _rxk_5ghz_group_from_idx(idx); 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 92562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp); 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_RGM, a_idxrxgain[idx]); 92862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, RR_RXA2_ATT, a_idxattc2[idx]); 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 93162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0); 93262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp); 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 93562306a36Sopenharmony_ci fsleep(100); 93662306a36Sopenharmony_ci rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 93762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0); 93862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[idx]); 93962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 94062306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 94362306a36Sopenharmony_ci "[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path, 94462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD), 94562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0)); 94662306a36Sopenharmony_ci 94762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 94862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 94962306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 95062306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 95162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 95462306a36Sopenharmony_ci "[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path, 95562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 95662306a36Sopenharmony_ci 95762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, WBRXK 0x8008 = 0x%x\n", 95862306a36Sopenharmony_ci path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_ci if (!notready) 96162306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci if (kfail) { 96462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 96562306a36Sopenharmony_ci MASKDWORD, 0x40000002); 96662306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 96762306a36Sopenharmony_ci } else { 96862306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 96962306a36Sopenharmony_ci } 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 97262306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail, 97362306a36Sopenharmony_ci 1 << path, iqk_info->nb_rxcfir[path]); 97462306a36Sopenharmony_ci 97562306a36Sopenharmony_ci return kfail; 97662306a36Sopenharmony_ci} 97762306a36Sopenharmony_ci 97862306a36Sopenharmony_cistatic bool _iqk_2g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 97962306a36Sopenharmony_ci u8 path) 98062306a36Sopenharmony_ci{ 98162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 98262306a36Sopenharmony_ci bool kfail = false; 98362306a36Sopenharmony_ci bool notready; 98462306a36Sopenharmony_ci u8 gp = 0x3; 98562306a36Sopenharmony_ci u32 rf_0; 98662306a36Sopenharmony_ci 98762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 98862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp); 98962306a36Sopenharmony_ci 99062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]); 99162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2, g_idxattc2[gp]); 99262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 99362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0); 99462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013); 99762306a36Sopenharmony_ci fsleep(10); 99862306a36Sopenharmony_ci rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 99962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0); 100062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]); 100162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 100262306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC); 100362306a36Sopenharmony_ci 100462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 100562306a36Sopenharmony_ci "[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", 100662306a36Sopenharmony_ci path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD), 100762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0)); 100862306a36Sopenharmony_ci 100962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 101062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 101162306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 101262306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 101362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2; 101462306a36Sopenharmony_ci 101562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 101662306a36Sopenharmony_ci "[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path, 101762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, WBRXK 0x8008 = 0x%x\n", 102062306a36Sopenharmony_ci path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD)); 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_ci if (!notready) 102362306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 102462306a36Sopenharmony_ci 102562306a36Sopenharmony_ci if (kfail) { 102662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 102762306a36Sopenharmony_ci MASKDWORD, 0x40000002); 102862306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 102962306a36Sopenharmony_ci } else { 103062306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 103162306a36Sopenharmony_ci } 103262306a36Sopenharmony_ci 103362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 103462306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail, 103562306a36Sopenharmony_ci 1 << path, iqk_info->nb_rxcfir[path]); 103662306a36Sopenharmony_ci return kfail; 103762306a36Sopenharmony_ci} 103862306a36Sopenharmony_ci 103962306a36Sopenharmony_cistatic void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path) 104062306a36Sopenharmony_ci{ 104162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_ci if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) 104662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_rxclk_80_defs_tbl); 104762306a36Sopenharmony_ci else 104862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_rxclk_others_defs_tbl); 104962306a36Sopenharmony_ci} 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_cistatic bool _txk_5g_group_sel(struct rtw89_dev *rtwdev, 105262306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 105362306a36Sopenharmony_ci{ 105462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 105562306a36Sopenharmony_ci bool kfail = false; 105662306a36Sopenharmony_ci bool notready; 105762306a36Sopenharmony_ci u8 gp; 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 106062306a36Sopenharmony_ci 106162306a36Sopenharmony_ci for (gp = 0x0; gp < RTW8851B_TXK_GROUP_NR; gp++) { 106262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]); 106362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]); 106462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]); 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 106762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1); 106862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0); 106962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp); 107062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 107162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, a_itqt[gp]); 107262306a36Sopenharmony_ci 107362306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 107462306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 107562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2; 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 107862306a36Sopenharmony_ci MASKDWORD, a_itqt[gp]); 107962306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 108062306a36Sopenharmony_ci } 108162306a36Sopenharmony_ci 108262306a36Sopenharmony_ci if (!notready) 108362306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci if (kfail) { 108662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 108762306a36Sopenharmony_ci MASKDWORD, iqk_info->nb_txcfir[path] | 0x2); 108862306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 108962306a36Sopenharmony_ci } else { 109062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 109162306a36Sopenharmony_ci MASKDWORD, 0x40000000); 109262306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 109362306a36Sopenharmony_ci } 109462306a36Sopenharmony_ci 109562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 109662306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail, 109762306a36Sopenharmony_ci 1 << path, iqk_info->nb_txcfir[path]); 109862306a36Sopenharmony_ci return kfail; 109962306a36Sopenharmony_ci} 110062306a36Sopenharmony_ci 110162306a36Sopenharmony_cistatic bool _txk_2g_group_sel(struct rtw89_dev *rtwdev, 110262306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 110362306a36Sopenharmony_ci{ 110462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 110562306a36Sopenharmony_ci bool kfail = false; 110662306a36Sopenharmony_ci bool notready; 110762306a36Sopenharmony_ci u8 gp; 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 111062306a36Sopenharmony_ci 111162306a36Sopenharmony_ci for (gp = 0x0; gp < RTW8851B_TXK_GROUP_NR; gp++) { 111262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, g_power_range[gp]); 111362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, g_track_range[gp]); 111462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, g_gain_bb[gp]); 111562306a36Sopenharmony_ci 111662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, g_itqt[gp]); 111762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 111862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1); 111962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0); 112062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp); 112162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 112262306a36Sopenharmony_ci 112362306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 112462306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 112562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2; 112662306a36Sopenharmony_ci 112762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 112862306a36Sopenharmony_ci MASKDWORD, g_itqt[gp]); 112962306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 113062306a36Sopenharmony_ci } 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_ci if (!notready) 113362306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 113462306a36Sopenharmony_ci 113562306a36Sopenharmony_ci if (kfail) { 113662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 113762306a36Sopenharmony_ci MASKDWORD, iqk_info->nb_txcfir[path] | 0x2); 113862306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 113962306a36Sopenharmony_ci } else { 114062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 114162306a36Sopenharmony_ci MASKDWORD, 0x40000000); 114262306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 114362306a36Sopenharmony_ci } 114462306a36Sopenharmony_ci 114562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 114662306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail, 114762306a36Sopenharmony_ci 1 << path, iqk_info->nb_txcfir[path]); 114862306a36Sopenharmony_ci return kfail; 114962306a36Sopenharmony_ci} 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_cistatic bool _iqk_5g_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 115262306a36Sopenharmony_ci u8 path) 115362306a36Sopenharmony_ci{ 115462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 115562306a36Sopenharmony_ci bool kfail = false; 115662306a36Sopenharmony_ci bool notready; 115762306a36Sopenharmony_ci u8 gp; 115862306a36Sopenharmony_ci 115962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_ci for (gp = 0x0; gp < RTW8851B_TXK_GROUP_NR; gp++) { 116262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]); 116362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]); 116462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]); 116562306a36Sopenharmony_ci 116662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 116762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1); 116862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0); 116962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp); 117062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 117162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, a_itqt[gp]); 117262306a36Sopenharmony_ci 117362306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 117462306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 117562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2; 117662306a36Sopenharmony_ci } 117762306a36Sopenharmony_ci 117862306a36Sopenharmony_ci if (!notready) 117962306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_ci if (kfail) { 118262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 118362306a36Sopenharmony_ci MASKDWORD, 0x40000002); 118462306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 118562306a36Sopenharmony_ci } else { 118662306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 118762306a36Sopenharmony_ci } 118862306a36Sopenharmony_ci 118962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 119062306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail, 119162306a36Sopenharmony_ci 1 << path, iqk_info->nb_txcfir[path]); 119262306a36Sopenharmony_ci return kfail; 119362306a36Sopenharmony_ci} 119462306a36Sopenharmony_ci 119562306a36Sopenharmony_cistatic bool _iqk_2g_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 119662306a36Sopenharmony_ci u8 path) 119762306a36Sopenharmony_ci{ 119862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 119962306a36Sopenharmony_ci bool kfail = false; 120062306a36Sopenharmony_ci bool notready; 120162306a36Sopenharmony_ci u8 gp; 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 120462306a36Sopenharmony_ci 120562306a36Sopenharmony_ci for (gp = 0x0; gp < RTW8851B_TXK_GROUP_NR; gp++) { 120662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, g_power_range[gp]); 120762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, g_track_range[gp]); 120862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, g_gain_bb[gp]); 120962306a36Sopenharmony_ci 121062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, g_itqt[gp]); 121162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1); 121262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1); 121362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0); 121462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp); 121562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 121662306a36Sopenharmony_ci 121762306a36Sopenharmony_ci notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 121862306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 121962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), 122062306a36Sopenharmony_ci MASKDWORD) | 0x2; 122162306a36Sopenharmony_ci } 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_ci if (!notready) 122462306a36Sopenharmony_ci kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG); 122562306a36Sopenharmony_ci 122662306a36Sopenharmony_ci if (kfail) { 122762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), 122862306a36Sopenharmony_ci MASKDWORD, 0x40000002); 122962306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 123062306a36Sopenharmony_ci } else { 123162306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 123262306a36Sopenharmony_ci } 123362306a36Sopenharmony_ci 123462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 123562306a36Sopenharmony_ci "[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail, 123662306a36Sopenharmony_ci 1 << path, iqk_info->nb_txcfir[path]); 123762306a36Sopenharmony_ci return kfail; 123862306a36Sopenharmony_ci} 123962306a36Sopenharmony_ci 124062306a36Sopenharmony_cistatic bool _iqk_2g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 124162306a36Sopenharmony_ci u8 path) 124262306a36Sopenharmony_ci{ 124362306a36Sopenharmony_ci static const u32 g_txbb[RTW8851B_LOK_GRAM] = { 124462306a36Sopenharmony_ci 0x02, 0x06, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17}; 124562306a36Sopenharmony_ci static const u32 g_itqt[RTW8851B_LOK_GRAM] = { 124662306a36Sopenharmony_ci 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x12, 0x12, 0x12, 0x1b}; 124762306a36Sopenharmony_ci static const u32 g_wa[RTW8851B_LOK_GRAM] = { 124862306a36Sopenharmony_ci 0x00, 0x04, 0x08, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17}; 124962306a36Sopenharmony_ci bool fail = false; 125062306a36Sopenharmony_ci u8 i; 125162306a36Sopenharmony_ci 125262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_LOK, 0x0); 125562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR0, 0x0); 125662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR1, 0x6); 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_ci for (i = 0; i < RTW8851B_LOK_GRAM; i++) { 125962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_TG, g_txbb[i]); 126062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RR_LUTWA_M1, g_wa[i]); 126162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 126262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, g_itqt[i]); 126362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 126462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 126562306a36Sopenharmony_ci 0x00000109 | (1 << (4 + path))); 126662306a36Sopenharmony_ci fail |= _iqk_check_cal(rtwdev, path); 126762306a36Sopenharmony_ci 126862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 126962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, g_itqt[i]); 127062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 127162306a36Sopenharmony_ci 0x00000309 | (1 << (4 + path))); 127262306a36Sopenharmony_ci fail |= _iqk_check_cal(rtwdev, path); 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 127562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0); 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 127862306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x8[19:15] = 0x%x,0x8[09:05] = 0x%x\n", i, 127962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0xf8000), 128062306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0x003e0)); 128162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 128262306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x9[19:16] = 0x%x,0x9[09:06] = 0x%x\n", i, 128362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0xf0000), 128462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0x003c0)); 128562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 128662306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x58 = %x\n", i, 128762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_TXMO, RFREG_MASK)); 128862306a36Sopenharmony_ci } 128962306a36Sopenharmony_ci 129062306a36Sopenharmony_ci return fail; 129162306a36Sopenharmony_ci} 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_cistatic bool _iqk_5g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 129462306a36Sopenharmony_ci u8 path) 129562306a36Sopenharmony_ci{ 129662306a36Sopenharmony_ci static const u32 a_txbb[RTW8851B_LOK_GRAM] = { 129762306a36Sopenharmony_ci 0x02, 0x06, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17}; 129862306a36Sopenharmony_ci static const u32 a_itqt[RTW8851B_LOK_GRAM] = { 129962306a36Sopenharmony_ci 0x09, 0x09, 0x09, 0x12, 0x12, 0x12, 0x1b, 0x1b, 0x1b, 0x1b}; 130062306a36Sopenharmony_ci static const u32 a_wa[RTW8851B_LOK_GRAM] = { 130162306a36Sopenharmony_ci 0x80, 0x84, 0x88, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x97}; 130262306a36Sopenharmony_ci bool fail = false; 130362306a36Sopenharmony_ci u8 i; 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 130662306a36Sopenharmony_ci 130762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_LOK, 0x0); 130862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR0, 0x0); 130962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR1, 0x7); 131062306a36Sopenharmony_ci 131162306a36Sopenharmony_ci for (i = 0; i < RTW8851B_LOK_GRAM; i++) { 131262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_TG, a_txbb[i]); 131362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RR_LUTWA_M1, a_wa[i]); 131462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1); 131562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, a_itqt[i]); 131662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 131762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 131862306a36Sopenharmony_ci 0x00000109 | (1 << (4 + path))); 131962306a36Sopenharmony_ci fail |= _iqk_check_cal(rtwdev, path); 132062306a36Sopenharmony_ci 132162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 132262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, a_itqt[i]); 132362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021); 132462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 132562306a36Sopenharmony_ci 0x00000309 | (1 << (4 + path))); 132662306a36Sopenharmony_ci fail |= _iqk_check_cal(rtwdev, path); 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 132962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0); 133062306a36Sopenharmony_ci 133162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 133262306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x8[19:15] = 0x%x,0x8[09:05] = 0x%x\n", i, 133362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0xf8000), 133462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0x003e0)); 133562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 133662306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x9[19:16] = 0x%x,0x9[09:06] = 0x%x\n", i, 133762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0xf0000), 133862306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0x003c0)); 133962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 134062306a36Sopenharmony_ci "[IQK]S0, i = %x, 0x58 = %x\n", i, 134162306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_TXMO, RFREG_MASK)); 134262306a36Sopenharmony_ci } 134362306a36Sopenharmony_ci 134462306a36Sopenharmony_ci return fail; 134562306a36Sopenharmony_ci} 134662306a36Sopenharmony_ci 134762306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) 134862306a36Sopenharmony_ci{ 134962306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 135262306a36Sopenharmony_ci case RTW89_BAND_2G: 135362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RTW89_BAND_2G\n"); 135462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_txk_2ghz_defs_tbl); 135562306a36Sopenharmony_ci break; 135662306a36Sopenharmony_ci case RTW89_BAND_5G: 135762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RTW89_BAND_5G\n"); 135862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_txk_5ghz_defs_tbl); 135962306a36Sopenharmony_ci break; 136062306a36Sopenharmony_ci default: 136162306a36Sopenharmony_ci break; 136262306a36Sopenharmony_ci } 136362306a36Sopenharmony_ci} 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci#define IQK_LOK_RETRY 1 136662306a36Sopenharmony_ci 136762306a36Sopenharmony_cistatic void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 136862306a36Sopenharmony_ci u8 path) 136962306a36Sopenharmony_ci{ 137062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 137162306a36Sopenharmony_ci bool lok_is_fail; 137262306a36Sopenharmony_ci u8 i; 137362306a36Sopenharmony_ci 137462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci for (i = 0; i < IQK_LOK_RETRY; i++) { 137762306a36Sopenharmony_ci _iqk_txk_setting(rtwdev, path); 137862306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 137962306a36Sopenharmony_ci lok_is_fail = _iqk_2g_lok(rtwdev, phy_idx, path); 138062306a36Sopenharmony_ci else 138162306a36Sopenharmony_ci lok_is_fail = _iqk_5g_lok(rtwdev, phy_idx, path); 138262306a36Sopenharmony_ci 138362306a36Sopenharmony_ci if (!lok_is_fail) 138462306a36Sopenharmony_ci break; 138562306a36Sopenharmony_ci } 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_ci if (iqk_info->is_nbiqk) { 138862306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 138962306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = 139062306a36Sopenharmony_ci _iqk_2g_nbtxk(rtwdev, phy_idx, path); 139162306a36Sopenharmony_ci else 139262306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = 139362306a36Sopenharmony_ci _iqk_5g_nbtxk(rtwdev, phy_idx, path); 139462306a36Sopenharmony_ci } else { 139562306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 139662306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = 139762306a36Sopenharmony_ci _txk_2g_group_sel(rtwdev, phy_idx, path); 139862306a36Sopenharmony_ci else 139962306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = 140062306a36Sopenharmony_ci _txk_5g_group_sel(rtwdev, phy_idx, path); 140162306a36Sopenharmony_ci } 140262306a36Sopenharmony_ci 140362306a36Sopenharmony_ci _iqk_rxclk_setting(rtwdev, path); 140462306a36Sopenharmony_ci _iqk_rxk_setting(rtwdev, path); 140562306a36Sopenharmony_ci _adc_fifo_rst(rtwdev, phy_idx, path); 140662306a36Sopenharmony_ci 140762306a36Sopenharmony_ci if (iqk_info->is_nbiqk) { 140862306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 140962306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = 141062306a36Sopenharmony_ci _iqk_2g_nbrxk(rtwdev, phy_idx, path); 141162306a36Sopenharmony_ci else 141262306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = 141362306a36Sopenharmony_ci _iqk_5g_nbrxk(rtwdev, phy_idx, path); 141462306a36Sopenharmony_ci } else { 141562306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 141662306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = 141762306a36Sopenharmony_ci _rxk_2g_group_sel(rtwdev, phy_idx, path); 141862306a36Sopenharmony_ci else 141962306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = 142062306a36Sopenharmony_ci _rxk_5g_group_sel(rtwdev, phy_idx, path); 142162306a36Sopenharmony_ci } 142262306a36Sopenharmony_ci} 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, 142562306a36Sopenharmony_ci u32 backup_bb_reg_val[]) 142662306a36Sopenharmony_ci{ 142762306a36Sopenharmony_ci u32 i; 142862306a36Sopenharmony_ci 142962306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 143062306a36Sopenharmony_ci backup_bb_reg_val[i] = 143162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, rtw8851b_backup_bb_regs[i], 143262306a36Sopenharmony_ci MASKDWORD); 143362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 143462306a36Sopenharmony_ci "[RFK]backup bb reg : %x, value =%x\n", 143562306a36Sopenharmony_ci rtw8851b_backup_bb_regs[i], backup_bb_reg_val[i]); 143662306a36Sopenharmony_ci } 143762306a36Sopenharmony_ci} 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, 144062306a36Sopenharmony_ci u32 backup_rf_reg_val[], u8 rf_path) 144162306a36Sopenharmony_ci{ 144262306a36Sopenharmony_ci u32 i; 144362306a36Sopenharmony_ci 144462306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 144562306a36Sopenharmony_ci backup_rf_reg_val[i] = 144662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, rf_path, 144762306a36Sopenharmony_ci rtw8851b_backup_rf_regs[i], RFREG_MASK); 144862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 144962306a36Sopenharmony_ci "[RFK]backup rf S%d reg : %x, value =%x\n", rf_path, 145062306a36Sopenharmony_ci rtw8851b_backup_rf_regs[i], backup_rf_reg_val[i]); 145162306a36Sopenharmony_ci } 145262306a36Sopenharmony_ci} 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev, 145562306a36Sopenharmony_ci const u32 backup_bb_reg_val[]) 145662306a36Sopenharmony_ci{ 145762306a36Sopenharmony_ci u32 i; 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 146062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, rtw8851b_backup_bb_regs[i], 146162306a36Sopenharmony_ci MASKDWORD, backup_bb_reg_val[i]); 146262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 146362306a36Sopenharmony_ci "[RFK]restore bb reg : %x, value =%x\n", 146462306a36Sopenharmony_ci rtw8851b_backup_bb_regs[i], backup_bb_reg_val[i]); 146562306a36Sopenharmony_ci } 146662306a36Sopenharmony_ci} 146762306a36Sopenharmony_ci 146862306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev, 146962306a36Sopenharmony_ci const u32 backup_rf_reg_val[], u8 rf_path) 147062306a36Sopenharmony_ci{ 147162306a36Sopenharmony_ci u32 i; 147262306a36Sopenharmony_ci 147362306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 147462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, rf_path, rtw8851b_backup_rf_regs[i], 147562306a36Sopenharmony_ci RFREG_MASK, backup_rf_reg_val[i]); 147662306a36Sopenharmony_ci 147762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 147862306a36Sopenharmony_ci "[RFK]restore rf S%d reg: %x, value =%x\n", rf_path, 147962306a36Sopenharmony_ci rtw8851b_backup_rf_regs[i], backup_rf_reg_val[i]); 148062306a36Sopenharmony_ci } 148162306a36Sopenharmony_ci} 148262306a36Sopenharmony_ci 148362306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 148462306a36Sopenharmony_ci u8 path) 148562306a36Sopenharmony_ci{ 148662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 148762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 148862306a36Sopenharmony_ci u8 idx = 0; 148962306a36Sopenharmony_ci 149062306a36Sopenharmony_ci iqk_info->iqk_band[path] = chan->band_type; 149162306a36Sopenharmony_ci iqk_info->iqk_bw[path] = chan->band_width; 149262306a36Sopenharmony_ci iqk_info->iqk_ch[path] = chan->channel; 149362306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = idx; 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d (PHY%d): / DBCC %s/ %s/ CH%d/ %s\n", 149662306a36Sopenharmony_ci path, phy, rtwdev->dbcc_en ? "on" : "off", 149762306a36Sopenharmony_ci iqk_info->iqk_band[path] == 0 ? "2G" : 149862306a36Sopenharmony_ci iqk_info->iqk_band[path] == 1 ? "5G" : "6G", 149962306a36Sopenharmony_ci iqk_info->iqk_ch[path], 150062306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 0 ? "20M" : 150162306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 1 ? "40M" : "80M"); 150262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n", 150362306a36Sopenharmony_ci iqk_info->iqk_times, idx); 150462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, iqk_info->syn1to2= 0x%x\n", 150562306a36Sopenharmony_ci path, iqk_info->syn1to2); 150662306a36Sopenharmony_ci} 150762306a36Sopenharmony_ci 150862306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 150962306a36Sopenharmony_ci u8 path) 151062306a36Sopenharmony_ci{ 151162306a36Sopenharmony_ci _iqk_by_path(rtwdev, phy_idx, path); 151262306a36Sopenharmony_ci} 151362306a36Sopenharmony_ci 151462306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) 151562306a36Sopenharmony_ci{ 151662306a36Sopenharmony_ci bool fail; 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 151962306a36Sopenharmony_ci 152062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00001219); 152162306a36Sopenharmony_ci fsleep(10); 152262306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path); 152362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] restore fail=%d\n", fail); 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RR_LUTWE_LOK, 0x0); 152662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_TIA, 0x0); 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 152962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 153062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 153162306a36Sopenharmony_ci} 153262306a36Sopenharmony_ci 153362306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev, 153462306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 153562306a36Sopenharmony_ci{ 153662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_afebb_restore_defs_tbl); 153762306a36Sopenharmony_ci} 153862306a36Sopenharmony_ci 153962306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) 154062306a36Sopenharmony_ci{ 154162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 154262306a36Sopenharmony_ci 154362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 154462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 154562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); 154662306a36Sopenharmony_ci} 154762306a36Sopenharmony_ci 154862306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev, 154962306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 155062306a36Sopenharmony_ci{ 155162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 155262306a36Sopenharmony_ci 155362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_macbb_defs_tbl); 155462306a36Sopenharmony_ci} 155562306a36Sopenharmony_ci 155662306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev) 155762306a36Sopenharmony_ci{ 155862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 155962306a36Sopenharmony_ci u8 idx, path; 156062306a36Sopenharmony_ci 156162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, MASKDWORD, 0x0); 156262306a36Sopenharmony_ci 156362306a36Sopenharmony_ci if (iqk_info->is_iqk_init) 156462306a36Sopenharmony_ci return; 156562306a36Sopenharmony_ci 156662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 156762306a36Sopenharmony_ci 156862306a36Sopenharmony_ci iqk_info->is_iqk_init = true; 156962306a36Sopenharmony_ci iqk_info->is_nbiqk = false; 157062306a36Sopenharmony_ci iqk_info->iqk_fft_en = false; 157162306a36Sopenharmony_ci iqk_info->iqk_sram_en = false; 157262306a36Sopenharmony_ci iqk_info->iqk_cfir_en = false; 157362306a36Sopenharmony_ci iqk_info->iqk_xym_en = false; 157462306a36Sopenharmony_ci iqk_info->iqk_times = 0x0; 157562306a36Sopenharmony_ci 157662306a36Sopenharmony_ci for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 157762306a36Sopenharmony_ci iqk_info->iqk_channel[idx] = 0x0; 157862306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 157962306a36Sopenharmony_ci iqk_info->lok_cor_fail[idx][path] = false; 158062306a36Sopenharmony_ci iqk_info->lok_fin_fail[idx][path] = false; 158162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[idx][path] = false; 158262306a36Sopenharmony_ci iqk_info->iqk_rx_fail[idx][path] = false; 158362306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = 0x0; 158462306a36Sopenharmony_ci } 158562306a36Sopenharmony_ci } 158662306a36Sopenharmony_ci} 158762306a36Sopenharmony_ci 158862306a36Sopenharmony_cistatic void _doiqk(struct rtw89_dev *rtwdev, bool force, 158962306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 159062306a36Sopenharmony_ci{ 159162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 159262306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); 159362306a36Sopenharmony_ci u32 backup_rf_val[RTW8851B_IQK_SS][BACKUP_RF_REGS_NR]; 159462306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, 159762306a36Sopenharmony_ci BTC_WRFK_ONESHOT_START); 159862306a36Sopenharmony_ci 159962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 160062306a36Sopenharmony_ci "[IQK]==========IQK start!!!!!==========\n"); 160162306a36Sopenharmony_ci iqk_info->iqk_times++; 160262306a36Sopenharmony_ci iqk_info->version = RTW8851B_IQK_VER; 160362306a36Sopenharmony_ci 160462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); 160562306a36Sopenharmony_ci _iqk_get_ch_info(rtwdev, phy_idx, path); 160662306a36Sopenharmony_ci 160762306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); 160862306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); 160962306a36Sopenharmony_ci _iqk_macbb_setting(rtwdev, phy_idx, path); 161062306a36Sopenharmony_ci _iqk_preset(rtwdev, path); 161162306a36Sopenharmony_ci _iqk_start_iqk(rtwdev, phy_idx, path); 161262306a36Sopenharmony_ci _iqk_restore(rtwdev, path); 161362306a36Sopenharmony_ci _iqk_afebb_restore(rtwdev, phy_idx, path); 161462306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); 161562306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, 161862306a36Sopenharmony_ci BTC_WRFK_ONESHOT_STOP); 161962306a36Sopenharmony_ci} 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) 162262306a36Sopenharmony_ci{ 162362306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 162462306a36Sopenharmony_ci} 162562306a36Sopenharmony_ci 162662306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 *reg, 162762306a36Sopenharmony_ci u32 reg_bkup[][DPK_KIP_REG_NUM_8851B], u8 path) 162862306a36Sopenharmony_ci{ 162962306a36Sopenharmony_ci u8 i; 163062306a36Sopenharmony_ci 163162306a36Sopenharmony_ci for (i = 0; i < DPK_KIP_REG_NUM_8851B; i++) { 163262306a36Sopenharmony_ci reg_bkup[path][i] = 163362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD); 163462306a36Sopenharmony_ci 163562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", 163662306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 163762306a36Sopenharmony_ci } 163862306a36Sopenharmony_ci} 163962306a36Sopenharmony_ci 164062306a36Sopenharmony_cistatic void _dpk_bkup_rf(struct rtw89_dev *rtwdev, const u32 *rf_reg, 164162306a36Sopenharmony_ci u32 rf_bkup[][DPK_RF_REG_NUM_8851B], u8 path) 164262306a36Sopenharmony_ci{ 164362306a36Sopenharmony_ci u8 i; 164462306a36Sopenharmony_ci 164562306a36Sopenharmony_ci for (i = 0; i < DPK_RF_REG_NUM_8851B; i++) { 164662306a36Sopenharmony_ci rf_bkup[path][i] = rtw89_read_rf(rtwdev, path, rf_reg[i], RFREG_MASK); 164762306a36Sopenharmony_ci 164862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup RF S%d 0x%x = %x\n", 164962306a36Sopenharmony_ci path, rf_reg[i], rf_bkup[path][i]); 165062306a36Sopenharmony_ci } 165162306a36Sopenharmony_ci} 165262306a36Sopenharmony_ci 165362306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 *reg, 165462306a36Sopenharmony_ci u32 reg_bkup[][DPK_KIP_REG_NUM_8851B], u8 path) 165562306a36Sopenharmony_ci{ 165662306a36Sopenharmony_ci u8 i; 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_ci for (i = 0; i < DPK_KIP_REG_NUM_8851B; i++) { 165962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD, 166062306a36Sopenharmony_ci reg_bkup[path][i]); 166162306a36Sopenharmony_ci 166262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 166362306a36Sopenharmony_ci "[DPK] Reload 0x%x = %x\n", 166462306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 166562306a36Sopenharmony_ci } 166662306a36Sopenharmony_ci} 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_cistatic void _dpk_reload_rf(struct rtw89_dev *rtwdev, const u32 *rf_reg, 166962306a36Sopenharmony_ci u32 rf_bkup[][DPK_RF_REG_NUM_8851B], u8 path) 167062306a36Sopenharmony_ci{ 167162306a36Sopenharmony_ci u8 i; 167262306a36Sopenharmony_ci 167362306a36Sopenharmony_ci for (i = 0; i < DPK_RF_REG_NUM_8851B; i++) { 167462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, rf_reg[i], RFREG_MASK, rf_bkup[path][i]); 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 167762306a36Sopenharmony_ci "[DPK] Reload RF S%d 0x%x = %x\n", path, 167862306a36Sopenharmony_ci rf_reg[i], rf_bkup[path][i]); 167962306a36Sopenharmony_ci } 168062306a36Sopenharmony_ci} 168162306a36Sopenharmony_ci 168262306a36Sopenharmony_cistatic void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 168362306a36Sopenharmony_ci enum rtw89_rf_path path, enum dpk_id id) 168462306a36Sopenharmony_ci{ 168562306a36Sopenharmony_ci u16 dpk_cmd; 168662306a36Sopenharmony_ci u32 val; 168762306a36Sopenharmony_ci int ret; 168862306a36Sopenharmony_ci 168962306a36Sopenharmony_ci dpk_cmd = ((id << 8) | (0x19 + path * 0x12)); 169062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); 169162306a36Sopenharmony_ci 169262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 169362306a36Sopenharmony_ci 10, 20000, false, 169462306a36Sopenharmony_ci rtwdev, 0xbff8, MASKBYTE0); 169562306a36Sopenharmony_ci if (ret) 169662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 1 timeout\n"); 169762306a36Sopenharmony_ci 169862306a36Sopenharmony_ci udelay(1); 169962306a36Sopenharmony_ci 170062306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000, 170162306a36Sopenharmony_ci 1, 2000, false, 170262306a36Sopenharmony_ci rtwdev, R_RPT_COM, MASKLWORD); 170362306a36Sopenharmony_ci if (ret) 170462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 2 timeout\n"); 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0); 170762306a36Sopenharmony_ci 170862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 170962306a36Sopenharmony_ci "[DPK] one-shot for %s = 0x%04x\n", 171062306a36Sopenharmony_ci id == 0x28 ? "KIP_PRESET" : 171162306a36Sopenharmony_ci id == 0x29 ? "DPK_TXAGC" : 171262306a36Sopenharmony_ci id == 0x2a ? "DPK_RXAGC" : 171362306a36Sopenharmony_ci id == 0x2b ? "SYNC" : 171462306a36Sopenharmony_ci id == 0x2c ? "GAIN_LOSS" : 171562306a36Sopenharmony_ci id == 0x2d ? "MDPK_IDL" : 171662306a36Sopenharmony_ci id == 0x2f ? "DPK_GAIN_NORM" : 171762306a36Sopenharmony_ci id == 0x31 ? "KIP_RESTORE" : 171862306a36Sopenharmony_ci id == 0x6 ? "LBK_RXIQK" : "Unknown id", 171962306a36Sopenharmony_ci dpk_cmd); 172062306a36Sopenharmony_ci} 172162306a36Sopenharmony_ci 172262306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 172362306a36Sopenharmony_ci bool off) 172462306a36Sopenharmony_ci{ 172562306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 172662306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 172762306a36Sopenharmony_ci u8 off_reverse = off ? 0 : 1; 172862306a36Sopenharmony_ci u8 val; 172962306a36Sopenharmony_ci 173062306a36Sopenharmony_ci val = dpk->is_dpk_enable * off_reverse * dpk->bp[path][kidx].path_ok; 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 173362306a36Sopenharmony_ci 0xf0000000, val); 173462306a36Sopenharmony_ci 173562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, 173662306a36Sopenharmony_ci kidx, val == 0 ? "disable" : "enable"); 173762306a36Sopenharmony_ci} 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_cistatic void _dpk_init(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 174062306a36Sopenharmony_ci{ 174162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 174262306a36Sopenharmony_ci 174362306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 174462306a36Sopenharmony_ci 174562306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = 0; 174662306a36Sopenharmony_ci} 174762306a36Sopenharmony_ci 174862306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 174962306a36Sopenharmony_ci enum rtw89_rf_path path) 175062306a36Sopenharmony_ci{ 175162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 175262306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 175362306a36Sopenharmony_ci 175462306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 175562306a36Sopenharmony_ci 175662306a36Sopenharmony_ci dpk->bp[path][kidx].band = chan->band_type; 175762306a36Sopenharmony_ci dpk->bp[path][kidx].ch = chan->band_width; 175862306a36Sopenharmony_ci dpk->bp[path][kidx].bw = chan->channel; 175962306a36Sopenharmony_ci 176062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 176162306a36Sopenharmony_ci "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", 176262306a36Sopenharmony_ci path, dpk->cur_idx[path], phy, 176362306a36Sopenharmony_ci rtwdev->is_tssi_mode[path] ? "on" : "off", 176462306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 176562306a36Sopenharmony_ci dpk->bp[path][kidx].band == 0 ? "2G" : 176662306a36Sopenharmony_ci dpk->bp[path][kidx].band == 1 ? "5G" : "6G", 176762306a36Sopenharmony_ci dpk->bp[path][kidx].ch, 176862306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 0 ? "20M" : 176962306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 1 ? "40M" : 177062306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 2 ? "80M" : "160M"); 177162306a36Sopenharmony_ci} 177262306a36Sopenharmony_ci 177362306a36Sopenharmony_cistatic void _dpk_rxagc_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 177462306a36Sopenharmony_ci bool turn_on) 177562306a36Sopenharmony_ci{ 177662306a36Sopenharmony_ci if (path == RF_PATH_A) 177762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_AGC_CTL, B_P0_AGC_EN, turn_on); 177862306a36Sopenharmony_ci else 177962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_AGC_CTL, B_P1_AGC_EN, turn_on); 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d RXAGC is %s\n", path, 178262306a36Sopenharmony_ci turn_on ? "turn_on" : "turn_off"); 178362306a36Sopenharmony_ci} 178462306a36Sopenharmony_ci 178562306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 178662306a36Sopenharmony_ci{ 178762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x1); 178862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x0); 178962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x1); 179062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x0); 179162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0xd801dffd); 179262306a36Sopenharmony_ci 179362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_bb_afe_defs_tbl); 179462306a36Sopenharmony_ci 179562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x1); 179662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x1); 179762306a36Sopenharmony_ci 179862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE setting\n", path); 179962306a36Sopenharmony_ci} 180062306a36Sopenharmony_ci 180162306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 180262306a36Sopenharmony_ci{ 180362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x0); 180462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x1); 180562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x0); 180662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x1); 180762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x0); 180862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0x00000000); 180962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), B_P0_TXCK_ALL, 0x00); 181062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x0); 181162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x0); 181262306a36Sopenharmony_ci 181362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE restore\n", path); 181462306a36Sopenharmony_ci} 181562306a36Sopenharmony_ci 181662306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 181762306a36Sopenharmony_ci bool is_pause) 181862306a36Sopenharmony_ci{ 181962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 182062306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, is_pause); 182162306a36Sopenharmony_ci 182262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, 182362306a36Sopenharmony_ci is_pause ? "pause" : "resume"); 182462306a36Sopenharmony_ci} 182562306a36Sopenharmony_ci 182662306a36Sopenharmony_cistatic void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 182762306a36Sopenharmony_ci{ 182862306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) { 183162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x0); 183262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xffe0fa00); 183362306a36Sopenharmony_ci } else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) { 183462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); 183562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xff4009e0); 183662306a36Sopenharmony_ci } else { 183762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); 183862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xf9f007d0); 183962306a36Sopenharmony_ci } 184062306a36Sopenharmony_ci 184162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG Select for %s\n", 184262306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : 184362306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); 184462306a36Sopenharmony_ci} 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_cistatic void _dpk_txpwr_bb_force(struct rtw89_dev *rtwdev, 184762306a36Sopenharmony_ci enum rtw89_rf_path path, bool force) 184862306a36Sopenharmony_ci{ 184962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13), B_TXPWRB_ON, force); 185062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H + (path << 13), B_TXPWRB_RDY, force); 185162306a36Sopenharmony_ci 185262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d txpwr_bb_force %s\n", 185362306a36Sopenharmony_ci path, force ? "on" : "off"); 185462306a36Sopenharmony_ci} 185562306a36Sopenharmony_ci 185662306a36Sopenharmony_cistatic void _dpk_kip_pwr_clk_onoff(struct rtw89_dev *rtwdev, bool turn_on) 185762306a36Sopenharmony_ci{ 185862306a36Sopenharmony_ci if (turn_on) { 185962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 186062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a); 186162306a36Sopenharmony_ci } else { 186262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 186362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 186462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_WR, BIT(18), 0x1); 186562306a36Sopenharmony_ci } 186662306a36Sopenharmony_ci} 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_cistatic void _dpk_kip_control_rfc(struct rtw89_dev *rtwdev, 186962306a36Sopenharmony_ci enum rtw89_rf_path path, bool ctrl_by_kip) 187062306a36Sopenharmony_ci{ 187162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), 187262306a36Sopenharmony_ci B_IQK_RFC_ON, ctrl_by_kip); 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] RFC is controlled by %s\n", 187562306a36Sopenharmony_ci ctrl_by_kip ? "KIP" : "BB"); 187662306a36Sopenharmony_ci} 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_cistatic void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 187962306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 188062306a36Sopenharmony_ci{ 188162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 188262306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 188362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 188462306a36Sopenharmony_ci B_DPD_SEL, 0x01); 188562306a36Sopenharmony_ci 188662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 188762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_KIP_PRESET); 188862306a36Sopenharmony_ci} 188962306a36Sopenharmony_ci 189062306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 189162306a36Sopenharmony_ci enum rtw89_rf_path path) 189262306a36Sopenharmony_ci{ 189362306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_KIP_RESTORE); 189462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 189562306a36Sopenharmony_ci _dpk_txpwr_bb_force(rtwdev, path, false); 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); 189862306a36Sopenharmony_ci} 189962306a36Sopenharmony_ci 190062306a36Sopenharmony_cistatic void _dpk_kset_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 190162306a36Sopenharmony_ci{ 190262306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 190362306a36Sopenharmony_ci 190462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0x10); 190562306a36Sopenharmony_ci 190662306a36Sopenharmony_ci dpk->cur_k_set = 190762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), B_RPT_PER_KSET) - 1; 190862306a36Sopenharmony_ci} 190962306a36Sopenharmony_ci 191062306a36Sopenharmony_cistatic void _dpk_para_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 191162306a36Sopenharmony_ci{ 191262306a36Sopenharmony_ci static const u32 reg[RTW89_DPK_BKUP_NUM][DPK_KSET_NUM] = { 191362306a36Sopenharmony_ci {0x8190, 0x8194, 0x8198, 0x81a4}, 191462306a36Sopenharmony_ci {0x81a8, 0x81c4, 0x81c8, 0x81e8} 191562306a36Sopenharmony_ci }; 191662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 191762306a36Sopenharmony_ci u8 cur_k_set = dpk->cur_k_set; 191862306a36Sopenharmony_ci u32 para; 191962306a36Sopenharmony_ci 192062306a36Sopenharmony_ci if (cur_k_set >= DPK_KSET_NUM) { 192162306a36Sopenharmony_ci rtw89_warn(rtwdev, "DPK cur_k_set = %d\n", cur_k_set); 192262306a36Sopenharmony_ci cur_k_set = 2; 192362306a36Sopenharmony_ci } 192462306a36Sopenharmony_ci 192562306a36Sopenharmony_ci para = rtw89_phy_read32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8), 192662306a36Sopenharmony_ci MASKDWORD); 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk = (para >> 10) & 0x3f; 192962306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk = (para >> 26) & 0x3f; 193062306a36Sopenharmony_ci 193162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 193262306a36Sopenharmony_ci "[DPK] thermal/ txagc_RF (K%d) = 0x%x/ 0x%x\n", 193362306a36Sopenharmony_ci dpk->cur_k_set, dpk->bp[path][kidx].ther_dpk, 193462306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk); 193562306a36Sopenharmony_ci} 193662306a36Sopenharmony_ci 193762306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 193862306a36Sopenharmony_ci{ 193962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 194062306a36Sopenharmony_ci u8 corr_val, corr_idx, rxbb; 194162306a36Sopenharmony_ci u16 dc_i, dc_q; 194262306a36Sopenharmony_ci u8 rxbb_ov; 194362306a36Sopenharmony_ci 194462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI); 194762306a36Sopenharmony_ci corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV); 194862306a36Sopenharmony_ci dpk->corr_idx[path][kidx] = corr_idx; 194962306a36Sopenharmony_ci dpk->corr_val[path][kidx] = corr_val; 195062306a36Sopenharmony_ci 195162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_ci dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 195462306a36Sopenharmony_ci dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); 195562306a36Sopenharmony_ci 195662306a36Sopenharmony_ci dc_i = abs(sign_extend32(dc_i, 11)); 195762306a36Sopenharmony_ci dc_q = abs(sign_extend32(dc_q, 11)); 195862306a36Sopenharmony_ci 195962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 196062306a36Sopenharmony_ci "[DPK] S%d Corr_idx/ Corr_val /DC I/Q, = %d / %d / %d / %d\n", 196162306a36Sopenharmony_ci path, corr_idx, corr_val, dc_i, dc_q); 196262306a36Sopenharmony_ci 196362306a36Sopenharmony_ci dpk->dc_i[path][kidx] = dc_i; 196462306a36Sopenharmony_ci dpk->dc_q[path][kidx] = dc_q; 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x8); 196762306a36Sopenharmony_ci rxbb = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB); 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x31); 197062306a36Sopenharmony_ci rxbb_ov = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXOV); 197162306a36Sopenharmony_ci 197262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 197362306a36Sopenharmony_ci "[DPK] S%d RXBB/ RXAGC_done /RXBB_ovlmt = %d / %d / %d\n", 197462306a36Sopenharmony_ci path, rxbb, 197562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DONE), 197662306a36Sopenharmony_ci rxbb_ov); 197762306a36Sopenharmony_ci 197862306a36Sopenharmony_ci if (dc_i > 200 || dc_q > 200 || corr_val < 170) 197962306a36Sopenharmony_ci return true; 198062306a36Sopenharmony_ci else 198162306a36Sopenharmony_ci return false; 198262306a36Sopenharmony_ci} 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_cistatic void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 198562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 dbm, 198662306a36Sopenharmony_ci bool set_from_bb) 198762306a36Sopenharmony_ci{ 198862306a36Sopenharmony_ci if (set_from_bb) { 198962306a36Sopenharmony_ci dbm = clamp_t(u8, dbm, 7, 24); 199062306a36Sopenharmony_ci 199162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 199262306a36Sopenharmony_ci "[DPK] set S%d txagc to %ddBm\n", path, dbm); 199362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13), 199462306a36Sopenharmony_ci B_TXPWRB_VAL, dbm << 2); 199562306a36Sopenharmony_ci } 199662306a36Sopenharmony_ci 199762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_TXAGC); 199862306a36Sopenharmony_ci _dpk_kset_query(rtwdev, path); 199962306a36Sopenharmony_ci} 200062306a36Sopenharmony_ci 200162306a36Sopenharmony_cistatic bool _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 200262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 200362306a36Sopenharmony_ci{ 200462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 200562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 200662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 200762306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 200862306a36Sopenharmony_ci 200962306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_RXAGC); 201062306a36Sopenharmony_ci return _dpk_sync_check(rtwdev, path, kidx); 201162306a36Sopenharmony_ci} 201262306a36Sopenharmony_ci 201362306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 201462306a36Sopenharmony_ci enum rtw89_rf_path path) 201562306a36Sopenharmony_ci{ 201662306a36Sopenharmony_ci u32 rf_11, reg_81cc; 201762306a36Sopenharmony_ci u8 cur_rxbb; 201862306a36Sopenharmony_ci 201962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1); 202062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1); 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 202362306a36Sopenharmony_ci 202462306a36Sopenharmony_ci cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB); 202562306a36Sopenharmony_ci rf_11 = rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK); 202662306a36Sopenharmony_ci reg_81cc = rtw89_phy_read32_mask(rtwdev, R_KIP_IQP + (path << 8), 202762306a36Sopenharmony_ci B_KIP_IQP_SW); 202862306a36Sopenharmony_ci 202962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 203062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x3); 203162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0xd); 203262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, 0x1f); 203362306a36Sopenharmony_ci 203462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x12); 203562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, 0x3); 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, MASKDWORD, 0x00250025); 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); 204262306a36Sopenharmony_ci 204362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path, 204462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD)); 204562306a36Sopenharmony_ci 204662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 204762306a36Sopenharmony_ci 204862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RFREG_MASK, rf_11); 204962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, cur_rxbb); 205062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, reg_81cc); 205162306a36Sopenharmony_ci 205262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0); 205362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0); 205462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1); 205562306a36Sopenharmony_ci 205662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 205762306a36Sopenharmony_ci} 205862306a36Sopenharmony_ci 205962306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 206062306a36Sopenharmony_ci{ 206162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 206262306a36Sopenharmony_ci 206362306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { 206462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50521); 206562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK); 206662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTC, 0x0); 206762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTR, 0x7); 206862306a36Sopenharmony_ci } else { 206962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 207062306a36Sopenharmony_ci 0x50521 | BIT(rtwdev->dbcc_en)); 207162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK); 207262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SATT, 0x3); 207362306a36Sopenharmony_ci } 207462306a36Sopenharmony_ci 207562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1); 207662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1); 207762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0); 207862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_EBW, 0x0); 207962306a36Sopenharmony_ci} 208062306a36Sopenharmony_ci 208162306a36Sopenharmony_cistatic void _dpk_bypass_rxiqc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 208262306a36Sopenharmony_ci{ 208362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1); 208462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 0x40000002); 208562306a36Sopenharmony_ci 208662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Bypass RXIQC\n"); 208762306a36Sopenharmony_ci} 208862306a36Sopenharmony_ci 208962306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) 209062306a36Sopenharmony_ci{ 209162306a36Sopenharmony_ci u16 dgain; 209262306a36Sopenharmony_ci 209362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 209462306a36Sopenharmony_ci dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 209562306a36Sopenharmony_ci 209662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain); 209762306a36Sopenharmony_ci 209862306a36Sopenharmony_ci return dgain; 209962306a36Sopenharmony_ci} 210062306a36Sopenharmony_ci 210162306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) 210262306a36Sopenharmony_ci{ 210362306a36Sopenharmony_ci u8 result; 210462306a36Sopenharmony_ci 210562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 210662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 210762306a36Sopenharmony_ci result = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); 210862306a36Sopenharmony_ci 210962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp GL = %d\n", result); 211062306a36Sopenharmony_ci 211162306a36Sopenharmony_ci return result; 211262306a36Sopenharmony_ci} 211362306a36Sopenharmony_ci 211462306a36Sopenharmony_cistatic u8 _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 211562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 211662306a36Sopenharmony_ci{ 211762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_GAIN_LOSS); 211862306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, 0xff, false); 211962306a36Sopenharmony_ci 212062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A1, 0xf078); 212162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A0, 0x0); 212262306a36Sopenharmony_ci 212362306a36Sopenharmony_ci return _dpk_gainloss_read(rtwdev); 212462306a36Sopenharmony_ci} 212562306a36Sopenharmony_ci 212662306a36Sopenharmony_cistatic u8 _dpk_pas_read(struct rtw89_dev *rtwdev, u8 is_check) 212762306a36Sopenharmony_ci{ 212862306a36Sopenharmony_ci u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 212962306a36Sopenharmony_ci u32 val1_sqrt_sum, val2_sqrt_sum; 213062306a36Sopenharmony_ci u8 i; 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); 213362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0); 213462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08); 213562306a36Sopenharmony_ci 213662306a36Sopenharmony_ci if (is_check) { 213762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); 213862306a36Sopenharmony_ci val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 213962306a36Sopenharmony_ci val1_i = abs(sign_extend32(val1_i, 11)); 214062306a36Sopenharmony_ci val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 214162306a36Sopenharmony_ci val1_q = abs(sign_extend32(val1_q, 11)); 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); 214462306a36Sopenharmony_ci val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 214562306a36Sopenharmony_ci val2_i = abs(sign_extend32(val2_i, 11)); 214662306a36Sopenharmony_ci val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 214762306a36Sopenharmony_ci val2_q = abs(sign_extend32(val2_q, 11)); 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", 215062306a36Sopenharmony_ci phy_div(val1_i * val1_i + val1_q * val1_q, 215162306a36Sopenharmony_ci val2_i * val2_i + val2_q * val2_q)); 215262306a36Sopenharmony_ci } else { 215362306a36Sopenharmony_ci for (i = 0; i < 32; i++) { 215462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); 215562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 215662306a36Sopenharmony_ci "[DPK] PAS_Read[%02d]= 0x%08x\n", i, 215762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 215862306a36Sopenharmony_ci } 215962306a36Sopenharmony_ci } 216062306a36Sopenharmony_ci 216162306a36Sopenharmony_ci val1_sqrt_sum = val1_i * val1_i + val1_q * val1_q; 216262306a36Sopenharmony_ci val2_sqrt_sum = val2_i * val2_i + val2_q * val2_q; 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_ci if (val1_sqrt_sum < val2_sqrt_sum) 216562306a36Sopenharmony_ci return 2; 216662306a36Sopenharmony_ci else if (val1_sqrt_sum >= val2_sqrt_sum * 8 / 5) 216762306a36Sopenharmony_ci return 1; 216862306a36Sopenharmony_ci else 216962306a36Sopenharmony_ci return 0; 217062306a36Sopenharmony_ci} 217162306a36Sopenharmony_ci 217262306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 217362306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 init_xdbm, u8 loss_only) 217462306a36Sopenharmony_ci{ 217562306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 217662306a36Sopenharmony_ci u8 tmp_dbm = init_xdbm, tmp_gl_idx = 0; 217762306a36Sopenharmony_ci u8 step = DPK_AGC_STEP_SYNC_DGAIN; 217862306a36Sopenharmony_ci u8 goout = 0, agc_cnt = 0; 217962306a36Sopenharmony_ci bool is_fail = false; 218062306a36Sopenharmony_ci int limit = 200; 218162306a36Sopenharmony_ci u8 tmp_rxbb; 218262306a36Sopenharmony_ci u16 dgain; 218362306a36Sopenharmony_ci 218462306a36Sopenharmony_ci do { 218562306a36Sopenharmony_ci switch (step) { 218662306a36Sopenharmony_ci case DPK_AGC_STEP_SYNC_DGAIN: 218762306a36Sopenharmony_ci is_fail = _dpk_kip_set_rxagc(rtwdev, phy, path, kidx); 218862306a36Sopenharmony_ci 218962306a36Sopenharmony_ci if (is_fail) { 219062306a36Sopenharmony_ci goout = 1; 219162306a36Sopenharmony_ci break; 219262306a36Sopenharmony_ci } 219362306a36Sopenharmony_ci 219462306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 219562306a36Sopenharmony_ci 219662306a36Sopenharmony_ci if (dgain > 0x5fc || dgain < 0x556) { 219762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_SYNC); 219862306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 219962306a36Sopenharmony_ci } 220062306a36Sopenharmony_ci 220162306a36Sopenharmony_ci if (agc_cnt == 0) { 220262306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) 220362306a36Sopenharmony_ci _dpk_bypass_rxiqc(rtwdev, path); 220462306a36Sopenharmony_ci else 220562306a36Sopenharmony_ci _dpk_lbk_rxiqk(rtwdev, phy, path); 220662306a36Sopenharmony_ci } 220762306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 220862306a36Sopenharmony_ci break; 220962306a36Sopenharmony_ci 221062306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_LOSS_IDX: 221162306a36Sopenharmony_ci tmp_gl_idx = _dpk_gainloss(rtwdev, phy, path, kidx); 221262306a36Sopenharmony_ci 221362306a36Sopenharmony_ci if (_dpk_pas_read(rtwdev, true) == 2 && tmp_gl_idx > 0) 221462306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 221562306a36Sopenharmony_ci else if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true) == 1) || 221662306a36Sopenharmony_ci tmp_gl_idx >= 7) 221762306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_GT_CRITERION; 221862306a36Sopenharmony_ci else if (tmp_gl_idx == 0) 221962306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 222062306a36Sopenharmony_ci else 222162306a36Sopenharmony_ci step = DPK_AGC_STEP_SET_TX_GAIN; 222262306a36Sopenharmony_ci break; 222362306a36Sopenharmony_ci 222462306a36Sopenharmony_ci case DPK_AGC_STEP_GL_GT_CRITERION: 222562306a36Sopenharmony_ci if (tmp_dbm <= 7) { 222662306a36Sopenharmony_ci goout = 1; 222762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 222862306a36Sopenharmony_ci "[DPK] Txagc@lower bound!!\n"); 222962306a36Sopenharmony_ci } else { 223062306a36Sopenharmony_ci tmp_dbm = max_t(u8, tmp_dbm - 3, 7); 223162306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true); 223262306a36Sopenharmony_ci } 223362306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 223462306a36Sopenharmony_ci agc_cnt++; 223562306a36Sopenharmony_ci break; 223662306a36Sopenharmony_ci 223762306a36Sopenharmony_ci case DPK_AGC_STEP_GL_LT_CRITERION: 223862306a36Sopenharmony_ci if (tmp_dbm >= 24) { 223962306a36Sopenharmony_ci goout = 1; 224062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 224162306a36Sopenharmony_ci "[DPK] Txagc@upper bound!!\n"); 224262306a36Sopenharmony_ci } else { 224362306a36Sopenharmony_ci tmp_dbm = min_t(u8, tmp_dbm + 2, 24); 224462306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true); 224562306a36Sopenharmony_ci } 224662306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 224762306a36Sopenharmony_ci agc_cnt++; 224862306a36Sopenharmony_ci break; 224962306a36Sopenharmony_ci 225062306a36Sopenharmony_ci case DPK_AGC_STEP_SET_TX_GAIN: 225162306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 225262306a36Sopenharmony_ci tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB); 225362306a36Sopenharmony_ci tmp_rxbb = min_t(u8, tmp_rxbb + tmp_gl_idx, 0x1f); 225462306a36Sopenharmony_ci 225562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, tmp_rxbb); 225662306a36Sopenharmony_ci 225762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 225862306a36Sopenharmony_ci "[DPK] Adjust RXBB (%+d) = 0x%x\n", 225962306a36Sopenharmony_ci tmp_gl_idx, tmp_rxbb); 226062306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 226162306a36Sopenharmony_ci goout = 1; 226262306a36Sopenharmony_ci break; 226362306a36Sopenharmony_ci default: 226462306a36Sopenharmony_ci goout = 1; 226562306a36Sopenharmony_ci break; 226662306a36Sopenharmony_ci } 226762306a36Sopenharmony_ci } while (!goout && agc_cnt < 6 && limit-- > 0); 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci return is_fail; 227062306a36Sopenharmony_ci} 227162306a36Sopenharmony_ci 227262306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order) 227362306a36Sopenharmony_ci{ 227462306a36Sopenharmony_ci switch (order) { 227562306a36Sopenharmony_ci case 0: /* (5,3,1) */ 227662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x0); 227762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x2); 227862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x4); 227962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x1); 228062306a36Sopenharmony_ci break; 228162306a36Sopenharmony_ci case 1: /* (5,3,0) */ 228262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x1); 228362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x1); 228462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0); 228562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x0); 228662306a36Sopenharmony_ci break; 228762306a36Sopenharmony_ci case 2: /* (5,0,0) */ 228862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x2); 228962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x0); 229062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0); 229162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x0); 229262306a36Sopenharmony_ci break; 229362306a36Sopenharmony_ci case 3: /* (7,3,1) */ 229462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x3); 229562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x3); 229662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x4); 229762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x1); 229862306a36Sopenharmony_ci break; 229962306a36Sopenharmony_ci default: 230062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 230162306a36Sopenharmony_ci "[DPK] Wrong MDPD order!!(0x%x)\n", order); 230262306a36Sopenharmony_ci break; 230362306a36Sopenharmony_ci } 230462306a36Sopenharmony_ci 230562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set %s for IDL\n", 230662306a36Sopenharmony_ci order == 0x0 ? "(5,3,1)" : 230762306a36Sopenharmony_ci order == 0x1 ? "(5,3,0)" : 230862306a36Sopenharmony_ci order == 0x2 ? "(5,0,0)" : "(7,3,1)"); 230962306a36Sopenharmony_ci} 231062306a36Sopenharmony_ci 231162306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 231262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 231362306a36Sopenharmony_ci{ 231462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_MA, 0x1); 231562306a36Sopenharmony_ci 231662306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_MD500) == 0x1) 231762306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x2); 231862306a36Sopenharmony_ci else if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_MD530) == 0x1) 231962306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x1); 232062306a36Sopenharmony_ci else 232162306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x0); 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL, 0x0); 232462306a36Sopenharmony_ci fsleep(1000); 232562306a36Sopenharmony_ci 232662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_MDPK_IDL); 232762306a36Sopenharmony_ci} 232862306a36Sopenharmony_ci 232962306a36Sopenharmony_cistatic u8 _dpk_order_convert(struct rtw89_dev *rtwdev) 233062306a36Sopenharmony_ci{ 233162306a36Sopenharmony_ci u32 order; 233262306a36Sopenharmony_ci u8 val; 233362306a36Sopenharmony_ci 233462306a36Sopenharmony_ci order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP); 233562306a36Sopenharmony_ci 233662306a36Sopenharmony_ci switch (order) { 233762306a36Sopenharmony_ci case 0: /* (5,3,1) */ 233862306a36Sopenharmony_ci val = 0x6; 233962306a36Sopenharmony_ci break; 234062306a36Sopenharmony_ci case 1: /* (5,3,0) */ 234162306a36Sopenharmony_ci val = 0x2; 234262306a36Sopenharmony_ci break; 234362306a36Sopenharmony_ci case 2: /* (5,0,0) */ 234462306a36Sopenharmony_ci val = 0x0; 234562306a36Sopenharmony_ci break; 234662306a36Sopenharmony_ci default: 234762306a36Sopenharmony_ci val = 0xff; 234862306a36Sopenharmony_ci break; 234962306a36Sopenharmony_ci } 235062306a36Sopenharmony_ci 235162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val); 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci return val; 235462306a36Sopenharmony_ci} 235562306a36Sopenharmony_ci 235662306a36Sopenharmony_cistatic void _dpk_gain_normalize(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 235762306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, bool is_execute) 235862306a36Sopenharmony_ci{ 235962306a36Sopenharmony_ci static const u32 reg[RTW89_DPK_BKUP_NUM][DPK_KSET_NUM] = { 236062306a36Sopenharmony_ci {0x8190, 0x8194, 0x8198, 0x81a4}, 236162306a36Sopenharmony_ci {0x81a8, 0x81c4, 0x81c8, 0x81e8} 236262306a36Sopenharmony_ci }; 236362306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 236462306a36Sopenharmony_ci u8 cur_k_set = dpk->cur_k_set; 236562306a36Sopenharmony_ci 236662306a36Sopenharmony_ci if (cur_k_set >= DPK_KSET_NUM) { 236762306a36Sopenharmony_ci rtw89_warn(rtwdev, "DPK cur_k_set = %d\n", cur_k_set); 236862306a36Sopenharmony_ci cur_k_set = 2; 236962306a36Sopenharmony_ci } 237062306a36Sopenharmony_ci 237162306a36Sopenharmony_ci if (is_execute) { 237262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8), 237362306a36Sopenharmony_ci B_DPK_GN_AG, 0x200); 237462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8), 237562306a36Sopenharmony_ci B_DPK_GN_EN, 0x3); 237662306a36Sopenharmony_ci 237762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_GAIN_NORM); 237862306a36Sopenharmony_ci } else { 237962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8), 238062306a36Sopenharmony_ci 0x0000007F, 0x5b); 238162306a36Sopenharmony_ci } 238262306a36Sopenharmony_ci 238362306a36Sopenharmony_ci dpk->bp[path][kidx].gs = 238462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8), 238562306a36Sopenharmony_ci 0x0000007F); 238662306a36Sopenharmony_ci} 238762306a36Sopenharmony_ci 238862306a36Sopenharmony_cistatic void _dpk_on(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 238962306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 239062306a36Sopenharmony_ci{ 239162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 239262306a36Sopenharmony_ci 239362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); 239462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0); 239562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 239662306a36Sopenharmony_ci B_DPD_ORDER, _dpk_order_convert(rtwdev)); 239762306a36Sopenharmony_ci 239862306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = 239962306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok | BIT(dpk->cur_k_set); 240062306a36Sopenharmony_ci 240162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] path_ok = 0x%x\n", 240262306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].path_ok); 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 240562306a36Sopenharmony_ci B_DPD_MEN, dpk->bp[path][kidx].path_ok); 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci _dpk_gain_normalize(rtwdev, phy, path, kidx, false); 240862306a36Sopenharmony_ci} 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 241162306a36Sopenharmony_ci enum rtw89_rf_path path) 241262306a36Sopenharmony_ci{ 241362306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 241462306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 241562306a36Sopenharmony_ci u8 init_xdbm = 17; 241662306a36Sopenharmony_ci bool is_fail; 241762306a36Sopenharmony_ci 241862306a36Sopenharmony_ci if (dpk->bp[path][kidx].band != RTW89_BAND_2G) 241962306a36Sopenharmony_ci init_xdbm = 15; 242062306a36Sopenharmony_ci 242162306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 242262306a36Sopenharmony_ci _rfk_rf_direct_cntrl(rtwdev, path, false); 242362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RFREG_MASK, 0x03ffd); 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_ci _dpk_rf_setting(rtwdev, path, kidx); 242662306a36Sopenharmony_ci _set_rx_dck(rtwdev, path, RF_DPK); 242762306a36Sopenharmony_ci 242862306a36Sopenharmony_ci _dpk_kip_pwr_clk_onoff(rtwdev, true); 242962306a36Sopenharmony_ci _dpk_kip_preset(rtwdev, phy, path, kidx); 243062306a36Sopenharmony_ci _dpk_txpwr_bb_force(rtwdev, path, true); 243162306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, init_xdbm, true); 243262306a36Sopenharmony_ci _dpk_tpg_sel(rtwdev, path, kidx); 243362306a36Sopenharmony_ci is_fail = _dpk_agc(rtwdev, phy, path, kidx, init_xdbm, false); 243462306a36Sopenharmony_ci if (is_fail) 243562306a36Sopenharmony_ci goto _error; 243662306a36Sopenharmony_ci 243762306a36Sopenharmony_ci _dpk_idl_mpa(rtwdev, phy, path, kidx); 243862306a36Sopenharmony_ci _dpk_para_query(rtwdev, path, kidx); 243962306a36Sopenharmony_ci 244062306a36Sopenharmony_ci _dpk_on(rtwdev, phy, path, kidx); 244162306a36Sopenharmony_ci_error: 244262306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 244362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RF_RX); 244462306a36Sopenharmony_ci 244562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d]_K%d %s\n", path, kidx, 244662306a36Sopenharmony_ci dpk->cur_k_set, is_fail ? "need Check" : "is Success"); 244762306a36Sopenharmony_ci 244862306a36Sopenharmony_ci return is_fail; 244962306a36Sopenharmony_ci} 245062306a36Sopenharmony_ci 245162306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force, 245262306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 kpath) 245362306a36Sopenharmony_ci{ 245462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 245562306a36Sopenharmony_ci u32 kip_bkup[RF_PATH_NUM_8851B][DPK_KIP_REG_NUM_8851B] = {}; 245662306a36Sopenharmony_ci u32 rf_bkup[RF_PATH_NUM_8851B][DPK_RF_REG_NUM_8851B] = {}; 245762306a36Sopenharmony_ci bool is_fail; 245862306a36Sopenharmony_ci u8 path; 245962306a36Sopenharmony_ci 246062306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) 246162306a36Sopenharmony_ci dpk->cur_idx[path] = 0; 246262306a36Sopenharmony_ci 246362306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 246462306a36Sopenharmony_ci if (!(kpath & BIT(path))) 246562306a36Sopenharmony_ci continue; 246662306a36Sopenharmony_ci _dpk_bkup_kip(rtwdev, dpk_kip_reg, kip_bkup, path); 246762306a36Sopenharmony_ci _dpk_bkup_rf(rtwdev, dpk_rf_reg, rf_bkup, path); 246862306a36Sopenharmony_ci _dpk_information(rtwdev, phy, path); 246962306a36Sopenharmony_ci _dpk_init(rtwdev, path); 247062306a36Sopenharmony_ci 247162306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 247262306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, true); 247362306a36Sopenharmony_ci } 247462306a36Sopenharmony_ci 247562306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 247662306a36Sopenharmony_ci if (!(kpath & BIT(path))) 247762306a36Sopenharmony_ci continue; 247862306a36Sopenharmony_ci 247962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 248062306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Start =========\n", 248162306a36Sopenharmony_ci path, dpk->cur_idx[path]); 248262306a36Sopenharmony_ci 248362306a36Sopenharmony_ci _dpk_rxagc_onoff(rtwdev, path, false); 248462306a36Sopenharmony_ci _rfk_drf_direct_cntrl(rtwdev, path, false); 248562306a36Sopenharmony_ci _dpk_bb_afe_setting(rtwdev, path); 248662306a36Sopenharmony_ci 248762306a36Sopenharmony_ci is_fail = _dpk_main(rtwdev, phy, path); 248862306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, is_fail); 248962306a36Sopenharmony_ci } 249062306a36Sopenharmony_ci 249162306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 249262306a36Sopenharmony_ci if (!(kpath & BIT(path))) 249362306a36Sopenharmony_ci continue; 249462306a36Sopenharmony_ci 249562306a36Sopenharmony_ci _dpk_kip_restore(rtwdev, phy, path); 249662306a36Sopenharmony_ci _dpk_reload_kip(rtwdev, dpk_kip_reg, kip_bkup, path); 249762306a36Sopenharmony_ci _dpk_reload_rf(rtwdev, dpk_rf_reg, rf_bkup, path); 249862306a36Sopenharmony_ci _dpk_bb_afe_restore(rtwdev, path); 249962306a36Sopenharmony_ci _dpk_rxagc_onoff(rtwdev, path, true); 250062306a36Sopenharmony_ci 250162306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 250262306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, false); 250362306a36Sopenharmony_ci } 250462306a36Sopenharmony_ci 250562306a36Sopenharmony_ci _dpk_kip_pwr_clk_onoff(rtwdev, false); 250662306a36Sopenharmony_ci} 250762306a36Sopenharmony_ci 250862306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force) 250962306a36Sopenharmony_ci{ 251062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 251162306a36Sopenharmony_ci "[DPK] ****** 8851B DPK Start (Ver: 0x%x, Cv: %d) ******\n", 251262306a36Sopenharmony_ci DPK_VER_8851B, rtwdev->hal.cv); 251362306a36Sopenharmony_ci 251462306a36Sopenharmony_ci _dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy)); 251562306a36Sopenharmony_ci} 251662306a36Sopenharmony_ci 251762306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev) 251862306a36Sopenharmony_ci{ 251962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 252062306a36Sopenharmony_ci s8 txagc_bb, txagc_bb_tp, txagc_ofst; 252162306a36Sopenharmony_ci s16 pwsf_tssi_ofst; 252262306a36Sopenharmony_ci s8 delta_ther = 0; 252362306a36Sopenharmony_ci u8 path, kidx; 252462306a36Sopenharmony_ci u8 txagc_rf; 252562306a36Sopenharmony_ci u8 cur_ther; 252662306a36Sopenharmony_ci 252762306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 252862306a36Sopenharmony_ci kidx = dpk->cur_idx[path]; 252962306a36Sopenharmony_ci 253062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 253162306a36Sopenharmony_ci "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", 253262306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].ch); 253362306a36Sopenharmony_ci 253462306a36Sopenharmony_ci txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 253562306a36Sopenharmony_ci B_TXAGC_RF); 253662306a36Sopenharmony_ci txagc_bb = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 253762306a36Sopenharmony_ci MASKBYTE2); 253862306a36Sopenharmony_ci txagc_bb_tp = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BTP + (path << 13), 253962306a36Sopenharmony_ci B_TXAGC_BTP); 254062306a36Sopenharmony_ci 254162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), 254262306a36Sopenharmony_ci B_KIP_RPT_SEL, 0xf); 254362306a36Sopenharmony_ci cur_ther = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), 254462306a36Sopenharmony_ci B_RPT_PER_TH); 254562306a36Sopenharmony_ci txagc_ofst = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), 254662306a36Sopenharmony_ci B_RPT_PER_OF); 254762306a36Sopenharmony_ci pwsf_tssi_ofst = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), 254862306a36Sopenharmony_ci B_RPT_PER_TSSI); 254962306a36Sopenharmony_ci pwsf_tssi_ofst = sign_extend32(pwsf_tssi_ofst, 12); 255062306a36Sopenharmony_ci 255162306a36Sopenharmony_ci delta_ther = cur_ther - dpk->bp[path][kidx].ther_dpk; 255262306a36Sopenharmony_ci 255362306a36Sopenharmony_ci delta_ther = delta_ther * 2 / 3; 255462306a36Sopenharmony_ci 255562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 255662306a36Sopenharmony_ci "[DPK_TRK] extra delta_ther = %d (0x%x / 0x%x@k)\n", 255762306a36Sopenharmony_ci delta_ther, cur_ther, dpk->bp[path][kidx].ther_dpk); 255862306a36Sopenharmony_ci 255962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 256062306a36Sopenharmony_ci "[DPK_TRK] delta_txagc = %d (0x%x / 0x%x@k)\n", 256162306a36Sopenharmony_ci txagc_rf - dpk->bp[path][kidx].txagc_dpk, 256262306a36Sopenharmony_ci txagc_rf, dpk->bp[path][kidx].txagc_dpk); 256362306a36Sopenharmony_ci 256462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 256562306a36Sopenharmony_ci "[DPK_TRK] txagc_offset / pwsf_tssi_ofst = 0x%x / %+d\n", 256662306a36Sopenharmony_ci txagc_ofst, pwsf_tssi_ofst); 256762306a36Sopenharmony_ci 256862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 256962306a36Sopenharmony_ci "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", 257062306a36Sopenharmony_ci txagc_bb_tp, txagc_bb); 257162306a36Sopenharmony_ci 257262306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_DN) == 0x0 && 257362306a36Sopenharmony_ci txagc_rf != 0) { 257462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 257562306a36Sopenharmony_ci "[DPK_TRK] New pwsf = 0x%x\n", 0x78 - delta_ther); 257662306a36Sopenharmony_ci 257762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 257862306a36Sopenharmony_ci R_DPD_BND + (path << 8) + (kidx << 2), 257962306a36Sopenharmony_ci 0x07FC0000, 0x78 - delta_ther); 258062306a36Sopenharmony_ci } 258162306a36Sopenharmony_ci } 258262306a36Sopenharmony_ci} 258362306a36Sopenharmony_ci 258462306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 258562306a36Sopenharmony_ci{ 258662306a36Sopenharmony_ci u32 rf_reg5; 258762306a36Sopenharmony_ci u32 rck_val; 258862306a36Sopenharmony_ci u32 val; 258962306a36Sopenharmony_ci int ret; 259062306a36Sopenharmony_ci 259162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); 259262306a36Sopenharmony_ci 259362306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 259462306a36Sopenharmony_ci 259562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 259662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 259762306a36Sopenharmony_ci 259862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n", 259962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 260062306a36Sopenharmony_ci 260162306a36Sopenharmony_ci /* RCK trigger */ 260262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); 260362306a36Sopenharmony_ci 260462306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30, 260562306a36Sopenharmony_ci false, rtwdev, path, RR_RCKS, BIT(3)); 260662306a36Sopenharmony_ci 260762306a36Sopenharmony_ci rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); 260862306a36Sopenharmony_ci 260962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n", 261062306a36Sopenharmony_ci rck_val, ret); 261162306a36Sopenharmony_ci 261262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); 261362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 261462306a36Sopenharmony_ci 261562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n", 261662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK)); 261762306a36Sopenharmony_ci} 261862306a36Sopenharmony_ci 261962306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 262062306a36Sopenharmony_ci enum rtw89_rf_path path) 262162306a36Sopenharmony_ci{ 262262306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 262362306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 262462306a36Sopenharmony_ci 262562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_sys_defs_tbl); 262662306a36Sopenharmony_ci 262762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 262862306a36Sopenharmony_ci &rtw8851b_tssi_sys_a_defs_2g_tbl, 262962306a36Sopenharmony_ci &rtw8851b_tssi_sys_a_defs_5g_tbl); 263062306a36Sopenharmony_ci} 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, 263362306a36Sopenharmony_ci enum rtw89_phy_idx phy, 263462306a36Sopenharmony_ci enum rtw89_rf_path path) 263562306a36Sopenharmony_ci{ 263662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_init_txpwr_defs_a_tbl); 263762306a36Sopenharmony_ci} 263862306a36Sopenharmony_ci 263962306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, 264062306a36Sopenharmony_ci enum rtw89_phy_idx phy, 264162306a36Sopenharmony_ci enum rtw89_rf_path path) 264262306a36Sopenharmony_ci{ 264362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_init_txpwr_he_tb_defs_a_tbl); 264462306a36Sopenharmony_ci} 264562306a36Sopenharmony_ci 264662306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 264762306a36Sopenharmony_ci enum rtw89_rf_path path) 264862306a36Sopenharmony_ci{ 264962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_dck_defs_a_tbl); 265062306a36Sopenharmony_ci} 265162306a36Sopenharmony_ci 265262306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 265362306a36Sopenharmony_ci enum rtw89_rf_path path) 265462306a36Sopenharmony_ci{ 265562306a36Sopenharmony_ci#define RTW8851B_TSSI_GET_VAL(ptr, idx) \ 265662306a36Sopenharmony_ci({ \ 265762306a36Sopenharmony_ci s8 *__ptr = (ptr); \ 265862306a36Sopenharmony_ci u8 __idx = (idx), __i, __v; \ 265962306a36Sopenharmony_ci u32 __val = 0; \ 266062306a36Sopenharmony_ci for (__i = 0; __i < 4; __i++) { \ 266162306a36Sopenharmony_ci __v = (__ptr[__idx + __i]); \ 266262306a36Sopenharmony_ci __val |= (__v << (8 * __i)); \ 266362306a36Sopenharmony_ci } \ 266462306a36Sopenharmony_ci __val; \ 266562306a36Sopenharmony_ci}) 266662306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 266762306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 266862306a36Sopenharmony_ci u8 ch = chan->channel; 266962306a36Sopenharmony_ci u8 subband = chan->subband_type; 267062306a36Sopenharmony_ci const s8 *thm_up_a = NULL; 267162306a36Sopenharmony_ci const s8 *thm_down_a = NULL; 267262306a36Sopenharmony_ci u8 thermal = 0xff; 267362306a36Sopenharmony_ci s8 thm_ofst[64] = {0}; 267462306a36Sopenharmony_ci u32 tmp = 0; 267562306a36Sopenharmony_ci u8 i, j; 267662306a36Sopenharmony_ci 267762306a36Sopenharmony_ci switch (subband) { 267862306a36Sopenharmony_ci default: 267962306a36Sopenharmony_ci case RTW89_CH_2G: 268062306a36Sopenharmony_ci thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_2ga_p; 268162306a36Sopenharmony_ci thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_2ga_n; 268262306a36Sopenharmony_ci break; 268362306a36Sopenharmony_ci case RTW89_CH_5G_BAND_1: 268462306a36Sopenharmony_ci thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[0]; 268562306a36Sopenharmony_ci thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[0]; 268662306a36Sopenharmony_ci break; 268762306a36Sopenharmony_ci case RTW89_CH_5G_BAND_3: 268862306a36Sopenharmony_ci thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[1]; 268962306a36Sopenharmony_ci thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[1]; 269062306a36Sopenharmony_ci break; 269162306a36Sopenharmony_ci case RTW89_CH_5G_BAND_4: 269262306a36Sopenharmony_ci thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[2]; 269362306a36Sopenharmony_ci thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[2]; 269462306a36Sopenharmony_ci break; 269562306a36Sopenharmony_ci } 269662306a36Sopenharmony_ci 269762306a36Sopenharmony_ci if (path == RF_PATH_A) { 269862306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_A]; 269962306a36Sopenharmony_ci 270062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 270162306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); 270262306a36Sopenharmony_ci 270362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); 270462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); 270562306a36Sopenharmony_ci 270662306a36Sopenharmony_ci if (thermal == 0xff) { 270762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); 270862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); 270962306a36Sopenharmony_ci 271062306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 271162306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 271462306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 271562306a36Sopenharmony_ci R_P0_TSSI_BASE + i, 0x0); 271662306a36Sopenharmony_ci } 271762306a36Sopenharmony_ci 271862306a36Sopenharmony_ci } else { 271962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 272062306a36Sopenharmony_ci thermal); 272162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 272262306a36Sopenharmony_ci thermal); 272362306a36Sopenharmony_ci 272462306a36Sopenharmony_ci i = 0; 272562306a36Sopenharmony_ci for (j = 0; j < 32; j++) 272662306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 272762306a36Sopenharmony_ci -thm_down_a[i++] : 272862306a36Sopenharmony_ci -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; 272962306a36Sopenharmony_ci 273062306a36Sopenharmony_ci i = 1; 273162306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 273262306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 273362306a36Sopenharmony_ci thm_up_a[i++] : 273462306a36Sopenharmony_ci thm_up_a[DELTA_SWINGIDX_SIZE - 1]; 273562306a36Sopenharmony_ci 273662306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 273762306a36Sopenharmony_ci tmp = RTW8851B_TSSI_GET_VAL(thm_ofst, i); 273862306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); 273962306a36Sopenharmony_ci 274062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 274162306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 274262306a36Sopenharmony_ci 0x5c00 + i, tmp); 274362306a36Sopenharmony_ci } 274462306a36Sopenharmony_ci } 274562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); 274662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); 274762306a36Sopenharmony_ci } 274862306a36Sopenharmony_ci#undef RTW8851B_TSSI_GET_VAL 274962306a36Sopenharmony_ci} 275062306a36Sopenharmony_ci 275162306a36Sopenharmony_cistatic void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 275262306a36Sopenharmony_ci enum rtw89_rf_path path) 275362306a36Sopenharmony_ci{ 275462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_dac_gain_defs_a_tbl); 275562306a36Sopenharmony_ci} 275662306a36Sopenharmony_ci 275762306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 275862306a36Sopenharmony_ci enum rtw89_rf_path path) 275962306a36Sopenharmony_ci{ 276062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 276162306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 276262306a36Sopenharmony_ci 276362306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 276462306a36Sopenharmony_ci &rtw8851b_tssi_slope_a_defs_2g_tbl, 276562306a36Sopenharmony_ci &rtw8851b_tssi_slope_a_defs_5g_tbl); 276662306a36Sopenharmony_ci} 276762306a36Sopenharmony_ci 276862306a36Sopenharmony_cistatic void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 276962306a36Sopenharmony_ci enum rtw89_rf_path path, bool all) 277062306a36Sopenharmony_ci{ 277162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 277262306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 277362306a36Sopenharmony_ci 277462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 277562306a36Sopenharmony_ci &rtw8851b_tssi_align_a_2g_defs_tbl, 277662306a36Sopenharmony_ci &rtw8851b_tssi_align_a_5g_defs_tbl); 277762306a36Sopenharmony_ci} 277862306a36Sopenharmony_ci 277962306a36Sopenharmony_cistatic void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 278062306a36Sopenharmony_ci enum rtw89_rf_path path) 278162306a36Sopenharmony_ci{ 278262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_slope_defs_a_tbl); 278362306a36Sopenharmony_ci} 278462306a36Sopenharmony_ci 278562306a36Sopenharmony_cistatic void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 278662306a36Sopenharmony_ci enum rtw89_rf_path path) 278762306a36Sopenharmony_ci{ 278862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_track_defs_a_tbl); 278962306a36Sopenharmony_ci} 279062306a36Sopenharmony_ci 279162306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, 279262306a36Sopenharmony_ci enum rtw89_phy_idx phy, 279362306a36Sopenharmony_ci enum rtw89_rf_path path) 279462306a36Sopenharmony_ci{ 279562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_mv_avg_defs_a_tbl); 279662306a36Sopenharmony_ci} 279762306a36Sopenharmony_ci 279862306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 279962306a36Sopenharmony_ci{ 280062306a36Sopenharmony_ci _tssi_set_tssi_track(rtwdev, phy, RF_PATH_A); 280162306a36Sopenharmony_ci _tssi_set_txagc_offset_mv_avg(rtwdev, phy, RF_PATH_A); 280262306a36Sopenharmony_ci 280362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x0); 280462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0); 280562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x1); 280662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXGA_V1, RR_TXGA_V1_TRK_EN, 0x1); 280762306a36Sopenharmony_ci 280862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 280962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x3); 281062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0); 281162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 281262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 281362306a36Sopenharmony_ci 281462306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = true; 281562306a36Sopenharmony_ci} 281662306a36Sopenharmony_ci 281762306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 281862306a36Sopenharmony_ci{ 281962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0); 282062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 282162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 282262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 282362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1); 282462306a36Sopenharmony_ci 282562306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = false; 282662306a36Sopenharmony_ci} 282762306a36Sopenharmony_ci 282862306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) 282962306a36Sopenharmony_ci{ 283062306a36Sopenharmony_ci switch (ch) { 283162306a36Sopenharmony_ci case 1 ... 2: 283262306a36Sopenharmony_ci return 0; 283362306a36Sopenharmony_ci case 3 ... 5: 283462306a36Sopenharmony_ci return 1; 283562306a36Sopenharmony_ci case 6 ... 8: 283662306a36Sopenharmony_ci return 2; 283762306a36Sopenharmony_ci case 9 ... 11: 283862306a36Sopenharmony_ci return 3; 283962306a36Sopenharmony_ci case 12 ... 13: 284062306a36Sopenharmony_ci return 4; 284162306a36Sopenharmony_ci case 14: 284262306a36Sopenharmony_ci return 5; 284362306a36Sopenharmony_ci } 284462306a36Sopenharmony_ci 284562306a36Sopenharmony_ci return 0; 284662306a36Sopenharmony_ci} 284762306a36Sopenharmony_ci 284862306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31)) 284962306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) 285062306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) 285162306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) 285262306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) 285362306a36Sopenharmony_ci 285462306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 285562306a36Sopenharmony_ci{ 285662306a36Sopenharmony_ci switch (ch) { 285762306a36Sopenharmony_ci case 1 ... 2: 285862306a36Sopenharmony_ci return 0; 285962306a36Sopenharmony_ci case 3 ... 5: 286062306a36Sopenharmony_ci return 1; 286162306a36Sopenharmony_ci case 6 ... 8: 286262306a36Sopenharmony_ci return 2; 286362306a36Sopenharmony_ci case 9 ... 11: 286462306a36Sopenharmony_ci return 3; 286562306a36Sopenharmony_ci case 12 ... 14: 286662306a36Sopenharmony_ci return 4; 286762306a36Sopenharmony_ci case 36 ... 40: 286862306a36Sopenharmony_ci return 5; 286962306a36Sopenharmony_ci case 41 ... 43: 287062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(5); 287162306a36Sopenharmony_ci case 44 ... 48: 287262306a36Sopenharmony_ci return 6; 287362306a36Sopenharmony_ci case 49 ... 51: 287462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 287562306a36Sopenharmony_ci case 52 ... 56: 287662306a36Sopenharmony_ci return 7; 287762306a36Sopenharmony_ci case 57 ... 59: 287862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(7); 287962306a36Sopenharmony_ci case 60 ... 64: 288062306a36Sopenharmony_ci return 8; 288162306a36Sopenharmony_ci case 100 ... 104: 288262306a36Sopenharmony_ci return 9; 288362306a36Sopenharmony_ci case 105 ... 107: 288462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(9); 288562306a36Sopenharmony_ci case 108 ... 112: 288662306a36Sopenharmony_ci return 10; 288762306a36Sopenharmony_ci case 113 ... 115: 288862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 288962306a36Sopenharmony_ci case 116 ... 120: 289062306a36Sopenharmony_ci return 11; 289162306a36Sopenharmony_ci case 121 ... 123: 289262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(11); 289362306a36Sopenharmony_ci case 124 ... 128: 289462306a36Sopenharmony_ci return 12; 289562306a36Sopenharmony_ci case 129 ... 131: 289662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 289762306a36Sopenharmony_ci case 132 ... 136: 289862306a36Sopenharmony_ci return 13; 289962306a36Sopenharmony_ci case 137 ... 139: 290062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(13); 290162306a36Sopenharmony_ci case 140 ... 144: 290262306a36Sopenharmony_ci return 14; 290362306a36Sopenharmony_ci case 149 ... 153: 290462306a36Sopenharmony_ci return 15; 290562306a36Sopenharmony_ci case 154 ... 156: 290662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(15); 290762306a36Sopenharmony_ci case 157 ... 161: 290862306a36Sopenharmony_ci return 16; 290962306a36Sopenharmony_ci case 162 ... 164: 291062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(16); 291162306a36Sopenharmony_ci case 165 ... 169: 291262306a36Sopenharmony_ci return 17; 291362306a36Sopenharmony_ci case 170 ... 172: 291462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(17); 291562306a36Sopenharmony_ci case 173 ... 177: 291662306a36Sopenharmony_ci return 18; 291762306a36Sopenharmony_ci } 291862306a36Sopenharmony_ci 291962306a36Sopenharmony_ci return 0; 292062306a36Sopenharmony_ci} 292162306a36Sopenharmony_ci 292262306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) 292362306a36Sopenharmony_ci{ 292462306a36Sopenharmony_ci switch (ch) { 292562306a36Sopenharmony_ci case 1 ... 8: 292662306a36Sopenharmony_ci return 0; 292762306a36Sopenharmony_ci case 9 ... 14: 292862306a36Sopenharmony_ci return 1; 292962306a36Sopenharmony_ci case 36 ... 48: 293062306a36Sopenharmony_ci return 2; 293162306a36Sopenharmony_ci case 52 ... 64: 293262306a36Sopenharmony_ci return 3; 293362306a36Sopenharmony_ci case 100 ... 112: 293462306a36Sopenharmony_ci return 4; 293562306a36Sopenharmony_ci case 116 ... 128: 293662306a36Sopenharmony_ci return 5; 293762306a36Sopenharmony_ci case 132 ... 144: 293862306a36Sopenharmony_ci return 6; 293962306a36Sopenharmony_ci case 149 ... 177: 294062306a36Sopenharmony_ci return 7; 294162306a36Sopenharmony_ci } 294262306a36Sopenharmony_ci 294362306a36Sopenharmony_ci return 0; 294462306a36Sopenharmony_ci} 294562306a36Sopenharmony_ci 294662306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 294762306a36Sopenharmony_ci enum rtw89_rf_path path) 294862306a36Sopenharmony_ci{ 294962306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 295062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 295162306a36Sopenharmony_ci u32 gidx, gidx_1st, gidx_2nd; 295262306a36Sopenharmony_ci u8 ch = chan->channel; 295362306a36Sopenharmony_ci s8 de_1st; 295462306a36Sopenharmony_ci s8 de_2nd; 295562306a36Sopenharmony_ci s8 val; 295662306a36Sopenharmony_ci 295762306a36Sopenharmony_ci gidx = _tssi_get_ofdm_group(rtwdev, ch); 295862306a36Sopenharmony_ci 295962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 296062306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx); 296162306a36Sopenharmony_ci 296262306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(gidx)) { 296362306a36Sopenharmony_ci gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 296462306a36Sopenharmony_ci gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 296562306a36Sopenharmony_ci de_1st = tssi_info->tssi_mcs[path][gidx_1st]; 296662306a36Sopenharmony_ci de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; 296762306a36Sopenharmony_ci val = (de_1st + de_2nd) / 2; 296862306a36Sopenharmony_ci 296962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 297062306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 297162306a36Sopenharmony_ci path, val, de_1st, de_2nd); 297262306a36Sopenharmony_ci } else { 297362306a36Sopenharmony_ci val = tssi_info->tssi_mcs[path][gidx]; 297462306a36Sopenharmony_ci 297562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 297662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 297762306a36Sopenharmony_ci } 297862306a36Sopenharmony_ci 297962306a36Sopenharmony_ci return val; 298062306a36Sopenharmony_ci} 298162306a36Sopenharmony_ci 298262306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 298362306a36Sopenharmony_ci enum rtw89_rf_path path) 298462306a36Sopenharmony_ci{ 298562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 298662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 298762306a36Sopenharmony_ci u32 tgidx, tgidx_1st, tgidx_2nd; 298862306a36Sopenharmony_ci u8 ch = chan->channel; 298962306a36Sopenharmony_ci s8 tde_1st; 299062306a36Sopenharmony_ci s8 tde_2nd; 299162306a36Sopenharmony_ci s8 val; 299262306a36Sopenharmony_ci 299362306a36Sopenharmony_ci tgidx = _tssi_get_trim_group(rtwdev, ch); 299462306a36Sopenharmony_ci 299562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 299662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 299762306a36Sopenharmony_ci path, tgidx); 299862306a36Sopenharmony_ci 299962306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(tgidx)) { 300062306a36Sopenharmony_ci tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 300162306a36Sopenharmony_ci tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 300262306a36Sopenharmony_ci tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; 300362306a36Sopenharmony_ci tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; 300462306a36Sopenharmony_ci val = (tde_1st + tde_2nd) / 2; 300562306a36Sopenharmony_ci 300662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 300762306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 300862306a36Sopenharmony_ci path, val, tde_1st, tde_2nd); 300962306a36Sopenharmony_ci } else { 301062306a36Sopenharmony_ci val = tssi_info->tssi_trim[path][tgidx]; 301162306a36Sopenharmony_ci 301262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 301362306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 301462306a36Sopenharmony_ci path, val); 301562306a36Sopenharmony_ci } 301662306a36Sopenharmony_ci 301762306a36Sopenharmony_ci return val; 301862306a36Sopenharmony_ci} 301962306a36Sopenharmony_ci 302062306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 302162306a36Sopenharmony_ci{ 302262306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 302362306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 302462306a36Sopenharmony_ci u8 ch = chan->channel; 302562306a36Sopenharmony_ci u8 gidx; 302662306a36Sopenharmony_ci s8 ofdm_de; 302762306a36Sopenharmony_ci s8 trim_de; 302862306a36Sopenharmony_ci s32 val; 302962306a36Sopenharmony_ci u32 i; 303062306a36Sopenharmony_ci 303162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", 303262306a36Sopenharmony_ci phy, ch); 303362306a36Sopenharmony_ci 303462306a36Sopenharmony_ci for (i = RF_PATH_A; i < RTW8851B_TSSI_PATH_NR; i++) { 303562306a36Sopenharmony_ci gidx = _tssi_get_cck_group(rtwdev, ch); 303662306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 303762306a36Sopenharmony_ci val = tssi_info->tssi_cck[i][gidx] + trim_de; 303862306a36Sopenharmony_ci 303962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 304062306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", 304162306a36Sopenharmony_ci i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); 304262306a36Sopenharmony_ci 304362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val); 304462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val); 304562306a36Sopenharmony_ci 304662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 304762306a36Sopenharmony_ci "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", 304862306a36Sopenharmony_ci _tssi_de_cck_long[i], 304962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i], 305062306a36Sopenharmony_ci _TSSI_DE_MASK)); 305162306a36Sopenharmony_ci 305262306a36Sopenharmony_ci ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); 305362306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 305462306a36Sopenharmony_ci val = ofdm_de + trim_de; 305562306a36Sopenharmony_ci 305662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 305762306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", 305862306a36Sopenharmony_ci i, ofdm_de, trim_de); 305962306a36Sopenharmony_ci 306062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val); 306162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val); 306262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val); 306362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val); 306462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val); 306562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val); 306662306a36Sopenharmony_ci 306762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 306862306a36Sopenharmony_ci "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", 306962306a36Sopenharmony_ci _tssi_de_mcs_20m[i], 307062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i], 307162306a36Sopenharmony_ci _TSSI_DE_MASK)); 307262306a36Sopenharmony_ci } 307362306a36Sopenharmony_ci} 307462306a36Sopenharmony_ci 307562306a36Sopenharmony_cistatic void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 307662306a36Sopenharmony_ci{ 307762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 307862306a36Sopenharmony_ci "[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n" 307962306a36Sopenharmony_ci "0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n", 308062306a36Sopenharmony_ci R_TSSI_PA_K1 + (path << 13), 308162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD), 308262306a36Sopenharmony_ci R_TSSI_PA_K2 + (path << 13), 308362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD), 308462306a36Sopenharmony_ci R_P0_TSSI_ALIM1 + (path << 13), 308562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD), 308662306a36Sopenharmony_ci R_P0_TSSI_ALIM3 + (path << 13), 308762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD), 308862306a36Sopenharmony_ci R_TSSI_PA_K5 + (path << 13), 308962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD), 309062306a36Sopenharmony_ci R_P0_TSSI_ALIM2 + (path << 13), 309162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD), 309262306a36Sopenharmony_ci R_P0_TSSI_ALIM4 + (path << 13), 309362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD), 309462306a36Sopenharmony_ci R_TSSI_PA_K8 + (path << 13), 309562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD)); 309662306a36Sopenharmony_ci} 309762306a36Sopenharmony_ci 309862306a36Sopenharmony_cistatic void _tssi_alimentk_done(struct rtw89_dev *rtwdev, 309962306a36Sopenharmony_ci enum rtw89_phy_idx phy, enum rtw89_rf_path path) 310062306a36Sopenharmony_ci{ 310162306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 310262306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 310362306a36Sopenharmony_ci u8 channel = chan->channel; 310462306a36Sopenharmony_ci u8 band; 310562306a36Sopenharmony_ci 310662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 310762306a36Sopenharmony_ci "======>%s phy=%d path=%d\n", __func__, phy, path); 310862306a36Sopenharmony_ci 310962306a36Sopenharmony_ci if (channel >= 1 && channel <= 14) 311062306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 311162306a36Sopenharmony_ci else if (channel >= 36 && channel <= 64) 311262306a36Sopenharmony_ci band = TSSI_ALIMK_5GL; 311362306a36Sopenharmony_ci else if (channel >= 100 && channel <= 144) 311462306a36Sopenharmony_ci band = TSSI_ALIMK_5GM; 311562306a36Sopenharmony_ci else if (channel >= 149 && channel <= 177) 311662306a36Sopenharmony_ci band = TSSI_ALIMK_5GH; 311762306a36Sopenharmony_ci else 311862306a36Sopenharmony_ci band = TSSI_ALIMK_2G; 311962306a36Sopenharmony_ci 312062306a36Sopenharmony_ci if (tssi_info->alignment_done[path][band]) { 312162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD, 312262306a36Sopenharmony_ci tssi_info->alignment_value[path][band][0]); 312362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD, 312462306a36Sopenharmony_ci tssi_info->alignment_value[path][band][1]); 312562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD, 312662306a36Sopenharmony_ci tssi_info->alignment_value[path][band][2]); 312762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD, 312862306a36Sopenharmony_ci tssi_info->alignment_value[path][band][3]); 312962306a36Sopenharmony_ci } 313062306a36Sopenharmony_ci 313162306a36Sopenharmony_ci _tssi_alimentk_dump_result(rtwdev, path); 313262306a36Sopenharmony_ci} 313362306a36Sopenharmony_ci 313462306a36Sopenharmony_cistatic void rtw8851b_by_rate_dpd(struct rtw89_dev *rtwdev) 313562306a36Sopenharmony_ci{ 313662306a36Sopenharmony_ci rtw89_write32_mask(rtwdev, R_AX_PWR_SWING_OTHER_CTRL0, 313762306a36Sopenharmony_ci B_AX_CFIR_BY_RATE_OFF_MASK, 0x21861); 313862306a36Sopenharmony_ci} 313962306a36Sopenharmony_ci 314062306a36Sopenharmony_civoid rtw8851b_dpk_init(struct rtw89_dev *rtwdev) 314162306a36Sopenharmony_ci{ 314262306a36Sopenharmony_ci rtw8851b_by_rate_dpd(rtwdev); 314362306a36Sopenharmony_ci} 314462306a36Sopenharmony_ci 314562306a36Sopenharmony_civoid rtw8851b_aack(struct rtw89_dev *rtwdev) 314662306a36Sopenharmony_ci{ 314762306a36Sopenharmony_ci u32 tmp05, tmpd3, ib[4]; 314862306a36Sopenharmony_ci u32 tmp; 314962306a36Sopenharmony_ci int ret; 315062306a36Sopenharmony_ci int rek; 315162306a36Sopenharmony_ci int i; 315262306a36Sopenharmony_ci 315362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]DO AACK\n"); 315462306a36Sopenharmony_ci 315562306a36Sopenharmony_ci tmp05 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK); 315662306a36Sopenharmony_ci tmpd3 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK); 315762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0x3); 315862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0); 315962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_ST, 0x0); 316062306a36Sopenharmony_ci 316162306a36Sopenharmony_ci for (rek = 0; rek < 4; rek++) { 316262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_AACK, RFREG_MASK, 0x8201e); 316362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_AACK, RFREG_MASK, 0x8201f); 316462306a36Sopenharmony_ci fsleep(100); 316562306a36Sopenharmony_ci 316662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp, 316762306a36Sopenharmony_ci 1, 1000, false, 316862306a36Sopenharmony_ci rtwdev, RF_PATH_A, 0xd0, BIT(16)); 316962306a36Sopenharmony_ci if (ret) 317062306a36Sopenharmony_ci rtw89_warn(rtwdev, "[LCK]AACK timeout\n"); 317162306a36Sopenharmony_ci 317262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCI, RR_VCI_ON, 0x1); 317362306a36Sopenharmony_ci for (i = 0; i < 4; i++) { 317462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCO, RR_VCO_SEL, i); 317562306a36Sopenharmony_ci ib[i] = rtw89_read_rf(rtwdev, RF_PATH_A, RR_IBD, RR_IBD_VAL); 317662306a36Sopenharmony_ci } 317762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCI, RR_VCI_ON, 0x0); 317862306a36Sopenharmony_ci 317962306a36Sopenharmony_ci if (ib[0] != 0 && ib[1] != 0 && ib[2] != 0 && ib[3] != 0) 318062306a36Sopenharmony_ci break; 318162306a36Sopenharmony_ci } 318262306a36Sopenharmony_ci 318362306a36Sopenharmony_ci if (rek != 0) 318462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]AACK rek = %d\n", rek); 318562306a36Sopenharmony_ci 318662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, tmp05); 318762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK, tmpd3); 318862306a36Sopenharmony_ci} 318962306a36Sopenharmony_ci 319062306a36Sopenharmony_cistatic void _lck_keep_thermal(struct rtw89_dev *rtwdev) 319162306a36Sopenharmony_ci{ 319262306a36Sopenharmony_ci struct rtw89_lck_info *lck = &rtwdev->lck; 319362306a36Sopenharmony_ci 319462306a36Sopenharmony_ci lck->thermal[RF_PATH_A] = 319562306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[RF_PATH_A]); 319662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 319762306a36Sopenharmony_ci "[LCK] path=%d thermal=0x%x", RF_PATH_A, lck->thermal[RF_PATH_A]); 319862306a36Sopenharmony_ci} 319962306a36Sopenharmony_ci 320062306a36Sopenharmony_cistatic void rtw8851b_lck(struct rtw89_dev *rtwdev) 320162306a36Sopenharmony_ci{ 320262306a36Sopenharmony_ci u32 tmp05, tmp18, tmpd3; 320362306a36Sopenharmony_ci 320462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]DO LCK\n"); 320562306a36Sopenharmony_ci 320662306a36Sopenharmony_ci tmp05 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK); 320762306a36Sopenharmony_ci tmp18 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 320862306a36Sopenharmony_ci tmpd3 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK); 320962306a36Sopenharmony_ci 321062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0x3); 321162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0); 321262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 321362306a36Sopenharmony_ci 321462306a36Sopenharmony_ci _set_ch(rtwdev, tmp18); 321562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK, tmpd3); 321662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, tmp05); 321762306a36Sopenharmony_ci 321862306a36Sopenharmony_ci _lck_keep_thermal(rtwdev); 321962306a36Sopenharmony_ci} 322062306a36Sopenharmony_ci 322162306a36Sopenharmony_ci#define RTW8851B_LCK_TH 8 322262306a36Sopenharmony_ci 322362306a36Sopenharmony_civoid rtw8851b_lck_track(struct rtw89_dev *rtwdev) 322462306a36Sopenharmony_ci{ 322562306a36Sopenharmony_ci struct rtw89_lck_info *lck = &rtwdev->lck; 322662306a36Sopenharmony_ci u8 cur_thermal; 322762306a36Sopenharmony_ci int delta; 322862306a36Sopenharmony_ci 322962306a36Sopenharmony_ci cur_thermal = 323062306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[RF_PATH_A]); 323162306a36Sopenharmony_ci delta = abs((int)cur_thermal - lck->thermal[RF_PATH_A]); 323262306a36Sopenharmony_ci 323362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 323462306a36Sopenharmony_ci "[LCK] path=%d current thermal=0x%x delta=0x%x\n", 323562306a36Sopenharmony_ci RF_PATH_A, cur_thermal, delta); 323662306a36Sopenharmony_ci 323762306a36Sopenharmony_ci if (delta >= RTW8851B_LCK_TH) { 323862306a36Sopenharmony_ci rtw8851b_aack(rtwdev); 323962306a36Sopenharmony_ci rtw8851b_lck(rtwdev); 324062306a36Sopenharmony_ci } 324162306a36Sopenharmony_ci} 324262306a36Sopenharmony_ci 324362306a36Sopenharmony_civoid rtw8851b_lck_init(struct rtw89_dev *rtwdev) 324462306a36Sopenharmony_ci{ 324562306a36Sopenharmony_ci _lck_keep_thermal(rtwdev); 324662306a36Sopenharmony_ci} 324762306a36Sopenharmony_ci 324862306a36Sopenharmony_civoid rtw8851b_rck(struct rtw89_dev *rtwdev) 324962306a36Sopenharmony_ci{ 325062306a36Sopenharmony_ci _rck(rtwdev, RF_PATH_A); 325162306a36Sopenharmony_ci} 325262306a36Sopenharmony_ci 325362306a36Sopenharmony_civoid rtw8851b_dack(struct rtw89_dev *rtwdev) 325462306a36Sopenharmony_ci{ 325562306a36Sopenharmony_ci _dac_cal(rtwdev, false); 325662306a36Sopenharmony_ci} 325762306a36Sopenharmony_ci 325862306a36Sopenharmony_civoid rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 325962306a36Sopenharmony_ci{ 326062306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 326162306a36Sopenharmony_ci u32 tx_en; 326262306a36Sopenharmony_ci 326362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 326462306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 326562306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 326662306a36Sopenharmony_ci 326762306a36Sopenharmony_ci _iqk_init(rtwdev); 326862306a36Sopenharmony_ci _iqk(rtwdev, phy_idx, false); 326962306a36Sopenharmony_ci 327062306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 327162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 327262306a36Sopenharmony_ci} 327362306a36Sopenharmony_ci 327462306a36Sopenharmony_civoid rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 327562306a36Sopenharmony_ci{ 327662306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 327762306a36Sopenharmony_ci u32 tx_en; 327862306a36Sopenharmony_ci 327962306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 328062306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 328162306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 328262306a36Sopenharmony_ci 328362306a36Sopenharmony_ci _rx_dck(rtwdev, phy_idx, false); 328462306a36Sopenharmony_ci 328562306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 328662306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 328762306a36Sopenharmony_ci} 328862306a36Sopenharmony_ci 328962306a36Sopenharmony_civoid rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 329062306a36Sopenharmony_ci{ 329162306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 329262306a36Sopenharmony_ci u32 tx_en; 329362306a36Sopenharmony_ci 329462306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 329562306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 329662306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 329762306a36Sopenharmony_ci 329862306a36Sopenharmony_ci rtwdev->dpk.is_dpk_enable = true; 329962306a36Sopenharmony_ci rtwdev->dpk.is_dpk_reload_en = false; 330062306a36Sopenharmony_ci _dpk(rtwdev, phy_idx, false); 330162306a36Sopenharmony_ci 330262306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 330362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 330462306a36Sopenharmony_ci} 330562306a36Sopenharmony_ci 330662306a36Sopenharmony_civoid rtw8851b_dpk_track(struct rtw89_dev *rtwdev) 330762306a36Sopenharmony_ci{ 330862306a36Sopenharmony_ci _dpk_track(rtwdev); 330962306a36Sopenharmony_ci} 331062306a36Sopenharmony_ci 331162306a36Sopenharmony_civoid rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool hwtx_en) 331262306a36Sopenharmony_ci{ 331362306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A); 331462306a36Sopenharmony_ci u8 i; 331562306a36Sopenharmony_ci 331662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy); 331762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 331862306a36Sopenharmony_ci 331962306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 332062306a36Sopenharmony_ci 332162306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) { 332262306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 332362306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); 332462306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); 332562306a36Sopenharmony_ci _tssi_set_dck(rtwdev, phy, i); 332662306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 332762306a36Sopenharmony_ci _tssi_set_dac_gain_tbl(rtwdev, phy, i); 332862306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 332962306a36Sopenharmony_ci _tssi_alignment_default(rtwdev, phy, i, true); 333062306a36Sopenharmony_ci _tssi_set_tssi_slope(rtwdev, phy, i); 333162306a36Sopenharmony_ci } 333262306a36Sopenharmony_ci 333362306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 333462306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 333562306a36Sopenharmony_ci 333662306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 333762306a36Sopenharmony_ci} 333862306a36Sopenharmony_ci 333962306a36Sopenharmony_civoid rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 334062306a36Sopenharmony_ci{ 334162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 334262306a36Sopenharmony_ci u8 channel = chan->channel; 334362306a36Sopenharmony_ci u32 i; 334462306a36Sopenharmony_ci 334562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 334662306a36Sopenharmony_ci "======>%s phy=%d channel=%d\n", __func__, phy, channel); 334762306a36Sopenharmony_ci 334862306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 334962306a36Sopenharmony_ci 335062306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) { 335162306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 335262306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 335362306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 335462306a36Sopenharmony_ci _tssi_alignment_default(rtwdev, phy, i, true); 335562306a36Sopenharmony_ci } 335662306a36Sopenharmony_ci 335762306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 335862306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 335962306a36Sopenharmony_ci} 336062306a36Sopenharmony_ci 336162306a36Sopenharmony_cistatic void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev, 336262306a36Sopenharmony_ci enum rtw89_phy_idx phy, bool enable) 336362306a36Sopenharmony_ci{ 336462306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 336562306a36Sopenharmony_ci u8 channel = chan->channel; 336662306a36Sopenharmony_ci 336762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n", 336862306a36Sopenharmony_ci __func__, channel); 336962306a36Sopenharmony_ci 337062306a36Sopenharmony_ci if (enable) 337162306a36Sopenharmony_ci return; 337262306a36Sopenharmony_ci 337362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 337462306a36Sopenharmony_ci "======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x\n", 337562306a36Sopenharmony_ci __func__, 337662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT)); 337762306a36Sopenharmony_ci 337862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0); 337962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 338062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 338162306a36Sopenharmony_ci 338262306a36Sopenharmony_ci _tssi_alimentk_done(rtwdev, phy, RF_PATH_A); 338362306a36Sopenharmony_ci 338462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 338562306a36Sopenharmony_ci "======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x\n", 338662306a36Sopenharmony_ci __func__, 338762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT)); 338862306a36Sopenharmony_ci 338962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 339062306a36Sopenharmony_ci "======> %s SCAN_END\n", __func__); 339162306a36Sopenharmony_ci} 339262306a36Sopenharmony_ci 339362306a36Sopenharmony_civoid rtw8851b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start, 339462306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 339562306a36Sopenharmony_ci{ 339662306a36Sopenharmony_ci if (scan_start) 339762306a36Sopenharmony_ci rtw8851b_tssi_default_txagc(rtwdev, phy_idx, true); 339862306a36Sopenharmony_ci else 339962306a36Sopenharmony_ci rtw8851b_tssi_default_txagc(rtwdev, phy_idx, false); 340062306a36Sopenharmony_ci} 340162306a36Sopenharmony_ci 340262306a36Sopenharmony_cistatic void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 340362306a36Sopenharmony_ci enum rtw89_bandwidth bw, bool dav) 340462306a36Sopenharmony_ci{ 340562306a36Sopenharmony_ci u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; 340662306a36Sopenharmony_ci u32 rf_reg18; 340762306a36Sopenharmony_ci 340862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); 340962306a36Sopenharmony_ci 341062306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); 341162306a36Sopenharmony_ci if (rf_reg18 == INV_RF_DATA) { 341262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 341362306a36Sopenharmony_ci "[RFK]Invalid RF_0x18 for Path-%d\n", path); 341462306a36Sopenharmony_ci return; 341562306a36Sopenharmony_ci } 341662306a36Sopenharmony_ci rf_reg18 &= ~RR_CFGCH_BW; 341762306a36Sopenharmony_ci 341862306a36Sopenharmony_ci switch (bw) { 341962306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_5: 342062306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_10: 342162306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_20: 342262306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M); 342362306a36Sopenharmony_ci break; 342462306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_40: 342562306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M); 342662306a36Sopenharmony_ci break; 342762306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_80: 342862306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M); 342962306a36Sopenharmony_ci break; 343062306a36Sopenharmony_ci default: 343162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n"); 343262306a36Sopenharmony_ci } 343362306a36Sopenharmony_ci 343462306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | 343562306a36Sopenharmony_ci RR_CFGCH_BW2) & RFREG_MASK; 343662306a36Sopenharmony_ci rf_reg18 |= RR_CFGCH_BW2; 343762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); 343862306a36Sopenharmony_ci 343962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n", 344062306a36Sopenharmony_ci bw, path, reg18_addr, 344162306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); 344262306a36Sopenharmony_ci} 344362306a36Sopenharmony_ci 344462306a36Sopenharmony_cistatic void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 344562306a36Sopenharmony_ci enum rtw89_bandwidth bw) 344662306a36Sopenharmony_ci{ 344762306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_A, bw, true); 344862306a36Sopenharmony_ci _bw_setting(rtwdev, RF_PATH_A, bw, false); 344962306a36Sopenharmony_ci} 345062306a36Sopenharmony_ci 345162306a36Sopenharmony_cistatic bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val) 345262306a36Sopenharmony_ci{ 345362306a36Sopenharmony_ci u32 bak; 345462306a36Sopenharmony_ci u32 tmp; 345562306a36Sopenharmony_ci int ret; 345662306a36Sopenharmony_ci 345762306a36Sopenharmony_ci bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK); 345862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1); 345962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val); 346062306a36Sopenharmony_ci 346162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000, 346262306a36Sopenharmony_ci false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY); 346362306a36Sopenharmony_ci if (ret) 346462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n"); 346562306a36Sopenharmony_ci 346662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak); 346762306a36Sopenharmony_ci 346862306a36Sopenharmony_ci return !!ret; 346962306a36Sopenharmony_ci} 347062306a36Sopenharmony_ci 347162306a36Sopenharmony_cistatic void _lck_check(struct rtw89_dev *rtwdev) 347262306a36Sopenharmony_ci{ 347362306a36Sopenharmony_ci u32 tmp; 347462306a36Sopenharmony_ci 347562306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 347662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n"); 347762306a36Sopenharmony_ci 347862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1); 347962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0); 348062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1); 348162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0); 348262306a36Sopenharmony_ci } 348362306a36Sopenharmony_ci 348462306a36Sopenharmony_ci udelay(10); 348562306a36Sopenharmony_ci 348662306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 348762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n"); 348862306a36Sopenharmony_ci 348962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 349062306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 349162306a36Sopenharmony_ci _set_s0_arfc18(rtwdev, tmp); 349262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); 349362306a36Sopenharmony_ci } 349462306a36Sopenharmony_ci 349562306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) { 349662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n"); 349762306a36Sopenharmony_ci 349862306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK); 349962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp); 350062306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK); 350162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp); 350262306a36Sopenharmony_ci 350362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1); 350462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0); 350562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3); 350662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0); 350762306a36Sopenharmony_ci 350862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 350962306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 351062306a36Sopenharmony_ci _set_s0_arfc18(rtwdev, tmp); 351162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); 351262306a36Sopenharmony_ci 351362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n", 351462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK), 351562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK)); 351662306a36Sopenharmony_ci } 351762306a36Sopenharmony_ci} 351862306a36Sopenharmony_ci 351962306a36Sopenharmony_cistatic void _set_ch(struct rtw89_dev *rtwdev, u32 val) 352062306a36Sopenharmony_ci{ 352162306a36Sopenharmony_ci bool timeout; 352262306a36Sopenharmony_ci 352362306a36Sopenharmony_ci timeout = _set_s0_arfc18(rtwdev, val); 352462306a36Sopenharmony_ci if (!timeout) 352562306a36Sopenharmony_ci _lck_check(rtwdev); 352662306a36Sopenharmony_ci} 352762306a36Sopenharmony_ci 352862306a36Sopenharmony_cistatic void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 352962306a36Sopenharmony_ci u8 central_ch, bool dav) 353062306a36Sopenharmony_ci{ 353162306a36Sopenharmony_ci u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1; 353262306a36Sopenharmony_ci bool is_2g_ch = central_ch <= 14; 353362306a36Sopenharmony_ci u32 rf_reg18; 353462306a36Sopenharmony_ci 353562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__); 353662306a36Sopenharmony_ci 353762306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK); 353862306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | 353962306a36Sopenharmony_ci RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH); 354062306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch); 354162306a36Sopenharmony_ci 354262306a36Sopenharmony_ci if (!is_2g_ch) 354362306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) | 354462306a36Sopenharmony_ci FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G); 354562306a36Sopenharmony_ci 354662306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN | 354762306a36Sopenharmony_ci RR_CFGCH_BW2) & RFREG_MASK; 354862306a36Sopenharmony_ci rf_reg18 |= RR_CFGCH_BW2; 354962306a36Sopenharmony_ci 355062306a36Sopenharmony_ci if (path == RF_PATH_A && dav) 355162306a36Sopenharmony_ci _set_ch(rtwdev, rf_reg18); 355262306a36Sopenharmony_ci else 355362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18); 355462306a36Sopenharmony_ci 355562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0); 355662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1); 355762306a36Sopenharmony_ci 355862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 355962306a36Sopenharmony_ci "[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n", 356062306a36Sopenharmony_ci central_ch, path, reg18_addr, 356162306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK)); 356262306a36Sopenharmony_ci} 356362306a36Sopenharmony_ci 356462306a36Sopenharmony_cistatic void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch) 356562306a36Sopenharmony_ci{ 356662306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_A, central_ch, true); 356762306a36Sopenharmony_ci _ch_setting(rtwdev, RF_PATH_A, central_ch, false); 356862306a36Sopenharmony_ci} 356962306a36Sopenharmony_ci 357062306a36Sopenharmony_cistatic void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw, 357162306a36Sopenharmony_ci enum rtw89_rf_path path) 357262306a36Sopenharmony_ci{ 357362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1); 357462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12); 357562306a36Sopenharmony_ci 357662306a36Sopenharmony_ci if (bw == RTW89_CHANNEL_WIDTH_20) 357762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b); 357862306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_40) 357962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13); 358062306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_80) 358162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb); 358262306a36Sopenharmony_ci else 358362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3); 358462306a36Sopenharmony_ci 358562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path, 358662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB)); 358762306a36Sopenharmony_ci 358862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0); 358962306a36Sopenharmony_ci} 359062306a36Sopenharmony_ci 359162306a36Sopenharmony_cistatic void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 359262306a36Sopenharmony_ci enum rtw89_bandwidth bw) 359362306a36Sopenharmony_ci{ 359462306a36Sopenharmony_ci u8 kpath, path; 359562306a36Sopenharmony_ci 359662306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 359762306a36Sopenharmony_ci 359862306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8851B; path++) { 359962306a36Sopenharmony_ci if (!(kpath & BIT(path))) 360062306a36Sopenharmony_ci continue; 360162306a36Sopenharmony_ci 360262306a36Sopenharmony_ci _set_rxbb_bw(rtwdev, bw, path); 360362306a36Sopenharmony_ci } 360462306a36Sopenharmony_ci} 360562306a36Sopenharmony_ci 360662306a36Sopenharmony_cistatic void rtw8851b_ctrl_bw_ch(struct rtw89_dev *rtwdev, 360762306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 central_ch, 360862306a36Sopenharmony_ci enum rtw89_band band, enum rtw89_bandwidth bw) 360962306a36Sopenharmony_ci{ 361062306a36Sopenharmony_ci _ctrl_ch(rtwdev, central_ch); 361162306a36Sopenharmony_ci _ctrl_bw(rtwdev, phy, bw); 361262306a36Sopenharmony_ci _rxbb_bw(rtwdev, phy, bw); 361362306a36Sopenharmony_ci} 361462306a36Sopenharmony_ci 361562306a36Sopenharmony_civoid rtw8851b_set_channel_rf(struct rtw89_dev *rtwdev, 361662306a36Sopenharmony_ci const struct rtw89_chan *chan, 361762306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 361862306a36Sopenharmony_ci{ 361962306a36Sopenharmony_ci rtw8851b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type, 362062306a36Sopenharmony_ci chan->band_width); 362162306a36Sopenharmony_ci} 3622