162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2019-2022 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "coex.h" 662306a36Sopenharmony_ci#include "debug.h" 762306a36Sopenharmony_ci#include "phy.h" 862306a36Sopenharmony_ci#include "reg.h" 962306a36Sopenharmony_ci#include "rtw8852c.h" 1062306a36Sopenharmony_ci#include "rtw8852c_rfk.h" 1162306a36Sopenharmony_ci#include "rtw8852c_rfk_table.h" 1262306a36Sopenharmony_ci#include "rtw8852c_table.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistruct rxck_def { 1562306a36Sopenharmony_ci u32 ctl; 1662306a36Sopenharmony_ci u32 en; 1762306a36Sopenharmony_ci u32 bw0; 1862306a36Sopenharmony_ci u32 bw1; 1962306a36Sopenharmony_ci u32 mul; 2062306a36Sopenharmony_ci u32 lp; 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci#define _TSSI_DE_MASK GENMASK(21, 12) 2462306a36Sopenharmony_cistatic const u32 _tssi_de_cck_long[RF_PATH_NUM_8852C] = {0x5858, 0x7858}; 2562306a36Sopenharmony_cistatic const u32 _tssi_de_cck_short[RF_PATH_NUM_8852C] = {0x5860, 0x7860}; 2662306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8852C] = {0x5838, 0x7838}; 2762306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8852C] = {0x5840, 0x7840}; 2862306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8852C] = {0x5848, 0x7848}; 2962306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8852C] = {0x5850, 0x7850}; 3062306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8852C] = {0x5828, 0x7828}; 3162306a36Sopenharmony_cistatic const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8852C] = {0x5830, 0x7830}; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic const u32 rtw8852c_backup_bb_regs[] = { 3462306a36Sopenharmony_ci 0x8120, 0xc0d4, 0xc0d8, 0xc0e8, 0x8220, 0xc1d4, 0xc1d8, 0xc1e8 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic const u32 rtw8852c_backup_rf_regs[] = { 3862306a36Sopenharmony_ci 0xdf, 0x5f, 0x8f, 0x97, 0xa3, 0x5, 0x10005 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852c_backup_bb_regs) 4262306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852c_backup_rf_regs) 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#define RXK_GROUP_NR 4 4562306a36Sopenharmony_cistatic const u32 _rxk_a6_idxrxgain[RXK_GROUP_NR] = {0x190, 0x196, 0x290, 0x316}; 4662306a36Sopenharmony_cistatic const u32 _rxk_a6_idxattc2[RXK_GROUP_NR] = {0x00, 0x0, 0x00, 0x00}; 4762306a36Sopenharmony_cistatic const u32 _rxk_a_idxrxgain[RXK_GROUP_NR] = {0x190, 0x198, 0x310, 0x318}; 4862306a36Sopenharmony_cistatic const u32 _rxk_a_idxattc2[RXK_GROUP_NR] = {0x00, 0x00, 0x00, 0x00}; 4962306a36Sopenharmony_cistatic const u32 _rxk_g_idxrxgain[RXK_GROUP_NR] = {0x252, 0x26c, 0x350, 0x360}; 5062306a36Sopenharmony_cistatic const u32 _rxk_g_idxattc2[RXK_GROUP_NR] = {0x00, 0x07, 0x00, 0x3}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci#define TXK_GROUP_NR 3 5362306a36Sopenharmony_cistatic const u32 _txk_a6_power_range[TXK_GROUP_NR] = {0x0, 0x0, 0x0}; 5462306a36Sopenharmony_cistatic const u32 _txk_a6_track_range[TXK_GROUP_NR] = {0x6, 0x7, 0x7}; 5562306a36Sopenharmony_cistatic const u32 _txk_a6_gain_bb[TXK_GROUP_NR] = {0x12, 0x09, 0x0e}; 5662306a36Sopenharmony_cistatic const u32 _txk_a6_itqt[TXK_GROUP_NR] = {0x12, 0x12, 0x12}; 5762306a36Sopenharmony_cistatic const u32 _txk_a_power_range[TXK_GROUP_NR] = {0x0, 0x0, 0x0}; 5862306a36Sopenharmony_cistatic const u32 _txk_a_track_range[TXK_GROUP_NR] = {0x5, 0x6, 0x7}; 5962306a36Sopenharmony_cistatic const u32 _txk_a_gain_bb[TXK_GROUP_NR] = {0x12, 0x09, 0x0e}; 6062306a36Sopenharmony_cistatic const u32 _txk_a_itqt[TXK_GROUP_NR] = {0x12, 0x12, 0x12}; 6162306a36Sopenharmony_cistatic const u32 _txk_g_power_range[TXK_GROUP_NR] = {0x0, 0x0, 0x0}; 6262306a36Sopenharmony_cistatic const u32 _txk_g_track_range[TXK_GROUP_NR] = {0x5, 0x6, 0x6}; 6362306a36Sopenharmony_cistatic const u32 _txk_g_gain_bb[TXK_GROUP_NR] = {0x0e, 0x0a, 0x0e}; 6462306a36Sopenharmony_cistatic const u32 _txk_g_itqt[TXK_GROUP_NR] = { 0x12, 0x12, 0x12}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistatic const u32 dpk_par_regs[RTW89_DPK_RF_PATH][4] = { 6762306a36Sopenharmony_ci {0x8190, 0x8194, 0x8198, 0x81a4}, 6862306a36Sopenharmony_ci {0x81a8, 0x81c4, 0x81c8, 0x81e8}, 6962306a36Sopenharmony_ci}; 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_cistatic const u8 _dck_addr_bs[RF_PATH_NUM_8852C] = {0x0, 0x10}; 7262306a36Sopenharmony_cistatic const u8 _dck_addr[RF_PATH_NUM_8852C] = {0xc, 0x1c}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_cistatic const struct rxck_def _ck480M = {0x8, 0x2, 0x3, 0xf, 0x0, 0x9}; 7562306a36Sopenharmony_cistatic const struct rxck_def _ck960M = {0x8, 0x2, 0x2, 0x8, 0x0, 0x9}; 7662306a36Sopenharmony_cistatic const struct rxck_def _ck1920M = {0x8, 0x0, 0x2, 0x4, 0x6, 0x9}; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x, PHY%d\n", 8162306a36Sopenharmony_ci rtwdev->dbcc_en, phy_idx); 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci if (!rtwdev->dbcc_en) 8462306a36Sopenharmony_ci return RF_AB; 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci if (phy_idx == RTW89_PHY_0) 8762306a36Sopenharmony_ci return RF_A; 8862306a36Sopenharmony_ci else 8962306a36Sopenharmony_ci return RF_B; 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci u32 i; 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 9762306a36Sopenharmony_ci backup_bb_reg_val[i] = 9862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, rtw8852c_backup_bb_regs[i], 9962306a36Sopenharmony_ci MASKDWORD); 10062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 10162306a36Sopenharmony_ci "[IQK]backup bb reg : %x, value =%x\n", 10262306a36Sopenharmony_ci rtw8852c_backup_bb_regs[i], backup_bb_reg_val[i]); 10362306a36Sopenharmony_ci } 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], 10762306a36Sopenharmony_ci u8 rf_path) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci u32 i; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 11262306a36Sopenharmony_ci backup_rf_reg_val[i] = 11362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, rf_path, 11462306a36Sopenharmony_ci rtw8852c_backup_rf_regs[i], RFREG_MASK); 11562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 11662306a36Sopenharmony_ci "[IQK]backup rf S%d reg : %x, value =%x\n", rf_path, 11762306a36Sopenharmony_ci rtw8852c_backup_rf_regs[i], backup_rf_reg_val[i]); 11862306a36Sopenharmony_ci } 11962306a36Sopenharmony_ci} 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) 12262306a36Sopenharmony_ci{ 12362306a36Sopenharmony_ci u32 i; 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 12662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, rtw8852c_backup_bb_regs[i], 12762306a36Sopenharmony_ci MASKDWORD, backup_bb_reg_val[i]); 12862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 12962306a36Sopenharmony_ci "[IQK]restore bb reg : %x, value =%x\n", 13062306a36Sopenharmony_ci rtw8852c_backup_bb_regs[i], backup_bb_reg_val[i]); 13162306a36Sopenharmony_ci } 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], 13562306a36Sopenharmony_ci u8 rf_path) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci u32 i; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 14062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, rf_path, rtw8852c_backup_rf_regs[i], 14162306a36Sopenharmony_ci RFREG_MASK, backup_rf_reg_val[i]); 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 14462306a36Sopenharmony_ci "[IQK]restore rf S%d reg: %x, value =%x\n", rf_path, 14562306a36Sopenharmony_ci rtw8852c_backup_rf_regs[i], backup_rf_reg_val[i]); 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci} 14862306a36Sopenharmony_ci 14962306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) 15062306a36Sopenharmony_ci{ 15162306a36Sopenharmony_ci u8 path; 15262306a36Sopenharmony_ci u32 rf_mode; 15362306a36Sopenharmony_ci int ret; 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci for (path = 0; path < RF_PATH_MAX; path++) { 15662306a36Sopenharmony_ci if (!(kpath & BIT(path))) 15762306a36Sopenharmony_ci continue; 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, rf_mode != 2, 16062306a36Sopenharmony_ci 2, 5000, false, rtwdev, path, 0x00, 16162306a36Sopenharmony_ci RR_MOD_MASK); 16262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 16362306a36Sopenharmony_ci "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", 16462306a36Sopenharmony_ci path, ret); 16562306a36Sopenharmony_ci } 16662306a36Sopenharmony_ci} 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev) 16962306a36Sopenharmony_ci{ 17062306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 17162306a36Sopenharmony_ci u8 i; 17262306a36Sopenharmony_ci u8 t; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 17562306a36Sopenharmony_ci "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", 17662306a36Sopenharmony_ci dack->addck_d[0][0], dack->addck_d[0][1]); 17762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 17862306a36Sopenharmony_ci "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n", 17962306a36Sopenharmony_ci dack->addck_d[1][0], dack->addck_d[1][1]); 18062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 18162306a36Sopenharmony_ci "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", 18262306a36Sopenharmony_ci dack->dadck_d[0][0], dack->dadck_d[0][1]); 18362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 18462306a36Sopenharmony_ci "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n", 18562306a36Sopenharmony_ci dack->dadck_d[1][0], dack->dadck_d[1][1]); 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 18862306a36Sopenharmony_ci "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", 18962306a36Sopenharmony_ci dack->biask_d[0][0], dack->biask_d[0][1]); 19062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 19162306a36Sopenharmony_ci "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n", 19262306a36Sopenharmony_ci dack->biask_d[1][0], dack->biask_d[1][1]); 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); 19562306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 19662306a36Sopenharmony_ci t = dack->msbk_d[0][0][i]; 19762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 19862306a36Sopenharmony_ci } 19962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); 20062306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 20162306a36Sopenharmony_ci t = dack->msbk_d[0][1][i]; 20262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 20362306a36Sopenharmony_ci } 20462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n"); 20562306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 20662306a36Sopenharmony_ci t = dack->msbk_d[1][0][i]; 20762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 20862306a36Sopenharmony_ci } 20962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n"); 21062306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 21162306a36Sopenharmony_ci t = dack->msbk_d[1][1][i]; 21262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 21362306a36Sopenharmony_ci } 21462306a36Sopenharmony_ci} 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev) 21762306a36Sopenharmony_ci{ 21862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0); 22162306a36Sopenharmony_ci dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, 22262306a36Sopenharmony_ci B_ADDCKR0_A0); 22362306a36Sopenharmony_ci dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, 22462306a36Sopenharmony_ci B_ADDCKR0_A1); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x0); 22762306a36Sopenharmony_ci dack->addck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, 22862306a36Sopenharmony_ci B_ADDCKR1_A0); 22962306a36Sopenharmony_ci dack->addck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR1, 23062306a36Sopenharmony_ci B_ADDCKR1_A1); 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev) 23462306a36Sopenharmony_ci{ 23562306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL1, 23862306a36Sopenharmony_ci dack->addck_d[0][0]); 23962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL0, 24062306a36Sopenharmony_ci dack->addck_d[0][1]); 24162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x3); 24262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL1, 24362306a36Sopenharmony_ci dack->addck_d[1][0]); 24462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RL0, 24562306a36Sopenharmony_ci dack->addck_d[1][1]); 24662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1_RL, B_ADDCK1_RLS, 0x3); 24762306a36Sopenharmony_ci} 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev) 25062306a36Sopenharmony_ci{ 25162306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 25262306a36Sopenharmony_ci u8 i; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1); 25562306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 25662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i); 25762306a36Sopenharmony_ci dack->msbk_d[0][0][i] = rtw89_phy_read32_mask(rtwdev, 25862306a36Sopenharmony_ci R_DACK_S0P2, 25962306a36Sopenharmony_ci B_DACK_S0M0); 26062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i); 26162306a36Sopenharmony_ci dack->msbk_d[0][1][i] = rtw89_phy_read32_mask(rtwdev, 26262306a36Sopenharmony_ci R_DACK_S0P3, 26362306a36Sopenharmony_ci B_DACK_S0M1); 26462306a36Sopenharmony_ci } 26562306a36Sopenharmony_ci dack->biask_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, 26662306a36Sopenharmony_ci B_DACK_BIAS00); 26762306a36Sopenharmony_ci dack->biask_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, 26862306a36Sopenharmony_ci B_DACK_BIAS01); 26962306a36Sopenharmony_ci dack->dadck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, 27062306a36Sopenharmony_ci B_DACK_DADCK00); 27162306a36Sopenharmony_ci dack->dadck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, 27262306a36Sopenharmony_ci B_DACK_DADCK01); 27362306a36Sopenharmony_ci} 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cistatic void _dack_backup_s1(struct rtw89_dev *rtwdev) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 27862306a36Sopenharmony_ci u8 i; 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x1); 28162306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 28262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK10, B_DACK10, i); 28362306a36Sopenharmony_ci dack->msbk_d[1][0][i] = rtw89_phy_read32_mask(rtwdev, 28462306a36Sopenharmony_ci R_DACK10S, 28562306a36Sopenharmony_ci B_DACK10S); 28662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK11, B_DACK11, i); 28762306a36Sopenharmony_ci dack->msbk_d[1][1][i] = rtw89_phy_read32_mask(rtwdev, 28862306a36Sopenharmony_ci R_DACK11S, 28962306a36Sopenharmony_ci B_DACK11S); 29062306a36Sopenharmony_ci } 29162306a36Sopenharmony_ci dack->biask_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS10, 29262306a36Sopenharmony_ci B_DACK_BIAS10); 29362306a36Sopenharmony_ci dack->biask_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS11, 29462306a36Sopenharmony_ci B_DACK_BIAS11); 29562306a36Sopenharmony_ci dack->dadck_d[1][0] = rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK10, 29662306a36Sopenharmony_ci B_DACK_DADCK10); 29762306a36Sopenharmony_ci dack->dadck_d[1][1] = rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK11, 29862306a36Sopenharmony_ci B_DACK_DADCK11); 29962306a36Sopenharmony_ci} 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_cistatic void _dack_reload_by_path(struct rtw89_dev *rtwdev, 30262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 index) 30362306a36Sopenharmony_ci{ 30462306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 30562306a36Sopenharmony_ci u32 idx_offset, path_offset; 30662306a36Sopenharmony_ci u32 val32, offset, addr; 30762306a36Sopenharmony_ci u8 i; 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci idx_offset = (index == 0 ? 0 : 0x14); 31062306a36Sopenharmony_ci path_offset = (path == RF_PATH_A ? 0 : 0x28); 31162306a36Sopenharmony_ci offset = idx_offset + path_offset; 31262306a36Sopenharmony_ci 31362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_dack_reload_defs_tbl); 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_ci /* msbk_d: 15/14/13/12 */ 31662306a36Sopenharmony_ci val32 = 0x0; 31762306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 31862306a36Sopenharmony_ci val32 |= dack->msbk_d[path][index][i + 12] << (i * 8); 31962306a36Sopenharmony_ci addr = 0xc200 + offset; 32062306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, addr, val32); 32162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", addr, 32262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, addr, MASKDWORD)); 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci /* msbk_d: 11/10/9/8 */ 32562306a36Sopenharmony_ci val32 = 0x0; 32662306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 32762306a36Sopenharmony_ci val32 |= dack->msbk_d[path][index][i + 8] << (i * 8); 32862306a36Sopenharmony_ci addr = 0xc204 + offset; 32962306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, addr, val32); 33062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", addr, 33162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, addr, MASKDWORD)); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci /* msbk_d: 7/6/5/4 */ 33462306a36Sopenharmony_ci val32 = 0x0; 33562306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 33662306a36Sopenharmony_ci val32 |= dack->msbk_d[path][index][i + 4] << (i * 8); 33762306a36Sopenharmony_ci addr = 0xc208 + offset; 33862306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, addr, val32); 33962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", addr, 34062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, addr, MASKDWORD)); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci /* msbk_d: 3/2/1/0 */ 34362306a36Sopenharmony_ci val32 = 0x0; 34462306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 34562306a36Sopenharmony_ci val32 |= dack->msbk_d[path][index][i] << (i * 8); 34662306a36Sopenharmony_ci addr = 0xc20c + offset; 34762306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, addr, val32); 34862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", addr, 34962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, addr, MASKDWORD)); 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci /* dadak_d/biask_d */ 35262306a36Sopenharmony_ci val32 = (dack->biask_d[path][index] << 22) | 35362306a36Sopenharmony_ci (dack->dadck_d[path][index] << 14); 35462306a36Sopenharmony_ci addr = 0xc210 + offset; 35562306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, addr, val32); 35662306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr, BIT(0)); 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistatic void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 36062306a36Sopenharmony_ci{ 36162306a36Sopenharmony_ci u8 i; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci for (i = 0; i < 2; i++) 36462306a36Sopenharmony_ci _dack_reload_by_path(rtwdev, path, i); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 37062306a36Sopenharmony_ci u32 val; 37162306a36Sopenharmony_ci int ret; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci /* S0 */ 37462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x1); 37562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x1); 37662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x0); 37762306a36Sopenharmony_ci fsleep(1); 37862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 38162306a36Sopenharmony_ci 1, 10000, false, rtwdev, 0xc0fc, BIT(0)); 38262306a36Sopenharmony_ci if (ret) { 38362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); 38462306a36Sopenharmony_ci dack->addck_timeout[0] = true; 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x0); 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci /* S1 */ 39062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_RST, 0x1); 39162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_EN, 0x1); 39262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_EN, 0x0); 39362306a36Sopenharmony_ci udelay(1); 39462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1, 0x1); 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 39762306a36Sopenharmony_ci 1, 10000, false, rtwdev, 0xc1fc, BIT(0)); 39862306a36Sopenharmony_ci if (ret) { 39962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n"); 40062306a36Sopenharmony_ci dack->addck_timeout[0] = true; 40162306a36Sopenharmony_ci } 40262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADDCK1, B_ADDCK1_RST, 0x0); 40362306a36Sopenharmony_ci} 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_cistatic void _dack_reset(struct rtw89_dev *rtwdev, u8 path) 40662306a36Sopenharmony_ci{ 40762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 40862306a36Sopenharmony_ci &rtw8852c_dack_reset_defs_a_tbl, 40962306a36Sopenharmony_ci &rtw8852c_dack_reset_defs_b_tbl); 41062306a36Sopenharmony_ci} 41162306a36Sopenharmony_ci 41262306a36Sopenharmony_cienum adc_ck { 41362306a36Sopenharmony_ci ADC_NA = 0, 41462306a36Sopenharmony_ci ADC_480M = 1, 41562306a36Sopenharmony_ci ADC_960M = 2, 41662306a36Sopenharmony_ci ADC_1920M = 3, 41762306a36Sopenharmony_ci}; 41862306a36Sopenharmony_ci 41962306a36Sopenharmony_cienum dac_ck { 42062306a36Sopenharmony_ci DAC_40M = 0, 42162306a36Sopenharmony_ci DAC_80M = 1, 42262306a36Sopenharmony_ci DAC_120M = 2, 42362306a36Sopenharmony_ci DAC_160M = 3, 42462306a36Sopenharmony_ci DAC_240M = 4, 42562306a36Sopenharmony_ci DAC_320M = 5, 42662306a36Sopenharmony_ci DAC_480M = 6, 42762306a36Sopenharmony_ci DAC_960M = 7, 42862306a36Sopenharmony_ci}; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_cienum rf_mode { 43162306a36Sopenharmony_ci RF_SHUT_DOWN = 0x0, 43262306a36Sopenharmony_ci RF_STANDBY = 0x1, 43362306a36Sopenharmony_ci RF_TX = 0x2, 43462306a36Sopenharmony_ci RF_RX = 0x3, 43562306a36Sopenharmony_ci RF_TXIQK = 0x4, 43662306a36Sopenharmony_ci RF_DPK = 0x5, 43762306a36Sopenharmony_ci RF_RXK1 = 0x6, 43862306a36Sopenharmony_ci RF_RXK2 = 0x7, 43962306a36Sopenharmony_ci}; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_cistatic void rtw8852c_txck_force(struct rtw89_dev *rtwdev, u8 path, bool force, 44262306a36Sopenharmony_ci enum dac_ck ck) 44362306a36Sopenharmony_ci{ 44462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x0); 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci if (!force) 44762306a36Sopenharmony_ci return; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_VAL, ck); 45062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x1); 45162306a36Sopenharmony_ci} 45262306a36Sopenharmony_ci 45362306a36Sopenharmony_cistatic void rtw8852c_rxck_force(struct rtw89_dev *rtwdev, u8 path, bool force, 45462306a36Sopenharmony_ci enum adc_ck ck) 45562306a36Sopenharmony_ci{ 45662306a36Sopenharmony_ci const struct rxck_def *def; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x0); 45962306a36Sopenharmony_ci 46062306a36Sopenharmony_ci if (!force) 46162306a36Sopenharmony_ci return; 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_VAL, ck); 46462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x1); 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ci switch (ck) { 46762306a36Sopenharmony_ci case ADC_480M: 46862306a36Sopenharmony_ci def = &_ck480M; 46962306a36Sopenharmony_ci break; 47062306a36Sopenharmony_ci case ADC_960M: 47162306a36Sopenharmony_ci def = &_ck960M; 47262306a36Sopenharmony_ci break; 47362306a36Sopenharmony_ci case ADC_1920M: 47462306a36Sopenharmony_ci default: 47562306a36Sopenharmony_ci def = &_ck1920M; 47662306a36Sopenharmony_ci break; 47762306a36Sopenharmony_ci } 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_CTL, def->ctl); 48062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_EN, def->en); 48162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, def->bw0); 48262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, def->bw1); 48362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK | (path << 8), B_DRCK_MUL, def->mul); 48462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADCMOD | (path << 8), B_ADCMOD_LP, def->lp); 48562306a36Sopenharmony_ci} 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_cistatic bool _check_dack_done(struct rtw89_dev *rtwdev, bool s0) 48862306a36Sopenharmony_ci{ 48962306a36Sopenharmony_ci if (s0) { 49062306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 || 49162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0 || 49262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 || 49362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0) 49462306a36Sopenharmony_ci return false; 49562306a36Sopenharmony_ci } else { 49662306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DACK_S1P0, B_DACK_S1P0_OK) == 0 || 49762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S1P1, B_DACK_S1P1_OK) == 0 || 49862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S1P2, B_DACK_S1P2_OK) == 0 || 49962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DACK_S1P3, B_DACK_S1P3_OK) == 0) 50062306a36Sopenharmony_ci return false; 50162306a36Sopenharmony_ci } 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_ci return true; 50462306a36Sopenharmony_ci} 50562306a36Sopenharmony_ci 50662306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev) 50762306a36Sopenharmony_ci{ 50862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 50962306a36Sopenharmony_ci bool done; 51062306a36Sopenharmony_ci int ret; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, RF_PATH_A, true, DAC_160M); 51362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_dack_defs_s0_tbl); 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci _dack_reset(rtwdev, RF_PATH_A); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x1); 51862306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_check_dack_done, done, done, 51962306a36Sopenharmony_ci 1, 10000, false, rtwdev, true); 52062306a36Sopenharmony_ci if (ret) { 52162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DACK timeout\n"); 52262306a36Sopenharmony_ci dack->msbk_timeout[0] = true; 52362306a36Sopenharmony_ci } 52462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x0); 52562306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, RF_PATH_A, false, DAC_960M); 52662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n"); 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci _dack_backup_s0(rtwdev); 52962306a36Sopenharmony_ci _dack_reload(rtwdev, RF_PATH_A); 53062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0); 53162306a36Sopenharmony_ci} 53262306a36Sopenharmony_ci 53362306a36Sopenharmony_cistatic void _dack_s1(struct rtw89_dev *rtwdev) 53462306a36Sopenharmony_ci{ 53562306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 53662306a36Sopenharmony_ci bool done; 53762306a36Sopenharmony_ci int ret; 53862306a36Sopenharmony_ci 53962306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, RF_PATH_B, true, DAC_160M); 54062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_dack_defs_s1_tbl); 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci _dack_reset(rtwdev, RF_PATH_B); 54362306a36Sopenharmony_ci 54462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x1); 54562306a36Sopenharmony_ci ret = read_poll_timeout_atomic(_check_dack_done, done, done, 54662306a36Sopenharmony_ci 1, 10000, false, rtwdev, false); 54762306a36Sopenharmony_ci if (ret) { 54862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DACK timeout\n"); 54962306a36Sopenharmony_ci dack->msbk_timeout[0] = true; 55062306a36Sopenharmony_ci } 55162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DACK1_K, B_DACK1_EN, 0x0); 55262306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, RF_PATH_B, false, DAC_960M); 55362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n"); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci _dack_backup_s1(rtwdev); 55662306a36Sopenharmony_ci _dack_reload(rtwdev, RF_PATH_B); 55762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON, 0x0); 55862306a36Sopenharmony_ci} 55962306a36Sopenharmony_ci 56062306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev) 56162306a36Sopenharmony_ci{ 56262306a36Sopenharmony_ci _dack_s0(rtwdev); 56362306a36Sopenharmony_ci _dack_s1(rtwdev); 56462306a36Sopenharmony_ci} 56562306a36Sopenharmony_ci 56662306a36Sopenharmony_cistatic void _drck(struct rtw89_dev *rtwdev) 56762306a36Sopenharmony_ci{ 56862306a36Sopenharmony_ci u32 val; 56962306a36Sopenharmony_ci int ret; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x1); 57262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 57362306a36Sopenharmony_ci 1, 10000, false, rtwdev, 0xc0c8, BIT(3)); 57462306a36Sopenharmony_ci if (ret) 57562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n"); 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_drck_defs_tbl); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci val = rtw89_phy_read32_mask(rtwdev, R_DRCK_RES, B_DRCK_RES); 58062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x0); 58162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_VAL, val); 58262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0c4 = 0x%x\n", 58362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD)); 58462306a36Sopenharmony_ci} 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force) 58762306a36Sopenharmony_ci{ 58862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 58962306a36Sopenharmony_ci u32 rf0_0, rf1_0; 59062306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB); 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci dack->dack_done = false; 59362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n"); 59462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); 59562306a36Sopenharmony_ci rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK); 59662306a36Sopenharmony_ci rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK); 59762306a36Sopenharmony_ci _drck(rtwdev); 59862306a36Sopenharmony_ci 59962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0); 60062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0); 60162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1); 60262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x337e1); 60362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START); 60462306a36Sopenharmony_ci _addck(rtwdev); 60562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP); 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_ci _addck_backup(rtwdev); 60862306a36Sopenharmony_ci _addck_reload(rtwdev); 60962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0); 61062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0); 61162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START); 61262306a36Sopenharmony_ci _dack(rtwdev); 61362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP); 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci _dack_dump(rtwdev); 61662306a36Sopenharmony_ci dack->dack_done = true; 61762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0); 61862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0); 61962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1); 62062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1); 62162306a36Sopenharmony_ci dack->dack_cnt++; 62262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); 62362306a36Sopenharmony_ci} 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci#define RTW8852C_NCTL_VER 0xd 62662306a36Sopenharmony_ci#define RTW8852C_IQK_VER 0x2a 62762306a36Sopenharmony_ci#define RTW8852C_IQK_SS 2 62862306a36Sopenharmony_ci#define RTW8852C_IQK_THR_REK 8 62962306a36Sopenharmony_ci#define RTW8852C_IQK_CFIR_GROUP_NR 4 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_cienum rtw8852c_iqk_type { 63262306a36Sopenharmony_ci ID_TXAGC, 63362306a36Sopenharmony_ci ID_G_FLOK_COARSE, 63462306a36Sopenharmony_ci ID_A_FLOK_COARSE, 63562306a36Sopenharmony_ci ID_G_FLOK_FINE, 63662306a36Sopenharmony_ci ID_A_FLOK_FINE, 63762306a36Sopenharmony_ci ID_FLOK_VBUFFER, 63862306a36Sopenharmony_ci ID_TXK, 63962306a36Sopenharmony_ci ID_RXAGC, 64062306a36Sopenharmony_ci ID_RXK, 64162306a36Sopenharmony_ci ID_NBTXK, 64262306a36Sopenharmony_ci ID_NBRXK, 64362306a36Sopenharmony_ci}; 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_cistatic void rtw8852c_disable_rxagc(struct rtw89_dev *rtwdev, u8 path, u8 en_rxgac) 64662306a36Sopenharmony_ci{ 64762306a36Sopenharmony_ci if (path == RF_PATH_A) 64862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_AGC_CTL, B_P0_AGC_EN, en_rxgac); 64962306a36Sopenharmony_ci else 65062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_AGC_CTL, B_P1_AGC_EN, en_rxgac); 65162306a36Sopenharmony_ci} 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) 65462306a36Sopenharmony_ci{ 65562306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ci if (path == RF_PATH_A) 65862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0101); 65962306a36Sopenharmony_ci else 66062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0202); 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ci switch (iqk_info->iqk_bw[path]) { 66362306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_20: 66462306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_40: 66562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 66662306a36Sopenharmony_ci rtw8852c_rxck_force(rtwdev, path, true, ADC_480M); 66762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x0); 66862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 66962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 67062306a36Sopenharmony_ci break; 67162306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_80: 67262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 67362306a36Sopenharmony_ci rtw8852c_rxck_force(rtwdev, path, true, ADC_960M); 67462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x1); 67562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 67662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 67762306a36Sopenharmony_ci break; 67862306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_160: 67962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 68062306a36Sopenharmony_ci rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 68162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x2); 68262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 68362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 68462306a36Sopenharmony_ci break; 68562306a36Sopenharmony_ci default: 68662306a36Sopenharmony_ci break; 68762306a36Sopenharmony_ci } 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_iqk_rxk_cfg_defs_tbl); 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_ci if (path == RF_PATH_A) 69262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x1101); 69362306a36Sopenharmony_ci else 69462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x2202); 69562306a36Sopenharmony_ci} 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype) 69862306a36Sopenharmony_ci{ 69962306a36Sopenharmony_ci u32 tmp; 70062306a36Sopenharmony_ci u32 val; 70162306a36Sopenharmony_ci int ret; 70262306a36Sopenharmony_ci 70362306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 70462306a36Sopenharmony_ci 1, 8200, false, rtwdev, 0xbff8, MASKBYTE0); 70562306a36Sopenharmony_ci if (ret) 70662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]IQK timeout!!!\n"); 70762306a36Sopenharmony_ci 70862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0); 70962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret); 71062306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD); 71162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 71262306a36Sopenharmony_ci "[IQK]S%x, type= %x, 0x8008 = 0x%x\n", path, ktype, tmp); 71362306a36Sopenharmony_ci 71462306a36Sopenharmony_ci return false; 71562306a36Sopenharmony_ci} 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev, 71862306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path, u8 ktype) 71962306a36Sopenharmony_ci{ 72062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 72162306a36Sopenharmony_ci u32 addr_rfc_ctl = R_UPD_CLK + (path << 13); 72262306a36Sopenharmony_ci u32 iqk_cmd; 72362306a36Sopenharmony_ci bool fail; 72462306a36Sopenharmony_ci 72562306a36Sopenharmony_ci switch (ktype) { 72662306a36Sopenharmony_ci case ID_TXAGC: 72762306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (4 + path)) | (path << 1); 72862306a36Sopenharmony_ci break; 72962306a36Sopenharmony_ci case ID_A_FLOK_COARSE: 73062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 73162306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (4 + path)); 73262306a36Sopenharmony_ci break; 73362306a36Sopenharmony_ci case ID_G_FLOK_COARSE: 73462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 73562306a36Sopenharmony_ci iqk_cmd = 0x108 | (1 << (4 + path)); 73662306a36Sopenharmony_ci break; 73762306a36Sopenharmony_ci case ID_A_FLOK_FINE: 73862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 73962306a36Sopenharmony_ci iqk_cmd = 0x508 | (1 << (4 + path)); 74062306a36Sopenharmony_ci break; 74162306a36Sopenharmony_ci case ID_G_FLOK_FINE: 74262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 74362306a36Sopenharmony_ci iqk_cmd = 0x208 | (1 << (4 + path)); 74462306a36Sopenharmony_ci break; 74562306a36Sopenharmony_ci case ID_FLOK_VBUFFER: 74662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 74762306a36Sopenharmony_ci iqk_cmd = 0x308 | (1 << (4 + path)); 74862306a36Sopenharmony_ci break; 74962306a36Sopenharmony_ci case ID_TXK: 75062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x0); 75162306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (4 + path)) | ((0x8 + iqk_info->iqk_bw[path]) << 8); 75262306a36Sopenharmony_ci break; 75362306a36Sopenharmony_ci case ID_RXAGC: 75462306a36Sopenharmony_ci iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1); 75562306a36Sopenharmony_ci break; 75662306a36Sopenharmony_ci case ID_RXK: 75762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 75862306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (4 + path)) | ((0xc + iqk_info->iqk_bw[path]) << 8); 75962306a36Sopenharmony_ci break; 76062306a36Sopenharmony_ci case ID_NBTXK: 76162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x0); 76262306a36Sopenharmony_ci iqk_cmd = 0x408 | (1 << (4 + path)); 76362306a36Sopenharmony_ci break; 76462306a36Sopenharmony_ci case ID_NBRXK: 76562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x1); 76662306a36Sopenharmony_ci iqk_cmd = 0x608 | (1 << (4 + path)); 76762306a36Sopenharmony_ci break; 76862306a36Sopenharmony_ci default: 76962306a36Sopenharmony_ci return false; 77062306a36Sopenharmony_ci } 77162306a36Sopenharmony_ci 77262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); 77362306a36Sopenharmony_ci fsleep(15); 77462306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path, ktype); 77562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, addr_rfc_ctl, 0x00000002, 0x0); 77662306a36Sopenharmony_ci 77762306a36Sopenharmony_ci return fail; 77862306a36Sopenharmony_ci} 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_cistatic bool _rxk_group_sel(struct rtw89_dev *rtwdev, 78162306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 78262306a36Sopenharmony_ci{ 78362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 78462306a36Sopenharmony_ci bool fail; 78562306a36Sopenharmony_ci u32 tmp; 78662306a36Sopenharmony_ci u32 bkrf0; 78762306a36Sopenharmony_ci u8 gp; 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci bkrf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_NBW); 79062306a36Sopenharmony_ci if (path == RF_PATH_B) { 79162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_IQKPLL, RR_IQKPLL_MOD, 0x3); 79262306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CHTR, RR_CHTR_MOD); 79362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV4, RR_RSV4_AGH, tmp); 79462306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CHTR, RR_CHTR_TXRX); 79562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV4, RR_RSV4_PLLCH, tmp); 79662306a36Sopenharmony_ci } 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 79962306a36Sopenharmony_ci case RTW89_BAND_2G: 80062306a36Sopenharmony_ci default: 80162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 80262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 80362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXG, RR_RXG_IQKMOD, 0x9); 80462306a36Sopenharmony_ci break; 80562306a36Sopenharmony_ci case RTW89_BAND_5G: 80662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 80762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 80862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXAE, RR_RXAE_IQKMOD, 0x8); 80962306a36Sopenharmony_ci break; 81062306a36Sopenharmony_ci case RTW89_BAND_6G: 81162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 81262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 81362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXAE, RR_RXAE_IQKMOD, 0x9); 81462306a36Sopenharmony_ci break; 81562306a36Sopenharmony_ci } 81662306a36Sopenharmony_ci 81762306a36Sopenharmony_ci fsleep(10); 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci for (gp = 0; gp < RXK_GROUP_NR; gp++) { 82062306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 82162306a36Sopenharmony_ci case RTW89_BAND_2G: 82262306a36Sopenharmony_ci default: 82362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, 82462306a36Sopenharmony_ci _rxk_g_idxrxgain[gp]); 82562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_VOBUF, 82662306a36Sopenharmony_ci _rxk_g_idxattc2[gp]); 82762306a36Sopenharmony_ci break; 82862306a36Sopenharmony_ci case RTW89_BAND_5G: 82962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, 83062306a36Sopenharmony_ci _rxk_a_idxrxgain[gp]); 83162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_IATT, 83262306a36Sopenharmony_ci _rxk_a_idxattc2[gp]); 83362306a36Sopenharmony_ci break; 83462306a36Sopenharmony_ci case RTW89_BAND_6G: 83562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, 83662306a36Sopenharmony_ci _rxk_a6_idxrxgain[gp]); 83762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_IATT, 83862306a36Sopenharmony_ci _rxk_a6_idxattc2[gp]); 83962306a36Sopenharmony_ci break; 84062306a36Sopenharmony_ci } 84162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 84262306a36Sopenharmony_ci B_CFIR_LUT_SEL, 0x1); 84362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 84462306a36Sopenharmony_ci B_CFIR_LUT_SET, 0x0); 84562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 84662306a36Sopenharmony_ci B_CFIR_LUT_GP_V1, gp); 84762306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 84862306a36Sopenharmony_ci } 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci if (path == RF_PATH_B) 85162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_IQKPLL, RR_IQKPLL_MOD, 0x0); 85262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, bkrf0); 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_ci if (fail) { 85562306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000002; 85662306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 85762306a36Sopenharmony_ci } else { 85862306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000000; 85962306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = true; 86062306a36Sopenharmony_ci } 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci return false; 86362306a36Sopenharmony_ci} 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_cistatic bool _iqk_nbrxk(struct rtw89_dev *rtwdev, 86662306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 86762306a36Sopenharmony_ci{ 86862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 86962306a36Sopenharmony_ci bool fail; 87062306a36Sopenharmony_ci u32 tmp; 87162306a36Sopenharmony_ci u32 bkrf0; 87262306a36Sopenharmony_ci u8 gp = 0x2; 87362306a36Sopenharmony_ci 87462306a36Sopenharmony_ci bkrf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_NBW); 87562306a36Sopenharmony_ci if (path == RF_PATH_B) { 87662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_IQKPLL, RR_IQKPLL_MOD, 0x3); 87762306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CHTR, RR_CHTR_MOD); 87862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV4, RR_RSV4_AGH, tmp); 87962306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CHTR, RR_CHTR_TXRX); 88062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV4, RR_RSV4_PLLCH, tmp); 88162306a36Sopenharmony_ci } 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 88462306a36Sopenharmony_ci case RTW89_BAND_2G: 88562306a36Sopenharmony_ci default: 88662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 88762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 88862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXG, RR_RXG_IQKMOD, 0x9); 88962306a36Sopenharmony_ci break; 89062306a36Sopenharmony_ci case RTW89_BAND_5G: 89162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 89262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 89362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXAE, RR_RXAE_IQKMOD, 0x8); 89462306a36Sopenharmony_ci break; 89562306a36Sopenharmony_ci case RTW89_BAND_6G: 89662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 89762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, 0x0); 89862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXAE, RR_RXAE_IQKMOD, 0x9); 89962306a36Sopenharmony_ci break; 90062306a36Sopenharmony_ci } 90162306a36Sopenharmony_ci 90262306a36Sopenharmony_ci fsleep(10); 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 90562306a36Sopenharmony_ci case RTW89_BAND_2G: 90662306a36Sopenharmony_ci default: 90762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, _rxk_g_idxrxgain[gp]); 90862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_VOBUF, _rxk_g_idxattc2[gp]); 90962306a36Sopenharmony_ci break; 91062306a36Sopenharmony_ci case RTW89_BAND_5G: 91162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, _rxk_a_idxrxgain[gp]); 91262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_IATT, _rxk_a_idxattc2[gp]); 91362306a36Sopenharmony_ci break; 91462306a36Sopenharmony_ci case RTW89_BAND_6G: 91562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, _rxk_a6_idxrxgain[gp]); 91662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_IATT, _rxk_a6_idxattc2[gp]); 91762306a36Sopenharmony_ci break; 91862306a36Sopenharmony_ci } 91962306a36Sopenharmony_ci 92062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); 92162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x0); 92262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP_V1, gp); 92362306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 92462306a36Sopenharmony_ci 92562306a36Sopenharmony_ci if (path == RF_PATH_B) 92662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_IQKPLL, RR_IQKPLL_MOD, 0x0); 92762306a36Sopenharmony_ci 92862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_NBW, bkrf0); 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_ci if (fail) 93162306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 93262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 93362306a36Sopenharmony_ci MASKDWORD) | 0x2; 93462306a36Sopenharmony_ci else 93562306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000002; 93662306a36Sopenharmony_ci 93762306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = false; 93862306a36Sopenharmony_ci return fail; 93962306a36Sopenharmony_ci} 94062306a36Sopenharmony_ci 94162306a36Sopenharmony_cistatic bool _txk_group_sel(struct rtw89_dev *rtwdev, 94262306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 94362306a36Sopenharmony_ci{ 94462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 94562306a36Sopenharmony_ci bool fail; 94662306a36Sopenharmony_ci u8 gp; 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_ci for (gp = 0; gp < TXK_GROUP_NR; gp++) { 94962306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 95062306a36Sopenharmony_ci case RTW89_BAND_2G: 95162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 95262306a36Sopenharmony_ci _txk_g_power_range[gp]); 95362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 95462306a36Sopenharmony_ci _txk_g_track_range[gp]); 95562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 95662306a36Sopenharmony_ci _txk_g_gain_bb[gp]); 95762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 95862306a36Sopenharmony_ci R_KIP_IQP + (path << 8), 95962306a36Sopenharmony_ci MASKDWORD, _txk_g_itqt[gp]); 96062306a36Sopenharmony_ci break; 96162306a36Sopenharmony_ci case RTW89_BAND_5G: 96262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 96362306a36Sopenharmony_ci _txk_a_power_range[gp]); 96462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 96562306a36Sopenharmony_ci _txk_a_track_range[gp]); 96662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 96762306a36Sopenharmony_ci _txk_a_gain_bb[gp]); 96862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 96962306a36Sopenharmony_ci R_KIP_IQP + (path << 8), 97062306a36Sopenharmony_ci MASKDWORD, _txk_a_itqt[gp]); 97162306a36Sopenharmony_ci break; 97262306a36Sopenharmony_ci case RTW89_BAND_6G: 97362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 97462306a36Sopenharmony_ci _txk_a6_power_range[gp]); 97562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 97662306a36Sopenharmony_ci _txk_a6_track_range[gp]); 97762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 97862306a36Sopenharmony_ci _txk_a6_gain_bb[gp]); 97962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 98062306a36Sopenharmony_ci R_KIP_IQP + (path << 8), 98162306a36Sopenharmony_ci MASKDWORD, _txk_a6_itqt[gp]); 98262306a36Sopenharmony_ci break; 98362306a36Sopenharmony_ci default: 98462306a36Sopenharmony_ci break; 98562306a36Sopenharmony_ci } 98662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 98762306a36Sopenharmony_ci B_CFIR_LUT_SEL, 0x1); 98862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 98962306a36Sopenharmony_ci B_CFIR_LUT_SET, 0x1); 99062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 99162306a36Sopenharmony_ci B_CFIR_LUT_G2, 0x0); 99262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 99362306a36Sopenharmony_ci B_CFIR_LUT_GP, gp + 1); 99462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x00b); 99562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 99662306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 99762306a36Sopenharmony_ci } 99862306a36Sopenharmony_ci 99962306a36Sopenharmony_ci if (fail) { 100062306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000002; 100162306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 100262306a36Sopenharmony_ci } else { 100362306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000000; 100462306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 100562306a36Sopenharmony_ci } 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_ci return fail; 100862306a36Sopenharmony_ci} 100962306a36Sopenharmony_ci 101062306a36Sopenharmony_cistatic bool _iqk_nbtxk(struct rtw89_dev *rtwdev, 101162306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 101262306a36Sopenharmony_ci{ 101362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 101462306a36Sopenharmony_ci bool fail; 101562306a36Sopenharmony_ci u8 gp = 0x2; 101662306a36Sopenharmony_ci 101762306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 101862306a36Sopenharmony_ci case RTW89_BAND_2G: 101962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, _txk_g_power_range[gp]); 102062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, _txk_g_track_range[gp]); 102162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, _txk_g_gain_bb[gp]); 102262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 102362306a36Sopenharmony_ci MASKDWORD, _txk_g_itqt[gp]); 102462306a36Sopenharmony_ci break; 102562306a36Sopenharmony_ci case RTW89_BAND_5G: 102662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, _txk_a_power_range[gp]); 102762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, _txk_a_track_range[gp]); 102862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, _txk_a_gain_bb[gp]); 102962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 103062306a36Sopenharmony_ci MASKDWORD, _txk_a_itqt[gp]); 103162306a36Sopenharmony_ci break; 103262306a36Sopenharmony_ci case RTW89_BAND_6G: 103362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, _txk_a6_power_range[gp]); 103462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, _txk_a6_track_range[gp]); 103562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, _txk_a6_gain_bb[gp]); 103662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 103762306a36Sopenharmony_ci MASKDWORD, _txk_a6_itqt[gp]); 103862306a36Sopenharmony_ci break; 103962306a36Sopenharmony_ci default: 104062306a36Sopenharmony_ci break; 104162306a36Sopenharmony_ci } 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); 104462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SET, 0x1); 104562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G2, 0x0); 104662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp + 1); 104762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x00b); 104862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 104962306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 105062306a36Sopenharmony_ci 105162306a36Sopenharmony_ci if (!fail) 105262306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 105362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), 105462306a36Sopenharmony_ci MASKDWORD) | 0x2; 105562306a36Sopenharmony_ci else 105662306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000002; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = false; 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci return fail; 106162306a36Sopenharmony_ci} 106262306a36Sopenharmony_ci 106362306a36Sopenharmony_cistatic bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path) 106462306a36Sopenharmony_ci{ 106562306a36Sopenharmony_ci struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; 106662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 106762306a36Sopenharmony_ci u8 idx = rfk_mcc->table_idx; 106862306a36Sopenharmony_ci bool is_fail1, is_fail2; 106962306a36Sopenharmony_ci u32 val; 107062306a36Sopenharmony_ci u32 core_i; 107162306a36Sopenharmony_ci u32 core_q; 107262306a36Sopenharmony_ci u32 vbuff_i; 107362306a36Sopenharmony_ci u32 vbuff_q; 107462306a36Sopenharmony_ci 107562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 107662306a36Sopenharmony_ci val = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK); 107762306a36Sopenharmony_ci core_i = FIELD_GET(RR_TXMO_COI, val); 107862306a36Sopenharmony_ci core_q = FIELD_GET(RR_TXMO_COQ, val); 107962306a36Sopenharmony_ci 108062306a36Sopenharmony_ci if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d) 108162306a36Sopenharmony_ci is_fail1 = true; 108262306a36Sopenharmony_ci else 108362306a36Sopenharmony_ci is_fail1 = false; 108462306a36Sopenharmony_ci 108562306a36Sopenharmony_ci iqk_info->lok_idac[idx][path] = val; 108662306a36Sopenharmony_ci 108762306a36Sopenharmony_ci val = rtw89_read_rf(rtwdev, path, RR_LOKVB, RFREG_MASK); 108862306a36Sopenharmony_ci vbuff_i = FIELD_GET(RR_LOKVB_COI, val); 108962306a36Sopenharmony_ci vbuff_q = FIELD_GET(RR_LOKVB_COQ, val); 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci if (vbuff_i < 0x2 || vbuff_i > 0x3d || vbuff_q < 0x2 || vbuff_q > 0x3d) 109262306a36Sopenharmony_ci is_fail2 = true; 109362306a36Sopenharmony_ci else 109462306a36Sopenharmony_ci is_fail2 = false; 109562306a36Sopenharmony_ci 109662306a36Sopenharmony_ci iqk_info->lok_vbuf[idx][path] = val; 109762306a36Sopenharmony_ci 109862306a36Sopenharmony_ci return is_fail1 || is_fail2; 109962306a36Sopenharmony_ci} 110062306a36Sopenharmony_ci 110162306a36Sopenharmony_cistatic bool _iqk_lok(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 u8 tmp_id = 0x0; 110662306a36Sopenharmony_ci bool fail = false; 110762306a36Sopenharmony_ci bool tmp = false; 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_ci /* Step 0: Init RF gain & tone idx= 8.25Mhz */ 111062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, IQK_DF4_TXT_8_25MHZ); 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci /* Step 1 START: _lok_coarse_fine_wi_swap */ 111362306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 111462306a36Sopenharmony_ci case RTW89_BAND_2G: 111562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 111662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 111762306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 111862306a36Sopenharmony_ci tmp_id = ID_G_FLOK_COARSE; 111962306a36Sopenharmony_ci break; 112062306a36Sopenharmony_ci case RTW89_BAND_5G: 112162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 112262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 112362306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 112462306a36Sopenharmony_ci tmp_id = ID_A_FLOK_COARSE; 112562306a36Sopenharmony_ci break; 112662306a36Sopenharmony_ci case RTW89_BAND_6G: 112762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 112862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 112962306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 113062306a36Sopenharmony_ci tmp_id = ID_A_FLOK_COARSE; 113162306a36Sopenharmony_ci break; 113262306a36Sopenharmony_ci default: 113362306a36Sopenharmony_ci break; 113462306a36Sopenharmony_ci } 113562306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, tmp_id); 113662306a36Sopenharmony_ci iqk_info->lok_cor_fail[0][path] = tmp; 113762306a36Sopenharmony_ci 113862306a36Sopenharmony_ci /* Step 2 */ 113962306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 114062306a36Sopenharmony_ci case RTW89_BAND_2G: 114162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 114262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 114362306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 114462306a36Sopenharmony_ci break; 114562306a36Sopenharmony_ci case RTW89_BAND_5G: 114662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 114762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 114862306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 114962306a36Sopenharmony_ci break; 115062306a36Sopenharmony_ci case RTW89_BAND_6G: 115162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 115262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 115362306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 115462306a36Sopenharmony_ci break; 115562306a36Sopenharmony_ci default: 115662306a36Sopenharmony_ci break; 115762306a36Sopenharmony_ci } 115862306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_ci /* Step 3 */ 116162306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 116262306a36Sopenharmony_ci case RTW89_BAND_2G: 116362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 116462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 116562306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 116662306a36Sopenharmony_ci tmp_id = ID_G_FLOK_FINE; 116762306a36Sopenharmony_ci break; 116862306a36Sopenharmony_ci case RTW89_BAND_5G: 116962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 117062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 117162306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 117262306a36Sopenharmony_ci tmp_id = ID_A_FLOK_FINE; 117362306a36Sopenharmony_ci break; 117462306a36Sopenharmony_ci case RTW89_BAND_6G: 117562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x6); 117662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 117762306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x9); 117862306a36Sopenharmony_ci tmp_id = ID_A_FLOK_FINE; 117962306a36Sopenharmony_ci break; 118062306a36Sopenharmony_ci default: 118162306a36Sopenharmony_ci break; 118262306a36Sopenharmony_ci } 118362306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, tmp_id); 118462306a36Sopenharmony_ci iqk_info->lok_fin_fail[0][path] = tmp; 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci /* Step 4 large rf gain */ 118762306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 118862306a36Sopenharmony_ci case RTW89_BAND_2G: 118962306a36Sopenharmony_ci default: 119062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 119162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 119262306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 119362306a36Sopenharmony_ci break; 119462306a36Sopenharmony_ci case RTW89_BAND_5G: 119562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 119662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 119762306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 119862306a36Sopenharmony_ci break; 119962306a36Sopenharmony_ci case RTW89_BAND_6G: 120062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0x12); 120162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 120262306a36Sopenharmony_ci B_KIP_IQP_IQSW, 0x1b); 120362306a36Sopenharmony_ci break; 120462306a36Sopenharmony_ci } 120562306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_VBUFFER); 120662306a36Sopenharmony_ci fail = _lok_finetune_check(rtwdev, path); 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci return fail; 120962306a36Sopenharmony_ci} 121062306a36Sopenharmony_ci 121162306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) 121262306a36Sopenharmony_ci{ 121362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 121662306a36Sopenharmony_ci case RTW89_BAND_2G: 121762306a36Sopenharmony_ci default: 121862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0); 121962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x0); 122062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1); 122162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXA2, RR_TXA2_LDO, 0xf); 122262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 122362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 122462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 122562306a36Sopenharmony_ci 0x403e0 | iqk_info->syn1to2); 122662306a36Sopenharmony_ci fsleep(10); 122762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 122862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6); 122962306a36Sopenharmony_ci break; 123062306a36Sopenharmony_ci case RTW89_BAND_5G: 123162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXATANK, RR_TXATANK_LBSW2, 0x0); 123262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXAS, 0x1); 123362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXA2, RR_TXA2_LDO, 0xf); 123462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 123562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 123662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 123762306a36Sopenharmony_ci 0x403e0 | iqk_info->syn1to2); 123862306a36Sopenharmony_ci fsleep(10); 123962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 124062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6); 124162306a36Sopenharmony_ci break; 124262306a36Sopenharmony_ci case RTW89_BAND_6G: 124362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXATANK, RR_TXATANK_LBSW2, 0x0); 124462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXAS, 0x1); 124562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXA2, RR_TXA2_LDO, 0xf); 124662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EXT, 0x0); 124762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 124862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 124962306a36Sopenharmony_ci 0x403e0 | iqk_info->syn1to2); 125062306a36Sopenharmony_ci fsleep(10); 125162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 125262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x6); 125362306a36Sopenharmony_ci break; 125462306a36Sopenharmony_ci } 125562306a36Sopenharmony_ci} 125662306a36Sopenharmony_ci 125762306a36Sopenharmony_cistatic void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 125862306a36Sopenharmony_ci u8 path) 125962306a36Sopenharmony_ci{ 126062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 126162306a36Sopenharmony_ci u32 tmp; 126262306a36Sopenharmony_ci bool flag; 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_thermal = %lu\n", path, 126562306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path])); 126662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_COR_fail= %d\n", path, 126762306a36Sopenharmony_ci iqk_info->lok_cor_fail[0][path]); 126862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_FIN_fail= %d\n", path, 126962306a36Sopenharmony_ci iqk_info->lok_fin_fail[0][path]); 127062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_TXIQK_fail = %d\n", path, 127162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path]); 127262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_RXIQK_fail= %d,\n", path, 127362306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path]); 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci flag = iqk_info->lok_cor_fail[0][path]; 127662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FCOR << (path * 4), flag); 127762306a36Sopenharmony_ci flag = iqk_info->lok_fin_fail[0][path]; 127862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FFIN << (path * 4), flag); 127962306a36Sopenharmony_ci flag = iqk_info->iqk_tx_fail[0][path]; 128062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_FTX << (path * 4), flag); 128162306a36Sopenharmony_ci flag = iqk_info->iqk_rx_fail[0][path]; 128262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_F_RX << (path * 4), flag); 128362306a36Sopenharmony_ci 128462306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD); 128562306a36Sopenharmony_ci iqk_info->bp_iqkenable[path] = tmp; 128662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 128762306a36Sopenharmony_ci iqk_info->bp_txkresult[path] = tmp; 128862306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD); 128962306a36Sopenharmony_ci iqk_info->bp_rxkresult[path] = tmp; 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, 129262306a36Sopenharmony_ci iqk_info->iqk_times); 129362306a36Sopenharmony_ci 129462306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, B_IQKINF_FAIL << (path * 4)); 129562306a36Sopenharmony_ci if (tmp != 0x0) 129662306a36Sopenharmony_ci iqk_info->iqk_fail_cnt++; 129762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_FCNT << (path * 4), 129862306a36Sopenharmony_ci iqk_info->iqk_fail_cnt); 129962306a36Sopenharmony_ci} 130062306a36Sopenharmony_ci 130162306a36Sopenharmony_cistatic void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 130262306a36Sopenharmony_ci{ 130362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 130462306a36Sopenharmony_ci 130562306a36Sopenharmony_ci _iqk_txk_setting(rtwdev, path); 130662306a36Sopenharmony_ci iqk_info->lok_fail[path] = _iqk_lok(rtwdev, phy_idx, path); 130762306a36Sopenharmony_ci 130862306a36Sopenharmony_ci if (iqk_info->is_nbiqk) 130962306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path); 131062306a36Sopenharmony_ci else 131162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path); 131262306a36Sopenharmony_ci 131362306a36Sopenharmony_ci _iqk_rxk_setting(rtwdev, path); 131462306a36Sopenharmony_ci if (iqk_info->is_nbiqk) 131562306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path); 131662306a36Sopenharmony_ci else 131762306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path); 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_ci _iqk_info_iqk(rtwdev, phy_idx, path); 132062306a36Sopenharmony_ci} 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev, 132362306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 path) 132462306a36Sopenharmony_ci{ 132562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 132662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci iqk_info->iqk_band[path] = chan->band_type; 133162306a36Sopenharmony_ci iqk_info->iqk_bw[path] = chan->band_width; 133262306a36Sopenharmony_ci iqk_info->iqk_ch[path] = chan->channel; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 133562306a36Sopenharmony_ci "[IQK]iqk_info->iqk_band[%x] = 0x%x\n", path, 133662306a36Sopenharmony_ci iqk_info->iqk_band[path]); 133762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_bw[%x] = 0x%x\n", 133862306a36Sopenharmony_ci path, iqk_info->iqk_bw[path]); 133962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_ch[%x] = 0x%x\n", 134062306a36Sopenharmony_ci path, iqk_info->iqk_ch[path]); 134162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 134262306a36Sopenharmony_ci "[IQK]S%d (PHY%d): / DBCC %s/ %s/ CH%d/ %s\n", path, phy, 134362306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 134462306a36Sopenharmony_ci iqk_info->iqk_band[path] == 0 ? "2G" : 134562306a36Sopenharmony_ci iqk_info->iqk_band[path] == 1 ? "5G" : "6G", 134662306a36Sopenharmony_ci iqk_info->iqk_ch[path], 134762306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 0 ? "20M" : 134862306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 1 ? "40M" : "80M"); 134962306a36Sopenharmony_ci if (!rtwdev->dbcc_en) 135062306a36Sopenharmony_ci iqk_info->syn1to2 = 0x1; 135162306a36Sopenharmony_ci else 135262306a36Sopenharmony_ci iqk_info->syn1to2 = 0x3; 135362306a36Sopenharmony_ci 135462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852C_IQK_VER); 135562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BAND << (path * 16), 135662306a36Sopenharmony_ci iqk_info->iqk_band[path]); 135762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_BW << (path * 16), 135862306a36Sopenharmony_ci iqk_info->iqk_bw[path]); 135962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, B_IQKCH_CH << (path * 16), 136062306a36Sopenharmony_ci iqk_info->iqk_ch[path]); 136162306a36Sopenharmony_ci 136262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_NCTLV, RTW8852C_NCTL_VER); 136362306a36Sopenharmony_ci} 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 136662306a36Sopenharmony_ci u8 path) 136762306a36Sopenharmony_ci{ 136862306a36Sopenharmony_ci _iqk_by_path(rtwdev, phy_idx, path); 136962306a36Sopenharmony_ci} 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) 137262306a36Sopenharmony_ci{ 137362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 137462306a36Sopenharmony_ci bool fail; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 137762306a36Sopenharmony_ci iqk_info->nb_txcfir[path]); 137862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 137962306a36Sopenharmony_ci iqk_info->nb_rxcfir[path]); 138062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 138162306a36Sopenharmony_ci 0x00001219 + (path << 4)); 138262306a36Sopenharmony_ci fsleep(200); 138362306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path, 0x12); 138462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] restore fail = %x\n", fail); 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00); 138762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000); 138862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 138962306a36Sopenharmony_ci 139062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 139162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 139262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 139362306a36Sopenharmony_ci} 139462306a36Sopenharmony_ci 139562306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev, 139662306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 139762306a36Sopenharmony_ci{ 139862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 139962306a36Sopenharmony_ci &rtw8852c_iqk_afebb_restore_defs_a_tbl, 140062306a36Sopenharmony_ci &rtw8852c_iqk_afebb_restore_defs_b_tbl); 140162306a36Sopenharmony_ci 140262306a36Sopenharmony_ci rtw8852c_disable_rxagc(rtwdev, path, 0x1); 140362306a36Sopenharmony_ci} 140462306a36Sopenharmony_ci 140562306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) 140662306a36Sopenharmony_ci{ 140762306a36Sopenharmony_ci struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; 140862306a36Sopenharmony_ci u8 idx = 0; 140962306a36Sopenharmony_ci 141062306a36Sopenharmony_ci idx = rfk_mcc->table_idx; 141162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_IQC, idx); 141262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, idx); 141362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 141462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 141562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); 141662306a36Sopenharmony_ci} 141762306a36Sopenharmony_ci 141862306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev, 141962306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 142062306a36Sopenharmony_ci{ 142162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===> %s\n", __func__); 142262306a36Sopenharmony_ci 142362306a36Sopenharmony_ci /* 01_BB_AFE_for DPK_S0_20210820 */ 142462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 142562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A0 << path, 0x1); 142662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A1 << path, 0x0); 142762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A2 << path, 0x1); 142862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A3 << path, 0x0); 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_ci /* disable rxgac */ 143162306a36Sopenharmony_ci rtw8852c_disable_rxagc(rtwdev, path, 0x0); 143262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), MASKDWORD, 0xf801fffd); 143362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), B_DPD_DIS, 0x1); 143462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), B_DAC_VAL, 0x1); 143562306a36Sopenharmony_ci 143662306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, path, true, DAC_960M); 143762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), B_DPD_GDIS, 0x1); 143862306a36Sopenharmony_ci 143962306a36Sopenharmony_ci rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 144062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), B_ACK_VAL, 0x2); 144162306a36Sopenharmony_ci 144262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW | (path << 13), B_P0_NRBW_DBG, 0x1); 144362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); 144462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); 144562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001); 144662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); 144762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A1 << path, 0x1); 144862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A3 << path, 0x1); 144962306a36Sopenharmony_ci} 145062306a36Sopenharmony_ci 145162306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 145262306a36Sopenharmony_ci{ 145362306a36Sopenharmony_ci u32 rf_reg5, rck_val = 0; 145462306a36Sopenharmony_ci u32 val; 145562306a36Sopenharmony_ci int ret; 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); 145862306a36Sopenharmony_ci 145962306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 146062306a36Sopenharmony_ci 146162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 146262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%x\n", 146562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_ci /* RCK trigger */ 146862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); 146962306a36Sopenharmony_ci 147062306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 20, 147162306a36Sopenharmony_ci false, rtwdev, path, 0x1c, BIT(3)); 147262306a36Sopenharmony_ci if (ret) 147362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RCK timeout\n"); 147462306a36Sopenharmony_ci 147562306a36Sopenharmony_ci rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); 147662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); 147762306a36Sopenharmony_ci 147862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 147962306a36Sopenharmony_ci 148062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 148162306a36Sopenharmony_ci "[RCK] RF 0x1b / 0x1c = 0x%x / 0x%x\n", 148262306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK), 148362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKS, RFREG_MASK)); 148462306a36Sopenharmony_ci} 148562306a36Sopenharmony_ci 148662306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev) 148762306a36Sopenharmony_ci{ 148862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 148962306a36Sopenharmony_ci u8 ch, path; 149062306a36Sopenharmony_ci 149162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQKINF, MASKDWORD); 149262306a36Sopenharmony_ci if (iqk_info->is_iqk_init) 149362306a36Sopenharmony_ci return; 149462306a36Sopenharmony_ci 149562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 149662306a36Sopenharmony_ci iqk_info->is_iqk_init = true; 149762306a36Sopenharmony_ci iqk_info->is_nbiqk = false; 149862306a36Sopenharmony_ci iqk_info->iqk_fft_en = false; 149962306a36Sopenharmony_ci iqk_info->iqk_sram_en = false; 150062306a36Sopenharmony_ci iqk_info->iqk_cfir_en = false; 150162306a36Sopenharmony_ci iqk_info->iqk_xym_en = false; 150262306a36Sopenharmony_ci iqk_info->iqk_times = 0x0; 150362306a36Sopenharmony_ci 150462306a36Sopenharmony_ci for (ch = 0; ch < RTW89_IQK_CHS_NR; ch++) { 150562306a36Sopenharmony_ci iqk_info->iqk_channel[ch] = 0x0; 150662306a36Sopenharmony_ci for (path = 0; path < RTW8852C_IQK_SS; path++) { 150762306a36Sopenharmony_ci iqk_info->lok_cor_fail[ch][path] = false; 150862306a36Sopenharmony_ci iqk_info->lok_fin_fail[ch][path] = false; 150962306a36Sopenharmony_ci iqk_info->iqk_tx_fail[ch][path] = false; 151062306a36Sopenharmony_ci iqk_info->iqk_rx_fail[ch][path] = false; 151162306a36Sopenharmony_ci iqk_info->iqk_mcc_ch[ch][path] = 0x0; 151262306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = 0x0; 151362306a36Sopenharmony_ci } 151462306a36Sopenharmony_ci } 151562306a36Sopenharmony_ci} 151662306a36Sopenharmony_ci 151762306a36Sopenharmony_cistatic void _doiqk(struct rtw89_dev *rtwdev, bool force, 151862306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 151962306a36Sopenharmony_ci{ 152062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 152162306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 152262306a36Sopenharmony_ci u32 backup_rf_val[RTW8852C_IQK_SS][BACKUP_RF_REGS_NR]; 152362306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); 152462306a36Sopenharmony_ci 152562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 152662306a36Sopenharmony_ci 152762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 152862306a36Sopenharmony_ci "[IQK]==========IQK start!!!!!==========\n"); 152962306a36Sopenharmony_ci iqk_info->iqk_times++; 153062306a36Sopenharmony_ci iqk_info->version = RTW8852C_IQK_VER; 153162306a36Sopenharmony_ci 153262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); 153362306a36Sopenharmony_ci _iqk_get_ch_info(rtwdev, phy_idx, path); 153462306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, backup_bb_val); 153562306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path); 153662306a36Sopenharmony_ci _iqk_macbb_setting(rtwdev, phy_idx, path); 153762306a36Sopenharmony_ci _iqk_preset(rtwdev, path); 153862306a36Sopenharmony_ci _iqk_start_iqk(rtwdev, phy_idx, path); 153962306a36Sopenharmony_ci _iqk_restore(rtwdev, path); 154062306a36Sopenharmony_ci _iqk_afebb_restore(rtwdev, phy_idx, path); 154162306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, backup_bb_val); 154262306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, backup_rf_val[path], path); 154362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 154462306a36Sopenharmony_ci} 154562306a36Sopenharmony_ci 154662306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) 154762306a36Sopenharmony_ci{ 154862306a36Sopenharmony_ci switch (_kpath(rtwdev, phy_idx)) { 154962306a36Sopenharmony_ci case RF_A: 155062306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 155162306a36Sopenharmony_ci break; 155262306a36Sopenharmony_ci case RF_B: 155362306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 155462306a36Sopenharmony_ci break; 155562306a36Sopenharmony_ci case RF_AB: 155662306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 155762306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 155862306a36Sopenharmony_ci break; 155962306a36Sopenharmony_ci default: 156062306a36Sopenharmony_ci break; 156162306a36Sopenharmony_ci } 156262306a36Sopenharmony_ci} 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_cistatic void _rx_dck_value_rewrite(struct rtw89_dev *rtwdev, u8 path, u8 addr, 156562306a36Sopenharmony_ci u8 val_i, u8 val_q) 156662306a36Sopenharmony_ci{ 156762306a36Sopenharmony_ci u32 ofst_val; 156862306a36Sopenharmony_ci 156962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 157062306a36Sopenharmony_ci "[RX_DCK] rewrite val_i = 0x%x, val_q = 0x%x\n", val_i, val_q); 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci /* val_i and val_q are 7 bits, and target is 6 bits. */ 157362306a36Sopenharmony_ci ofst_val = u32_encode_bits(val_q >> 1, RR_LUTWD0_MB) | 157462306a36Sopenharmony_ci u32_encode_bits(val_i >> 1, RR_LUTWD0_LB); 157562306a36Sopenharmony_ci 157662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTPLL, RR_CAL_RW, 0x1); 157762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RFC, RR_WCAL, 0x1); 157862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x1); 157962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, MASKBYTE0, addr); 158062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ofst_val); 158162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ofst_val); 158262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); 158362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RFC, RR_WCAL, 0x0); 158462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTPLL, RR_CAL_RW, 0x0); 158562306a36Sopenharmony_ci 158662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] Final val_i = 0x%x, val_q = 0x%x\n", 158762306a36Sopenharmony_ci u32_get_bits(ofst_val, RR_LUTWD0_LB) << 1, 158862306a36Sopenharmony_ci u32_get_bits(ofst_val, RR_LUTWD0_MB) << 1); 158962306a36Sopenharmony_ci} 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_cistatic bool _rx_dck_rek_check(struct rtw89_dev *rtwdev, u8 path) 159262306a36Sopenharmony_ci{ 159362306a36Sopenharmony_ci u8 i_even_bs, q_even_bs; 159462306a36Sopenharmony_ci u8 i_odd_bs, q_odd_bs; 159562306a36Sopenharmony_ci u8 i_even, q_even; 159662306a36Sopenharmony_ci u8 i_odd, q_odd; 159762306a36Sopenharmony_ci const u8 th = 10; 159862306a36Sopenharmony_ci u8 i; 159962306a36Sopenharmony_ci 160062306a36Sopenharmony_ci for (i = 0; i < RF_PATH_NUM_8852C; i++) { 160162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i]); 160262306a36Sopenharmony_ci i_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 160362306a36Sopenharmony_ci q_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 160462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 160562306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_even_bs/ q_even_bs = 0x%x/ 0x%x\n", 160662306a36Sopenharmony_ci _dck_addr_bs[i], i_even_bs, q_even_bs); 160762306a36Sopenharmony_ci 160862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i]); 160962306a36Sopenharmony_ci i_even = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 161062306a36Sopenharmony_ci q_even = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 161162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 161262306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_even/ q_even = 0x%x/ 0x%x\n", 161362306a36Sopenharmony_ci _dck_addr[i], i_even, q_even); 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_ci if (abs(i_even_bs - i_even) > th || abs(q_even_bs - q_even) > th) 161662306a36Sopenharmony_ci return true; 161762306a36Sopenharmony_ci 161862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i] + 1); 161962306a36Sopenharmony_ci i_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 162062306a36Sopenharmony_ci q_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 162162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 162262306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_odd_bs/ q_odd_bs = 0x%x/ 0x%x\n", 162362306a36Sopenharmony_ci _dck_addr_bs[i] + 1, i_odd_bs, q_odd_bs); 162462306a36Sopenharmony_ci 162562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i] + 1); 162662306a36Sopenharmony_ci i_odd = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 162762306a36Sopenharmony_ci q_odd = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 162862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 162962306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_odd/ q_odd = 0x%x/ 0x%x\n", 163062306a36Sopenharmony_ci _dck_addr[i] + 1, i_odd, q_odd); 163162306a36Sopenharmony_ci 163262306a36Sopenharmony_ci if (abs(i_odd_bs - i_odd) > th || abs(q_odd_bs - q_odd) > th) 163362306a36Sopenharmony_ci return true; 163462306a36Sopenharmony_ci } 163562306a36Sopenharmony_ci 163662306a36Sopenharmony_ci return false; 163762306a36Sopenharmony_ci} 163862306a36Sopenharmony_ci 163962306a36Sopenharmony_cistatic void _rx_dck_fix_if_need(struct rtw89_dev *rtwdev, u8 path, u8 addr, 164062306a36Sopenharmony_ci u8 val_i_bs, u8 val_q_bs, u8 val_i, u8 val_q) 164162306a36Sopenharmony_ci{ 164262306a36Sopenharmony_ci const u8 th = 10; 164362306a36Sopenharmony_ci 164462306a36Sopenharmony_ci if ((abs(val_i_bs - val_i) < th) && (abs(val_q_bs - val_q) <= th)) { 164562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] offset check PASS!!\n"); 164662306a36Sopenharmony_ci return; 164762306a36Sopenharmony_ci } 164862306a36Sopenharmony_ci 164962306a36Sopenharmony_ci if (abs(val_i_bs - val_i) > th) { 165062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 165162306a36Sopenharmony_ci "[RX_DCK] val_i over TH (0x%x / 0x%x)\n", val_i_bs, val_i); 165262306a36Sopenharmony_ci val_i = val_i_bs; 165362306a36Sopenharmony_ci } 165462306a36Sopenharmony_ci 165562306a36Sopenharmony_ci if (abs(val_q_bs - val_q) > th) { 165662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 165762306a36Sopenharmony_ci "[RX_DCK] val_q over TH (0x%x / 0x%x)\n", val_q_bs, val_q); 165862306a36Sopenharmony_ci val_q = val_q_bs; 165962306a36Sopenharmony_ci } 166062306a36Sopenharmony_ci 166162306a36Sopenharmony_ci _rx_dck_value_rewrite(rtwdev, path, addr, val_i, val_q); 166262306a36Sopenharmony_ci} 166362306a36Sopenharmony_ci 166462306a36Sopenharmony_cistatic void _rx_dck_recover(struct rtw89_dev *rtwdev, u8 path) 166562306a36Sopenharmony_ci{ 166662306a36Sopenharmony_ci u8 i_even_bs, q_even_bs; 166762306a36Sopenharmony_ci u8 i_odd_bs, q_odd_bs; 166862306a36Sopenharmony_ci u8 i_even, q_even; 166962306a36Sopenharmony_ci u8 i_odd, q_odd; 167062306a36Sopenharmony_ci u8 i; 167162306a36Sopenharmony_ci 167262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] ===> recovery\n"); 167362306a36Sopenharmony_ci 167462306a36Sopenharmony_ci for (i = 0; i < RF_PATH_NUM_8852C; i++) { 167562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i]); 167662306a36Sopenharmony_ci i_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 167762306a36Sopenharmony_ci q_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 167862306a36Sopenharmony_ci 167962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i] + 1); 168062306a36Sopenharmony_ci i_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 168162306a36Sopenharmony_ci q_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 168262306a36Sopenharmony_ci 168362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 168462306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_even_bs/ q_even_bs = 0x%x/ 0x%x\n", 168562306a36Sopenharmony_ci _dck_addr_bs[i], i_even_bs, q_even_bs); 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i]); 168862306a36Sopenharmony_ci i_even = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 168962306a36Sopenharmony_ci q_even = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 169062306a36Sopenharmony_ci 169162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 169262306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_even/ q_even = 0x%x/ 0x%x\n", 169362306a36Sopenharmony_ci _dck_addr[i], i_even, q_even); 169462306a36Sopenharmony_ci _rx_dck_fix_if_need(rtwdev, path, _dck_addr[i], 169562306a36Sopenharmony_ci i_even_bs, q_even_bs, i_even, q_even); 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 169862306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_odd_bs/ q_odd_bs = 0x%x/ 0x%x\n", 169962306a36Sopenharmony_ci _dck_addr_bs[i] + 1, i_odd_bs, q_odd_bs); 170062306a36Sopenharmony_ci 170162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i] + 1); 170262306a36Sopenharmony_ci i_odd = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 170362306a36Sopenharmony_ci q_odd = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 170462306a36Sopenharmony_ci 170562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 170662306a36Sopenharmony_ci "[RX_DCK] Gain[0x%x] i_odd/ q_odd = 0x%x/ 0x%x\n", 170762306a36Sopenharmony_ci _dck_addr[i] + 1, i_odd, q_odd); 170862306a36Sopenharmony_ci _rx_dck_fix_if_need(rtwdev, path, _dck_addr[i] + 1, 170962306a36Sopenharmony_ci i_odd_bs, q_odd_bs, i_odd, q_odd); 171062306a36Sopenharmony_ci } 171162306a36Sopenharmony_ci} 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_cistatic void _rx_dck_toggle(struct rtw89_dev *rtwdev, u8 path) 171462306a36Sopenharmony_ci{ 171562306a36Sopenharmony_ci int ret; 171662306a36Sopenharmony_ci u32 val; 171762306a36Sopenharmony_ci 171862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 171962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 172062306a36Sopenharmony_ci 172162306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 172262306a36Sopenharmony_ci 2, 2000, false, rtwdev, path, 172362306a36Sopenharmony_ci RR_DCK1, RR_DCK1_DONE); 172462306a36Sopenharmony_ci if (ret) 172562306a36Sopenharmony_ci rtw89_warn(rtwdev, "[RX_DCK] S%d RXDCK timeout\n", path); 172662306a36Sopenharmony_ci else 172762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] S%d RXDCK finish\n", path); 172862306a36Sopenharmony_ci 172962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 173062306a36Sopenharmony_ci} 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, u8 path, 173362306a36Sopenharmony_ci bool is_afe) 173462306a36Sopenharmony_ci{ 173562306a36Sopenharmony_ci u8 res; 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_CLR, 0x0); 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_ci _rx_dck_toggle(rtwdev, path); 174062306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, path, RR_DCKC, RR_DCKC_CHK) == 0) 174162306a36Sopenharmony_ci return; 174262306a36Sopenharmony_ci res = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_DONE); 174362306a36Sopenharmony_ci if (res > 1) { 174462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_IDAC, res); 174562306a36Sopenharmony_ci _rx_dck_toggle(rtwdev, path); 174662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_IDAC, 0x1); 174762306a36Sopenharmony_ci } 174862306a36Sopenharmony_ci} 174962306a36Sopenharmony_ci 175062306a36Sopenharmony_cistatic 175162306a36Sopenharmony_ciu8 _rx_dck_channel_calc(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan) 175262306a36Sopenharmony_ci{ 175362306a36Sopenharmony_ci u8 target_ch = 0; 175462306a36Sopenharmony_ci 175562306a36Sopenharmony_ci if (chan->band_type == RTW89_BAND_5G) { 175662306a36Sopenharmony_ci if (chan->channel >= 36 && chan->channel <= 64) { 175762306a36Sopenharmony_ci target_ch = 100; 175862306a36Sopenharmony_ci } else if (chan->channel >= 100 && chan->channel <= 144) { 175962306a36Sopenharmony_ci target_ch = chan->channel + 32; 176062306a36Sopenharmony_ci if (target_ch > 144) 176162306a36Sopenharmony_ci target_ch = chan->channel + 33; 176262306a36Sopenharmony_ci } else if (chan->channel >= 149 && chan->channel <= 177) { 176362306a36Sopenharmony_ci target_ch = chan->channel - 33; 176462306a36Sopenharmony_ci } 176562306a36Sopenharmony_ci } else if (chan->band_type == RTW89_BAND_6G) { 176662306a36Sopenharmony_ci if (chan->channel >= 1 && chan->channel <= 125) 176762306a36Sopenharmony_ci target_ch = chan->channel + 32; 176862306a36Sopenharmony_ci else 176962306a36Sopenharmony_ci target_ch = chan->channel - 32; 177062306a36Sopenharmony_ci } else { 177162306a36Sopenharmony_ci target_ch = chan->channel; 177262306a36Sopenharmony_ci } 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 177562306a36Sopenharmony_ci "[RX_DCK] cur_ch / target_ch = %d / %d\n", 177662306a36Sopenharmony_ci chan->channel, target_ch); 177762306a36Sopenharmony_ci 177862306a36Sopenharmony_ci return target_ch; 177962306a36Sopenharmony_ci} 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci#define RTW8852C_RF_REL_VERSION 34 178262306a36Sopenharmony_ci#define RTW8852C_DPK_VER 0xf 178362306a36Sopenharmony_ci#define RTW8852C_DPK_TH_AVG_NUM 4 178462306a36Sopenharmony_ci#define RTW8852C_DPK_RF_PATH 2 178562306a36Sopenharmony_ci#define RTW8852C_DPK_KIP_REG_NUM 7 178662306a36Sopenharmony_ci#define RTW8852C_DPK_RXSRAM_DBG 0 178762306a36Sopenharmony_ci 178862306a36Sopenharmony_cienum rtw8852c_dpk_id { 178962306a36Sopenharmony_ci LBK_RXIQK = 0x06, 179062306a36Sopenharmony_ci SYNC = 0x10, 179162306a36Sopenharmony_ci MDPK_IDL = 0x11, 179262306a36Sopenharmony_ci MDPK_MPA = 0x12, 179362306a36Sopenharmony_ci GAIN_LOSS = 0x13, 179462306a36Sopenharmony_ci GAIN_CAL = 0x14, 179562306a36Sopenharmony_ci DPK_RXAGC = 0x15, 179662306a36Sopenharmony_ci KIP_PRESET = 0x16, 179762306a36Sopenharmony_ci KIP_RESTORE = 0x17, 179862306a36Sopenharmony_ci DPK_TXAGC = 0x19, 179962306a36Sopenharmony_ci D_KIP_PRESET = 0x28, 180062306a36Sopenharmony_ci D_TXAGC = 0x29, 180162306a36Sopenharmony_ci D_RXAGC = 0x2a, 180262306a36Sopenharmony_ci D_SYNC = 0x2b, 180362306a36Sopenharmony_ci D_GAIN_LOSS = 0x2c, 180462306a36Sopenharmony_ci D_MDPK_IDL = 0x2d, 180562306a36Sopenharmony_ci D_GAIN_NORM = 0x2f, 180662306a36Sopenharmony_ci D_KIP_THERMAL = 0x30, 180762306a36Sopenharmony_ci D_KIP_RESTORE = 0x31 180862306a36Sopenharmony_ci}; 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_ci#define DPK_TXAGC_LOWER 0x2e 181162306a36Sopenharmony_ci#define DPK_TXAGC_UPPER 0x3f 181262306a36Sopenharmony_ci#define DPK_TXAGC_INVAL 0xff 181362306a36Sopenharmony_ci 181462306a36Sopenharmony_cienum dpk_agc_step { 181562306a36Sopenharmony_ci DPK_AGC_STEP_SYNC_DGAIN, 181662306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_LOSS_IDX, 181762306a36Sopenharmony_ci DPK_AGC_STEP_GL_GT_CRITERION, 181862306a36Sopenharmony_ci DPK_AGC_STEP_GL_LT_CRITERION, 181962306a36Sopenharmony_ci DPK_AGC_STEP_SET_TX_GAIN, 182062306a36Sopenharmony_ci}; 182162306a36Sopenharmony_ci 182262306a36Sopenharmony_cienum dpk_pas_result { 182362306a36Sopenharmony_ci DPK_PAS_NOR, 182462306a36Sopenharmony_ci DPK_PAS_GT, 182562306a36Sopenharmony_ci DPK_PAS_LT, 182662306a36Sopenharmony_ci}; 182762306a36Sopenharmony_ci 182862306a36Sopenharmony_cistatic void _rf_direct_cntrl(struct rtw89_dev *rtwdev, 182962306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 183062306a36Sopenharmony_ci{ 183162306a36Sopenharmony_ci if (is_bybb) 183262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 183362306a36Sopenharmony_ci else 183462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 183562306a36Sopenharmony_ci} 183662306a36Sopenharmony_ci 183762306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, 183862306a36Sopenharmony_ci enum rtw89_rf_path path, bool off); 183962306a36Sopenharmony_ci 184062306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 reg[], 184162306a36Sopenharmony_ci u32 reg_bkup[][RTW8852C_DPK_KIP_REG_NUM], u8 path) 184262306a36Sopenharmony_ci{ 184362306a36Sopenharmony_ci u8 i; 184462306a36Sopenharmony_ci 184562306a36Sopenharmony_ci for (i = 0; i < RTW8852C_DPK_KIP_REG_NUM; i++) { 184662306a36Sopenharmony_ci reg_bkup[path][i] = 184762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD); 184862306a36Sopenharmony_ci 184962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", 185062306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 185162306a36Sopenharmony_ci } 185262306a36Sopenharmony_ci} 185362306a36Sopenharmony_ci 185462306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 reg[], 185562306a36Sopenharmony_ci u32 reg_bkup[][RTW8852C_DPK_KIP_REG_NUM], u8 path) 185662306a36Sopenharmony_ci{ 185762306a36Sopenharmony_ci u8 i; 185862306a36Sopenharmony_ci 185962306a36Sopenharmony_ci for (i = 0; i < RTW8852C_DPK_KIP_REG_NUM; i++) { 186062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), 186162306a36Sopenharmony_ci MASKDWORD, reg_bkup[path][i]); 186262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n", 186362306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 186462306a36Sopenharmony_ci } 186562306a36Sopenharmony_ci} 186662306a36Sopenharmony_ci 186762306a36Sopenharmony_cistatic u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 186862306a36Sopenharmony_ci enum rtw89_rf_path path, enum rtw8852c_dpk_id id) 186962306a36Sopenharmony_ci{ 187062306a36Sopenharmony_ci u16 dpk_cmd; 187162306a36Sopenharmony_ci u32 val; 187262306a36Sopenharmony_ci int ret; 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_ci dpk_cmd = (u16)((id << 8) | (0x19 + path * 0x12)); 187562306a36Sopenharmony_ci 187662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); 187762306a36Sopenharmony_ci 187862306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 187962306a36Sopenharmony_ci 10, 20000, false, rtwdev, 0xbff8, MASKBYTE0); 188062306a36Sopenharmony_ci udelay(10); 188162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0); 188262306a36Sopenharmony_ci 188362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 188462306a36Sopenharmony_ci "[DPK] one-shot for %s = 0x%x (ret=%d)\n", 188562306a36Sopenharmony_ci id == 0x06 ? "LBK_RXIQK" : 188662306a36Sopenharmony_ci id == 0x10 ? "SYNC" : 188762306a36Sopenharmony_ci id == 0x11 ? "MDPK_IDL" : 188862306a36Sopenharmony_ci id == 0x12 ? "MDPK_MPA" : 188962306a36Sopenharmony_ci id == 0x13 ? "GAIN_LOSS" : "PWR_CAL", 189062306a36Sopenharmony_ci dpk_cmd, ret); 189162306a36Sopenharmony_ci 189262306a36Sopenharmony_ci if (ret) { 189362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 189462306a36Sopenharmony_ci "[DPK] one-shot over 20ms!!!!\n"); 189562306a36Sopenharmony_ci return 1; 189662306a36Sopenharmony_ci } 189762306a36Sopenharmony_ci 189862306a36Sopenharmony_ci return 0; 189962306a36Sopenharmony_ci} 190062306a36Sopenharmony_ci 190162306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev, 190262306a36Sopenharmony_ci enum rtw89_phy_idx phy, 190362306a36Sopenharmony_ci enum rtw89_rf_path path) 190462306a36Sopenharmony_ci{ 190562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 190662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 190762306a36Sopenharmony_ci 190862306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 190962306a36Sopenharmony_ci 191062306a36Sopenharmony_ci dpk->bp[path][kidx].band = chan->band_type; 191162306a36Sopenharmony_ci dpk->bp[path][kidx].ch = chan->channel; 191262306a36Sopenharmony_ci dpk->bp[path][kidx].bw = chan->band_width; 191362306a36Sopenharmony_ci 191462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 191562306a36Sopenharmony_ci "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", 191662306a36Sopenharmony_ci path, dpk->cur_idx[path], phy, 191762306a36Sopenharmony_ci rtwdev->is_tssi_mode[path] ? "on" : "off", 191862306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 191962306a36Sopenharmony_ci dpk->bp[path][kidx].band == 0 ? "2G" : 192062306a36Sopenharmony_ci dpk->bp[path][kidx].band == 1 ? "5G" : "6G", 192162306a36Sopenharmony_ci dpk->bp[path][kidx].ch, 192262306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 0 ? "20M" : 192362306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 1 ? "40M" : "80M"); 192462306a36Sopenharmony_ci} 192562306a36Sopenharmony_ci 192662306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, 192762306a36Sopenharmony_ci enum rtw89_phy_idx phy, 192862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kpath) 192962306a36Sopenharmony_ci{ 193062306a36Sopenharmony_ci /*1. Keep ADC_fifo reset*/ 193162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A0 << path, 0x1); 193262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A1 << path, 0x0); 193362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A2 << path, 0x1); 193462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A3 << path, 0x0); 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci /*2. BB for IQK DBG mode*/ 193762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0xd801dffd); 193862306a36Sopenharmony_ci 193962306a36Sopenharmony_ci /*3.Set DAC clk*/ 194062306a36Sopenharmony_ci rtw8852c_txck_force(rtwdev, path, true, DAC_960M); 194162306a36Sopenharmony_ci 194262306a36Sopenharmony_ci /*4. Set ADC clk*/ 194362306a36Sopenharmony_ci rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 194462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), 194562306a36Sopenharmony_ci B_P0_NRBW_DBG, 0x1); 194662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x1f); 194762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x13); 194862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0001); 194962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, MASKHWORD, 0x0041); 195062306a36Sopenharmony_ci 195162306a36Sopenharmony_ci /*5. ADDA fifo rst*/ 195262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A1 << path, 0x1); 195362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A3 << path, 0x1); 195462306a36Sopenharmony_ci 195562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE setting\n", path); 195662306a36Sopenharmony_ci} 195762306a36Sopenharmony_ci 195862306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, u8 path) 195962306a36Sopenharmony_ci{ 196062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), 196162306a36Sopenharmony_ci B_P0_NRBW_DBG, 0x0); 196262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A0 << path, 0x1); 196362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A1 << path, 0x0); 196462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A2 << path, 0x1); 196562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A3 << path, 0x0); 196662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0x00000000); 196762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), B_P0_TXCK_ALL, 0x00); 196862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A0 << path, 0x0); 196962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_A2 << path, 0x0); 197062306a36Sopenharmony_ci 197162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE restore\n", path); 197262306a36Sopenharmony_ci} 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev, 197562306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_pause) 197662306a36Sopenharmony_ci{ 197762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 197862306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, is_pause); 197962306a36Sopenharmony_ci 198062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, 198162306a36Sopenharmony_ci is_pause ? "pause" : "resume"); 198262306a36Sopenharmony_ci} 198362306a36Sopenharmony_ci 198462306a36Sopenharmony_cistatic void _dpk_kip_control_rfc(struct rtw89_dev *rtwdev, u8 path, bool ctrl_by_kip) 198562306a36Sopenharmony_ci{ 198662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_IQK_RFC_ON, ctrl_by_kip); 198762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] RFC is controlled by %s\n", 198862306a36Sopenharmony_ci ctrl_by_kip ? "KIP" : "BB"); 198962306a36Sopenharmony_ci} 199062306a36Sopenharmony_ci 199162306a36Sopenharmony_cistatic void _dpk_txpwr_bb_force(struct rtw89_dev *rtwdev, u8 path, bool force) 199262306a36Sopenharmony_ci{ 199362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13), B_TXPWRB_ON, force); 199462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H + (path << 13), B_TXPWRB_RDY, force); 199562306a36Sopenharmony_ci 199662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d txpwr_bb_force %s\n", 199762306a36Sopenharmony_ci path, force ? "on" : "off"); 199862306a36Sopenharmony_ci} 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 200162306a36Sopenharmony_ci enum rtw89_rf_path path) 200262306a36Sopenharmony_ci{ 200362306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_KIP_RESTORE); 200462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 200562306a36Sopenharmony_ci _dpk_txpwr_bb_force(rtwdev, path, false); 200662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); 200762306a36Sopenharmony_ci} 200862306a36Sopenharmony_ci 200962306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, 201062306a36Sopenharmony_ci enum rtw89_phy_idx phy, 201162306a36Sopenharmony_ci enum rtw89_rf_path path) 201262306a36Sopenharmony_ci{ 201362306a36Sopenharmony_ci#define RX_TONE_IDX 0x00250025 /* Q.2 9.25MHz */ 201462306a36Sopenharmony_ci u8 cur_rxbb; 201562306a36Sopenharmony_ci u32 rf_11, reg_81cc; 201662306a36Sopenharmony_ci 201762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1); 201862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1); 201962306a36Sopenharmony_ci 202062306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB); 202362306a36Sopenharmony_ci rf_11 = rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK); 202462306a36Sopenharmony_ci reg_81cc = rtw89_phy_read32_mask(rtwdev, R_KIP_IQP + (path << 8), 202562306a36Sopenharmony_ci B_KIP_IQP_SW); 202662306a36Sopenharmony_ci 202762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0); 202862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x3); 202962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0xd); 203062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB, 0x1f); 203162306a36Sopenharmony_ci 203262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x12); 203362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, 0x3); 203462306a36Sopenharmony_ci 203562306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 203662306a36Sopenharmony_ci 203762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, MASKDWORD, RX_TONE_IDX); 203862306a36Sopenharmony_ci 203962306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); 204062306a36Sopenharmony_ci 204162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path, 204262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD)); 204362306a36Sopenharmony_ci 204462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 204562306a36Sopenharmony_ci 204662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIG, RFREG_MASK, rf_11); 204762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB, cur_rxbb); 204862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, reg_81cc); 204962306a36Sopenharmony_ci 205062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0); 205162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0); 205262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1); 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 205562306a36Sopenharmony_ci} 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain, 205862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 205962306a36Sopenharmony_ci{ 206062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 206162306a36Sopenharmony_ci 206262306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { 206362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 206462306a36Sopenharmony_ci 0x50121 | BIT(rtwdev->dbcc_en)); 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, 0x2); 206762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTR, 0x4); 206862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 206962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 207062306a36Sopenharmony_ci 207162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 207262306a36Sopenharmony_ci "[DPK] RF 0x0/0x83/0x9e/0x1a/0xdf/0x1001a = 0x%x/ 0x%x/ 0x%x/ 0x%x/ 0x%x/ 0x%x\n", 207362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK), 207462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RXBB, RFREG_MASK), 207562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_TIA, RFREG_MASK), 207662306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK), 207762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_LUTDBG, RFREG_MASK), 207862306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, 0x1001a, RFREG_MASK)); 207962306a36Sopenharmony_ci } else { 208062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 208162306a36Sopenharmony_ci 0x50101 | BIT(rtwdev->dbcc_en)); 208262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK); 208362306a36Sopenharmony_ci 208462306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_6G && dpk->bp[path][kidx].ch >= 161) 208562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_IQGEN, RR_IQGEN_BIAS, 0x8); 208662306a36Sopenharmony_ci 208762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LOGEN, RR_LOGEN_RPT, 0xd); 208862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXAC, RR_TXAC_IQG, 0x8); 208962306a36Sopenharmony_ci 209062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_ATT, 0x0); 209162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT2, 0x3); 209262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_TIA, 0x1); 209362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TIA, RR_TIA_N6, 0x1); 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_160) 209662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_EBW, 0x0); 209762306a36Sopenharmony_ci } 209862306a36Sopenharmony_ci} 209962306a36Sopenharmony_ci 210062306a36Sopenharmony_cistatic void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 210162306a36Sopenharmony_ci{ 210262306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 210362306a36Sopenharmony_ci 210462306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_160) { 210562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x3); 210662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0x0180ff30); 210762306a36Sopenharmony_ci } else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) { 210862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x0); 210962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xffe0fa00); 211062306a36Sopenharmony_ci } else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) { 211162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); 211262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xff4009e0); 211362306a36Sopenharmony_ci } else { 211462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); 211562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xf9f007d0); 211662306a36Sopenharmony_ci } 211762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n", 211862306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_160 ? "160M" : 211962306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : 212062306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); 212162306a36Sopenharmony_ci} 212262306a36Sopenharmony_ci 212362306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 212462306a36Sopenharmony_ci{ 212562306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_I 200 212662306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_Q 200 212762306a36Sopenharmony_ci#define DPK_SYNC_TH_CORR 170 212862306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 212962306a36Sopenharmony_ci u16 dc_i, dc_q; 213062306a36Sopenharmony_ci u8 corr_val, corr_idx, rxbb; 213162306a36Sopenharmony_ci u8 rxbb_ov; 213262306a36Sopenharmony_ci 213362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 213462306a36Sopenharmony_ci 213562306a36Sopenharmony_ci corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI); 213662306a36Sopenharmony_ci corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV); 213762306a36Sopenharmony_ci 213862306a36Sopenharmony_ci dpk->corr_idx[path][kidx] = corr_idx; 213962306a36Sopenharmony_ci dpk->corr_val[path][kidx] = corr_val; 214062306a36Sopenharmony_ci 214162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 214462306a36Sopenharmony_ci dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); 214562306a36Sopenharmony_ci 214662306a36Sopenharmony_ci dc_i = abs(sign_extend32(dc_i, 11)); 214762306a36Sopenharmony_ci dc_q = abs(sign_extend32(dc_q, 11)); 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 215062306a36Sopenharmony_ci "[DPK] S%d Corr_idx/ Corr_val /DC I/Q, = %d / %d / %d / %d\n", 215162306a36Sopenharmony_ci path, corr_idx, corr_val, dc_i, dc_q); 215262306a36Sopenharmony_ci 215362306a36Sopenharmony_ci dpk->dc_i[path][kidx] = dc_i; 215462306a36Sopenharmony_ci dpk->dc_q[path][kidx] = dc_q; 215562306a36Sopenharmony_ci 215662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x8); 215762306a36Sopenharmony_ci rxbb = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB); 215862306a36Sopenharmony_ci 215962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x31); 216062306a36Sopenharmony_ci rxbb_ov = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXOV); 216162306a36Sopenharmony_ci 216262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 216362306a36Sopenharmony_ci "[DPK] S%d RXBB/ RXAGC_done /RXBB_ovlmt = %d / %d / %d\n", 216462306a36Sopenharmony_ci path, rxbb, 216562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DONE), 216662306a36Sopenharmony_ci rxbb_ov); 216762306a36Sopenharmony_ci 216862306a36Sopenharmony_ci if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q || 216962306a36Sopenharmony_ci corr_val < DPK_SYNC_TH_CORR) 217062306a36Sopenharmony_ci return true; 217162306a36Sopenharmony_ci else 217262306a36Sopenharmony_ci return false; 217362306a36Sopenharmony_ci} 217462306a36Sopenharmony_ci 217562306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) 217662306a36Sopenharmony_ci{ 217762306a36Sopenharmony_ci u16 dgain = 0x0; 217862306a36Sopenharmony_ci 217962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL); 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 218262306a36Sopenharmony_ci 218362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x (%d)\n", dgain, dgain); 218462306a36Sopenharmony_ci 218562306a36Sopenharmony_ci return dgain; 218662306a36Sopenharmony_ci} 218762306a36Sopenharmony_ci 218862306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) 218962306a36Sopenharmony_ci{ 219062306a36Sopenharmony_ci u8 result; 219162306a36Sopenharmony_ci 219262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 219362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 219462306a36Sopenharmony_ci 219562306a36Sopenharmony_ci result = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); 219662306a36Sopenharmony_ci 219762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp GL = %d\n", result); 219862306a36Sopenharmony_ci 219962306a36Sopenharmony_ci return result; 220062306a36Sopenharmony_ci} 220162306a36Sopenharmony_ci 220262306a36Sopenharmony_cistatic void _dpk_kset_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 220362306a36Sopenharmony_ci{ 220462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0x10); 220762306a36Sopenharmony_ci dpk->cur_k_set = 220862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), 0xE0000000) - 1; 220962306a36Sopenharmony_ci} 221062306a36Sopenharmony_ci 221162306a36Sopenharmony_cistatic void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 221262306a36Sopenharmony_ci enum rtw89_rf_path path, u8 dbm, bool set_from_bb) 221362306a36Sopenharmony_ci{ 221462306a36Sopenharmony_ci if (set_from_bb) { 221562306a36Sopenharmony_ci dbm = clamp_t(u8, dbm, 7, 24); 221662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] set S%d txagc to %ddBm\n", path, dbm); 221762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13), B_TXPWRB_VAL, dbm << 2); 221862306a36Sopenharmony_ci } 221962306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_TXAGC); 222062306a36Sopenharmony_ci _dpk_kset_query(rtwdev, path); 222162306a36Sopenharmony_ci} 222262306a36Sopenharmony_ci 222362306a36Sopenharmony_cistatic u8 _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 222462306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 222562306a36Sopenharmony_ci{ 222662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_GAIN_LOSS); 222762306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, 0xff, false); 222862306a36Sopenharmony_ci 222962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A1, 0x0); 223062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A0, 0x0); 223162306a36Sopenharmony_ci 223262306a36Sopenharmony_ci return _dpk_gainloss_read(rtwdev); 223362306a36Sopenharmony_ci} 223462306a36Sopenharmony_ci 223562306a36Sopenharmony_cistatic enum dpk_pas_result _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) 223662306a36Sopenharmony_ci{ 223762306a36Sopenharmony_ci u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 223862306a36Sopenharmony_ci u32 val1_sqrt_sum, val2_sqrt_sum; 223962306a36Sopenharmony_ci u8 i; 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); 224262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0); 224362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08); 224462306a36Sopenharmony_ci 224562306a36Sopenharmony_ci if (is_check) { 224662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); 224762306a36Sopenharmony_ci val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 224862306a36Sopenharmony_ci val1_i = abs(sign_extend32(val1_i, 11)); 224962306a36Sopenharmony_ci val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 225062306a36Sopenharmony_ci val1_q = abs(sign_extend32(val1_q, 11)); 225162306a36Sopenharmony_ci 225262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); 225362306a36Sopenharmony_ci val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 225462306a36Sopenharmony_ci val2_i = abs(sign_extend32(val2_i, 11)); 225562306a36Sopenharmony_ci val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 225662306a36Sopenharmony_ci val2_q = abs(sign_extend32(val2_q, 11)); 225762306a36Sopenharmony_ci 225862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", 225962306a36Sopenharmony_ci phy_div(val1_i * val1_i + val1_q * val1_q, 226062306a36Sopenharmony_ci val2_i * val2_i + val2_q * val2_q)); 226162306a36Sopenharmony_ci } else { 226262306a36Sopenharmony_ci for (i = 0; i < 32; i++) { 226362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); 226462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_Read[%02d]= 0x%08x\n", i, 226562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 226662306a36Sopenharmony_ci } 226762306a36Sopenharmony_ci } 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci val1_sqrt_sum = val1_i * val1_i + val1_q * val1_q; 227062306a36Sopenharmony_ci val2_sqrt_sum = val2_i * val2_i + val2_q * val2_q; 227162306a36Sopenharmony_ci 227262306a36Sopenharmony_ci if (val1_sqrt_sum < val2_sqrt_sum) 227362306a36Sopenharmony_ci return DPK_PAS_LT; 227462306a36Sopenharmony_ci else if (val1_sqrt_sum >= val2_sqrt_sum * 8 / 5) 227562306a36Sopenharmony_ci return DPK_PAS_GT; 227662306a36Sopenharmony_ci else 227762306a36Sopenharmony_ci return DPK_PAS_NOR; 227862306a36Sopenharmony_ci} 227962306a36Sopenharmony_ci 228062306a36Sopenharmony_cistatic bool _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 228162306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 228262306a36Sopenharmony_ci{ 228362306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 228462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 228562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 228662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 228762306a36Sopenharmony_ci 228862306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_RXAGC); 228962306a36Sopenharmony_ci 229062306a36Sopenharmony_ci return _dpk_sync_check(rtwdev, path, kidx); 229162306a36Sopenharmony_ci} 229262306a36Sopenharmony_ci 229362306a36Sopenharmony_cistatic void _dpk_read_rxsram(struct rtw89_dev *rtwdev) 229462306a36Sopenharmony_ci{ 229562306a36Sopenharmony_ci u32 addr; 229662306a36Sopenharmony_ci 229762306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_read_rxsram_pre_defs_tbl); 229862306a36Sopenharmony_ci 229962306a36Sopenharmony_ci for (addr = 0; addr < 0x200; addr++) { 230062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000 | addr); 230162306a36Sopenharmony_ci 230262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] RXSRAM[%03d] = 0x%07x\n", addr, 230362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 230462306a36Sopenharmony_ci } 230562306a36Sopenharmony_ci 230662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_read_rxsram_post_defs_tbl); 230762306a36Sopenharmony_ci} 230862306a36Sopenharmony_ci 230962306a36Sopenharmony_cistatic void _dpk_bypass_rxiqc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 231062306a36Sopenharmony_ci{ 231162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1); 231262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 0x40000002); 231362306a36Sopenharmony_ci 231462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Bypass RXIQC\n"); 231562306a36Sopenharmony_ci} 231662306a36Sopenharmony_ci 231762306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 231862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 init_xdbm, u8 loss_only) 231962306a36Sopenharmony_ci{ 232062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 232162306a36Sopenharmony_ci u8 step = DPK_AGC_STEP_SYNC_DGAIN; 232262306a36Sopenharmony_ci u8 tmp_dbm = init_xdbm, tmp_gl_idx = 0; 232362306a36Sopenharmony_ci u8 tmp_rxbb; 232462306a36Sopenharmony_ci u8 goout = 0, agc_cnt = 0; 232562306a36Sopenharmony_ci enum dpk_pas_result pas; 232662306a36Sopenharmony_ci u16 dgain = 0; 232762306a36Sopenharmony_ci bool is_fail = false; 232862306a36Sopenharmony_ci int limit = 200; 232962306a36Sopenharmony_ci 233062306a36Sopenharmony_ci do { 233162306a36Sopenharmony_ci switch (step) { 233262306a36Sopenharmony_ci case DPK_AGC_STEP_SYNC_DGAIN: 233362306a36Sopenharmony_ci is_fail = _dpk_kip_set_rxagc(rtwdev, phy, path, kidx); 233462306a36Sopenharmony_ci 233562306a36Sopenharmony_ci if (RTW8852C_DPK_RXSRAM_DBG) 233662306a36Sopenharmony_ci _dpk_read_rxsram(rtwdev); 233762306a36Sopenharmony_ci 233862306a36Sopenharmony_ci if (is_fail) { 233962306a36Sopenharmony_ci goout = 1; 234062306a36Sopenharmony_ci break; 234162306a36Sopenharmony_ci } 234262306a36Sopenharmony_ci 234362306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 234462306a36Sopenharmony_ci 234562306a36Sopenharmony_ci if (dgain > 0x5fc || dgain < 0x556) { 234662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_SYNC); 234762306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 234862306a36Sopenharmony_ci } 234962306a36Sopenharmony_ci 235062306a36Sopenharmony_ci if (agc_cnt == 0) { 235162306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) 235262306a36Sopenharmony_ci _dpk_bypass_rxiqc(rtwdev, path); 235362306a36Sopenharmony_ci else 235462306a36Sopenharmony_ci _dpk_lbk_rxiqk(rtwdev, phy, path); 235562306a36Sopenharmony_ci } 235662306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 235762306a36Sopenharmony_ci break; 235862306a36Sopenharmony_ci 235962306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_LOSS_IDX: 236062306a36Sopenharmony_ci tmp_gl_idx = _dpk_gainloss(rtwdev, phy, path, kidx); 236162306a36Sopenharmony_ci pas = _dpk_pas_read(rtwdev, true); 236262306a36Sopenharmony_ci 236362306a36Sopenharmony_ci if (pas == DPK_PAS_LT && tmp_gl_idx > 0) 236462306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 236562306a36Sopenharmony_ci else if (pas == DPK_PAS_GT && tmp_gl_idx == 0) 236662306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_GT_CRITERION; 236762306a36Sopenharmony_ci else if (tmp_gl_idx >= 7) 236862306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_GT_CRITERION; 236962306a36Sopenharmony_ci else if (tmp_gl_idx == 0) 237062306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 237162306a36Sopenharmony_ci else 237262306a36Sopenharmony_ci step = DPK_AGC_STEP_SET_TX_GAIN; 237362306a36Sopenharmony_ci break; 237462306a36Sopenharmony_ci 237562306a36Sopenharmony_ci case DPK_AGC_STEP_GL_GT_CRITERION: 237662306a36Sopenharmony_ci if (tmp_dbm <= 7) { 237762306a36Sopenharmony_ci goout = 1; 237862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Txagc@lower bound!!\n"); 237962306a36Sopenharmony_ci } else { 238062306a36Sopenharmony_ci tmp_dbm = max_t(u8, tmp_dbm - 3, 7); 238162306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true); 238262306a36Sopenharmony_ci } 238362306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 238462306a36Sopenharmony_ci agc_cnt++; 238562306a36Sopenharmony_ci break; 238662306a36Sopenharmony_ci 238762306a36Sopenharmony_ci case DPK_AGC_STEP_GL_LT_CRITERION: 238862306a36Sopenharmony_ci if (tmp_dbm >= 24) { 238962306a36Sopenharmony_ci goout = 1; 239062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Txagc@upper bound!!\n"); 239162306a36Sopenharmony_ci } else { 239262306a36Sopenharmony_ci tmp_dbm = min_t(u8, tmp_dbm + 2, 24); 239362306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true); 239462306a36Sopenharmony_ci } 239562306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 239662306a36Sopenharmony_ci agc_cnt++; 239762306a36Sopenharmony_ci break; 239862306a36Sopenharmony_ci 239962306a36Sopenharmony_ci case DPK_AGC_STEP_SET_TX_GAIN: 240062306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 240162306a36Sopenharmony_ci tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB); 240262306a36Sopenharmony_ci if (tmp_rxbb + tmp_gl_idx > 0x1f) 240362306a36Sopenharmony_ci tmp_rxbb = 0x1f; 240462306a36Sopenharmony_ci else 240562306a36Sopenharmony_ci tmp_rxbb = tmp_rxbb + tmp_gl_idx; 240662306a36Sopenharmony_ci 240762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB, tmp_rxbb); 240862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Adjust RXBB (%+d) = 0x%x\n", 240962306a36Sopenharmony_ci tmp_gl_idx, tmp_rxbb); 241062306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 241162306a36Sopenharmony_ci goout = 1; 241262306a36Sopenharmony_ci break; 241362306a36Sopenharmony_ci default: 241462306a36Sopenharmony_ci goout = 1; 241562306a36Sopenharmony_ci break; 241662306a36Sopenharmony_ci } 241762306a36Sopenharmony_ci } while (!goout && agc_cnt < 6 && --limit > 0); 241862306a36Sopenharmony_ci 241962306a36Sopenharmony_ci if (limit <= 0) 242062306a36Sopenharmony_ci rtw89_warn(rtwdev, "[DPK] exceed loop limit\n"); 242162306a36Sopenharmony_ci 242262306a36Sopenharmony_ci return is_fail; 242362306a36Sopenharmony_ci} 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order) 242662306a36Sopenharmony_ci{ 242762306a36Sopenharmony_ci static const struct rtw89_rfk_tbl *order_tbls[] = { 242862306a36Sopenharmony_ci &rtw8852c_dpk_mdpd_order0_defs_tbl, 242962306a36Sopenharmony_ci &rtw8852c_dpk_mdpd_order1_defs_tbl, 243062306a36Sopenharmony_ci &rtw8852c_dpk_mdpd_order2_defs_tbl, 243162306a36Sopenharmony_ci &rtw8852c_dpk_mdpd_order3_defs_tbl, 243262306a36Sopenharmony_ci }; 243362306a36Sopenharmony_ci 243462306a36Sopenharmony_ci if (order >= ARRAY_SIZE(order_tbls)) { 243562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Wrong MDPD order!!(0x%x)\n", order); 243662306a36Sopenharmony_ci return; 243762306a36Sopenharmony_ci } 243862306a36Sopenharmony_ci 243962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, order_tbls[order]); 244062306a36Sopenharmony_ci 244162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set %s for IDL\n", 244262306a36Sopenharmony_ci order == 0x0 ? "(5,3,1)" : 244362306a36Sopenharmony_ci order == 0x1 ? "(5,3,0)" : 244462306a36Sopenharmony_ci order == 0x2 ? "(5,0,0)" : "(7,3,1)"); 244562306a36Sopenharmony_ci} 244662306a36Sopenharmony_ci 244762306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 244862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 244962306a36Sopenharmony_ci{ 245062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 245162306a36Sopenharmony_ci u8 cnt; 245262306a36Sopenharmony_ci u8 ov_flag; 245362306a36Sopenharmony_ci u32 dpk_sync; 245462306a36Sopenharmony_ci 245562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_MA, 0x1); 245662306a36Sopenharmony_ci 245762306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DPK_MPA, B_DPK_MPA_T2) == 0x1) 245862306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x2); 245962306a36Sopenharmony_ci else if (rtw89_phy_read32_mask(rtwdev, R_DPK_MPA, B_DPK_MPA_T1) == 0x1) 246062306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x1); 246162306a36Sopenharmony_ci else if (rtw89_phy_read32_mask(rtwdev, R_DPK_MPA, B_DPK_MPA_T0) == 0x1) 246262306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x0); 246362306a36Sopenharmony_ci else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_5 || 246462306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_10 || 246562306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_20) 246662306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x2); 246762306a36Sopenharmony_ci else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 || 246862306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) 246962306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x1); 247062306a36Sopenharmony_ci else 247162306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x0); 247262306a36Sopenharmony_ci 247362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL, 0x0); 247462306a36Sopenharmony_ci fsleep(1000); 247562306a36Sopenharmony_ci 247662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_MDPK_IDL); 247762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0); 247862306a36Sopenharmony_ci dpk_sync = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 247962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] dpk_sync = 0x%x\n", dpk_sync); 248062306a36Sopenharmony_ci 248162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0xf); 248262306a36Sopenharmony_ci ov_flag = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_SYNERR); 248362306a36Sopenharmony_ci for (cnt = 0; cnt < 5 && ov_flag == 0x1; cnt++) { 248462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] ReK due to MDPK ov!!!\n"); 248562306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_MDPK_IDL); 248662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0xf); 248762306a36Sopenharmony_ci ov_flag = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_SYNERR); 248862306a36Sopenharmony_ci } 248962306a36Sopenharmony_ci 249062306a36Sopenharmony_ci if (ov_flag) { 249162306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x2); 249262306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_MDPK_IDL); 249362306a36Sopenharmony_ci } 249462306a36Sopenharmony_ci} 249562306a36Sopenharmony_ci 249662306a36Sopenharmony_cistatic bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 249762306a36Sopenharmony_ci enum rtw89_rf_path path) 249862306a36Sopenharmony_ci{ 249962306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 250062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 250162306a36Sopenharmony_ci bool is_reload = false; 250262306a36Sopenharmony_ci u8 idx, cur_band, cur_ch; 250362306a36Sopenharmony_ci 250462306a36Sopenharmony_ci cur_band = chan->band_type; 250562306a36Sopenharmony_ci cur_ch = chan->channel; 250662306a36Sopenharmony_ci 250762306a36Sopenharmony_ci for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) { 250862306a36Sopenharmony_ci if (cur_band != dpk->bp[path][idx].band || 250962306a36Sopenharmony_ci cur_ch != dpk->bp[path][idx].ch) 251062306a36Sopenharmony_ci continue; 251162306a36Sopenharmony_ci 251262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 251362306a36Sopenharmony_ci B_COEF_SEL_MDPD, idx); 251462306a36Sopenharmony_ci dpk->cur_idx[path] = idx; 251562306a36Sopenharmony_ci is_reload = true; 251662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 251762306a36Sopenharmony_ci "[DPK] reload S%d[%d] success\n", path, idx); 251862306a36Sopenharmony_ci } 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_ci return is_reload; 252162306a36Sopenharmony_ci} 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_cistatic void _dpk_kip_pwr_clk_onoff(struct rtw89_dev *rtwdev, bool turn_on) 252462306a36Sopenharmony_ci{ 252562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, turn_on ? &rtw8852c_dpk_kip_pwr_clk_on_defs_tbl : 252662306a36Sopenharmony_ci &rtw8852c_dpk_kip_pwr_clk_off_defs_tbl); 252762306a36Sopenharmony_ci} 252862306a36Sopenharmony_ci 252962306a36Sopenharmony_cistatic void _dpk_kip_preset_8852c(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 253062306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 253162306a36Sopenharmony_ci{ 253262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 253362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 253462306a36Sopenharmony_ci 253562306a36Sopenharmony_ci if (rtwdev->hal.cv == CHIP_CAV) 253662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 253762306a36Sopenharmony_ci R_DPD_CH0A + (path << 8) + (kidx << 2), 253862306a36Sopenharmony_ci B_DPD_SEL, 0x01); 253962306a36Sopenharmony_ci else 254062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, 254162306a36Sopenharmony_ci R_DPD_CH0A + (path << 8) + (kidx << 2), 254262306a36Sopenharmony_ci B_DPD_SEL, 0x0c); 254362306a36Sopenharmony_ci 254462306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, true); 254562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_MDPD, kidx); 254662306a36Sopenharmony_ci 254762306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_KIP_PRESET); 254862306a36Sopenharmony_ci} 254962306a36Sopenharmony_ci 255062306a36Sopenharmony_cistatic void _dpk_para_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 255162306a36Sopenharmony_ci{ 255262306a36Sopenharmony_ci#define _DPK_PARA_TXAGC GENMASK(15, 10) 255362306a36Sopenharmony_ci#define _DPK_PARA_THER GENMASK(31, 26) 255462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 255562306a36Sopenharmony_ci u32 para; 255662306a36Sopenharmony_ci 255762306a36Sopenharmony_ci para = rtw89_phy_read32_mask(rtwdev, dpk_par_regs[kidx][dpk->cur_k_set] + (path << 8), 255862306a36Sopenharmony_ci MASKDWORD); 255962306a36Sopenharmony_ci 256062306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk = FIELD_GET(_DPK_PARA_TXAGC, para); 256162306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk = FIELD_GET(_DPK_PARA_THER, para); 256262306a36Sopenharmony_ci 256362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal/ txagc_RF (K%d) = 0x%x/ 0x%x\n", 256462306a36Sopenharmony_ci dpk->cur_k_set, dpk->bp[path][kidx].ther_dpk, dpk->bp[path][kidx].txagc_dpk); 256562306a36Sopenharmony_ci} 256662306a36Sopenharmony_ci 256762306a36Sopenharmony_cistatic void _dpk_gain_normalize_8852c(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 256862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, bool is_execute) 256962306a36Sopenharmony_ci{ 257062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 257162306a36Sopenharmony_ci 257262306a36Sopenharmony_ci if (is_execute) { 257362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8), B_DPK_GN_AG, 0x200); 257462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8), B_DPK_GN_EN, 0x3); 257562306a36Sopenharmony_ci 257662306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, D_GAIN_NORM); 257762306a36Sopenharmony_ci } else { 257862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, dpk_par_regs[kidx][dpk->cur_k_set] + (path << 8), 257962306a36Sopenharmony_ci 0x0000007F, 0x5b); 258062306a36Sopenharmony_ci } 258162306a36Sopenharmony_ci dpk->bp[path][kidx].gs = 258262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, dpk_par_regs[kidx][dpk->cur_k_set] + (path << 8), 258362306a36Sopenharmony_ci 0x0000007F); 258462306a36Sopenharmony_ci} 258562306a36Sopenharmony_ci 258662306a36Sopenharmony_cistatic u8 _dpk_order_convert(struct rtw89_dev *rtwdev) 258762306a36Sopenharmony_ci{ 258862306a36Sopenharmony_ci u32 val32 = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP); 258962306a36Sopenharmony_ci u8 val; 259062306a36Sopenharmony_ci 259162306a36Sopenharmony_ci switch (val32) { 259262306a36Sopenharmony_ci case 0: 259362306a36Sopenharmony_ci val = 0x6; 259462306a36Sopenharmony_ci break; 259562306a36Sopenharmony_ci case 1: 259662306a36Sopenharmony_ci val = 0x2; 259762306a36Sopenharmony_ci break; 259862306a36Sopenharmony_ci case 2: 259962306a36Sopenharmony_ci val = 0x0; 260062306a36Sopenharmony_ci break; 260162306a36Sopenharmony_ci case 3: 260262306a36Sopenharmony_ci val = 0x7; 260362306a36Sopenharmony_ci break; 260462306a36Sopenharmony_ci default: 260562306a36Sopenharmony_ci val = 0xff; 260662306a36Sopenharmony_ci break; 260762306a36Sopenharmony_ci } 260862306a36Sopenharmony_ci 260962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val); 261062306a36Sopenharmony_ci 261162306a36Sopenharmony_ci return val; 261262306a36Sopenharmony_ci} 261362306a36Sopenharmony_ci 261462306a36Sopenharmony_cistatic void _dpk_on(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 261562306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 261662306a36Sopenharmony_ci{ 261762306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 261862306a36Sopenharmony_ci 261962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); 262062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0); 262162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 262262306a36Sopenharmony_ci B_DPD_ORDER, _dpk_order_convert(rtwdev)); 262362306a36Sopenharmony_ci 262462306a36Sopenharmony_ci dpk->bp[path][kidx].mdpd_en = BIT(dpk->cur_k_set); 262562306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = true; 262662306a36Sopenharmony_ci 262762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] path_ok = 0x%x\n", 262862306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].mdpd_en); 262962306a36Sopenharmony_ci 263062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 263162306a36Sopenharmony_ci B_DPD_MEN, dpk->bp[path][kidx].mdpd_en); 263262306a36Sopenharmony_ci 263362306a36Sopenharmony_ci _dpk_gain_normalize_8852c(rtwdev, phy, path, kidx, false); 263462306a36Sopenharmony_ci} 263562306a36Sopenharmony_ci 263662306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 263762306a36Sopenharmony_ci enum rtw89_rf_path path, u8 gain) 263862306a36Sopenharmony_ci{ 263962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 264062306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 264162306a36Sopenharmony_ci u8 init_xdbm = 15; 264262306a36Sopenharmony_ci bool is_fail; 264362306a36Sopenharmony_ci 264462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 264562306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Start =========\n", path, kidx); 264662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 264762306a36Sopenharmony_ci _rf_direct_cntrl(rtwdev, path, false); 264862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RFREG_MASK, 0x03ffd); 264962306a36Sopenharmony_ci _dpk_rf_setting(rtwdev, gain, path, kidx); 265062306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path, false); 265162306a36Sopenharmony_ci _dpk_kip_pwr_clk_onoff(rtwdev, true); 265262306a36Sopenharmony_ci _dpk_kip_preset_8852c(rtwdev, phy, path, kidx); 265362306a36Sopenharmony_ci _dpk_txpwr_bb_force(rtwdev, path, true); 265462306a36Sopenharmony_ci _dpk_kip_set_txagc(rtwdev, phy, path, init_xdbm, true); 265562306a36Sopenharmony_ci _dpk_tpg_sel(rtwdev, path, kidx); 265662306a36Sopenharmony_ci 265762306a36Sopenharmony_ci is_fail = _dpk_agc(rtwdev, phy, path, kidx, init_xdbm, false); 265862306a36Sopenharmony_ci if (is_fail) 265962306a36Sopenharmony_ci goto _error; 266062306a36Sopenharmony_ci 266162306a36Sopenharmony_ci _dpk_idl_mpa(rtwdev, phy, path, kidx); 266262306a36Sopenharmony_ci _dpk_para_query(rtwdev, path, kidx); 266362306a36Sopenharmony_ci _dpk_on(rtwdev, phy, path, kidx); 266462306a36Sopenharmony_ci 266562306a36Sopenharmony_ci_error: 266662306a36Sopenharmony_ci _dpk_kip_control_rfc(rtwdev, path, false); 266762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RF_RX); 266862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d]_K%d %s\n", path, kidx, 266962306a36Sopenharmony_ci dpk->cur_k_set, is_fail ? "need Check" : "is Success"); 267062306a36Sopenharmony_ci 267162306a36Sopenharmony_ci return is_fail; 267262306a36Sopenharmony_ci} 267362306a36Sopenharmony_ci 267462306a36Sopenharmony_cistatic void _dpk_init(struct rtw89_dev *rtwdev, u8 path) 267562306a36Sopenharmony_ci{ 267662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 267762306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 267862306a36Sopenharmony_ci 267962306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = false; 268062306a36Sopenharmony_ci} 268162306a36Sopenharmony_ci 268262306a36Sopenharmony_cistatic void _dpk_drf_direct_cntrl(struct rtw89_dev *rtwdev, u8 path, bool is_bybb) 268362306a36Sopenharmony_ci{ 268462306a36Sopenharmony_ci if (is_bybb) 268562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1); 268662306a36Sopenharmony_ci else 268762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0); 268862306a36Sopenharmony_ci} 268962306a36Sopenharmony_ci 269062306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force, 269162306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 kpath) 269262306a36Sopenharmony_ci{ 269362306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 269462306a36Sopenharmony_ci static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120, 0xc0c4, 0xc0e8, 0xc0d4, 0xc0d8}; 269562306a36Sopenharmony_ci u32 backup_rf_val[RTW8852C_DPK_RF_PATH][BACKUP_RF_REGS_NR]; 269662306a36Sopenharmony_ci u32 kip_bkup[RTW8852C_DPK_RF_PATH][RTW8852C_DPK_KIP_REG_NUM] = {}; 269762306a36Sopenharmony_ci u8 path; 269862306a36Sopenharmony_ci bool is_fail = true, reloaded[RTW8852C_DPK_RF_PATH] = {false}; 269962306a36Sopenharmony_ci 270062306a36Sopenharmony_ci static_assert(ARRAY_SIZE(kip_reg) == RTW8852C_DPK_KIP_REG_NUM); 270162306a36Sopenharmony_ci 270262306a36Sopenharmony_ci if (dpk->is_dpk_reload_en) { 270362306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 270462306a36Sopenharmony_ci if (!(kpath & BIT(path))) 270562306a36Sopenharmony_ci continue; 270662306a36Sopenharmony_ci 270762306a36Sopenharmony_ci reloaded[path] = _dpk_reload_check(rtwdev, phy, path); 270862306a36Sopenharmony_ci if (!reloaded[path] && dpk->bp[path][0].ch != 0) 270962306a36Sopenharmony_ci dpk->cur_idx[path] = !dpk->cur_idx[path]; 271062306a36Sopenharmony_ci else 271162306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, false); 271262306a36Sopenharmony_ci } 271362306a36Sopenharmony_ci } else { 271462306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) 271562306a36Sopenharmony_ci dpk->cur_idx[path] = 0; 271662306a36Sopenharmony_ci } 271762306a36Sopenharmony_ci 271862306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 271962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 272062306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Init =========\n", 272162306a36Sopenharmony_ci path, dpk->cur_idx[path]); 272262306a36Sopenharmony_ci _dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path); 272362306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, backup_rf_val[path], path); 272462306a36Sopenharmony_ci _dpk_information(rtwdev, phy, path); 272562306a36Sopenharmony_ci _dpk_init(rtwdev, path); 272662306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 272762306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, true); 272862306a36Sopenharmony_ci } 272962306a36Sopenharmony_ci 273062306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 273162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 273262306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Start =========\n", 273362306a36Sopenharmony_ci path, dpk->cur_idx[path]); 273462306a36Sopenharmony_ci rtw8852c_disable_rxagc(rtwdev, path, 0x0); 273562306a36Sopenharmony_ci _dpk_drf_direct_cntrl(rtwdev, path, false); 273662306a36Sopenharmony_ci _dpk_bb_afe_setting(rtwdev, phy, path, kpath); 273762306a36Sopenharmony_ci is_fail = _dpk_main(rtwdev, phy, path, 1); 273862306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, is_fail); 273962306a36Sopenharmony_ci } 274062306a36Sopenharmony_ci 274162306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 274262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 274362306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Restore =========\n", 274462306a36Sopenharmony_ci path, dpk->cur_idx[path]); 274562306a36Sopenharmony_ci _dpk_kip_restore(rtwdev, phy, path); 274662306a36Sopenharmony_ci _dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path); 274762306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, backup_rf_val[path], path); 274862306a36Sopenharmony_ci _dpk_bb_afe_restore(rtwdev, path); 274962306a36Sopenharmony_ci rtw8852c_disable_rxagc(rtwdev, path, 0x1); 275062306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 275162306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, false); 275262306a36Sopenharmony_ci } 275362306a36Sopenharmony_ci 275462306a36Sopenharmony_ci _dpk_kip_pwr_clk_onoff(rtwdev, false); 275562306a36Sopenharmony_ci} 275662306a36Sopenharmony_ci 275762306a36Sopenharmony_cistatic bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 275862306a36Sopenharmony_ci{ 275962306a36Sopenharmony_ci struct rtw89_fem_info *fem = &rtwdev->fem; 276062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 276162306a36Sopenharmony_ci u8 band = chan->band_type; 276262306a36Sopenharmony_ci 276362306a36Sopenharmony_ci if (rtwdev->hal.cv == CHIP_CAV && band != RTW89_BAND_2G) { 276462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Skip DPK due to CAV & not 2G!!\n"); 276562306a36Sopenharmony_ci return true; 276662306a36Sopenharmony_ci } else if (fem->epa_2g && band == RTW89_BAND_2G) { 276762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Skip DPK due to 2G_ext_PA exist!!\n"); 276862306a36Sopenharmony_ci return true; 276962306a36Sopenharmony_ci } else if (fem->epa_5g && band == RTW89_BAND_5G) { 277062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Skip DPK due to 5G_ext_PA exist!!\n"); 277162306a36Sopenharmony_ci return true; 277262306a36Sopenharmony_ci } else if (fem->epa_6g && band == RTW89_BAND_6G) { 277362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Skip DPK due to 6G_ext_PA exist!!\n"); 277462306a36Sopenharmony_ci return true; 277562306a36Sopenharmony_ci } 277662306a36Sopenharmony_ci 277762306a36Sopenharmony_ci return false; 277862306a36Sopenharmony_ci} 277962306a36Sopenharmony_ci 278062306a36Sopenharmony_cistatic void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 278162306a36Sopenharmony_ci{ 278262306a36Sopenharmony_ci u8 path, kpath; 278362306a36Sopenharmony_ci 278462306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 278562306a36Sopenharmony_ci 278662306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 278762306a36Sopenharmony_ci if (kpath & BIT(path)) 278862306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, true); 278962306a36Sopenharmony_ci } 279062306a36Sopenharmony_ci} 279162306a36Sopenharmony_ci 279262306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force) 279362306a36Sopenharmony_ci{ 279462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 279562306a36Sopenharmony_ci "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n", 279662306a36Sopenharmony_ci RTW8852C_DPK_VER, rtwdev->hal.cv, 279762306a36Sopenharmony_ci RTW8852C_RF_REL_VERSION); 279862306a36Sopenharmony_ci 279962306a36Sopenharmony_ci if (_dpk_bypass_check(rtwdev, phy)) 280062306a36Sopenharmony_ci _dpk_force_bypass(rtwdev, phy); 280162306a36Sopenharmony_ci else 280262306a36Sopenharmony_ci _dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy)); 280362306a36Sopenharmony_ci 280462306a36Sopenharmony_ci if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_DCKC, RR_DCKC_CHK) == 0x1) 280562306a36Sopenharmony_ci rtw8852c_rx_dck(rtwdev, phy, false); 280662306a36Sopenharmony_ci} 280762306a36Sopenharmony_ci 280862306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, 280962306a36Sopenharmony_ci enum rtw89_rf_path path, bool off) 281062306a36Sopenharmony_ci{ 281162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 281262306a36Sopenharmony_ci u8 val, kidx = dpk->cur_idx[path]; 281362306a36Sopenharmony_ci 281462306a36Sopenharmony_ci val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok ? 281562306a36Sopenharmony_ci dpk->bp[path][kidx].mdpd_en : 0; 281662306a36Sopenharmony_ci 281762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 281862306a36Sopenharmony_ci B_DPD_MEN, val); 281962306a36Sopenharmony_ci 282062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, 282162306a36Sopenharmony_ci kidx, dpk->is_dpk_enable && !off ? "enable" : "disable"); 282262306a36Sopenharmony_ci} 282362306a36Sopenharmony_ci 282462306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev) 282562306a36Sopenharmony_ci{ 282662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 282762306a36Sopenharmony_ci u8 path, kidx; 282862306a36Sopenharmony_ci u8 txagc_rf = 0; 282962306a36Sopenharmony_ci s8 txagc_bb = 0, txagc_bb_tp = 0, txagc_ofst = 0; 283062306a36Sopenharmony_ci u8 cur_ther; 283162306a36Sopenharmony_ci s8 delta_ther = 0; 283262306a36Sopenharmony_ci s16 pwsf_tssi_ofst; 283362306a36Sopenharmony_ci 283462306a36Sopenharmony_ci for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { 283562306a36Sopenharmony_ci kidx = dpk->cur_idx[path]; 283662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 283762306a36Sopenharmony_ci "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", 283862306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].ch); 283962306a36Sopenharmony_ci 284062306a36Sopenharmony_ci txagc_rf = 284162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 0x0000003f); 284262306a36Sopenharmony_ci txagc_bb = 284362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), MASKBYTE2); 284462306a36Sopenharmony_ci txagc_bb_tp = 284562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BTP + (path << 13), B_TXAGC_BTP); 284662306a36Sopenharmony_ci 284762306a36Sopenharmony_ci /* report from KIP */ 284862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0xf); 284962306a36Sopenharmony_ci cur_ther = 285062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), B_RPT_PER_TH); 285162306a36Sopenharmony_ci txagc_ofst = 285262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), B_RPT_PER_OF); 285362306a36Sopenharmony_ci pwsf_tssi_ofst = 285462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), B_RPT_PER_TSSI); 285562306a36Sopenharmony_ci pwsf_tssi_ofst = sign_extend32(pwsf_tssi_ofst, 12); 285662306a36Sopenharmony_ci 285762306a36Sopenharmony_ci cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 285862306a36Sopenharmony_ci 285962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 286062306a36Sopenharmony_ci "[DPK_TRK] thermal now = %d\n", cur_ther); 286162306a36Sopenharmony_ci 286262306a36Sopenharmony_ci if (dpk->bp[path][kidx].ch != 0 && cur_ther != 0) 286362306a36Sopenharmony_ci delta_ther = dpk->bp[path][kidx].ther_dpk - cur_ther; 286462306a36Sopenharmony_ci 286562306a36Sopenharmony_ci delta_ther = delta_ther * 1 / 2; 286662306a36Sopenharmony_ci 286762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 286862306a36Sopenharmony_ci "[DPK_TRK] extra delta_ther = %d (0x%x / 0x%x@k)\n", 286962306a36Sopenharmony_ci delta_ther, cur_ther, dpk->bp[path][kidx].ther_dpk); 287062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 287162306a36Sopenharmony_ci "[DPK_TRK] delta_txagc = %d (0x%x / 0x%x@k)\n", 287262306a36Sopenharmony_ci txagc_rf - dpk->bp[path][kidx].txagc_dpk, txagc_rf, 287362306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk); 287462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 287562306a36Sopenharmony_ci "[DPK_TRK] txagc_offset / pwsf_tssi_ofst = 0x%x / %+d\n", 287662306a36Sopenharmony_ci txagc_ofst, pwsf_tssi_ofst); 287762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 287862306a36Sopenharmony_ci "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", 287962306a36Sopenharmony_ci txagc_bb_tp, txagc_bb); 288062306a36Sopenharmony_ci 288162306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DPK_WR, B_DPK_WR_ST) == 0x0 && 288262306a36Sopenharmony_ci txagc_rf != 0 && rtwdev->hal.cv == CHIP_CAV) { 288362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 288462306a36Sopenharmony_ci "[DPK_TRK] New pwsf = 0x%x\n", 0x78 - delta_ther); 288562306a36Sopenharmony_ci 288662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 288762306a36Sopenharmony_ci 0x07FC0000, 0x78 - delta_ther); 288862306a36Sopenharmony_ci } 288962306a36Sopenharmony_ci } 289062306a36Sopenharmony_ci} 289162306a36Sopenharmony_ci 289262306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 289362306a36Sopenharmony_ci enum rtw89_rf_path path) 289462306a36Sopenharmony_ci{ 289562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 289662306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 289762306a36Sopenharmony_ci 289862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_tssi_sys_defs_tbl); 289962306a36Sopenharmony_ci 290062306a36Sopenharmony_ci if (path == RF_PATH_A) 290162306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 290262306a36Sopenharmony_ci &rtw8852c_tssi_sys_defs_2g_a_tbl, 290362306a36Sopenharmony_ci &rtw8852c_tssi_sys_defs_5g_a_tbl); 290462306a36Sopenharmony_ci else 290562306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 290662306a36Sopenharmony_ci &rtw8852c_tssi_sys_defs_2g_b_tbl, 290762306a36Sopenharmony_ci &rtw8852c_tssi_sys_defs_5g_b_tbl); 290862306a36Sopenharmony_ci} 290962306a36Sopenharmony_ci 291062306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 291162306a36Sopenharmony_ci enum rtw89_rf_path path) 291262306a36Sopenharmony_ci{ 291362306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 291462306a36Sopenharmony_ci &rtw8852c_tssi_txpwr_ctrl_bb_defs_a_tbl, 291562306a36Sopenharmony_ci &rtw8852c_tssi_txpwr_ctrl_bb_defs_b_tbl); 291662306a36Sopenharmony_ci} 291762306a36Sopenharmony_ci 291862306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, 291962306a36Sopenharmony_ci enum rtw89_phy_idx phy, 292062306a36Sopenharmony_ci enum rtw89_rf_path path) 292162306a36Sopenharmony_ci{ 292262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 292362306a36Sopenharmony_ci &rtw8852c_tssi_txpwr_ctrl_bb_he_tb_defs_a_tbl, 292462306a36Sopenharmony_ci &rtw8852c_tssi_txpwr_ctrl_bb_he_tb_defs_b_tbl); 292562306a36Sopenharmony_ci} 292662306a36Sopenharmony_ci 292762306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 292862306a36Sopenharmony_ci enum rtw89_rf_path path) 292962306a36Sopenharmony_ci{ 293062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 293162306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 293262306a36Sopenharmony_ci 293362306a36Sopenharmony_ci if (path == RF_PATH_A) { 293462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_tssi_dck_defs_a_tbl); 293562306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 293662306a36Sopenharmony_ci &rtw8852c_tssi_dck_defs_2g_a_tbl, 293762306a36Sopenharmony_ci &rtw8852c_tssi_dck_defs_5g_a_tbl); 293862306a36Sopenharmony_ci } else { 293962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_tssi_dck_defs_b_tbl); 294062306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 294162306a36Sopenharmony_ci &rtw8852c_tssi_dck_defs_2g_b_tbl, 294262306a36Sopenharmony_ci &rtw8852c_tssi_dck_defs_5g_b_tbl); 294362306a36Sopenharmony_ci } 294462306a36Sopenharmony_ci} 294562306a36Sopenharmony_ci 294662306a36Sopenharmony_cistatic void _tssi_set_bbgain_split(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 294762306a36Sopenharmony_ci enum rtw89_rf_path path) 294862306a36Sopenharmony_ci{ 294962306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 295062306a36Sopenharmony_ci &rtw8852c_tssi_set_bbgain_split_a_tbl, 295162306a36Sopenharmony_ci &rtw8852c_tssi_set_bbgain_split_b_tbl); 295262306a36Sopenharmony_ci} 295362306a36Sopenharmony_ci 295462306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 295562306a36Sopenharmony_ci enum rtw89_rf_path path) 295662306a36Sopenharmony_ci{ 295762306a36Sopenharmony_ci#define RTW8852C_TSSI_GET_VAL(ptr, idx) \ 295862306a36Sopenharmony_ci({ \ 295962306a36Sopenharmony_ci s8 *__ptr = (ptr); \ 296062306a36Sopenharmony_ci u8 __idx = (idx), __i, __v; \ 296162306a36Sopenharmony_ci u32 __val = 0; \ 296262306a36Sopenharmony_ci for (__i = 0; __i < 4; __i++) { \ 296362306a36Sopenharmony_ci __v = (__ptr[__idx + __i]); \ 296462306a36Sopenharmony_ci __val |= (__v << (8 * __i)); \ 296562306a36Sopenharmony_ci } \ 296662306a36Sopenharmony_ci __val; \ 296762306a36Sopenharmony_ci}) 296862306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 296962306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 297062306a36Sopenharmony_ci u8 ch = chan->channel; 297162306a36Sopenharmony_ci u8 subband = chan->subband_type; 297262306a36Sopenharmony_ci const s8 *thm_up_a = NULL; 297362306a36Sopenharmony_ci const s8 *thm_down_a = NULL; 297462306a36Sopenharmony_ci const s8 *thm_up_b = NULL; 297562306a36Sopenharmony_ci const s8 *thm_down_b = NULL; 297662306a36Sopenharmony_ci u8 thermal = 0xff; 297762306a36Sopenharmony_ci s8 thm_ofst[64] = {0}; 297862306a36Sopenharmony_ci u32 tmp = 0; 297962306a36Sopenharmony_ci u8 i, j; 298062306a36Sopenharmony_ci 298162306a36Sopenharmony_ci switch (subband) { 298262306a36Sopenharmony_ci default: 298362306a36Sopenharmony_ci case RTW89_CH_2G: 298462306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_2ga_p; 298562306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_2ga_n; 298662306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_2gb_p; 298762306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_2gb_n; 298862306a36Sopenharmony_ci break; 298962306a36Sopenharmony_ci case RTW89_CH_5G_BAND_1: 299062306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[0]; 299162306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[0]; 299262306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[0]; 299362306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[0]; 299462306a36Sopenharmony_ci break; 299562306a36Sopenharmony_ci case RTW89_CH_5G_BAND_3: 299662306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[1]; 299762306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[1]; 299862306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[1]; 299962306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[1]; 300062306a36Sopenharmony_ci break; 300162306a36Sopenharmony_ci case RTW89_CH_5G_BAND_4: 300262306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_p[2]; 300362306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_5ga_n[2]; 300462306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_p[2]; 300562306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_5gb_n[2]; 300662306a36Sopenharmony_ci break; 300762306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX0: 300862306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX1: 300962306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[0]; 301062306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[0]; 301162306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[0]; 301262306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[0]; 301362306a36Sopenharmony_ci break; 301462306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX2: 301562306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX3: 301662306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[1]; 301762306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[1]; 301862306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[1]; 301962306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[1]; 302062306a36Sopenharmony_ci break; 302162306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX4: 302262306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX5: 302362306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[2]; 302462306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[2]; 302562306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[2]; 302662306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[2]; 302762306a36Sopenharmony_ci break; 302862306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX6: 302962306a36Sopenharmony_ci case RTW89_CH_6G_BAND_IDX7: 303062306a36Sopenharmony_ci thm_up_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_p[3]; 303162306a36Sopenharmony_ci thm_down_a = rtw89_8852c_trk_cfg.delta_swingidx_6ga_n[3]; 303262306a36Sopenharmony_ci thm_up_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_p[3]; 303362306a36Sopenharmony_ci thm_down_b = rtw89_8852c_trk_cfg.delta_swingidx_6gb_n[3]; 303462306a36Sopenharmony_ci break; 303562306a36Sopenharmony_ci } 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_ci if (path == RF_PATH_A) { 303862306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_A]; 303962306a36Sopenharmony_ci 304062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 304162306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); 304262306a36Sopenharmony_ci 304362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); 304462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); 304562306a36Sopenharmony_ci 304662306a36Sopenharmony_ci if (thermal == 0xff) { 304762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); 304862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); 304962306a36Sopenharmony_ci 305062306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 305162306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 305462306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 305562306a36Sopenharmony_ci 0x5c00 + i, 0x0); 305662306a36Sopenharmony_ci } 305762306a36Sopenharmony_ci 305862306a36Sopenharmony_ci } else { 305962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal); 306062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 306162306a36Sopenharmony_ci thermal); 306262306a36Sopenharmony_ci 306362306a36Sopenharmony_ci i = 0; 306462306a36Sopenharmony_ci for (j = 0; j < 32; j++) 306562306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 306662306a36Sopenharmony_ci -thm_down_a[i++] : 306762306a36Sopenharmony_ci -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; 306862306a36Sopenharmony_ci 306962306a36Sopenharmony_ci i = 1; 307062306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 307162306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 307262306a36Sopenharmony_ci thm_up_a[i++] : 307362306a36Sopenharmony_ci thm_up_a[DELTA_SWINGIDX_SIZE - 1]; 307462306a36Sopenharmony_ci 307562306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 307662306a36Sopenharmony_ci tmp = RTW8852C_TSSI_GET_VAL(thm_ofst, i); 307762306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); 307862306a36Sopenharmony_ci 307962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 308062306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 308162306a36Sopenharmony_ci 0x5c00 + i, tmp); 308262306a36Sopenharmony_ci } 308362306a36Sopenharmony_ci } 308462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); 308562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); 308662306a36Sopenharmony_ci 308762306a36Sopenharmony_ci } else { 308862306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_B]; 308962306a36Sopenharmony_ci 309062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 309162306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal); 309262306a36Sopenharmony_ci 309362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0); 309462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1); 309562306a36Sopenharmony_ci 309662306a36Sopenharmony_ci if (thermal == 0xff) { 309762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32); 309862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32); 309962306a36Sopenharmony_ci 310062306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 310162306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0); 310262306a36Sopenharmony_ci 310362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 310462306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 310562306a36Sopenharmony_ci 0x7c00 + i, 0x0); 310662306a36Sopenharmony_ci } 310762306a36Sopenharmony_ci 310862306a36Sopenharmony_ci } else { 310962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal); 311062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 311162306a36Sopenharmony_ci thermal); 311262306a36Sopenharmony_ci 311362306a36Sopenharmony_ci i = 0; 311462306a36Sopenharmony_ci for (j = 0; j < 32; j++) 311562306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 311662306a36Sopenharmony_ci -thm_down_b[i++] : 311762306a36Sopenharmony_ci -thm_down_b[DELTA_SWINGIDX_SIZE - 1]; 311862306a36Sopenharmony_ci 311962306a36Sopenharmony_ci i = 1; 312062306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 312162306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 312262306a36Sopenharmony_ci thm_up_b[i++] : 312362306a36Sopenharmony_ci thm_up_b[DELTA_SWINGIDX_SIZE - 1]; 312462306a36Sopenharmony_ci 312562306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 312662306a36Sopenharmony_ci tmp = RTW8852C_TSSI_GET_VAL(thm_ofst, i); 312762306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp); 312862306a36Sopenharmony_ci 312962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 313062306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 313162306a36Sopenharmony_ci 0x7c00 + i, tmp); 313262306a36Sopenharmony_ci } 313362306a36Sopenharmony_ci } 313462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1); 313562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0); 313662306a36Sopenharmony_ci } 313762306a36Sopenharmony_ci#undef RTW8852C_TSSI_GET_VAL 313862306a36Sopenharmony_ci} 313962306a36Sopenharmony_ci 314062306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 314162306a36Sopenharmony_ci enum rtw89_rf_path path) 314262306a36Sopenharmony_ci{ 314362306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 314462306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 314562306a36Sopenharmony_ci 314662306a36Sopenharmony_ci if (path == RF_PATH_A) { 314762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 314862306a36Sopenharmony_ci &rtw8852c_tssi_slope_cal_org_defs_2g_a_tbl, 314962306a36Sopenharmony_ci &rtw8852c_tssi_slope_cal_org_defs_5g_a_tbl); 315062306a36Sopenharmony_ci } else { 315162306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 315262306a36Sopenharmony_ci &rtw8852c_tssi_slope_cal_org_defs_2g_b_tbl, 315362306a36Sopenharmony_ci &rtw8852c_tssi_slope_cal_org_defs_5g_b_tbl); 315462306a36Sopenharmony_ci } 315562306a36Sopenharmony_ci} 315662306a36Sopenharmony_ci 315762306a36Sopenharmony_cistatic void _tssi_set_aligk_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 315862306a36Sopenharmony_ci enum rtw89_rf_path path) 315962306a36Sopenharmony_ci{ 316062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 316162306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 316262306a36Sopenharmony_ci const struct rtw89_rfk_tbl *tbl; 316362306a36Sopenharmony_ci 316462306a36Sopenharmony_ci if (path == RF_PATH_A) { 316562306a36Sopenharmony_ci if (band == RTW89_BAND_2G) 316662306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_2g_a_tbl; 316762306a36Sopenharmony_ci else if (band == RTW89_BAND_6G) 316862306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_6g_a_tbl; 316962306a36Sopenharmony_ci else 317062306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_5g_a_tbl; 317162306a36Sopenharmony_ci } else { 317262306a36Sopenharmony_ci if (band == RTW89_BAND_2G) 317362306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_2g_b_tbl; 317462306a36Sopenharmony_ci else if (band == RTW89_BAND_6G) 317562306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_6g_b_tbl; 317662306a36Sopenharmony_ci else 317762306a36Sopenharmony_ci tbl = &rtw8852c_tssi_set_aligk_default_defs_5g_b_tbl; 317862306a36Sopenharmony_ci } 317962306a36Sopenharmony_ci 318062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, tbl); 318162306a36Sopenharmony_ci} 318262306a36Sopenharmony_ci 318362306a36Sopenharmony_cistatic void _tssi_set_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 318462306a36Sopenharmony_ci enum rtw89_rf_path path) 318562306a36Sopenharmony_ci{ 318662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 318762306a36Sopenharmony_ci &rtw8852c_tssi_slope_defs_a_tbl, 318862306a36Sopenharmony_ci &rtw8852c_tssi_slope_defs_b_tbl); 318962306a36Sopenharmony_ci} 319062306a36Sopenharmony_ci 319162306a36Sopenharmony_cistatic void _tssi_run_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 319262306a36Sopenharmony_ci enum rtw89_rf_path path) 319362306a36Sopenharmony_ci{ 319462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 319562306a36Sopenharmony_ci &rtw8852c_tssi_run_slope_defs_a_tbl, 319662306a36Sopenharmony_ci &rtw8852c_tssi_run_slope_defs_b_tbl); 319762306a36Sopenharmony_ci} 319862306a36Sopenharmony_ci 319962306a36Sopenharmony_cistatic void _tssi_set_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 320062306a36Sopenharmony_ci enum rtw89_rf_path path) 320162306a36Sopenharmony_ci{ 320262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 320362306a36Sopenharmony_ci &rtw8852c_tssi_track_defs_a_tbl, 320462306a36Sopenharmony_ci &rtw8852c_tssi_track_defs_b_tbl); 320562306a36Sopenharmony_ci} 320662306a36Sopenharmony_ci 320762306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, 320862306a36Sopenharmony_ci enum rtw89_phy_idx phy, 320962306a36Sopenharmony_ci enum rtw89_rf_path path) 321062306a36Sopenharmony_ci{ 321162306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 321262306a36Sopenharmony_ci &rtw8852c_tssi_txagc_ofst_mv_avg_defs_a_tbl, 321362306a36Sopenharmony_ci &rtw8852c_tssi_txagc_ofst_mv_avg_defs_b_tbl); 321462306a36Sopenharmony_ci} 321562306a36Sopenharmony_ci 321662306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 321762306a36Sopenharmony_ci{ 321862306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 321962306a36Sopenharmony_ci u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C; 322062306a36Sopenharmony_ci 322162306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 322262306a36Sopenharmony_ci if (phy == RTW89_PHY_0) { 322362306a36Sopenharmony_ci path = RF_PATH_A; 322462306a36Sopenharmony_ci path_max = RF_PATH_B; 322562306a36Sopenharmony_ci } else if (phy == RTW89_PHY_1) { 322662306a36Sopenharmony_ci path = RF_PATH_B; 322762306a36Sopenharmony_ci path_max = RF_PATH_NUM_8852C; 322862306a36Sopenharmony_ci } 322962306a36Sopenharmony_ci } 323062306a36Sopenharmony_ci 323162306a36Sopenharmony_ci for (i = path; i < path_max; i++) { 323262306a36Sopenharmony_ci _tssi_set_track(rtwdev, phy, i); 323362306a36Sopenharmony_ci _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i); 323462306a36Sopenharmony_ci 323562306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, i == RF_PATH_A, 323662306a36Sopenharmony_ci &rtw8852c_tssi_enable_defs_a_tbl, 323762306a36Sopenharmony_ci &rtw8852c_tssi_enable_defs_b_tbl); 323862306a36Sopenharmony_ci 323962306a36Sopenharmony_ci tssi_info->base_thermal[i] = 324062306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[i]); 324162306a36Sopenharmony_ci rtwdev->is_tssi_mode[i] = true; 324262306a36Sopenharmony_ci } 324362306a36Sopenharmony_ci} 324462306a36Sopenharmony_ci 324562306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 324662306a36Sopenharmony_ci{ 324762306a36Sopenharmony_ci u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C; 324862306a36Sopenharmony_ci 324962306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 325062306a36Sopenharmony_ci if (phy == RTW89_PHY_0) { 325162306a36Sopenharmony_ci path = RF_PATH_A; 325262306a36Sopenharmony_ci path_max = RF_PATH_B; 325362306a36Sopenharmony_ci } else if (phy == RTW89_PHY_1) { 325462306a36Sopenharmony_ci path = RF_PATH_B; 325562306a36Sopenharmony_ci path_max = RF_PATH_NUM_8852C; 325662306a36Sopenharmony_ci } 325762306a36Sopenharmony_ci } 325862306a36Sopenharmony_ci 325962306a36Sopenharmony_ci for (i = path; i < path_max; i++) { 326062306a36Sopenharmony_ci if (i == RF_PATH_A) { 326162306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_tssi_disable_defs_a_tbl); 326262306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = false; 326362306a36Sopenharmony_ci } else if (i == RF_PATH_B) { 326462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852c_tssi_disable_defs_b_tbl); 326562306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_B] = false; 326662306a36Sopenharmony_ci } 326762306a36Sopenharmony_ci } 326862306a36Sopenharmony_ci} 326962306a36Sopenharmony_ci 327062306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) 327162306a36Sopenharmony_ci{ 327262306a36Sopenharmony_ci switch (ch) { 327362306a36Sopenharmony_ci case 1 ... 2: 327462306a36Sopenharmony_ci return 0; 327562306a36Sopenharmony_ci case 3 ... 5: 327662306a36Sopenharmony_ci return 1; 327762306a36Sopenharmony_ci case 6 ... 8: 327862306a36Sopenharmony_ci return 2; 327962306a36Sopenharmony_ci case 9 ... 11: 328062306a36Sopenharmony_ci return 3; 328162306a36Sopenharmony_ci case 12 ... 13: 328262306a36Sopenharmony_ci return 4; 328362306a36Sopenharmony_ci case 14: 328462306a36Sopenharmony_ci return 5; 328562306a36Sopenharmony_ci } 328662306a36Sopenharmony_ci 328762306a36Sopenharmony_ci return 0; 328862306a36Sopenharmony_ci} 328962306a36Sopenharmony_ci 329062306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31)) 329162306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) 329262306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) 329362306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) 329462306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) 329562306a36Sopenharmony_ci 329662306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 329762306a36Sopenharmony_ci{ 329862306a36Sopenharmony_ci switch (ch) { 329962306a36Sopenharmony_ci case 1 ... 2: 330062306a36Sopenharmony_ci return 0; 330162306a36Sopenharmony_ci case 3 ... 5: 330262306a36Sopenharmony_ci return 1; 330362306a36Sopenharmony_ci case 6 ... 8: 330462306a36Sopenharmony_ci return 2; 330562306a36Sopenharmony_ci case 9 ... 11: 330662306a36Sopenharmony_ci return 3; 330762306a36Sopenharmony_ci case 12 ... 14: 330862306a36Sopenharmony_ci return 4; 330962306a36Sopenharmony_ci case 36 ... 40: 331062306a36Sopenharmony_ci return 5; 331162306a36Sopenharmony_ci case 41 ... 43: 331262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(5); 331362306a36Sopenharmony_ci case 44 ... 48: 331462306a36Sopenharmony_ci return 6; 331562306a36Sopenharmony_ci case 49 ... 51: 331662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 331762306a36Sopenharmony_ci case 52 ... 56: 331862306a36Sopenharmony_ci return 7; 331962306a36Sopenharmony_ci case 57 ... 59: 332062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(7); 332162306a36Sopenharmony_ci case 60 ... 64: 332262306a36Sopenharmony_ci return 8; 332362306a36Sopenharmony_ci case 100 ... 104: 332462306a36Sopenharmony_ci return 9; 332562306a36Sopenharmony_ci case 105 ... 107: 332662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(9); 332762306a36Sopenharmony_ci case 108 ... 112: 332862306a36Sopenharmony_ci return 10; 332962306a36Sopenharmony_ci case 113 ... 115: 333062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 333162306a36Sopenharmony_ci case 116 ... 120: 333262306a36Sopenharmony_ci return 11; 333362306a36Sopenharmony_ci case 121 ... 123: 333462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(11); 333562306a36Sopenharmony_ci case 124 ... 128: 333662306a36Sopenharmony_ci return 12; 333762306a36Sopenharmony_ci case 129 ... 131: 333862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 333962306a36Sopenharmony_ci case 132 ... 136: 334062306a36Sopenharmony_ci return 13; 334162306a36Sopenharmony_ci case 137 ... 139: 334262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(13); 334362306a36Sopenharmony_ci case 140 ... 144: 334462306a36Sopenharmony_ci return 14; 334562306a36Sopenharmony_ci case 149 ... 153: 334662306a36Sopenharmony_ci return 15; 334762306a36Sopenharmony_ci case 154 ... 156: 334862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(15); 334962306a36Sopenharmony_ci case 157 ... 161: 335062306a36Sopenharmony_ci return 16; 335162306a36Sopenharmony_ci case 162 ... 164: 335262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(16); 335362306a36Sopenharmony_ci case 165 ... 169: 335462306a36Sopenharmony_ci return 17; 335562306a36Sopenharmony_ci case 170 ... 172: 335662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(17); 335762306a36Sopenharmony_ci case 173 ... 177: 335862306a36Sopenharmony_ci return 18; 335962306a36Sopenharmony_ci } 336062306a36Sopenharmony_ci 336162306a36Sopenharmony_ci return 0; 336262306a36Sopenharmony_ci} 336362306a36Sopenharmony_ci 336462306a36Sopenharmony_cistatic u32 _tssi_get_6g_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 336562306a36Sopenharmony_ci{ 336662306a36Sopenharmony_ci switch (ch) { 336762306a36Sopenharmony_ci case 1 ... 5: 336862306a36Sopenharmony_ci return 0; 336962306a36Sopenharmony_ci case 6 ... 8: 337062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(0); 337162306a36Sopenharmony_ci case 9 ... 13: 337262306a36Sopenharmony_ci return 1; 337362306a36Sopenharmony_ci case 14 ... 16: 337462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(1); 337562306a36Sopenharmony_ci case 17 ... 21: 337662306a36Sopenharmony_ci return 2; 337762306a36Sopenharmony_ci case 22 ... 24: 337862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(2); 337962306a36Sopenharmony_ci case 25 ... 29: 338062306a36Sopenharmony_ci return 3; 338162306a36Sopenharmony_ci case 33 ... 37: 338262306a36Sopenharmony_ci return 4; 338362306a36Sopenharmony_ci case 38 ... 40: 338462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(4); 338562306a36Sopenharmony_ci case 41 ... 45: 338662306a36Sopenharmony_ci return 5; 338762306a36Sopenharmony_ci case 46 ... 48: 338862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(5); 338962306a36Sopenharmony_ci case 49 ... 53: 339062306a36Sopenharmony_ci return 6; 339162306a36Sopenharmony_ci case 54 ... 56: 339262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 339362306a36Sopenharmony_ci case 57 ... 61: 339462306a36Sopenharmony_ci return 7; 339562306a36Sopenharmony_ci case 65 ... 69: 339662306a36Sopenharmony_ci return 8; 339762306a36Sopenharmony_ci case 70 ... 72: 339862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(8); 339962306a36Sopenharmony_ci case 73 ... 77: 340062306a36Sopenharmony_ci return 9; 340162306a36Sopenharmony_ci case 78 ... 80: 340262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(9); 340362306a36Sopenharmony_ci case 81 ... 85: 340462306a36Sopenharmony_ci return 10; 340562306a36Sopenharmony_ci case 86 ... 88: 340662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 340762306a36Sopenharmony_ci case 89 ... 93: 340862306a36Sopenharmony_ci return 11; 340962306a36Sopenharmony_ci case 97 ... 101: 341062306a36Sopenharmony_ci return 12; 341162306a36Sopenharmony_ci case 102 ... 104: 341262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 341362306a36Sopenharmony_ci case 105 ... 109: 341462306a36Sopenharmony_ci return 13; 341562306a36Sopenharmony_ci case 110 ... 112: 341662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(13); 341762306a36Sopenharmony_ci case 113 ... 117: 341862306a36Sopenharmony_ci return 14; 341962306a36Sopenharmony_ci case 118 ... 120: 342062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(14); 342162306a36Sopenharmony_ci case 121 ... 125: 342262306a36Sopenharmony_ci return 15; 342362306a36Sopenharmony_ci case 129 ... 133: 342462306a36Sopenharmony_ci return 16; 342562306a36Sopenharmony_ci case 134 ... 136: 342662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(16); 342762306a36Sopenharmony_ci case 137 ... 141: 342862306a36Sopenharmony_ci return 17; 342962306a36Sopenharmony_ci case 142 ... 144: 343062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(17); 343162306a36Sopenharmony_ci case 145 ... 149: 343262306a36Sopenharmony_ci return 18; 343362306a36Sopenharmony_ci case 150 ... 152: 343462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(18); 343562306a36Sopenharmony_ci case 153 ... 157: 343662306a36Sopenharmony_ci return 19; 343762306a36Sopenharmony_ci case 161 ... 165: 343862306a36Sopenharmony_ci return 20; 343962306a36Sopenharmony_ci case 166 ... 168: 344062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(20); 344162306a36Sopenharmony_ci case 169 ... 173: 344262306a36Sopenharmony_ci return 21; 344362306a36Sopenharmony_ci case 174 ... 176: 344462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(21); 344562306a36Sopenharmony_ci case 177 ... 181: 344662306a36Sopenharmony_ci return 22; 344762306a36Sopenharmony_ci case 182 ... 184: 344862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(22); 344962306a36Sopenharmony_ci case 185 ... 189: 345062306a36Sopenharmony_ci return 23; 345162306a36Sopenharmony_ci case 193 ... 197: 345262306a36Sopenharmony_ci return 24; 345362306a36Sopenharmony_ci case 198 ... 200: 345462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(24); 345562306a36Sopenharmony_ci case 201 ... 205: 345662306a36Sopenharmony_ci return 25; 345762306a36Sopenharmony_ci case 206 ... 208: 345862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(25); 345962306a36Sopenharmony_ci case 209 ... 213: 346062306a36Sopenharmony_ci return 26; 346162306a36Sopenharmony_ci case 214 ... 216: 346262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(26); 346362306a36Sopenharmony_ci case 217 ... 221: 346462306a36Sopenharmony_ci return 27; 346562306a36Sopenharmony_ci case 225 ... 229: 346662306a36Sopenharmony_ci return 28; 346762306a36Sopenharmony_ci case 230 ... 232: 346862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(28); 346962306a36Sopenharmony_ci case 233 ... 237: 347062306a36Sopenharmony_ci return 29; 347162306a36Sopenharmony_ci case 238 ... 240: 347262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(29); 347362306a36Sopenharmony_ci case 241 ... 245: 347462306a36Sopenharmony_ci return 30; 347562306a36Sopenharmony_ci case 246 ... 248: 347662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(30); 347762306a36Sopenharmony_ci case 249 ... 253: 347862306a36Sopenharmony_ci return 31; 347962306a36Sopenharmony_ci } 348062306a36Sopenharmony_ci 348162306a36Sopenharmony_ci return 0; 348262306a36Sopenharmony_ci} 348362306a36Sopenharmony_ci 348462306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) 348562306a36Sopenharmony_ci{ 348662306a36Sopenharmony_ci switch (ch) { 348762306a36Sopenharmony_ci case 1 ... 8: 348862306a36Sopenharmony_ci return 0; 348962306a36Sopenharmony_ci case 9 ... 14: 349062306a36Sopenharmony_ci return 1; 349162306a36Sopenharmony_ci case 36 ... 48: 349262306a36Sopenharmony_ci return 2; 349362306a36Sopenharmony_ci case 49 ... 51: 349462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(2); 349562306a36Sopenharmony_ci case 52 ... 64: 349662306a36Sopenharmony_ci return 3; 349762306a36Sopenharmony_ci case 100 ... 112: 349862306a36Sopenharmony_ci return 4; 349962306a36Sopenharmony_ci case 113 ... 115: 350062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(4); 350162306a36Sopenharmony_ci case 116 ... 128: 350262306a36Sopenharmony_ci return 5; 350362306a36Sopenharmony_ci case 132 ... 144: 350462306a36Sopenharmony_ci return 6; 350562306a36Sopenharmony_ci case 149 ... 177: 350662306a36Sopenharmony_ci return 7; 350762306a36Sopenharmony_ci } 350862306a36Sopenharmony_ci 350962306a36Sopenharmony_ci return 0; 351062306a36Sopenharmony_ci} 351162306a36Sopenharmony_ci 351262306a36Sopenharmony_cistatic u32 _tssi_get_6g_trim_group(struct rtw89_dev *rtwdev, u8 ch) 351362306a36Sopenharmony_ci{ 351462306a36Sopenharmony_ci switch (ch) { 351562306a36Sopenharmony_ci case 1 ... 13: 351662306a36Sopenharmony_ci return 0; 351762306a36Sopenharmony_ci case 14 ... 16: 351862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(0); 351962306a36Sopenharmony_ci case 17 ... 29: 352062306a36Sopenharmony_ci return 1; 352162306a36Sopenharmony_ci case 33 ... 45: 352262306a36Sopenharmony_ci return 2; 352362306a36Sopenharmony_ci case 46 ... 48: 352462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(2); 352562306a36Sopenharmony_ci case 49 ... 61: 352662306a36Sopenharmony_ci return 3; 352762306a36Sopenharmony_ci case 65 ... 77: 352862306a36Sopenharmony_ci return 4; 352962306a36Sopenharmony_ci case 78 ... 80: 353062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(4); 353162306a36Sopenharmony_ci case 81 ... 93: 353262306a36Sopenharmony_ci return 5; 353362306a36Sopenharmony_ci case 97 ... 109: 353462306a36Sopenharmony_ci return 6; 353562306a36Sopenharmony_ci case 110 ... 112: 353662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 353762306a36Sopenharmony_ci case 113 ... 125: 353862306a36Sopenharmony_ci return 7; 353962306a36Sopenharmony_ci case 129 ... 141: 354062306a36Sopenharmony_ci return 8; 354162306a36Sopenharmony_ci case 142 ... 144: 354262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(8); 354362306a36Sopenharmony_ci case 145 ... 157: 354462306a36Sopenharmony_ci return 9; 354562306a36Sopenharmony_ci case 161 ... 173: 354662306a36Sopenharmony_ci return 10; 354762306a36Sopenharmony_ci case 174 ... 176: 354862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 354962306a36Sopenharmony_ci case 177 ... 189: 355062306a36Sopenharmony_ci return 11; 355162306a36Sopenharmony_ci case 193 ... 205: 355262306a36Sopenharmony_ci return 12; 355362306a36Sopenharmony_ci case 206 ... 208: 355462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 355562306a36Sopenharmony_ci case 209 ... 221: 355662306a36Sopenharmony_ci return 13; 355762306a36Sopenharmony_ci case 225 ... 237: 355862306a36Sopenharmony_ci return 14; 355962306a36Sopenharmony_ci case 238 ... 240: 356062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(14); 356162306a36Sopenharmony_ci case 241 ... 253: 356262306a36Sopenharmony_ci return 15; 356362306a36Sopenharmony_ci } 356462306a36Sopenharmony_ci 356562306a36Sopenharmony_ci return 0; 356662306a36Sopenharmony_ci} 356762306a36Sopenharmony_ci 356862306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 356962306a36Sopenharmony_ci enum rtw89_rf_path path) 357062306a36Sopenharmony_ci{ 357162306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 357262306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 357362306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 357462306a36Sopenharmony_ci u8 ch = chan->channel; 357562306a36Sopenharmony_ci u32 gidx, gidx_1st, gidx_2nd; 357662306a36Sopenharmony_ci s8 de_1st; 357762306a36Sopenharmony_ci s8 de_2nd; 357862306a36Sopenharmony_ci s8 val; 357962306a36Sopenharmony_ci 358062306a36Sopenharmony_ci if (band == RTW89_BAND_2G || band == RTW89_BAND_5G) { 358162306a36Sopenharmony_ci gidx = _tssi_get_ofdm_group(rtwdev, ch); 358262306a36Sopenharmony_ci 358362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 358462306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", 358562306a36Sopenharmony_ci path, gidx); 358662306a36Sopenharmony_ci 358762306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(gidx)) { 358862306a36Sopenharmony_ci gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 358962306a36Sopenharmony_ci gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 359062306a36Sopenharmony_ci de_1st = tssi_info->tssi_mcs[path][gidx_1st]; 359162306a36Sopenharmony_ci de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; 359262306a36Sopenharmony_ci val = (de_1st + de_2nd) / 2; 359362306a36Sopenharmony_ci 359462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 359562306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 359662306a36Sopenharmony_ci path, val, de_1st, de_2nd); 359762306a36Sopenharmony_ci } else { 359862306a36Sopenharmony_ci val = tssi_info->tssi_mcs[path][gidx]; 359962306a36Sopenharmony_ci 360062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 360162306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 360262306a36Sopenharmony_ci } 360362306a36Sopenharmony_ci } else { 360462306a36Sopenharmony_ci gidx = _tssi_get_6g_ofdm_group(rtwdev, ch); 360562306a36Sopenharmony_ci 360662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 360762306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", 360862306a36Sopenharmony_ci path, gidx); 360962306a36Sopenharmony_ci 361062306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(gidx)) { 361162306a36Sopenharmony_ci gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 361262306a36Sopenharmony_ci gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 361362306a36Sopenharmony_ci de_1st = tssi_info->tssi_6g_mcs[path][gidx_1st]; 361462306a36Sopenharmony_ci de_2nd = tssi_info->tssi_6g_mcs[path][gidx_2nd]; 361562306a36Sopenharmony_ci val = (de_1st + de_2nd) / 2; 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 361862306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 361962306a36Sopenharmony_ci path, val, de_1st, de_2nd); 362062306a36Sopenharmony_ci } else { 362162306a36Sopenharmony_ci val = tssi_info->tssi_6g_mcs[path][gidx]; 362262306a36Sopenharmony_ci 362362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 362462306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 362562306a36Sopenharmony_ci } 362662306a36Sopenharmony_ci } 362762306a36Sopenharmony_ci 362862306a36Sopenharmony_ci return val; 362962306a36Sopenharmony_ci} 363062306a36Sopenharmony_ci 363162306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, 363262306a36Sopenharmony_ci enum rtw89_phy_idx phy, 363362306a36Sopenharmony_ci enum rtw89_rf_path path) 363462306a36Sopenharmony_ci{ 363562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 363662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 363762306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 363862306a36Sopenharmony_ci u8 ch = chan->channel; 363962306a36Sopenharmony_ci u32 tgidx, tgidx_1st, tgidx_2nd; 364062306a36Sopenharmony_ci s8 tde_1st = 0; 364162306a36Sopenharmony_ci s8 tde_2nd = 0; 364262306a36Sopenharmony_ci s8 val; 364362306a36Sopenharmony_ci 364462306a36Sopenharmony_ci if (band == RTW89_BAND_2G || band == RTW89_BAND_5G) { 364562306a36Sopenharmony_ci tgidx = _tssi_get_trim_group(rtwdev, ch); 364662306a36Sopenharmony_ci 364762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 364862306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 364962306a36Sopenharmony_ci path, tgidx); 365062306a36Sopenharmony_ci 365162306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(tgidx)) { 365262306a36Sopenharmony_ci tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 365362306a36Sopenharmony_ci tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 365462306a36Sopenharmony_ci tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; 365562306a36Sopenharmony_ci tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; 365662306a36Sopenharmony_ci val = (tde_1st + tde_2nd) / 2; 365762306a36Sopenharmony_ci 365862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 365962306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 366062306a36Sopenharmony_ci path, val, tde_1st, tde_2nd); 366162306a36Sopenharmony_ci } else { 366262306a36Sopenharmony_ci val = tssi_info->tssi_trim[path][tgidx]; 366362306a36Sopenharmony_ci 366462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 366562306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 366662306a36Sopenharmony_ci path, val); 366762306a36Sopenharmony_ci } 366862306a36Sopenharmony_ci } else { 366962306a36Sopenharmony_ci tgidx = _tssi_get_6g_trim_group(rtwdev, ch); 367062306a36Sopenharmony_ci 367162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 367262306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 367362306a36Sopenharmony_ci path, tgidx); 367462306a36Sopenharmony_ci 367562306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(tgidx)) { 367662306a36Sopenharmony_ci tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 367762306a36Sopenharmony_ci tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 367862306a36Sopenharmony_ci tde_1st = tssi_info->tssi_trim_6g[path][tgidx_1st]; 367962306a36Sopenharmony_ci tde_2nd = tssi_info->tssi_trim_6g[path][tgidx_2nd]; 368062306a36Sopenharmony_ci val = (tde_1st + tde_2nd) / 2; 368162306a36Sopenharmony_ci 368262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 368362306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 368462306a36Sopenharmony_ci path, val, tde_1st, tde_2nd); 368562306a36Sopenharmony_ci } else { 368662306a36Sopenharmony_ci val = tssi_info->tssi_trim_6g[path][tgidx]; 368762306a36Sopenharmony_ci 368862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 368962306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 369062306a36Sopenharmony_ci path, val); 369162306a36Sopenharmony_ci } 369262306a36Sopenharmony_ci } 369362306a36Sopenharmony_ci 369462306a36Sopenharmony_ci return val; 369562306a36Sopenharmony_ci} 369662306a36Sopenharmony_ci 369762306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, 369862306a36Sopenharmony_ci enum rtw89_phy_idx phy) 369962306a36Sopenharmony_ci{ 370062306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 370162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 370262306a36Sopenharmony_ci u8 ch = chan->channel; 370362306a36Sopenharmony_ci u8 gidx; 370462306a36Sopenharmony_ci s8 ofdm_de; 370562306a36Sopenharmony_ci s8 trim_de; 370662306a36Sopenharmony_ci s32 val; 370762306a36Sopenharmony_ci u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C; 370862306a36Sopenharmony_ci 370962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", 371062306a36Sopenharmony_ci phy, ch); 371162306a36Sopenharmony_ci 371262306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 371362306a36Sopenharmony_ci if (phy == RTW89_PHY_0) { 371462306a36Sopenharmony_ci path = RF_PATH_A; 371562306a36Sopenharmony_ci path_max = RF_PATH_B; 371662306a36Sopenharmony_ci } else if (phy == RTW89_PHY_1) { 371762306a36Sopenharmony_ci path = RF_PATH_B; 371862306a36Sopenharmony_ci path_max = RF_PATH_NUM_8852C; 371962306a36Sopenharmony_ci } 372062306a36Sopenharmony_ci } 372162306a36Sopenharmony_ci 372262306a36Sopenharmony_ci for (i = path; i < path_max; i++) { 372362306a36Sopenharmony_ci gidx = _tssi_get_cck_group(rtwdev, ch); 372462306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 372562306a36Sopenharmony_ci val = tssi_info->tssi_cck[i][gidx] + trim_de; 372662306a36Sopenharmony_ci 372762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 372862306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", 372962306a36Sopenharmony_ci i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); 373062306a36Sopenharmony_ci 373162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val); 373262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val); 373362306a36Sopenharmony_ci 373462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 373562306a36Sopenharmony_ci "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", 373662306a36Sopenharmony_ci _tssi_de_cck_long[i], 373762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i], 373862306a36Sopenharmony_ci _TSSI_DE_MASK)); 373962306a36Sopenharmony_ci 374062306a36Sopenharmony_ci ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); 374162306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 374262306a36Sopenharmony_ci val = ofdm_de + trim_de; 374362306a36Sopenharmony_ci 374462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 374562306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", 374662306a36Sopenharmony_ci i, ofdm_de, trim_de); 374762306a36Sopenharmony_ci 374862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val); 374962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val); 375062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val); 375162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val); 375262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val); 375362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val); 375462306a36Sopenharmony_ci 375562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 375662306a36Sopenharmony_ci "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", 375762306a36Sopenharmony_ci _tssi_de_mcs_20m[i], 375862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i], 375962306a36Sopenharmony_ci _TSSI_DE_MASK)); 376062306a36Sopenharmony_ci } 376162306a36Sopenharmony_ci} 376262306a36Sopenharmony_ci 376362306a36Sopenharmony_cistatic void rtw8852c_tssi_cont_en(struct rtw89_dev *rtwdev, bool en, 376462306a36Sopenharmony_ci enum rtw89_rf_path path) 376562306a36Sopenharmony_ci{ 376662306a36Sopenharmony_ci static const u32 tssi_trk[2] = {0x5818, 0x7818}; 376762306a36Sopenharmony_ci static const u32 tssi_en[2] = {0x5820, 0x7820}; 376862306a36Sopenharmony_ci 376962306a36Sopenharmony_ci if (en) { 377062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, tssi_trk[path], BIT(30), 0x0); 377162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, tssi_en[path], BIT(31), 0x0); 377262306a36Sopenharmony_ci if (rtwdev->dbcc_en && path == RF_PATH_B) 377362306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, RTW89_PHY_1); 377462306a36Sopenharmony_ci else 377562306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, RTW89_PHY_0); 377662306a36Sopenharmony_ci } else { 377762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, tssi_trk[path], BIT(30), 0x1); 377862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, tssi_en[path], BIT(31), 0x1); 377962306a36Sopenharmony_ci } 378062306a36Sopenharmony_ci} 378162306a36Sopenharmony_ci 378262306a36Sopenharmony_civoid rtw8852c_tssi_cont_en_phyidx(struct rtw89_dev *rtwdev, bool en, u8 phy_idx) 378362306a36Sopenharmony_ci{ 378462306a36Sopenharmony_ci if (!rtwdev->dbcc_en) { 378562306a36Sopenharmony_ci rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A); 378662306a36Sopenharmony_ci rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B); 378762306a36Sopenharmony_ci } else { 378862306a36Sopenharmony_ci if (phy_idx == RTW89_PHY_0) 378962306a36Sopenharmony_ci rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_A); 379062306a36Sopenharmony_ci else 379162306a36Sopenharmony_ci rtw8852c_tssi_cont_en(rtwdev, en, RF_PATH_B); 379262306a36Sopenharmony_ci } 379362306a36Sopenharmony_ci} 379462306a36Sopenharmony_ci 379562306a36Sopenharmony_cistatic void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 379662306a36Sopenharmony_ci enum rtw89_bandwidth bw, bool is_dav) 379762306a36Sopenharmony_ci{ 379862306a36Sopenharmony_ci u32 rf_reg18; 379962306a36Sopenharmony_ci u32 reg_reg18_addr; 380062306a36Sopenharmony_ci 380162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===>%s\n", __func__); 380262306a36Sopenharmony_ci if (is_dav) 380362306a36Sopenharmony_ci reg_reg18_addr = RR_CFGCH; 380462306a36Sopenharmony_ci else 380562306a36Sopenharmony_ci reg_reg18_addr = RR_CFGCH_V1; 380662306a36Sopenharmony_ci 380762306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg_reg18_addr, RFREG_MASK); 380862306a36Sopenharmony_ci rf_reg18 &= ~RR_CFGCH_BW; 380962306a36Sopenharmony_ci 381062306a36Sopenharmony_ci switch (bw) { 381162306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_5: 381262306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_10: 381362306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_20: 381462306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M); 381562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, 0x3); 381662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, 0xf); 381762306a36Sopenharmony_ci break; 381862306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_40: 381962306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M); 382062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, 0x3); 382162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, 0xf); 382262306a36Sopenharmony_ci break; 382362306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_80: 382462306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M); 382562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, 0x2); 382662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, 0xd); 382762306a36Sopenharmony_ci break; 382862306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_160: 382962306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_160M); 383062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, 0x1); 383162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, 0xb); 383262306a36Sopenharmony_ci break; 383362306a36Sopenharmony_ci default: 383462306a36Sopenharmony_ci break; 383562306a36Sopenharmony_ci } 383662306a36Sopenharmony_ci 383762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg_reg18_addr, RFREG_MASK, rf_reg18); 383862306a36Sopenharmony_ci} 383962306a36Sopenharmony_ci 384062306a36Sopenharmony_cistatic void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 384162306a36Sopenharmony_ci enum rtw89_bandwidth bw) 384262306a36Sopenharmony_ci{ 384362306a36Sopenharmony_ci bool is_dav; 384462306a36Sopenharmony_ci u8 kpath, path; 384562306a36Sopenharmony_ci u32 tmp = 0; 384662306a36Sopenharmony_ci 384762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===>%s\n", __func__); 384862306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 384962306a36Sopenharmony_ci 385062306a36Sopenharmony_ci for (path = 0; path < 2; path++) { 385162306a36Sopenharmony_ci if (!(kpath & BIT(path))) 385262306a36Sopenharmony_ci continue; 385362306a36Sopenharmony_ci 385462306a36Sopenharmony_ci is_dav = true; 385562306a36Sopenharmony_ci _bw_setting(rtwdev, path, bw, is_dav); 385662306a36Sopenharmony_ci is_dav = false; 385762306a36Sopenharmony_ci _bw_setting(rtwdev, path, bw, is_dav); 385862306a36Sopenharmony_ci if (rtwdev->dbcc_en) 385962306a36Sopenharmony_ci continue; 386062306a36Sopenharmony_ci 386162306a36Sopenharmony_ci if (path == RF_PATH_B && rtwdev->hal.cv == CHIP_CAV) { 386262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0); 386362306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 386462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_APK, RR_APK_MOD, 0x3); 386562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK, tmp); 386662306a36Sopenharmony_ci fsleep(100); 386762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1); 386862306a36Sopenharmony_ci } 386962306a36Sopenharmony_ci } 387062306a36Sopenharmony_ci} 387162306a36Sopenharmony_ci 387262306a36Sopenharmony_cistatic void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, 387362306a36Sopenharmony_ci u8 central_ch, enum rtw89_band band, bool is_dav) 387462306a36Sopenharmony_ci{ 387562306a36Sopenharmony_ci u32 rf_reg18; 387662306a36Sopenharmony_ci u32 reg_reg18_addr; 387762306a36Sopenharmony_ci 387862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===>%s\n", __func__); 387962306a36Sopenharmony_ci if (is_dav) 388062306a36Sopenharmony_ci reg_reg18_addr = 0x18; 388162306a36Sopenharmony_ci else 388262306a36Sopenharmony_ci reg_reg18_addr = 0x10018; 388362306a36Sopenharmony_ci 388462306a36Sopenharmony_ci rf_reg18 = rtw89_read_rf(rtwdev, path, reg_reg18_addr, RFREG_MASK); 388562306a36Sopenharmony_ci rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_BAND0 | RR_CFGCH_CH); 388662306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch); 388762306a36Sopenharmony_ci 388862306a36Sopenharmony_ci switch (band) { 388962306a36Sopenharmony_ci case RTW89_BAND_2G: 389062306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_2G); 389162306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_2G); 389262306a36Sopenharmony_ci break; 389362306a36Sopenharmony_ci case RTW89_BAND_5G: 389462306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G); 389562306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G); 389662306a36Sopenharmony_ci break; 389762306a36Sopenharmony_ci case RTW89_BAND_6G: 389862306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_6G); 389962306a36Sopenharmony_ci rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_6G); 390062306a36Sopenharmony_ci break; 390162306a36Sopenharmony_ci default: 390262306a36Sopenharmony_ci break; 390362306a36Sopenharmony_ci } 390462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, reg_reg18_addr, RFREG_MASK, rf_reg18); 390562306a36Sopenharmony_ci fsleep(100); 390662306a36Sopenharmony_ci} 390762306a36Sopenharmony_ci 390862306a36Sopenharmony_cistatic void _ctrl_ch(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 390962306a36Sopenharmony_ci u8 central_ch, enum rtw89_band band) 391062306a36Sopenharmony_ci{ 391162306a36Sopenharmony_ci u8 kpath, path; 391262306a36Sopenharmony_ci 391362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===>%s\n", __func__); 391462306a36Sopenharmony_ci if (band != RTW89_BAND_6G) { 391562306a36Sopenharmony_ci if ((central_ch > 14 && central_ch < 36) || 391662306a36Sopenharmony_ci (central_ch > 64 && central_ch < 100) || 391762306a36Sopenharmony_ci (central_ch > 144 && central_ch < 149) || central_ch > 177) 391862306a36Sopenharmony_ci return; 391962306a36Sopenharmony_ci } else { 392062306a36Sopenharmony_ci if (central_ch > 253 || central_ch == 2) 392162306a36Sopenharmony_ci return; 392262306a36Sopenharmony_ci } 392362306a36Sopenharmony_ci 392462306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 392562306a36Sopenharmony_ci 392662306a36Sopenharmony_ci for (path = 0; path < 2; path++) { 392762306a36Sopenharmony_ci if (kpath & BIT(path)) { 392862306a36Sopenharmony_ci _ch_setting(rtwdev, path, central_ch, band, true); 392962306a36Sopenharmony_ci _ch_setting(rtwdev, path, central_ch, band, false); 393062306a36Sopenharmony_ci } 393162306a36Sopenharmony_ci } 393262306a36Sopenharmony_ci} 393362306a36Sopenharmony_ci 393462306a36Sopenharmony_cistatic void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 393562306a36Sopenharmony_ci enum rtw89_bandwidth bw) 393662306a36Sopenharmony_ci{ 393762306a36Sopenharmony_ci u8 kpath; 393862306a36Sopenharmony_ci u8 path; 393962306a36Sopenharmony_ci u32 val; 394062306a36Sopenharmony_ci 394162306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 394262306a36Sopenharmony_ci for (path = 0; path < 2; path++) { 394362306a36Sopenharmony_ci if (!(kpath & BIT(path))) 394462306a36Sopenharmony_ci continue; 394562306a36Sopenharmony_ci 394662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1); 394762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0xa); 394862306a36Sopenharmony_ci switch (bw) { 394962306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_20: 395062306a36Sopenharmony_ci val = 0x1b; 395162306a36Sopenharmony_ci break; 395262306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_40: 395362306a36Sopenharmony_ci val = 0x13; 395462306a36Sopenharmony_ci break; 395562306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_80: 395662306a36Sopenharmony_ci val = 0xb; 395762306a36Sopenharmony_ci break; 395862306a36Sopenharmony_ci case RTW89_CHANNEL_WIDTH_160: 395962306a36Sopenharmony_ci default: 396062306a36Sopenharmony_ci val = 0x3; 396162306a36Sopenharmony_ci break; 396262306a36Sopenharmony_ci } 396362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, val); 396462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0); 396562306a36Sopenharmony_ci } 396662306a36Sopenharmony_ci} 396762306a36Sopenharmony_ci 396862306a36Sopenharmony_cistatic void _lck_keep_thermal(struct rtw89_dev *rtwdev) 396962306a36Sopenharmony_ci{ 397062306a36Sopenharmony_ci struct rtw89_lck_info *lck = &rtwdev->lck; 397162306a36Sopenharmony_ci int path; 397262306a36Sopenharmony_ci 397362306a36Sopenharmony_ci for (path = 0; path < rtwdev->chip->rf_path_num; path++) { 397462306a36Sopenharmony_ci lck->thermal[path] = 397562306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 397662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 397762306a36Sopenharmony_ci "[LCK] path=%d thermal=0x%x", path, lck->thermal[path]); 397862306a36Sopenharmony_ci } 397962306a36Sopenharmony_ci} 398062306a36Sopenharmony_ci 398162306a36Sopenharmony_cistatic void _lck(struct rtw89_dev *rtwdev) 398262306a36Sopenharmony_ci{ 398362306a36Sopenharmony_ci u32 tmp18[2]; 398462306a36Sopenharmony_ci int path = rtwdev->dbcc_en ? 2 : 1; 398562306a36Sopenharmony_ci int i; 398662306a36Sopenharmony_ci 398762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, "[LCK] DO LCK\n"); 398862306a36Sopenharmony_ci 398962306a36Sopenharmony_ci tmp18[0] = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK); 399062306a36Sopenharmony_ci tmp18[1] = rtw89_read_rf(rtwdev, RF_PATH_B, RR_CFGCH, RFREG_MASK); 399162306a36Sopenharmony_ci 399262306a36Sopenharmony_ci for (i = 0; i < path; i++) { 399362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, i, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1); 399462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, i, RR_CFGCH, RFREG_MASK, tmp18[i]); 399562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, i, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0); 399662306a36Sopenharmony_ci } 399762306a36Sopenharmony_ci 399862306a36Sopenharmony_ci _lck_keep_thermal(rtwdev); 399962306a36Sopenharmony_ci} 400062306a36Sopenharmony_ci 400162306a36Sopenharmony_ci#define RTW8852C_LCK_TH 8 400262306a36Sopenharmony_ci 400362306a36Sopenharmony_civoid rtw8852c_lck_track(struct rtw89_dev *rtwdev) 400462306a36Sopenharmony_ci{ 400562306a36Sopenharmony_ci struct rtw89_lck_info *lck = &rtwdev->lck; 400662306a36Sopenharmony_ci u8 cur_thermal; 400762306a36Sopenharmony_ci int delta; 400862306a36Sopenharmony_ci int path; 400962306a36Sopenharmony_ci 401062306a36Sopenharmony_ci for (path = 0; path < rtwdev->chip->rf_path_num; path++) { 401162306a36Sopenharmony_ci cur_thermal = 401262306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 401362306a36Sopenharmony_ci delta = abs((int)cur_thermal - lck->thermal[path]); 401462306a36Sopenharmony_ci 401562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 401662306a36Sopenharmony_ci "[LCK] path=%d current thermal=0x%x delta=0x%x\n", 401762306a36Sopenharmony_ci path, cur_thermal, delta); 401862306a36Sopenharmony_ci 401962306a36Sopenharmony_ci if (delta >= RTW8852C_LCK_TH) { 402062306a36Sopenharmony_ci _lck(rtwdev); 402162306a36Sopenharmony_ci return; 402262306a36Sopenharmony_ci } 402362306a36Sopenharmony_ci } 402462306a36Sopenharmony_ci} 402562306a36Sopenharmony_ci 402662306a36Sopenharmony_civoid rtw8852c_lck_init(struct rtw89_dev *rtwdev) 402762306a36Sopenharmony_ci{ 402862306a36Sopenharmony_ci _lck_keep_thermal(rtwdev); 402962306a36Sopenharmony_ci} 403062306a36Sopenharmony_ci 403162306a36Sopenharmony_cistatic 403262306a36Sopenharmony_civoid rtw8852c_ctrl_bw_ch(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 403362306a36Sopenharmony_ci u8 central_ch, enum rtw89_band band, 403462306a36Sopenharmony_ci enum rtw89_bandwidth bw) 403562306a36Sopenharmony_ci{ 403662306a36Sopenharmony_ci _ctrl_ch(rtwdev, phy, central_ch, band); 403762306a36Sopenharmony_ci _ctrl_bw(rtwdev, phy, bw); 403862306a36Sopenharmony_ci _rxbb_bw(rtwdev, phy, bw); 403962306a36Sopenharmony_ci} 404062306a36Sopenharmony_ci 404162306a36Sopenharmony_civoid rtw8852c_set_channel_rf(struct rtw89_dev *rtwdev, 404262306a36Sopenharmony_ci const struct rtw89_chan *chan, 404362306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 404462306a36Sopenharmony_ci{ 404562306a36Sopenharmony_ci rtw8852c_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, 404662306a36Sopenharmony_ci chan->band_type, 404762306a36Sopenharmony_ci chan->band_width); 404862306a36Sopenharmony_ci} 404962306a36Sopenharmony_ci 405062306a36Sopenharmony_civoid rtw8852c_mcc_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 405162306a36Sopenharmony_ci{ 405262306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 405362306a36Sopenharmony_ci struct rtw89_rfk_mcc_info *rfk_mcc = &rtwdev->rfk_mcc; 405462306a36Sopenharmony_ci u8 idx = rfk_mcc->table_idx; 405562306a36Sopenharmony_ci int i; 405662306a36Sopenharmony_ci 405762306a36Sopenharmony_ci for (i = 0; i < RTW89_IQK_CHS_NR; i++) { 405862306a36Sopenharmony_ci if (rfk_mcc->ch[idx] == 0) 405962306a36Sopenharmony_ci break; 406062306a36Sopenharmony_ci if (++idx >= RTW89_IQK_CHS_NR) 406162306a36Sopenharmony_ci idx = 0; 406262306a36Sopenharmony_ci } 406362306a36Sopenharmony_ci 406462306a36Sopenharmony_ci rfk_mcc->table_idx = idx; 406562306a36Sopenharmony_ci rfk_mcc->ch[idx] = chan->channel; 406662306a36Sopenharmony_ci rfk_mcc->band[idx] = chan->band_type; 406762306a36Sopenharmony_ci} 406862306a36Sopenharmony_ci 406962306a36Sopenharmony_civoid rtw8852c_rck(struct rtw89_dev *rtwdev) 407062306a36Sopenharmony_ci{ 407162306a36Sopenharmony_ci u8 path; 407262306a36Sopenharmony_ci 407362306a36Sopenharmony_ci for (path = 0; path < 2; path++) 407462306a36Sopenharmony_ci _rck(rtwdev, path); 407562306a36Sopenharmony_ci} 407662306a36Sopenharmony_ci 407762306a36Sopenharmony_civoid rtw8852c_dack(struct rtw89_dev *rtwdev) 407862306a36Sopenharmony_ci{ 407962306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0); 408062306a36Sopenharmony_ci 408162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START); 408262306a36Sopenharmony_ci _dac_cal(rtwdev, false); 408362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP); 408462306a36Sopenharmony_ci} 408562306a36Sopenharmony_ci 408662306a36Sopenharmony_civoid rtw8852c_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 408762306a36Sopenharmony_ci{ 408862306a36Sopenharmony_ci u32 tx_en; 408962306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 409062306a36Sopenharmony_ci 409162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 409262306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 409362306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 409462306a36Sopenharmony_ci 409562306a36Sopenharmony_ci _iqk_init(rtwdev); 409662306a36Sopenharmony_ci _iqk(rtwdev, phy_idx, false); 409762306a36Sopenharmony_ci 409862306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 409962306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 410062306a36Sopenharmony_ci} 410162306a36Sopenharmony_ci 410262306a36Sopenharmony_ci#define RXDCK_VER_8852C 0xe 410362306a36Sopenharmony_ci 410462306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 410562306a36Sopenharmony_ci bool is_afe, u8 retry_limit) 410662306a36Sopenharmony_ci{ 410762306a36Sopenharmony_ci struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; 410862306a36Sopenharmony_ci u8 path, kpath; 410962306a36Sopenharmony_ci u32 rf_reg5; 411062306a36Sopenharmony_ci bool is_fail; 411162306a36Sopenharmony_ci u8 rek_cnt; 411262306a36Sopenharmony_ci 411362306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 411462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 411562306a36Sopenharmony_ci "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, Cv: %d) ******\n", 411662306a36Sopenharmony_ci RXDCK_VER_8852C, rtwdev->hal.cv); 411762306a36Sopenharmony_ci 411862306a36Sopenharmony_ci for (path = 0; path < 2; path++) { 411962306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 412062306a36Sopenharmony_ci if (!(kpath & BIT(path))) 412162306a36Sopenharmony_ci continue; 412262306a36Sopenharmony_ci 412362306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 412462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 412562306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x1); 412662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 412762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 412862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_LO_SEL, rtwdev->dbcc_en); 412962306a36Sopenharmony_ci 413062306a36Sopenharmony_ci for (rek_cnt = 0; rek_cnt < retry_limit; rek_cnt++) { 413162306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path, is_afe); 413262306a36Sopenharmony_ci 413362306a36Sopenharmony_ci /* To reduce IO of dck_rek_check(), the last try is seen 413462306a36Sopenharmony_ci * as failure always, and then do recovery procedure. 413562306a36Sopenharmony_ci */ 413662306a36Sopenharmony_ci if (rek_cnt == retry_limit - 1) { 413762306a36Sopenharmony_ci _rx_dck_recover(rtwdev, path); 413862306a36Sopenharmony_ci break; 413962306a36Sopenharmony_ci } 414062306a36Sopenharmony_ci 414162306a36Sopenharmony_ci is_fail = _rx_dck_rek_check(rtwdev, path); 414262306a36Sopenharmony_ci if (!is_fail) 414362306a36Sopenharmony_ci break; 414462306a36Sopenharmony_ci } 414562306a36Sopenharmony_ci 414662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] rek_cnt[%d]=%d", 414762306a36Sopenharmony_ci path, rek_cnt); 414862306a36Sopenharmony_ci 414962306a36Sopenharmony_ci rx_dck->thermal[path] = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 415062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 415162306a36Sopenharmony_ci 415262306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 415362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 415462306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, 0x0); 415562306a36Sopenharmony_ci } 415662306a36Sopenharmony_ci} 415762306a36Sopenharmony_ci 415862306a36Sopenharmony_civoid rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe) 415962306a36Sopenharmony_ci{ 416062306a36Sopenharmony_ci _rx_dck(rtwdev, phy, is_afe, 1); 416162306a36Sopenharmony_ci} 416262306a36Sopenharmony_ci 416362306a36Sopenharmony_ci#define RTW8852C_RX_DCK_TH 12 416462306a36Sopenharmony_ci 416562306a36Sopenharmony_civoid rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev) 416662306a36Sopenharmony_ci{ 416762306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 416862306a36Sopenharmony_ci struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; 416962306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx = RTW89_PHY_0; 417062306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 417162306a36Sopenharmony_ci u8 dck_channel; 417262306a36Sopenharmony_ci u8 cur_thermal; 417362306a36Sopenharmony_ci u32 tx_en; 417462306a36Sopenharmony_ci int delta; 417562306a36Sopenharmony_ci int path; 417662306a36Sopenharmony_ci 417762306a36Sopenharmony_ci if (chan->band_type == RTW89_BAND_2G) 417862306a36Sopenharmony_ci return; 417962306a36Sopenharmony_ci 418062306a36Sopenharmony_ci if (rtwdev->scanning) 418162306a36Sopenharmony_ci return; 418262306a36Sopenharmony_ci 418362306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852C; path++) { 418462306a36Sopenharmony_ci cur_thermal = 418562306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 418662306a36Sopenharmony_ci delta = abs((int)cur_thermal - rx_dck->thermal[path]); 418762306a36Sopenharmony_ci 418862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 418962306a36Sopenharmony_ci "[RX_DCK] path=%d current thermal=0x%x delta=0x%x\n", 419062306a36Sopenharmony_ci path, cur_thermal, delta); 419162306a36Sopenharmony_ci 419262306a36Sopenharmony_ci if (delta >= RTW8852C_RX_DCK_TH) 419362306a36Sopenharmony_ci goto trigger_rx_dck; 419462306a36Sopenharmony_ci } 419562306a36Sopenharmony_ci 419662306a36Sopenharmony_ci return; 419762306a36Sopenharmony_ci 419862306a36Sopenharmony_citrigger_rx_dck: 419962306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 420062306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 420162306a36Sopenharmony_ci 420262306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852C; path++) { 420362306a36Sopenharmony_ci dck_channel = _rx_dck_channel_calc(rtwdev, chan); 420462306a36Sopenharmony_ci _ctrl_ch(rtwdev, RTW89_PHY_0, dck_channel, chan->band_type); 420562306a36Sopenharmony_ci } 420662306a36Sopenharmony_ci 420762306a36Sopenharmony_ci _rx_dck(rtwdev, RTW89_PHY_0, false, 20); 420862306a36Sopenharmony_ci 420962306a36Sopenharmony_ci for (path = 0; path < RF_PATH_NUM_8852C; path++) 421062306a36Sopenharmony_ci _ctrl_ch(rtwdev, RTW89_PHY_0, chan->channel, chan->band_type); 421162306a36Sopenharmony_ci 421262306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 421362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 421462306a36Sopenharmony_ci} 421562306a36Sopenharmony_ci 421662306a36Sopenharmony_civoid rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 421762306a36Sopenharmony_ci{ 421862306a36Sopenharmony_ci u32 tx_en; 421962306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 422062306a36Sopenharmony_ci 422162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 422262306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 422362306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 422462306a36Sopenharmony_ci 422562306a36Sopenharmony_ci rtwdev->dpk.is_dpk_enable = true; 422662306a36Sopenharmony_ci rtwdev->dpk.is_dpk_reload_en = false; 422762306a36Sopenharmony_ci _dpk(rtwdev, phy_idx, false); 422862306a36Sopenharmony_ci 422962306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 423062306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 423162306a36Sopenharmony_ci} 423262306a36Sopenharmony_ci 423362306a36Sopenharmony_civoid rtw8852c_dpk_track(struct rtw89_dev *rtwdev) 423462306a36Sopenharmony_ci{ 423562306a36Sopenharmony_ci _dpk_track(rtwdev); 423662306a36Sopenharmony_ci} 423762306a36Sopenharmony_ci 423862306a36Sopenharmony_civoid rtw8852c_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 423962306a36Sopenharmony_ci{ 424062306a36Sopenharmony_ci u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C; 424162306a36Sopenharmony_ci 424262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy); 424362306a36Sopenharmony_ci 424462306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 424562306a36Sopenharmony_ci if (phy == RTW89_PHY_0) { 424662306a36Sopenharmony_ci path = RF_PATH_A; 424762306a36Sopenharmony_ci path_max = RF_PATH_B; 424862306a36Sopenharmony_ci } else if (phy == RTW89_PHY_1) { 424962306a36Sopenharmony_ci path = RF_PATH_B; 425062306a36Sopenharmony_ci path_max = RF_PATH_NUM_8852C; 425162306a36Sopenharmony_ci } 425262306a36Sopenharmony_ci } 425362306a36Sopenharmony_ci 425462306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 425562306a36Sopenharmony_ci 425662306a36Sopenharmony_ci for (i = path; i < path_max; i++) { 425762306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 425862306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); 425962306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); 426062306a36Sopenharmony_ci _tssi_set_dck(rtwdev, phy, i); 426162306a36Sopenharmony_ci _tssi_set_bbgain_split(rtwdev, phy, i); 426262306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 426362306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 426462306a36Sopenharmony_ci _tssi_set_aligk_default(rtwdev, phy, i); 426562306a36Sopenharmony_ci _tssi_set_slope(rtwdev, phy, i); 426662306a36Sopenharmony_ci _tssi_run_slope(rtwdev, phy, i); 426762306a36Sopenharmony_ci } 426862306a36Sopenharmony_ci 426962306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 427062306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 427162306a36Sopenharmony_ci} 427262306a36Sopenharmony_ci 427362306a36Sopenharmony_civoid rtw8852c_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 427462306a36Sopenharmony_ci{ 427562306a36Sopenharmony_ci u32 i, path = RF_PATH_A, path_max = RF_PATH_NUM_8852C; 427662306a36Sopenharmony_ci 427762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", 427862306a36Sopenharmony_ci __func__, phy); 427962306a36Sopenharmony_ci 428062306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A]) 428162306a36Sopenharmony_ci return; 428262306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_B]) 428362306a36Sopenharmony_ci return; 428462306a36Sopenharmony_ci 428562306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 428662306a36Sopenharmony_ci if (phy == RTW89_PHY_0) { 428762306a36Sopenharmony_ci path = RF_PATH_A; 428862306a36Sopenharmony_ci path_max = RF_PATH_B; 428962306a36Sopenharmony_ci } else if (phy == RTW89_PHY_1) { 429062306a36Sopenharmony_ci path = RF_PATH_B; 429162306a36Sopenharmony_ci path_max = RF_PATH_NUM_8852C; 429262306a36Sopenharmony_ci } 429362306a36Sopenharmony_ci } 429462306a36Sopenharmony_ci 429562306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 429662306a36Sopenharmony_ci 429762306a36Sopenharmony_ci for (i = path; i < path_max; i++) { 429862306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy, i); 429962306a36Sopenharmony_ci _tssi_set_dck(rtwdev, phy, i); 430062306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 430162306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 430262306a36Sopenharmony_ci _tssi_set_aligk_default(rtwdev, phy, i); 430362306a36Sopenharmony_ci } 430462306a36Sopenharmony_ci 430562306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 430662306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 430762306a36Sopenharmony_ci} 430862306a36Sopenharmony_ci 430962306a36Sopenharmony_cistatic void rtw8852c_tssi_default_txagc(struct rtw89_dev *rtwdev, 431062306a36Sopenharmony_ci enum rtw89_phy_idx phy, bool enable) 431162306a36Sopenharmony_ci{ 431262306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 431362306a36Sopenharmony_ci u8 i; 431462306a36Sopenharmony_ci 431562306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 431662306a36Sopenharmony_ci return; 431762306a36Sopenharmony_ci 431862306a36Sopenharmony_ci if (enable) { 431962306a36Sopenharmony_ci /* SCAN_START */ 432062306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0xc000 && 432162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0x0) { 432262306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 432362306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A] = 432462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, 432562306a36Sopenharmony_ci B_TXAGC_BB); 432662306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_A]) 432762306a36Sopenharmony_ci break; 432862306a36Sopenharmony_ci } 432962306a36Sopenharmony_ci } 433062306a36Sopenharmony_ci 433162306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0xc000 && 433262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0x0) { 433362306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 433462306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B] = 433562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, 433662306a36Sopenharmony_ci B_TXAGC_BB_S1); 433762306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_B]) 433862306a36Sopenharmony_ci break; 433962306a36Sopenharmony_ci } 434062306a36Sopenharmony_ci } 434162306a36Sopenharmony_ci } else { 434262306a36Sopenharmony_ci /* SCAN_END */ 434362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 434462306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A]); 434562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT, 434662306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B]); 434762306a36Sopenharmony_ci 434862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 434962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 435062306a36Sopenharmony_ci 435162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0); 435262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1); 435362306a36Sopenharmony_ci } 435462306a36Sopenharmony_ci} 435562306a36Sopenharmony_ci 435662306a36Sopenharmony_civoid rtw8852c_wifi_scan_notify(struct rtw89_dev *rtwdev, 435762306a36Sopenharmony_ci bool scan_start, enum rtw89_phy_idx phy_idx) 435862306a36Sopenharmony_ci{ 435962306a36Sopenharmony_ci if (scan_start) 436062306a36Sopenharmony_ci rtw8852c_tssi_default_txagc(rtwdev, phy_idx, true); 436162306a36Sopenharmony_ci else 436262306a36Sopenharmony_ci rtw8852c_tssi_default_txagc(rtwdev, phy_idx, false); 436362306a36Sopenharmony_ci} 4364