162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2019-2020 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "coex.h" 662306a36Sopenharmony_ci#include "debug.h" 762306a36Sopenharmony_ci#include "mac.h" 862306a36Sopenharmony_ci#include "phy.h" 962306a36Sopenharmony_ci#include "reg.h" 1062306a36Sopenharmony_ci#include "rtw8852a.h" 1162306a36Sopenharmony_ci#include "rtw8852a_rfk.h" 1262306a36Sopenharmony_ci#include "rtw8852a_rfk_table.h" 1362306a36Sopenharmony_ci#include "rtw8852a_table.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]dbcc_en: %x, PHY%d\n", 1862306a36Sopenharmony_ci rtwdev->dbcc_en, phy_idx); 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci if (!rtwdev->dbcc_en) 2162306a36Sopenharmony_ci return RF_AB; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci if (phy_idx == RTW89_PHY_0) 2462306a36Sopenharmony_ci return RF_A; 2562306a36Sopenharmony_ci else 2662306a36Sopenharmony_ci return RF_B; 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic const u32 rtw8852a_backup_bb_regs[] = {0x2344, 0x58f0, 0x78f0}; 3062306a36Sopenharmony_cistatic const u32 rtw8852a_backup_rf_regs[] = {0xef, 0xde, 0x0, 0x1e, 0x2, 0x85, 0x90, 0x5}; 3162306a36Sopenharmony_ci#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852a_backup_bb_regs) 3262306a36Sopenharmony_ci#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8852a_backup_rf_regs) 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev, u32 backup_bb_reg_val[]) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci u32 i; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 3962306a36Sopenharmony_ci backup_bb_reg_val[i] = 4062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, rtw8852a_backup_bb_regs[i], 4162306a36Sopenharmony_ci MASKDWORD); 4262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 4362306a36Sopenharmony_ci "[IQK]backup bb reg : %x, value =%x\n", 4462306a36Sopenharmony_ci rtw8852a_backup_bb_regs[i], backup_bb_reg_val[i]); 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev, u32 backup_rf_reg_val[], 4962306a36Sopenharmony_ci u8 rf_path) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci u32 i; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 5462306a36Sopenharmony_ci backup_rf_reg_val[i] = 5562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, rf_path, 5662306a36Sopenharmony_ci rtw8852a_backup_rf_regs[i], RFREG_MASK); 5762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 5862306a36Sopenharmony_ci "[IQK]backup rf S%d reg : %x, value =%x\n", rf_path, 5962306a36Sopenharmony_ci rtw8852a_backup_rf_regs[i], backup_rf_reg_val[i]); 6062306a36Sopenharmony_ci } 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev, 6462306a36Sopenharmony_ci u32 backup_bb_reg_val[]) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci u32 i; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci for (i = 0; i < BACKUP_BB_REGS_NR; i++) { 6962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, rtw8852a_backup_bb_regs[i], 7062306a36Sopenharmony_ci MASKDWORD, backup_bb_reg_val[i]); 7162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 7262306a36Sopenharmony_ci "[IQK]restore bb reg : %x, value =%x\n", 7362306a36Sopenharmony_ci rtw8852a_backup_bb_regs[i], backup_bb_reg_val[i]); 7462306a36Sopenharmony_ci } 7562306a36Sopenharmony_ci} 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_cistatic void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev, 7862306a36Sopenharmony_ci u32 backup_rf_reg_val[], u8 rf_path) 7962306a36Sopenharmony_ci{ 8062306a36Sopenharmony_ci u32 i; 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci for (i = 0; i < BACKUP_RF_REGS_NR; i++) { 8362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, rf_path, rtw8852a_backup_rf_regs[i], 8462306a36Sopenharmony_ci RFREG_MASK, backup_rf_reg_val[i]); 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 8762306a36Sopenharmony_ci "[IQK]restore rf S%d reg: %x, value =%x\n", rf_path, 8862306a36Sopenharmony_ci rtw8852a_backup_rf_regs[i], backup_rf_reg_val[i]); 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci} 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cistatic void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci u8 path; 9562306a36Sopenharmony_ci u32 rf_mode; 9662306a36Sopenharmony_ci int ret; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci for (path = 0; path < RF_PATH_MAX; path++) { 9962306a36Sopenharmony_ci if (!(kpath & BIT(path))) 10062306a36Sopenharmony_ci continue; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode, rf_mode != 2, 10362306a36Sopenharmony_ci 2, 5000, false, rtwdev, path, 0x00, 10462306a36Sopenharmony_ci RR_MOD_MASK); 10562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 10662306a36Sopenharmony_ci "[RFK] Wait S%d to Rx mode!! (ret = %d)\n", 10762306a36Sopenharmony_ci path, ret); 10862306a36Sopenharmony_ci } 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic void _dack_dump(struct rtw89_dev *rtwdev) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 11462306a36Sopenharmony_ci u8 i; 11562306a36Sopenharmony_ci u8 t; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 11862306a36Sopenharmony_ci "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n", 11962306a36Sopenharmony_ci dack->addck_d[0][0], dack->addck_d[0][1]); 12062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 12162306a36Sopenharmony_ci "[DACK]S1 ADC_DCK ic = 0x%x, qc = 0x%x\n", 12262306a36Sopenharmony_ci dack->addck_d[1][0], dack->addck_d[1][1]); 12362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 12462306a36Sopenharmony_ci "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n", 12562306a36Sopenharmony_ci dack->dadck_d[0][0], dack->dadck_d[0][1]); 12662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 12762306a36Sopenharmony_ci "[DACK]S1 DAC_DCK ic = 0x%x, qc = 0x%x\n", 12862306a36Sopenharmony_ci dack->dadck_d[1][0], dack->dadck_d[1][1]); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 13162306a36Sopenharmony_ci "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n", 13262306a36Sopenharmony_ci dack->biask_d[0][0], dack->biask_d[0][1]); 13362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 13462306a36Sopenharmony_ci "[DACK]S1 biask ic = 0x%x, qc = 0x%x\n", 13562306a36Sopenharmony_ci dack->biask_d[1][0], dack->biask_d[1][1]); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n"); 13862306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 13962306a36Sopenharmony_ci t = dack->msbk_d[0][0][i]; 14062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 14162306a36Sopenharmony_ci } 14262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n"); 14362306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 14462306a36Sopenharmony_ci t = dack->msbk_d[0][1][i]; 14562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 14662306a36Sopenharmony_ci } 14762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK ic:\n"); 14862306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 14962306a36Sopenharmony_ci t = dack->msbk_d[1][0][i]; 15062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 15162306a36Sopenharmony_ci } 15262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK qc:\n"); 15362306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 15462306a36Sopenharmony_ci t = dack->msbk_d[1][1][i]; 15562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t); 15662306a36Sopenharmony_ci } 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic void _afe_init(struct rtw89_dev *rtwdev) 16062306a36Sopenharmony_ci{ 16162306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_afe_init_defs_tbl); 16262306a36Sopenharmony_ci} 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic void _addck_backup(struct rtw89_dev *rtwdev) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_S0_RXDC2, B_S0_RXDC2_SEL); 16962306a36Sopenharmony_ci dack->addck_d[0][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_ADDCK, 17062306a36Sopenharmony_ci B_S0_ADDCK_Q); 17162306a36Sopenharmony_ci dack->addck_d[0][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_ADDCK, 17262306a36Sopenharmony_ci B_S0_ADDCK_I); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_S1_RXDC2, B_S1_RXDC2_SEL); 17562306a36Sopenharmony_ci dack->addck_d[1][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S1_ADDCK, 17662306a36Sopenharmony_ci B_S1_ADDCK_Q); 17762306a36Sopenharmony_ci dack->addck_d[1][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S1_ADDCK, 17862306a36Sopenharmony_ci B_S1_ADDCK_I); 17962306a36Sopenharmony_ci} 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_cistatic void _addck_reload(struct rtw89_dev *rtwdev) 18262306a36Sopenharmony_ci{ 18362306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_RXDC, B_S0_RXDC_I, dack->addck_d[0][0]); 18662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_RXDC2, B_S0_RXDC2_Q2, 18762306a36Sopenharmony_ci (dack->addck_d[0][1] >> 6)); 18862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_RXDC, B_S0_RXDC_Q, 18962306a36Sopenharmony_ci (dack->addck_d[0][1] & 0x3f)); 19062306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S0_RXDC2, B_S0_RXDC2_MEN); 19162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S1_RXDC, B_S1_RXDC_I, dack->addck_d[1][0]); 19262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S1_RXDC2, B_S1_RXDC2_Q2, 19362306a36Sopenharmony_ci (dack->addck_d[1][1] >> 6)); 19462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S1_RXDC, B_S1_RXDC_Q, 19562306a36Sopenharmony_ci (dack->addck_d[1][1] & 0x3f)); 19662306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S1_RXDC2, B_S1_RXDC2_EN); 19762306a36Sopenharmony_ci} 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_cistatic void _dack_backup_s0(struct rtw89_dev *rtwdev) 20062306a36Sopenharmony_ci{ 20162306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 20262306a36Sopenharmony_ci u8 i; 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S0_DACKI, B_S0_DACKI_EN); 20562306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S0_DACKQ, B_S0_DACKQ_EN); 20662306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG); 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 20962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_DACKI, B_S0_DACKI_AR, i); 21062306a36Sopenharmony_ci dack->msbk_d[0][0][i] = 21162306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI7, B_S0_DACKI7_K); 21262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_DACKQ, B_S0_DACKQ_AR, i); 21362306a36Sopenharmony_ci dack->msbk_d[0][1][i] = 21462306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ7, B_S0_DACKQ7_K); 21562306a36Sopenharmony_ci } 21662306a36Sopenharmony_ci dack->biask_d[0][0] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI2, 21762306a36Sopenharmony_ci B_S0_DACKI2_K); 21862306a36Sopenharmony_ci dack->biask_d[0][1] = (u16)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ2, 21962306a36Sopenharmony_ci B_S0_DACKQ2_K); 22062306a36Sopenharmony_ci dack->dadck_d[0][0] = (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKI8, 22162306a36Sopenharmony_ci B_S0_DACKI8_K) - 8; 22262306a36Sopenharmony_ci dack->dadck_d[0][1] = (u8)rtw89_phy_read32_mask(rtwdev, R_S0_DACKQ8, 22362306a36Sopenharmony_ci B_S0_DACKQ8_K) - 8; 22462306a36Sopenharmony_ci} 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_cistatic void _dack_backup_s1(struct rtw89_dev *rtwdev) 22762306a36Sopenharmony_ci{ 22862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 22962306a36Sopenharmony_ci u8 i; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S1_DACKI, B_S1_DACKI_EN); 23262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S1_DACKQ, B_S1_DACKQ_EN); 23362306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON); 23462306a36Sopenharmony_ci 23562306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR; i++) { 23662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S1_DACKI, B_S1_DACKI_AR, i); 23762306a36Sopenharmony_ci dack->msbk_d[1][0][i] = 23862306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI7, B_S1_DACKI_K); 23962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S1_DACKQ, B_S1_DACKQ_AR, i); 24062306a36Sopenharmony_ci dack->msbk_d[1][1][i] = 24162306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ7, B_S1_DACKQ7_K); 24262306a36Sopenharmony_ci } 24362306a36Sopenharmony_ci dack->biask_d[1][0] = 24462306a36Sopenharmony_ci (u16)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI2, B_S1_DACKI2_K); 24562306a36Sopenharmony_ci dack->biask_d[1][1] = 24662306a36Sopenharmony_ci (u16)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ2, B_S1_DACKQ2_K); 24762306a36Sopenharmony_ci dack->dadck_d[1][0] = 24862306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKI8, B_S1_DACKI8_K) - 8; 24962306a36Sopenharmony_ci dack->dadck_d[1][1] = 25062306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, R_S1_DACKQ8, B_S1_DACKQ8_K) - 8; 25162306a36Sopenharmony_ci} 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_cistatic void _dack_reload_by_path(struct rtw89_dev *rtwdev, 25462306a36Sopenharmony_ci enum rtw89_rf_path path, u8 index) 25562306a36Sopenharmony_ci{ 25662306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 25762306a36Sopenharmony_ci u32 tmp = 0, tmp_offset, tmp_reg; 25862306a36Sopenharmony_ci u8 i; 25962306a36Sopenharmony_ci u32 idx_offset, path_offset; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci if (index == 0) 26262306a36Sopenharmony_ci idx_offset = 0; 26362306a36Sopenharmony_ci else 26462306a36Sopenharmony_ci idx_offset = 0x50; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci if (path == RF_PATH_A) 26762306a36Sopenharmony_ci path_offset = 0; 26862306a36Sopenharmony_ci else 26962306a36Sopenharmony_ci path_offset = 0x2000; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci tmp_offset = idx_offset + path_offset; 27262306a36Sopenharmony_ci /* msbk_d: 15/14/13/12 */ 27362306a36Sopenharmony_ci tmp = 0x0; 27462306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 27562306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 12] << (i * 8); 27662306a36Sopenharmony_ci tmp_reg = 0x5e14 + tmp_offset; 27762306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, tmp_reg, tmp); 27862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 27962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 28062306a36Sopenharmony_ci /* msbk_d: 11/10/9/8 */ 28162306a36Sopenharmony_ci tmp = 0x0; 28262306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 28362306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 8] << (i * 8); 28462306a36Sopenharmony_ci tmp_reg = 0x5e18 + tmp_offset; 28562306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, tmp_reg, tmp); 28662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 28762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 28862306a36Sopenharmony_ci /* msbk_d: 7/6/5/4 */ 28962306a36Sopenharmony_ci tmp = 0x0; 29062306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 29162306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i + 4] << (i * 8); 29262306a36Sopenharmony_ci tmp_reg = 0x5e1c + tmp_offset; 29362306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, tmp_reg, tmp); 29462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 29562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 29662306a36Sopenharmony_ci /* msbk_d: 3/2/1/0 */ 29762306a36Sopenharmony_ci tmp = 0x0; 29862306a36Sopenharmony_ci for (i = 0; i < RTW89_DACK_MSBK_NR / 4; i++) 29962306a36Sopenharmony_ci tmp |= dack->msbk_d[path][index][i] << (i * 8); 30062306a36Sopenharmony_ci tmp_reg = 0x5e20 + tmp_offset; 30162306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, tmp_reg, tmp); 30262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", tmp_reg, 30362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, tmp_reg, MASKDWORD)); 30462306a36Sopenharmony_ci /* dadak_d/biask_d */ 30562306a36Sopenharmony_ci tmp = 0x0; 30662306a36Sopenharmony_ci tmp = (dack->biask_d[path][index] << 22) | 30762306a36Sopenharmony_ci (dack->dadck_d[path][index] << 14); 30862306a36Sopenharmony_ci tmp_reg = 0x5e24 + tmp_offset; 30962306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, tmp_reg, tmp); 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci u8 i; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci for (i = 0; i < 2; i++) 31762306a36Sopenharmony_ci _dack_reload_by_path(rtwdev, path, i); 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 32062306a36Sopenharmony_ci &rtw8852a_rfk_dack_reload_defs_a_tbl, 32162306a36Sopenharmony_ci &rtw8852a_rfk_dack_reload_defs_b_tbl); 32262306a36Sopenharmony_ci} 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci#define ADDC_T_AVG 100 32562306a36Sopenharmony_cistatic void _check_addc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci s32 dc_re = 0, dc_im = 0; 32862306a36Sopenharmony_ci u32 tmp; 32962306a36Sopenharmony_ci u32 i; 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 33262306a36Sopenharmony_ci &rtw8852a_rfk_check_addc_defs_a_tbl, 33362306a36Sopenharmony_ci &rtw8852a_rfk_check_addc_defs_b_tbl); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci for (i = 0; i < ADDC_T_AVG; i++) { 33662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_DBG32_D, MASKDWORD); 33762306a36Sopenharmony_ci dc_re += sign_extend32(FIELD_GET(0xfff000, tmp), 11); 33862306a36Sopenharmony_ci dc_im += sign_extend32(FIELD_GET(0xfff, tmp), 11); 33962306a36Sopenharmony_ci } 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci dc_re /= ADDC_T_AVG; 34262306a36Sopenharmony_ci dc_im /= ADDC_T_AVG; 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 34562306a36Sopenharmony_ci "[DACK]S%d,dc_re = 0x%x,dc_im =0x%x\n", path, dc_re, dc_im); 34662306a36Sopenharmony_ci} 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cistatic void _addck(struct rtw89_dev *rtwdev) 34962306a36Sopenharmony_ci{ 35062306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 35162306a36Sopenharmony_ci u32 val; 35262306a36Sopenharmony_ci int ret; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci /* S0 */ 35562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_reset_defs_a_tbl); 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S0 ADDCK\n"); 35862306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_A); 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_trigger_defs_a_tbl); 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 36362306a36Sopenharmony_ci false, rtwdev, 0x1e00, BIT(0)); 36462306a36Sopenharmony_ci if (ret) { 36562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n"); 36662306a36Sopenharmony_ci dack->addck_timeout[0] = true; 36762306a36Sopenharmony_ci } 36862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); 36962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 ADDCK\n"); 37062306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_A); 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_restore_defs_a_tbl); 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci /* S1 */ 37562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_reset_defs_b_tbl); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]before S1 ADDCK\n"); 37862306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_B); 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_trigger_defs_b_tbl); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 38362306a36Sopenharmony_ci false, rtwdev, 0x3e00, BIT(0)); 38462306a36Sopenharmony_ci if (ret) { 38562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 ADDCK timeout\n"); 38662306a36Sopenharmony_ci dack->addck_timeout[1] = true; 38762306a36Sopenharmony_ci } 38862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret); 38962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 ADDCK\n"); 39062306a36Sopenharmony_ci _check_addc(rtwdev, RF_PATH_B); 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_addck_restore_defs_b_tbl); 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic void _check_dadc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 39862306a36Sopenharmony_ci &rtw8852a_rfk_check_dadc_defs_f_a_tbl, 39962306a36Sopenharmony_ci &rtw8852a_rfk_check_dadc_defs_f_b_tbl); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci _check_addc(rtwdev, path); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 40462306a36Sopenharmony_ci &rtw8852a_rfk_check_dadc_defs_r_a_tbl, 40562306a36Sopenharmony_ci &rtw8852a_rfk_check_dadc_defs_r_b_tbl); 40662306a36Sopenharmony_ci} 40762306a36Sopenharmony_ci 40862306a36Sopenharmony_cistatic void _dack_s0(struct rtw89_dev *rtwdev) 40962306a36Sopenharmony_ci{ 41062306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 41162306a36Sopenharmony_ci u32 val; 41262306a36Sopenharmony_ci int ret; 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_f_a_tbl); 41562306a36Sopenharmony_ci 41662306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 41762306a36Sopenharmony_ci false, rtwdev, 0x5e28, BIT(15)); 41862306a36Sopenharmony_ci ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 41962306a36Sopenharmony_ci false, rtwdev, 0x5e78, BIT(15)); 42062306a36Sopenharmony_ci if (ret) { 42162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK timeout\n"); 42262306a36Sopenharmony_ci dack->msbk_timeout[0] = true; 42362306a36Sopenharmony_ci } 42462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 42562306a36Sopenharmony_ci 42662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_m_a_tbl); 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 42962306a36Sopenharmony_ci false, rtwdev, 0x5e48, BIT(17)); 43062306a36Sopenharmony_ci ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 43162306a36Sopenharmony_ci false, rtwdev, 0x5e98, BIT(17)); 43262306a36Sopenharmony_ci if (ret) { 43362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADACK timeout\n"); 43462306a36Sopenharmony_ci dack->dadck_timeout[0] = true; 43562306a36Sopenharmony_ci } 43662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 43762306a36Sopenharmony_ci 43862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_r_a_tbl); 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n"); 44162306a36Sopenharmony_ci _check_dadc(rtwdev, RF_PATH_A); 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ci _dack_backup_s0(rtwdev); 44462306a36Sopenharmony_ci _dack_reload(rtwdev, RF_PATH_A); 44562306a36Sopenharmony_ci 44662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG); 44762306a36Sopenharmony_ci} 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_cistatic void _dack_s1(struct rtw89_dev *rtwdev) 45062306a36Sopenharmony_ci{ 45162306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 45262306a36Sopenharmony_ci u32 val; 45362306a36Sopenharmony_ci int ret; 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_f_b_tbl); 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 45862306a36Sopenharmony_ci false, rtwdev, 0x7e28, BIT(15)); 45962306a36Sopenharmony_ci ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 46062306a36Sopenharmony_ci false, rtwdev, 0x7e78, BIT(15)); 46162306a36Sopenharmony_ci if (ret) { 46262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 MSBK timeout\n"); 46362306a36Sopenharmony_ci dack->msbk_timeout[1] = true; 46462306a36Sopenharmony_ci } 46562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_m_b_tbl); 46862306a36Sopenharmony_ci 46962306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 47062306a36Sopenharmony_ci false, rtwdev, 0x7e48, BIT(17)); 47162306a36Sopenharmony_ci ret |= read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val, 1, 10000, 47262306a36Sopenharmony_ci false, rtwdev, 0x7e98, BIT(17)); 47362306a36Sopenharmony_ci if (ret) { 47462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S1 DADCK timeout\n"); 47562306a36Sopenharmony_ci dack->dadck_timeout[1] = true; 47662306a36Sopenharmony_ci } 47762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret); 47862306a36Sopenharmony_ci 47962306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dack_defs_r_b_tbl); 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S1 DADCK\n"); 48262306a36Sopenharmony_ci _check_dadc(rtwdev, RF_PATH_B); 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_ci _dack_backup_s1(rtwdev); 48562306a36Sopenharmony_ci _dack_reload(rtwdev, RF_PATH_B); 48662306a36Sopenharmony_ci 48762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_P1_DBGMOD, B_P1_DBGMOD_ON); 48862306a36Sopenharmony_ci} 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_cistatic void _dack(struct rtw89_dev *rtwdev) 49162306a36Sopenharmony_ci{ 49262306a36Sopenharmony_ci _dack_s0(rtwdev); 49362306a36Sopenharmony_ci _dack_s1(rtwdev); 49462306a36Sopenharmony_ci} 49562306a36Sopenharmony_ci 49662306a36Sopenharmony_cistatic void _dac_cal(struct rtw89_dev *rtwdev, bool force) 49762306a36Sopenharmony_ci{ 49862306a36Sopenharmony_ci struct rtw89_dack_info *dack = &rtwdev->dack; 49962306a36Sopenharmony_ci u32 rf0_0, rf1_0; 50062306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, RF_AB); 50162306a36Sopenharmony_ci 50262306a36Sopenharmony_ci dack->dack_done = false; 50362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK b\n"); 50462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n"); 50562306a36Sopenharmony_ci rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK); 50662306a36Sopenharmony_ci rf1_0 = rtw89_read_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK); 50762306a36Sopenharmony_ci _afe_init(rtwdev); 50862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0); 50962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x0); 51062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x30001); 51162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x30001); 51262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START); 51362306a36Sopenharmony_ci _addck(rtwdev); 51462306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP); 51562306a36Sopenharmony_ci _addck_backup(rtwdev); 51662306a36Sopenharmony_ci _addck_reload(rtwdev); 51762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x40001); 51862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, 0x40001); 51962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MODOPT, RFREG_MASK, 0x0); 52062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MODOPT, RFREG_MASK, 0x0); 52162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_START); 52262306a36Sopenharmony_ci _dack(rtwdev); 52362306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_ONESHOT_STOP); 52462306a36Sopenharmony_ci _dack_dump(rtwdev); 52562306a36Sopenharmony_ci dack->dack_done = true; 52662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, rf0_0); 52762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_MOD, RFREG_MASK, rf1_0); 52862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1); 52962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, RF_PATH_B, RR_RSV1, RR_RSV1_RST, 0x1); 53062306a36Sopenharmony_ci dack->dack_cnt++; 53162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n"); 53262306a36Sopenharmony_ci} 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_ci#define RTW8852A_NCTL_VER 0xd 53562306a36Sopenharmony_ci#define RTW8852A_IQK_VER 0x2a 53662306a36Sopenharmony_ci#define RTW8852A_IQK_SS 2 53762306a36Sopenharmony_ci#define RTW8852A_IQK_THR_REK 8 53862306a36Sopenharmony_ci#define RTW8852A_IQK_CFIR_GROUP_NR 4 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_cienum rtw8852a_iqk_type { 54162306a36Sopenharmony_ci ID_TXAGC, 54262306a36Sopenharmony_ci ID_FLOK_COARSE, 54362306a36Sopenharmony_ci ID_FLOK_FINE, 54462306a36Sopenharmony_ci ID_TXK, 54562306a36Sopenharmony_ci ID_RXAGC, 54662306a36Sopenharmony_ci ID_RXK, 54762306a36Sopenharmony_ci ID_NBTXK, 54862306a36Sopenharmony_ci ID_NBRXK, 54962306a36Sopenharmony_ci}; 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_cistatic void _iqk_read_fft_dbcc0(struct rtw89_dev *rtwdev, u8 path) 55262306a36Sopenharmony_ci{ 55362306a36Sopenharmony_ci u8 i = 0x0; 55462306a36Sopenharmony_ci u32 fft[6] = {0x0}; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 55762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00160000); 55862306a36Sopenharmony_ci fft[0] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 55962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00170000); 56062306a36Sopenharmony_ci fft[1] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 56162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00180000); 56262306a36Sopenharmony_ci fft[2] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 56362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00190000); 56462306a36Sopenharmony_ci fft[3] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 56562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x001a0000); 56662306a36Sopenharmony_ci fft[4] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 56762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x001b0000); 56862306a36Sopenharmony_ci fft[5] = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD); 56962306a36Sopenharmony_ci for (i = 0; i < 6; i++) 57062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x,fft[%x]= %x\n", 57162306a36Sopenharmony_ci path, i, fft[i]); 57262306a36Sopenharmony_ci} 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistatic void _iqk_read_xym_dbcc0(struct rtw89_dev *rtwdev, u8 path) 57562306a36Sopenharmony_ci{ 57662306a36Sopenharmony_ci u8 i = 0x0; 57762306a36Sopenharmony_ci u32 tmp = 0x0; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 58062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, B_NCTL_CFG_SPAGE, path); 58162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF, B_IQK_DIF_TRX, 0x1); 58262306a36Sopenharmony_ci 58362306a36Sopenharmony_ci for (i = 0x0; i < 0x18; i++) { 58462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N2, MASKDWORD, 0x000000c0 + i); 58562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N2, MASKDWORD); 58662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 58762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = %x\n", 58862306a36Sopenharmony_ci path, BIT(path), tmp); 58962306a36Sopenharmony_ci udelay(1); 59062306a36Sopenharmony_ci } 59162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_DIF, B_IQK_DIF_TRX); 59262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 0x40000000); 59362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_N2, MASKDWORD, 0x80010100); 59462306a36Sopenharmony_ci udelay(1); 59562306a36Sopenharmony_ci} 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_cistatic void _iqk_read_txcfir_dbcc0(struct rtw89_dev *rtwdev, u8 path, 59862306a36Sopenharmony_ci u8 group) 59962306a36Sopenharmony_ci{ 60062306a36Sopenharmony_ci static const u32 base_addrs[RTW8852A_IQK_SS][RTW8852A_IQK_CFIR_GROUP_NR] = { 60162306a36Sopenharmony_ci {0x8f20, 0x8f54, 0x8f88, 0x8fbc}, 60262306a36Sopenharmony_ci {0x9320, 0x9354, 0x9388, 0x93bc}, 60362306a36Sopenharmony_ci }; 60462306a36Sopenharmony_ci u8 idx = 0x0; 60562306a36Sopenharmony_ci u32 tmp = 0x0; 60662306a36Sopenharmony_ci u32 base_addr; 60762306a36Sopenharmony_ci 60862306a36Sopenharmony_ci if (path >= RTW8852A_IQK_SS) { 60962306a36Sopenharmony_ci rtw89_warn(rtwdev, "cfir path %d out of range\n", path); 61062306a36Sopenharmony_ci return; 61162306a36Sopenharmony_ci } 61262306a36Sopenharmony_ci if (group >= RTW8852A_IQK_CFIR_GROUP_NR) { 61362306a36Sopenharmony_ci rtw89_warn(rtwdev, "cfir group %d out of range\n", group); 61462306a36Sopenharmony_ci return; 61562306a36Sopenharmony_ci } 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 61862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_W_COEF + (path << 8), MASKDWORD, 0x00000001); 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci base_addr = base_addrs[path][group]; 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ci for (idx = 0; idx < 0x0d; idx++) { 62362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, base_addr + (idx << 2), MASKDWORD); 62462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 62562306a36Sopenharmony_ci "[IQK] %x = %x\n", 62662306a36Sopenharmony_ci base_addr + (idx << 2), tmp); 62762306a36Sopenharmony_ci } 62862306a36Sopenharmony_ci 62962306a36Sopenharmony_ci if (path == 0x0) { 63062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n"); 63162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C0, MASKDWORD); 63262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8f50 = %x\n", tmp); 63362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C1, MASKDWORD); 63462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8f84 = %x\n", tmp); 63562306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C2, MASKDWORD); 63662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8fb8 = %x\n", tmp); 63762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P0C3, MASKDWORD); 63862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8fec = %x\n", tmp); 63962306a36Sopenharmony_ci } else { 64062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n"); 64162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C0, MASKDWORD); 64262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9350 = %x\n", tmp); 64362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C1, MASKDWORD); 64462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9384 = %x\n", tmp); 64562306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C2, MASKDWORD); 64662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x93b8 = %x\n", tmp); 64762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXCFIR_P1C3, MASKDWORD); 64862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x93ec = %x\n", tmp); 64962306a36Sopenharmony_ci } 65062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_W_COEF + (path << 8), MASKDWORD); 65162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0xc); 65262306a36Sopenharmony_ci udelay(1); 65362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), MASKDWORD); 65462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lxfc = %x\n", path, 65562306a36Sopenharmony_ci BIT(path), tmp); 65662306a36Sopenharmony_ci} 65762306a36Sopenharmony_ci 65862306a36Sopenharmony_cistatic void _iqk_read_rxcfir_dbcc0(struct rtw89_dev *rtwdev, u8 path, 65962306a36Sopenharmony_ci u8 group) 66062306a36Sopenharmony_ci{ 66162306a36Sopenharmony_ci static const u32 base_addrs[RTW8852A_IQK_SS][RTW8852A_IQK_CFIR_GROUP_NR] = { 66262306a36Sopenharmony_ci {0x8d00, 0x8d44, 0x8d88, 0x8dcc}, 66362306a36Sopenharmony_ci {0x9100, 0x9144, 0x9188, 0x91cc}, 66462306a36Sopenharmony_ci }; 66562306a36Sopenharmony_ci u8 idx = 0x0; 66662306a36Sopenharmony_ci u32 tmp = 0x0; 66762306a36Sopenharmony_ci u32 base_addr; 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ci if (path >= RTW8852A_IQK_SS) { 67062306a36Sopenharmony_ci rtw89_warn(rtwdev, "cfir path %d out of range\n", path); 67162306a36Sopenharmony_ci return; 67262306a36Sopenharmony_ci } 67362306a36Sopenharmony_ci if (group >= RTW8852A_IQK_CFIR_GROUP_NR) { 67462306a36Sopenharmony_ci rtw89_warn(rtwdev, "cfir group %d out of range\n", group); 67562306a36Sopenharmony_ci return; 67662306a36Sopenharmony_ci } 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 67962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_W_COEF + (path << 8), MASKDWORD, 0x00000001); 68062306a36Sopenharmony_ci 68162306a36Sopenharmony_ci base_addr = base_addrs[path][group]; 68262306a36Sopenharmony_ci for (idx = 0; idx < 0x10; idx++) { 68362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, base_addr + (idx << 2), MASKDWORD); 68462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 68562306a36Sopenharmony_ci "[IQK]%x = %x\n", 68662306a36Sopenharmony_ci base_addr + (idx << 2), tmp); 68762306a36Sopenharmony_ci } 68862306a36Sopenharmony_ci 68962306a36Sopenharmony_ci if (path == 0x0) { 69062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n"); 69162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C0, MASKDWORD); 69262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8d40 = %x\n", tmp); 69362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C1, MASKDWORD); 69462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8d84 = %x\n", tmp); 69562306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C2, MASKDWORD); 69662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8dc8 = %x\n", tmp); 69762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P0C3, MASKDWORD); 69862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x8e0c = %x\n", tmp); 69962306a36Sopenharmony_ci } else { 70062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]\n"); 70162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C0, MASKDWORD); 70262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9140 = %x\n", tmp); 70362306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C1, MASKDWORD); 70462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x9184 = %x\n", tmp); 70562306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C2, MASKDWORD); 70662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x91c8 = %x\n", tmp); 70762306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXCFIR_P1C3, MASKDWORD); 70862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] 0x920c = %x\n", tmp); 70962306a36Sopenharmony_ci } 71062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_W_COEF + (path << 8), MASKDWORD); 71162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0xd); 71262306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), MASKDWORD); 71362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lxfc = %x\n", path, 71462306a36Sopenharmony_ci BIT(path), tmp); 71562306a36Sopenharmony_ci} 71662306a36Sopenharmony_ci 71762306a36Sopenharmony_cistatic void _iqk_sram(struct rtw89_dev *rtwdev, u8 path) 71862306a36Sopenharmony_ci{ 71962306a36Sopenharmony_ci u32 tmp = 0x0; 72062306a36Sopenharmony_ci u32 i = 0x0; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 72362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00020000); 72462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000080); 72562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000); 72662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009); 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci for (i = 0; i <= 0x9f; i++) { 72962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000 + i); 73062306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 73162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", tmp); 73262306a36Sopenharmony_ci } 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci for (i = 0; i <= 0x9f; i++) { 73562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000 + i); 73662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); 73762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n", tmp); 73862306a36Sopenharmony_ci } 73962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_SRAM_IQRX2, MASKDWORD); 74062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_SRAM_IQRX, MASKDWORD); 74162306a36Sopenharmony_ci} 74262306a36Sopenharmony_ci 74362306a36Sopenharmony_cistatic void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path) 74462306a36Sopenharmony_ci{ 74562306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 74662306a36Sopenharmony_ci u32 tmp = 0x0; 74762306a36Sopenharmony_ci 74862306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG); 74962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x3); 75062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0xa041); 75162306a36Sopenharmony_ci udelay(1); 75262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H2, 0x3); 75362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x0); 75462306a36Sopenharmony_ci udelay(1); 75562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST, 0x1); 75662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H2, 0x0); 75762306a36Sopenharmony_ci udelay(1); 75862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303); 75962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000); 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 76262306a36Sopenharmony_ci case RTW89_BAND_2G: 76362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RXK2); 76462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x1); 76562306a36Sopenharmony_ci break; 76662306a36Sopenharmony_ci case RTW89_BAND_5G: 76762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RXK2); 76862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x5); 76962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x1); 77062306a36Sopenharmony_ci break; 77162306a36Sopenharmony_ci default: 77262306a36Sopenharmony_ci break; 77362306a36Sopenharmony_ci } 77462306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 77562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, tmp); 77662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 77762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 77862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1); 77962306a36Sopenharmony_ci fsleep(128); 78062306a36Sopenharmony_ci} 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_cistatic bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path, u8 ktype) 78362306a36Sopenharmony_ci{ 78462306a36Sopenharmony_ci u32 tmp; 78562306a36Sopenharmony_ci u32 val; 78662306a36Sopenharmony_ci int ret; 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 1, 8200, 78962306a36Sopenharmony_ci false, rtwdev, 0xbff8, MASKBYTE0); 79062306a36Sopenharmony_ci if (ret) 79162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]IQK timeout!!!\n"); 79262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0); 79362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ret=%d\n", path, ret); 79462306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD); 79562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 79662306a36Sopenharmony_ci "[IQK]S%x, type= %x, 0x8008 = 0x%x\n", path, ktype, tmp); 79762306a36Sopenharmony_ci 79862306a36Sopenharmony_ci return false; 79962306a36Sopenharmony_ci} 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_cistatic bool _iqk_one_shot(struct rtw89_dev *rtwdev, 80262306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path, u8 ktype) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 80562306a36Sopenharmony_ci bool fail = false; 80662306a36Sopenharmony_ci u32 iqk_cmd = 0x0; 80762306a36Sopenharmony_ci u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy_idx, path); 80862306a36Sopenharmony_ci u32 addr_rfc_ctl = 0x0; 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci if (path == RF_PATH_A) 81162306a36Sopenharmony_ci addr_rfc_ctl = 0x5864; 81262306a36Sopenharmony_ci else 81362306a36Sopenharmony_ci addr_rfc_ctl = 0x7864; 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 81662306a36Sopenharmony_ci switch (ktype) { 81762306a36Sopenharmony_ci case ID_TXAGC: 81862306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (4 + path)) | (path << 1); 81962306a36Sopenharmony_ci break; 82062306a36Sopenharmony_ci case ID_FLOK_COARSE: 82162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000); 82262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009); 82362306a36Sopenharmony_ci iqk_cmd = 0x108 | (1 << (4 + path)); 82462306a36Sopenharmony_ci break; 82562306a36Sopenharmony_ci case ID_FLOK_FINE: 82662306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000); 82762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009); 82862306a36Sopenharmony_ci iqk_cmd = 0x208 | (1 << (4 + path)); 82962306a36Sopenharmony_ci break; 83062306a36Sopenharmony_ci case ID_TXK: 83162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000); 83262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x025); 83362306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 83462306a36Sopenharmony_ci (((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8); 83562306a36Sopenharmony_ci break; 83662306a36Sopenharmony_ci case ID_RXAGC: 83762306a36Sopenharmony_ci iqk_cmd = 0x508 | (1 << (4 + path)) | (path << 1); 83862306a36Sopenharmony_ci break; 83962306a36Sopenharmony_ci case ID_RXK: 84062306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000); 84162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 84262306a36Sopenharmony_ci iqk_cmd = 0x008 | (1 << (path + 4)) | 84362306a36Sopenharmony_ci (((0xb + iqk_info->iqk_bw[path]) & 0xf) << 8); 84462306a36Sopenharmony_ci break; 84562306a36Sopenharmony_ci case ID_NBTXK: 84662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000); 84762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x025); 84862306a36Sopenharmony_ci iqk_cmd = 0x308 | (1 << (4 + path)); 84962306a36Sopenharmony_ci break; 85062306a36Sopenharmony_ci case ID_NBRXK: 85162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr_rfc_ctl, 0x20000000); 85262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011); 85362306a36Sopenharmony_ci iqk_cmd = 0x608 | (1 << (4 + path)); 85462306a36Sopenharmony_ci break; 85562306a36Sopenharmony_ci default: 85662306a36Sopenharmony_ci return false; 85762306a36Sopenharmony_ci } 85862306a36Sopenharmony_ci 85962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1); 86062306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_DPK_CTL, B_DPK_CTL_EN); 86162306a36Sopenharmony_ci udelay(1); 86262306a36Sopenharmony_ci fail = _iqk_check_cal(rtwdev, path, ktype); 86362306a36Sopenharmony_ci if (iqk_info->iqk_xym_en) 86462306a36Sopenharmony_ci _iqk_read_xym_dbcc0(rtwdev, path); 86562306a36Sopenharmony_ci if (iqk_info->iqk_fft_en) 86662306a36Sopenharmony_ci _iqk_read_fft_dbcc0(rtwdev, path); 86762306a36Sopenharmony_ci if (iqk_info->iqk_sram_en) 86862306a36Sopenharmony_ci _iqk_sram(rtwdev, path); 86962306a36Sopenharmony_ci if (iqk_info->iqk_cfir_en) { 87062306a36Sopenharmony_ci if (ktype == ID_TXK) { 87162306a36Sopenharmony_ci _iqk_read_txcfir_dbcc0(rtwdev, path, 0x0); 87262306a36Sopenharmony_ci _iqk_read_txcfir_dbcc0(rtwdev, path, 0x1); 87362306a36Sopenharmony_ci _iqk_read_txcfir_dbcc0(rtwdev, path, 0x2); 87462306a36Sopenharmony_ci _iqk_read_txcfir_dbcc0(rtwdev, path, 0x3); 87562306a36Sopenharmony_ci } else { 87662306a36Sopenharmony_ci _iqk_read_rxcfir_dbcc0(rtwdev, path, 0x0); 87762306a36Sopenharmony_ci _iqk_read_rxcfir_dbcc0(rtwdev, path, 0x1); 87862306a36Sopenharmony_ci _iqk_read_rxcfir_dbcc0(rtwdev, path, 0x2); 87962306a36Sopenharmony_ci _iqk_read_rxcfir_dbcc0(rtwdev, path, 0x3); 88062306a36Sopenharmony_ci } 88162306a36Sopenharmony_ci } 88262306a36Sopenharmony_ci 88362306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, addr_rfc_ctl, 0x20000000); 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci return fail; 88862306a36Sopenharmony_ci} 88962306a36Sopenharmony_ci 89062306a36Sopenharmony_cistatic bool _rxk_group_sel(struct rtw89_dev *rtwdev, 89162306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 89262306a36Sopenharmony_ci{ 89362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 89462306a36Sopenharmony_ci static const u32 rxgn_a[4] = {0x18C, 0x1A0, 0x28C, 0x2A0}; 89562306a36Sopenharmony_ci static const u32 attc2_a[4] = {0x0, 0x0, 0x07, 0x30}; 89662306a36Sopenharmony_ci static const u32 attc1_a[4] = {0x7, 0x5, 0x1, 0x1}; 89762306a36Sopenharmony_ci static const u32 rxgn_g[4] = {0x1CC, 0x1E0, 0x2CC, 0x2E0}; 89862306a36Sopenharmony_ci static const u32 attc2_g[4] = {0x0, 0x15, 0x3, 0x1a}; 89962306a36Sopenharmony_ci static const u32 attc1_g[4] = {0x1, 0x0, 0x1, 0x0}; 90062306a36Sopenharmony_ci u8 gp = 0x0; 90162306a36Sopenharmony_ci bool fail = false; 90262306a36Sopenharmony_ci u32 rf0 = 0x0; 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci for (gp = 0; gp < 0x4; gp++) { 90562306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 90662306a36Sopenharmony_ci case RTW89_BAND_2G: 90762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, rxgn_g[gp]); 90862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, attc2_g[gp]); 90962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, attc1_g[gp]); 91062306a36Sopenharmony_ci break; 91162306a36Sopenharmony_ci case RTW89_BAND_5G: 91262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, rxgn_a[gp]); 91362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C2, attc2_a[gp]); 91462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C1, attc1_a[gp]); 91562306a36Sopenharmony_ci break; 91662306a36Sopenharmony_ci default: 91762306a36Sopenharmony_ci break; 91862306a36Sopenharmony_ci } 91962306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET); 92062306a36Sopenharmony_ci rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 92162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, 92262306a36Sopenharmony_ci rf0 | iqk_info->syn1to2); 92362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_COM, MASKDWORD, 0x40010100); 92462306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR); 92562306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL); 92662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3); 92762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, gp); 92862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN, 0x1); 92962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP); 93062306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK); 93162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(16 + gp + path * 4), fail); 93262306a36Sopenharmony_ci } 93362306a36Sopenharmony_ci 93462306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 93562306a36Sopenharmony_ci case RTW89_BAND_2G: 93662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0); 93762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 93862306a36Sopenharmony_ci break; 93962306a36Sopenharmony_ci case RTW89_BAND_5G: 94062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); 94162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 94262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x0); 94362306a36Sopenharmony_ci break; 94462306a36Sopenharmony_ci default: 94562306a36Sopenharmony_ci break; 94662306a36Sopenharmony_ci } 94762306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000000; 94862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 94962306a36Sopenharmony_ci B_IQK_RES_RXCFIR, 0x5); 95062306a36Sopenharmony_ci iqk_info->is_wb_rxiqk[path] = true; 95162306a36Sopenharmony_ci return false; 95262306a36Sopenharmony_ci} 95362306a36Sopenharmony_ci 95462306a36Sopenharmony_cistatic bool _iqk_nbrxk(struct rtw89_dev *rtwdev, 95562306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 95662306a36Sopenharmony_ci{ 95762306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 95862306a36Sopenharmony_ci u8 group = 0x0; 95962306a36Sopenharmony_ci u32 rf0 = 0x0, tmp = 0x0; 96062306a36Sopenharmony_ci u32 idxrxgain_a = 0x1a0; 96162306a36Sopenharmony_ci u32 idxattc2_a = 0x00; 96262306a36Sopenharmony_ci u32 idxattc1_a = 0x5; 96362306a36Sopenharmony_ci u32 idxrxgain_g = 0x1E0; 96462306a36Sopenharmony_ci u32 idxattc2_g = 0x15; 96562306a36Sopenharmony_ci u32 idxattc1_g = 0x0; 96662306a36Sopenharmony_ci bool fail = false; 96762306a36Sopenharmony_ci 96862306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 96962306a36Sopenharmony_ci case RTW89_BAND_2G: 97062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, idxrxgain_g); 97162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2G, idxattc2_g); 97262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C1G, idxattc1_g); 97362306a36Sopenharmony_ci break; 97462306a36Sopenharmony_ci case RTW89_BAND_5G: 97562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXG, idxrxgain_a); 97662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C2, idxattc2_a); 97762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_C1, idxattc1_a); 97862306a36Sopenharmony_ci break; 97962306a36Sopenharmony_ci default: 98062306a36Sopenharmony_ci break; 98162306a36Sopenharmony_ci } 98262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET); 98362306a36Sopenharmony_ci rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 98462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, 98562306a36Sopenharmony_ci rf0 | iqk_info->syn1to2); 98662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_COM, MASKDWORD, 0x40010100); 98762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_RXCFIR); 98862306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL); 98962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3); 99062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 99162306a36Sopenharmony_ci B_CFIR_LUT_GP, group); 99262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN); 99362306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP); 99462306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK); 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 99762306a36Sopenharmony_ci case RTW89_BAND_2G: 99862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL2G, 0x0); 99962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 100062306a36Sopenharmony_ci break; 100162306a36Sopenharmony_ci case RTW89_BAND_5G: 100262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_SEL5G, 0x0); 100362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 100462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_WLSEL, RR_WLSEL_AG, 0x0); 100562306a36Sopenharmony_ci break; 100662306a36Sopenharmony_ci default: 100762306a36Sopenharmony_ci break; 100862306a36Sopenharmony_ci } 100962306a36Sopenharmony_ci if (!fail) { 101062306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD); 101162306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = tmp | 0x2; 101262306a36Sopenharmony_ci } else { 101362306a36Sopenharmony_ci iqk_info->nb_rxcfir[path] = 0x40000002; 101462306a36Sopenharmony_ci } 101562306a36Sopenharmony_ci return fail; 101662306a36Sopenharmony_ci} 101762306a36Sopenharmony_ci 101862306a36Sopenharmony_cistatic void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path) 101962306a36Sopenharmony_ci{ 102062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 102162306a36Sopenharmony_ci 102262306a36Sopenharmony_ci if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) { 102362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 102462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), 102562306a36Sopenharmony_ci MASKDWORD, 0x4d000a08); 102662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), 102762306a36Sopenharmony_ci B_P0_RXCK_VAL, 0x2); 102862306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON); 102962306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON); 103062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL, 0x1); 103162306a36Sopenharmony_ci } else { 103262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), 103362306a36Sopenharmony_ci MASKDWORD, 0x44000a08); 103462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), 103562306a36Sopenharmony_ci B_P0_RXCK_VAL, 0x1); 103662306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON); 103762306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_ON); 103862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_UPD_CLK_ADC, B_UPD_CLK_ADC_VAL); 103962306a36Sopenharmony_ci } 104062306a36Sopenharmony_ci} 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_cistatic bool _txk_group_sel(struct rtw89_dev *rtwdev, 104362306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 104462306a36Sopenharmony_ci{ 104562306a36Sopenharmony_ci static const u32 a_txgain[4] = {0xE466, 0x646D, 0xE4E2, 0x64ED}; 104662306a36Sopenharmony_ci static const u32 g_txgain[4] = {0x60e8, 0x60f0, 0x61e8, 0x61ED}; 104762306a36Sopenharmony_ci static const u32 a_itqt[4] = {0x12, 0x12, 0x12, 0x1b}; 104862306a36Sopenharmony_ci static const u32 g_itqt[4] = {0x09, 0x12, 0x12, 0x12}; 104962306a36Sopenharmony_ci static const u32 g_attsmxr[4] = {0x0, 0x1, 0x1, 0x1}; 105062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 105162306a36Sopenharmony_ci bool fail = false; 105262306a36Sopenharmony_ci u8 gp = 0x0; 105362306a36Sopenharmony_ci u32 tmp = 0x0; 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci for (gp = 0x0; gp < 0x4; gp++) { 105662306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 105762306a36Sopenharmony_ci case RTW89_BAND_2G: 105862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8), 105962306a36Sopenharmony_ci B_RFGAIN_BND, 0x08); 106062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 106162306a36Sopenharmony_ci g_txgain[gp]); 106262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 106362306a36Sopenharmony_ci g_attsmxr[gp]); 106462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 106562306a36Sopenharmony_ci g_attsmxr[gp]); 106662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 106762306a36Sopenharmony_ci MASKDWORD, g_itqt[gp]); 106862306a36Sopenharmony_ci break; 106962306a36Sopenharmony_ci case RTW89_BAND_5G: 107062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8), 107162306a36Sopenharmony_ci B_RFGAIN_BND, 0x04); 107262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 107362306a36Sopenharmony_ci a_txgain[gp]); 107462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), 107562306a36Sopenharmony_ci MASKDWORD, a_itqt[gp]); 107662306a36Sopenharmony_ci break; 107762306a36Sopenharmony_ci default: 107862306a36Sopenharmony_ci break; 107962306a36Sopenharmony_ci } 108062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR); 108162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL); 108262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3); 108362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 108462306a36Sopenharmony_ci B_CFIR_LUT_GP, gp); 108562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP); 108662306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK); 108762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(8 + gp + path * 4), fail); 108862306a36Sopenharmony_ci } 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000000; 109162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 109262306a36Sopenharmony_ci B_IQK_RES_TXCFIR, 0x5); 109362306a36Sopenharmony_ci iqk_info->is_wb_txiqk[path] = true; 109462306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 109562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = 0x%x\n", path, 109662306a36Sopenharmony_ci BIT(path), tmp); 109762306a36Sopenharmony_ci return false; 109862306a36Sopenharmony_ci} 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_cistatic bool _iqk_nbtxk(struct rtw89_dev *rtwdev, 110162306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 110262306a36Sopenharmony_ci{ 110362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 110462306a36Sopenharmony_ci u8 group = 0x2; 110562306a36Sopenharmony_ci u32 a_mode_txgain = 0x64e2; 110662306a36Sopenharmony_ci u32 g_mode_txgain = 0x61e8; 110762306a36Sopenharmony_ci u32 attsmxr = 0x1; 110862306a36Sopenharmony_ci u32 itqt = 0x12; 110962306a36Sopenharmony_ci u32 tmp = 0x0; 111062306a36Sopenharmony_ci bool fail = false; 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 111362306a36Sopenharmony_ci case RTW89_BAND_2G: 111462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8), 111562306a36Sopenharmony_ci B_RFGAIN_BND, 0x08); 111662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, g_mode_txgain); 111762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, attsmxr); 111862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, attsmxr); 111962306a36Sopenharmony_ci break; 112062306a36Sopenharmony_ci case RTW89_BAND_5G: 112162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN_BND + (path << 8), 112262306a36Sopenharmony_ci B_RFGAIN_BND, 0x04); 112362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, a_mode_txgain); 112462306a36Sopenharmony_ci break; 112562306a36Sopenharmony_ci default: 112662306a36Sopenharmony_ci break; 112762306a36Sopenharmony_ci } 112862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR); 112962306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL); 113062306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3); 113162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, group); 113262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt); 113362306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP); 113462306a36Sopenharmony_ci fail = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK); 113562306a36Sopenharmony_ci if (!fail) { 113662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 113762306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = tmp | 0x2; 113862306a36Sopenharmony_ci } else { 113962306a36Sopenharmony_ci iqk_info->nb_txcfir[path] = 0x40000002; 114062306a36Sopenharmony_ci } 114162306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 114262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x8%lx38 = 0x%x\n", path, 114362306a36Sopenharmony_ci BIT(path), tmp); 114462306a36Sopenharmony_ci return fail; 114562306a36Sopenharmony_ci} 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_cistatic void _lok_res_table(struct rtw89_dev *rtwdev, u8 path, u8 ibias) 114862306a36Sopenharmony_ci{ 114962306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, ibias = %x\n", path, ibias); 115262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x2); 115362306a36Sopenharmony_ci if (iqk_info->iqk_band[path] == RTW89_BAND_2G) 115462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x0); 115562306a36Sopenharmony_ci else 115662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, 0x1); 115762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ibias); 115862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RFREG_MASK, 0x0); 115962306a36Sopenharmony_ci} 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_cistatic bool _lok_finetune_check(struct rtw89_dev *rtwdev, u8 path) 116262306a36Sopenharmony_ci{ 116362306a36Sopenharmony_ci bool is_fail = false; 116462306a36Sopenharmony_ci u32 tmp = 0x0; 116562306a36Sopenharmony_ci u32 core_i = 0x0; 116662306a36Sopenharmony_ci u32 core_q = 0x0; 116762306a36Sopenharmony_ci 116862306a36Sopenharmony_ci tmp = rtw89_read_rf(rtwdev, path, RR_TXMO, RFREG_MASK); 116962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK][FineLOK] S%x, 0x58 = 0x%x\n", 117062306a36Sopenharmony_ci path, tmp); 117162306a36Sopenharmony_ci core_i = FIELD_GET(RR_TXMO_COI, tmp); 117262306a36Sopenharmony_ci core_q = FIELD_GET(RR_TXMO_COQ, tmp); 117362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, i = 0x%x\n", path, core_i); 117462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, q = 0x%x\n", path, core_q); 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci if (core_i < 0x2 || core_i > 0x1d || core_q < 0x2 || core_q > 0x1d) 117762306a36Sopenharmony_ci is_fail = true; 117862306a36Sopenharmony_ci return is_fail; 117962306a36Sopenharmony_ci} 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_cistatic bool _iqk_lok(struct rtw89_dev *rtwdev, 118262306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 118362306a36Sopenharmony_ci{ 118462306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 118562306a36Sopenharmony_ci u32 rf0 = 0x0; 118662306a36Sopenharmony_ci u8 itqt = 0x12; 118762306a36Sopenharmony_ci bool fail = false; 118862306a36Sopenharmony_ci bool tmp = false; 118962306a36Sopenharmony_ci 119062306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 119162306a36Sopenharmony_ci case RTW89_BAND_2G: 119262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 0xe5e0); 119362306a36Sopenharmony_ci itqt = 0x09; 119462306a36Sopenharmony_ci break; 119562306a36Sopenharmony_ci case RTW89_BAND_5G: 119662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_ALL, 0xe4e0); 119762306a36Sopenharmony_ci itqt = 0x12; 119862306a36Sopenharmony_ci break; 119962306a36Sopenharmony_ci default: 120062306a36Sopenharmony_ci break; 120162306a36Sopenharmony_ci } 120262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_IQK_CFG, B_IQK_CFG_SET); 120362306a36Sopenharmony_ci rf0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK); 120462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF1, B_IQK_DIF1_TXPI, 120562306a36Sopenharmony_ci rf0 | iqk_info->syn1to2); 120662306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQK_RES + (path << 8), B_IQK_RES_TXCFIR); 120762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL, 0x1); 120862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_G3, 0x1); 120962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_GP, 0x0); 121062306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_IOQ_IQK_DPK, B_IOQ_IQK_DPK_EN); 121162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP); 121262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt); 121362306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_COARSE); 121462306a36Sopenharmony_ci iqk_info->lok_cor_fail[0][path] = tmp; 121562306a36Sopenharmony_ci fsleep(10); 121662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), MASKDWORD, itqt); 121762306a36Sopenharmony_ci tmp = _iqk_one_shot(rtwdev, phy_idx, path, ID_FLOK_FINE); 121862306a36Sopenharmony_ci iqk_info->lok_fin_fail[0][path] = tmp; 121962306a36Sopenharmony_ci fail = _lok_finetune_check(rtwdev, path); 122062306a36Sopenharmony_ci return fail; 122162306a36Sopenharmony_ci} 122262306a36Sopenharmony_ci 122362306a36Sopenharmony_cistatic void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path) 122462306a36Sopenharmony_ci{ 122562306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG); 122862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); 122962306a36Sopenharmony_ci udelay(1); 123062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); 123162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001); 123262306a36Sopenharmony_ci udelay(1); 123362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041); 123462306a36Sopenharmony_ci udelay(1); 123562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0303); 123662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RST, 0x0000); 123762306a36Sopenharmony_ci switch (iqk_info->iqk_band[path]) { 123862306a36Sopenharmony_ci case RTW89_BAND_2G: 123962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XALNA2, RR_XALNA2_SW, 0x00); 124062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x3f); 124162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT2, 0x0); 124262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG1, RR_TXG1_ATT1, 0x1); 124362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXG2, RR_TXG2_ATT0, 0x1); 124462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EN, 0x0); 124562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 124662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_LOK, 0x0); 124762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_MASK, 0x000); 124862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200); 124962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200); 125062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 125162306a36Sopenharmony_ci 0x403e0 | iqk_info->syn1to2); 125262306a36Sopenharmony_ci udelay(1); 125362306a36Sopenharmony_ci break; 125462306a36Sopenharmony_ci case RTW89_BAND_5G: 125562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_XGLNA2, RR_XGLNA2_SW, 0x00); 125662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x3f); 125762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, 0x7); 125862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXGA, RR_TXGA_LOK_EN, 0x0); 125962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x1); 126062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTDBG, RR_LUTDBG_LOK, 0x0); 126162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_MASK, 0x100); 126262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV2, RFREG_MASK, 0x80200); 126362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DTXLOK, RFREG_MASK, 0x80200); 126462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, 0x1); 126562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, 0x0); 126662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 126762306a36Sopenharmony_ci 0x403e0 | iqk_info->syn1to2); 126862306a36Sopenharmony_ci udelay(1); 126962306a36Sopenharmony_ci break; 127062306a36Sopenharmony_ci default: 127162306a36Sopenharmony_ci break; 127262306a36Sopenharmony_ci } 127362306a36Sopenharmony_ci} 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_cistatic void _iqk_txclk_setting(struct rtw89_dev *rtwdev, u8 path) 127662306a36Sopenharmony_ci{ 127762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08); 127862306a36Sopenharmony_ci} 127962306a36Sopenharmony_ci 128062306a36Sopenharmony_cistatic void _iqk_info_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 128162306a36Sopenharmony_ci u8 path) 128262306a36Sopenharmony_ci{ 128362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 128462306a36Sopenharmony_ci u32 tmp = 0x0; 128562306a36Sopenharmony_ci bool flag = 0x0; 128662306a36Sopenharmony_ci 128762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_thermal = %lu\n", path, 128862306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path])); 128962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_COR_fail= %d\n", path, 129062306a36Sopenharmony_ci iqk_info->lok_cor_fail[0][path]); 129162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_LOK_FIN_fail= %d\n", path, 129262306a36Sopenharmony_ci iqk_info->lok_fin_fail[0][path]); 129362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_TXIQK_fail = %d\n", path, 129462306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path]); 129562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d_RXIQK_fail= %d,\n", path, 129662306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path]); 129762306a36Sopenharmony_ci flag = iqk_info->lok_cor_fail[0][path]; 129862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(0) << (path * 4), flag); 129962306a36Sopenharmony_ci flag = iqk_info->lok_fin_fail[0][path]; 130062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(1) << (path * 4), flag); 130162306a36Sopenharmony_ci flag = iqk_info->iqk_tx_fail[0][path]; 130262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(2) << (path * 4), flag); 130362306a36Sopenharmony_ci flag = iqk_info->iqk_rx_fail[0][path]; 130462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, BIT(3) << (path * 4), flag); 130562306a36Sopenharmony_ci 130662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQK_RES + (path << 8), MASKDWORD); 130762306a36Sopenharmony_ci iqk_info->bp_iqkenable[path] = tmp; 130862306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD); 130962306a36Sopenharmony_ci iqk_info->bp_txkresult[path] = tmp; 131062306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD); 131162306a36Sopenharmony_ci iqk_info->bp_rxkresult[path] = tmp; 131262306a36Sopenharmony_ci 131362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, B_IQKINF2_KCNT, 131462306a36Sopenharmony_ci (u8)iqk_info->iqk_times); 131562306a36Sopenharmony_ci 131662306a36Sopenharmony_ci tmp = rtw89_phy_read32_mask(rtwdev, R_IQKINF, 0x0000000f << (path * 4)); 131762306a36Sopenharmony_ci if (tmp != 0x0) 131862306a36Sopenharmony_ci iqk_info->iqk_fail_cnt++; 131962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, 0x00ff0000 << (path * 4), 132062306a36Sopenharmony_ci iqk_info->iqk_fail_cnt); 132162306a36Sopenharmony_ci} 132262306a36Sopenharmony_ci 132362306a36Sopenharmony_cistatic 132462306a36Sopenharmony_civoid _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, u8 path) 132562306a36Sopenharmony_ci{ 132662306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 132762306a36Sopenharmony_ci bool lok_is_fail = false; 132862306a36Sopenharmony_ci u8 ibias = 0x1; 132962306a36Sopenharmony_ci u8 i = 0; 133062306a36Sopenharmony_ci 133162306a36Sopenharmony_ci _iqk_txclk_setting(rtwdev, path); 133262306a36Sopenharmony_ci 133362306a36Sopenharmony_ci for (i = 0; i < 3; i++) { 133462306a36Sopenharmony_ci _lok_res_table(rtwdev, path, ibias++); 133562306a36Sopenharmony_ci _iqk_txk_setting(rtwdev, path); 133662306a36Sopenharmony_ci lok_is_fail = _iqk_lok(rtwdev, phy_idx, path); 133762306a36Sopenharmony_ci if (!lok_is_fail) 133862306a36Sopenharmony_ci break; 133962306a36Sopenharmony_ci } 134062306a36Sopenharmony_ci if (iqk_info->is_nbiqk) 134162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _iqk_nbtxk(rtwdev, phy_idx, path); 134262306a36Sopenharmony_ci else 134362306a36Sopenharmony_ci iqk_info->iqk_tx_fail[0][path] = _txk_group_sel(rtwdev, phy_idx, path); 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci _iqk_rxclk_setting(rtwdev, path); 134662306a36Sopenharmony_ci _iqk_rxk_setting(rtwdev, path); 134762306a36Sopenharmony_ci if (iqk_info->is_nbiqk || rtwdev->dbcc_en || iqk_info->iqk_band[path] == RTW89_BAND_2G) 134862306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _iqk_nbrxk(rtwdev, phy_idx, path); 134962306a36Sopenharmony_ci else 135062306a36Sopenharmony_ci iqk_info->iqk_rx_fail[0][path] = _rxk_group_sel(rtwdev, phy_idx, path); 135162306a36Sopenharmony_ci 135262306a36Sopenharmony_ci _iqk_info_iqk(rtwdev, phy_idx, path); 135362306a36Sopenharmony_ci} 135462306a36Sopenharmony_ci 135562306a36Sopenharmony_cistatic void _iqk_get_ch_info(struct rtw89_dev *rtwdev, 135662306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 path) 135762306a36Sopenharmony_ci{ 135862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 135962306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 136062306a36Sopenharmony_ci u32 reg_rf18 = 0x0, reg_35c = 0x0; 136162306a36Sopenharmony_ci u8 idx = 0; 136262306a36Sopenharmony_ci u8 get_empty_table = false; 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 136562306a36Sopenharmony_ci for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) { 136662306a36Sopenharmony_ci if (iqk_info->iqk_mcc_ch[idx][path] == 0) { 136762306a36Sopenharmony_ci get_empty_table = true; 136862306a36Sopenharmony_ci break; 136962306a36Sopenharmony_ci } 137062306a36Sopenharmony_ci } 137162306a36Sopenharmony_ci if (!get_empty_table) { 137262306a36Sopenharmony_ci idx = iqk_info->iqk_table_idx[path] + 1; 137362306a36Sopenharmony_ci if (idx > RTW89_IQK_CHS_NR - 1) 137462306a36Sopenharmony_ci idx = 0; 137562306a36Sopenharmony_ci } 137662306a36Sopenharmony_ci reg_rf18 = rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK); 137762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]cfg ch = %d\n", reg_rf18); 137862306a36Sopenharmony_ci reg_35c = rtw89_phy_read32_mask(rtwdev, 0x35c, 0x00000c00); 137962306a36Sopenharmony_ci 138062306a36Sopenharmony_ci iqk_info->iqk_band[path] = chan->band_type; 138162306a36Sopenharmony_ci iqk_info->iqk_bw[path] = chan->band_width; 138262306a36Sopenharmony_ci iqk_info->iqk_ch[path] = chan->channel; 138362306a36Sopenharmony_ci 138462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 138562306a36Sopenharmony_ci "[IQK]iqk_info->iqk_band[%x] = 0x%x\n", path, 138662306a36Sopenharmony_ci iqk_info->iqk_band[path]); 138762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_bw[%x] = 0x%x\n", 138862306a36Sopenharmony_ci path, iqk_info->iqk_bw[path]); 138962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]iqk_info->iqk_ch[%x] = 0x%x\n", 139062306a36Sopenharmony_ci path, iqk_info->iqk_ch[path]); 139162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 139262306a36Sopenharmony_ci "[IQK]S%d (PHY%d): / DBCC %s/ %s/ CH%d/ %s\n", path, phy, 139362306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 139462306a36Sopenharmony_ci iqk_info->iqk_band[path] == 0 ? "2G" : 139562306a36Sopenharmony_ci iqk_info->iqk_band[path] == 1 ? "5G" : "6G", 139662306a36Sopenharmony_ci iqk_info->iqk_ch[path], 139762306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 0 ? "20M" : 139862306a36Sopenharmony_ci iqk_info->iqk_bw[path] == 1 ? "40M" : "80M"); 139962306a36Sopenharmony_ci if (reg_35c == 0x01) 140062306a36Sopenharmony_ci iqk_info->syn1to2 = 0x1; 140162306a36Sopenharmony_ci else 140262306a36Sopenharmony_ci iqk_info->syn1to2 = 0x0; 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF, B_IQKINF_VER, RTW8852A_IQK_VER); 140562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0x000f << (path * 16), 140662306a36Sopenharmony_ci (u8)iqk_info->iqk_band[path]); 140762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0x00f0 << (path * 16), 140862306a36Sopenharmony_ci (u8)iqk_info->iqk_bw[path]); 140962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKCH, 0xff00 << (path * 16), 141062306a36Sopenharmony_ci (u8)iqk_info->iqk_ch[path]); 141162306a36Sopenharmony_ci 141262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQKINF2, 0x000000ff, RTW8852A_NCTL_VER); 141362306a36Sopenharmony_ci} 141462306a36Sopenharmony_ci 141562306a36Sopenharmony_cistatic void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 141662306a36Sopenharmony_ci u8 path) 141762306a36Sopenharmony_ci{ 141862306a36Sopenharmony_ci _iqk_by_path(rtwdev, phy_idx, path); 141962306a36Sopenharmony_ci} 142062306a36Sopenharmony_ci 142162306a36Sopenharmony_cistatic void _iqk_restore(struct rtw89_dev *rtwdev, u8 path) 142262306a36Sopenharmony_ci{ 142362306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 142462306a36Sopenharmony_ci 142562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8), MASKDWORD, 142662306a36Sopenharmony_ci iqk_info->nb_txcfir[path]); 142762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 142862306a36Sopenharmony_ci iqk_info->nb_rxcfir[path]); 142962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_RPT, MASKDWORD); 143062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_RX_DCK, MASKDWORD); 143162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 143262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KPATH_CFG, MASKDWORD); 143362306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_GAPK, B_GAPK_ADR); 143462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0x10010000); 143562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN); 143662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_MAP + (path << 8), MASKDWORD, 0xe4e4e4e4); 143762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_CFIR_LUT + (path << 8), B_CFIR_LUT_SEL); 143862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW); 143962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), MASKDWORD, 0x00000002); 144062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 144162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_POW, 0x0); 144262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_LUTWE, RR_LUTWE_LOK, 0x0); 144362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 144462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXRSV, RR_TXRSV_GAPK, 0x0); 144562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BIAS, RR_BIAS_GAPK, 0x0); 144662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 144762306a36Sopenharmony_ci} 144862306a36Sopenharmony_ci 144962306a36Sopenharmony_cistatic void _iqk_afebb_restore(struct rtw89_dev *rtwdev, 145062306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 145162306a36Sopenharmony_ci{ 145262306a36Sopenharmony_ci const struct rtw89_rfk_tbl *tbl; 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_ci switch (_kpath(rtwdev, phy_idx)) { 145562306a36Sopenharmony_ci case RF_A: 145662306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_restore_defs_dbcc_path0_tbl; 145762306a36Sopenharmony_ci break; 145862306a36Sopenharmony_ci case RF_B: 145962306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_restore_defs_dbcc_path1_tbl; 146062306a36Sopenharmony_ci break; 146162306a36Sopenharmony_ci default: 146262306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_restore_defs_nondbcc_path01_tbl; 146362306a36Sopenharmony_ci break; 146462306a36Sopenharmony_ci } 146562306a36Sopenharmony_ci 146662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, tbl); 146762306a36Sopenharmony_ci} 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_cistatic void _iqk_preset(struct rtw89_dev *rtwdev, u8 path) 147062306a36Sopenharmony_ci{ 147162306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 147262306a36Sopenharmony_ci u8 idx = iqk_info->iqk_table_idx[path]; 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_ci if (rtwdev->dbcc_en) { 147562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 147662306a36Sopenharmony_ci B_COEF_SEL_IQC, path & 0x1); 147762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 147862306a36Sopenharmony_ci B_CFIR_LUT_G2, path & 0x1); 147962306a36Sopenharmony_ci } else { 148062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 148162306a36Sopenharmony_ci B_COEF_SEL_IQC, idx); 148262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT + (path << 8), 148362306a36Sopenharmony_ci B_CFIR_LUT_G2, idx); 148462306a36Sopenharmony_ci } 148562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 148662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 148762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_RW, MASKDWORD); 148862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a); 148962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, MASKDWORD, 0x00200000); 149062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, MASKDWORD, 0x80000000); 149162306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8), MASKDWORD); 149262306a36Sopenharmony_ci} 149362306a36Sopenharmony_ci 149462306a36Sopenharmony_cistatic void _iqk_macbb_setting(struct rtw89_dev *rtwdev, 149562306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 149662306a36Sopenharmony_ci{ 149762306a36Sopenharmony_ci const struct rtw89_rfk_tbl *tbl; 149862306a36Sopenharmony_ci 149962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===> %s\n", __func__); 150062306a36Sopenharmony_ci 150162306a36Sopenharmony_ci switch (_kpath(rtwdev, phy_idx)) { 150262306a36Sopenharmony_ci case RF_A: 150362306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_set_defs_dbcc_path0_tbl; 150462306a36Sopenharmony_ci break; 150562306a36Sopenharmony_ci case RF_B: 150662306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_set_defs_dbcc_path1_tbl; 150762306a36Sopenharmony_ci break; 150862306a36Sopenharmony_ci default: 150962306a36Sopenharmony_ci tbl = &rtw8852a_rfk_iqk_set_defs_nondbcc_path01_tbl; 151062306a36Sopenharmony_ci break; 151162306a36Sopenharmony_ci } 151262306a36Sopenharmony_ci 151362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, tbl); 151462306a36Sopenharmony_ci} 151562306a36Sopenharmony_ci 151662306a36Sopenharmony_cistatic void _iqk_dbcc(struct rtw89_dev *rtwdev, u8 path) 151762306a36Sopenharmony_ci{ 151862306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 151962306a36Sopenharmony_ci u8 phy_idx = 0x0; 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ci iqk_info->iqk_times++; 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci if (path == 0x0) 152462306a36Sopenharmony_ci phy_idx = RTW89_PHY_0; 152562306a36Sopenharmony_ci else 152662306a36Sopenharmony_ci phy_idx = RTW89_PHY_1; 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_ci _iqk_get_ch_info(rtwdev, phy_idx, path); 152962306a36Sopenharmony_ci _iqk_macbb_setting(rtwdev, phy_idx, path); 153062306a36Sopenharmony_ci _iqk_preset(rtwdev, path); 153162306a36Sopenharmony_ci _iqk_start_iqk(rtwdev, phy_idx, path); 153262306a36Sopenharmony_ci _iqk_restore(rtwdev, path); 153362306a36Sopenharmony_ci _iqk_afebb_restore(rtwdev, phy_idx, path); 153462306a36Sopenharmony_ci} 153562306a36Sopenharmony_ci 153662306a36Sopenharmony_cistatic void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) 153762306a36Sopenharmony_ci{ 153862306a36Sopenharmony_ci u32 rf_reg5, rck_val = 0; 153962306a36Sopenharmony_ci u32 val; 154062306a36Sopenharmony_ci int ret; 154162306a36Sopenharmony_ci 154262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path); 154362306a36Sopenharmony_ci 154462306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 154562306a36Sopenharmony_ci 154662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 154762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 154862306a36Sopenharmony_ci 154962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%x\n", 155062306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 155162306a36Sopenharmony_ci 155262306a36Sopenharmony_ci /* RCK trigger */ 155362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240); 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 20, 155662306a36Sopenharmony_ci false, rtwdev, path, 0x1c, BIT(3)); 155762306a36Sopenharmony_ci if (ret) 155862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RCK timeout\n"); 155962306a36Sopenharmony_ci 156062306a36Sopenharmony_ci rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA); 156162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val); 156262306a36Sopenharmony_ci 156362306a36Sopenharmony_ci /* RCK_ADC_OFFSET */ 156462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKO, RR_RCKO_OFF, 0x4); 156562306a36Sopenharmony_ci 156662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RFC, RR_RFC_CKEN, 0x1); 156762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RFC, RR_RFC_CKEN, 0x0); 156862306a36Sopenharmony_ci 156962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 157062306a36Sopenharmony_ci 157162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 157262306a36Sopenharmony_ci "[RCK] RF 0x1b / 0x1c / 0x1d = 0x%x / 0x%x / 0x%x\n", 157362306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK), 157462306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKS, RFREG_MASK), 157562306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_RCKO, RFREG_MASK)); 157662306a36Sopenharmony_ci} 157762306a36Sopenharmony_ci 157862306a36Sopenharmony_cistatic void _iqk_init(struct rtw89_dev *rtwdev) 157962306a36Sopenharmony_ci{ 158062306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 158162306a36Sopenharmony_ci u8 ch, path; 158262306a36Sopenharmony_ci 158362306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_IQKINF, MASKDWORD); 158462306a36Sopenharmony_ci if (iqk_info->is_iqk_init) 158562306a36Sopenharmony_ci return; 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__); 158862306a36Sopenharmony_ci iqk_info->is_iqk_init = true; 158962306a36Sopenharmony_ci iqk_info->is_nbiqk = false; 159062306a36Sopenharmony_ci iqk_info->iqk_fft_en = false; 159162306a36Sopenharmony_ci iqk_info->iqk_sram_en = false; 159262306a36Sopenharmony_ci iqk_info->iqk_cfir_en = false; 159362306a36Sopenharmony_ci iqk_info->iqk_xym_en = false; 159462306a36Sopenharmony_ci iqk_info->iqk_times = 0x0; 159562306a36Sopenharmony_ci 159662306a36Sopenharmony_ci for (ch = 0; ch < RTW89_IQK_CHS_NR; ch++) { 159762306a36Sopenharmony_ci iqk_info->iqk_channel[ch] = 0x0; 159862306a36Sopenharmony_ci for (path = 0; path < RTW8852A_IQK_SS; path++) { 159962306a36Sopenharmony_ci iqk_info->lok_cor_fail[ch][path] = false; 160062306a36Sopenharmony_ci iqk_info->lok_fin_fail[ch][path] = false; 160162306a36Sopenharmony_ci iqk_info->iqk_tx_fail[ch][path] = false; 160262306a36Sopenharmony_ci iqk_info->iqk_rx_fail[ch][path] = false; 160362306a36Sopenharmony_ci iqk_info->iqk_mcc_ch[ch][path] = 0x0; 160462306a36Sopenharmony_ci iqk_info->iqk_table_idx[path] = 0x0; 160562306a36Sopenharmony_ci } 160662306a36Sopenharmony_ci } 160762306a36Sopenharmony_ci} 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_cistatic void _doiqk(struct rtw89_dev *rtwdev, bool force, 161062306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, u8 path) 161162306a36Sopenharmony_ci{ 161262306a36Sopenharmony_ci struct rtw89_iqk_info *iqk_info = &rtwdev->iqk; 161362306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 161462306a36Sopenharmony_ci u32 backup_rf_val[RTW8852A_IQK_SS][BACKUP_RF_REGS_NR]; 161562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB); 161662306a36Sopenharmony_ci 161762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 161862306a36Sopenharmony_ci 161962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 162062306a36Sopenharmony_ci "[IQK]==========IQK start!!!!!==========\n"); 162162306a36Sopenharmony_ci iqk_info->iqk_times++; 162262306a36Sopenharmony_ci iqk_info->version = RTW8852A_IQK_VER; 162362306a36Sopenharmony_ci 162462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version); 162562306a36Sopenharmony_ci _iqk_get_ch_info(rtwdev, phy_idx, path); 162662306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); 162762306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); 162862306a36Sopenharmony_ci _iqk_macbb_setting(rtwdev, phy_idx, path); 162962306a36Sopenharmony_ci _iqk_preset(rtwdev, path); 163062306a36Sopenharmony_ci _iqk_start_iqk(rtwdev, phy_idx, path); 163162306a36Sopenharmony_ci _iqk_restore(rtwdev, path); 163262306a36Sopenharmony_ci _iqk_afebb_restore(rtwdev, phy_idx, path); 163362306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); 163462306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); 163562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP); 163662306a36Sopenharmony_ci} 163762306a36Sopenharmony_ci 163862306a36Sopenharmony_cistatic void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, bool force) 163962306a36Sopenharmony_ci{ 164062306a36Sopenharmony_ci switch (_kpath(rtwdev, phy_idx)) { 164162306a36Sopenharmony_ci case RF_A: 164262306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 164362306a36Sopenharmony_ci break; 164462306a36Sopenharmony_ci case RF_B: 164562306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 164662306a36Sopenharmony_ci break; 164762306a36Sopenharmony_ci case RF_AB: 164862306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_A); 164962306a36Sopenharmony_ci _doiqk(rtwdev, force, phy_idx, RF_PATH_B); 165062306a36Sopenharmony_ci break; 165162306a36Sopenharmony_ci default: 165262306a36Sopenharmony_ci break; 165362306a36Sopenharmony_ci } 165462306a36Sopenharmony_ci} 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci#define RXDCK_VER_8852A 0xe 165762306a36Sopenharmony_ci 165862306a36Sopenharmony_cistatic void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 165962306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_afe) 166062306a36Sopenharmony_ci{ 166162306a36Sopenharmony_ci u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path); 166262306a36Sopenharmony_ci u32 ori_val; 166362306a36Sopenharmony_ci 166462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 166562306a36Sopenharmony_ci "[RX_DCK] ==== S%d RX DCK (by %s)====\n", 166662306a36Sopenharmony_ci path, is_afe ? "AFE" : "RFC"); 166762306a36Sopenharmony_ci 166862306a36Sopenharmony_ci ori_val = rtw89_phy_read32_mask(rtwdev, R_P0_RXCK + (path << 13), MASKDWORD); 166962306a36Sopenharmony_ci 167062306a36Sopenharmony_ci if (is_afe) { 167162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG); 167262306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_P0_RXCK + (path << 13), B_P0_RXCK_ON); 167362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), 167462306a36Sopenharmony_ci B_P0_RXCK_VAL, 0x3); 167562306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_S0_RXDC2 + (path << 13), B_S0_RXDC2_MEN); 167662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_S0_RXDC2 + (path << 13), 167762306a36Sopenharmony_ci B_S0_RXDC2_AVG, 0x3); 167862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15_H, 0x3); 167962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_ANAPAR, B_ANAPAR_ADCCLK); 168062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST); 168162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_ANAPAR, B_ANAPAR_FLTRST); 168262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_CRXBB, 0x1); 168362306a36Sopenharmony_ci } 168462306a36Sopenharmony_ci 168562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK2, RR_DCK2_CYCLE, 0x3f); 168662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK1, RR_DCK1_SEL, is_afe); 168762306a36Sopenharmony_ci 168862306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_ONESHOT_START); 168962306a36Sopenharmony_ci 169062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 169162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1); 169262306a36Sopenharmony_ci 169362306a36Sopenharmony_ci fsleep(600); 169462306a36Sopenharmony_ci 169562306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_ONESHOT_STOP); 169662306a36Sopenharmony_ci 169762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0); 169862306a36Sopenharmony_ci 169962306a36Sopenharmony_ci if (is_afe) { 170062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG); 170162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), 170262306a36Sopenharmony_ci MASKDWORD, ori_val); 170362306a36Sopenharmony_ci } 170462306a36Sopenharmony_ci} 170562306a36Sopenharmony_ci 170662306a36Sopenharmony_cistatic void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 170762306a36Sopenharmony_ci bool is_afe) 170862306a36Sopenharmony_ci{ 170962306a36Sopenharmony_ci u8 path, kpath, dck_tune; 171062306a36Sopenharmony_ci u32 rf_reg5; 171162306a36Sopenharmony_ci u32 addr; 171262306a36Sopenharmony_ci 171362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 171462306a36Sopenharmony_ci "[RX_DCK] ****** RXDCK Start (Ver: 0x%x, Cv: %d) ******\n", 171562306a36Sopenharmony_ci RXDCK_VER_8852A, rtwdev->hal.cv); 171662306a36Sopenharmony_ci 171762306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 171862306a36Sopenharmony_ci 171962306a36Sopenharmony_ci for (path = 0; path < 2; path++) { 172062306a36Sopenharmony_ci if (!(kpath & BIT(path))) 172162306a36Sopenharmony_ci continue; 172262306a36Sopenharmony_ci 172362306a36Sopenharmony_ci rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK); 172462306a36Sopenharmony_ci dck_tune = (u8)rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_FINE); 172562306a36Sopenharmony_ci 172662306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) { 172762306a36Sopenharmony_ci addr = 0x5818 + (path << 13); 172862306a36Sopenharmony_ci /* TSSI pause */ 172962306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, addr, BIT(30)); 173062306a36Sopenharmony_ci } 173162306a36Sopenharmony_ci 173262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 173362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); 173462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 173562306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path, is_afe); 173662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, dck_tune); 173762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 173862306a36Sopenharmony_ci 173962306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) { 174062306a36Sopenharmony_ci addr = 0x5818 + (path << 13); 174162306a36Sopenharmony_ci /* TSSI resume */ 174262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, addr, BIT(30)); 174362306a36Sopenharmony_ci } 174462306a36Sopenharmony_ci } 174562306a36Sopenharmony_ci} 174662306a36Sopenharmony_ci 174762306a36Sopenharmony_ci#define RTW8852A_RF_REL_VERSION 34 174862306a36Sopenharmony_ci#define RTW8852A_DPK_VER 0x10 174962306a36Sopenharmony_ci#define RTW8852A_DPK_TH_AVG_NUM 4 175062306a36Sopenharmony_ci#define RTW8852A_DPK_RF_PATH 2 175162306a36Sopenharmony_ci#define RTW8852A_DPK_KIP_REG_NUM 2 175262306a36Sopenharmony_ci 175362306a36Sopenharmony_cienum rtw8852a_dpk_id { 175462306a36Sopenharmony_ci LBK_RXIQK = 0x06, 175562306a36Sopenharmony_ci SYNC = 0x10, 175662306a36Sopenharmony_ci MDPK_IDL = 0x11, 175762306a36Sopenharmony_ci MDPK_MPA = 0x12, 175862306a36Sopenharmony_ci GAIN_LOSS = 0x13, 175962306a36Sopenharmony_ci GAIN_CAL = 0x14, 176062306a36Sopenharmony_ci}; 176162306a36Sopenharmony_ci 176262306a36Sopenharmony_cistatic void _rf_direct_cntrl(struct rtw89_dev *rtwdev, 176362306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bybb) 176462306a36Sopenharmony_ci{ 176562306a36Sopenharmony_ci if (is_bybb) 176662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1); 176762306a36Sopenharmony_ci else 176862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 176962306a36Sopenharmony_ci} 177062306a36Sopenharmony_ci 177162306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, 177262306a36Sopenharmony_ci enum rtw89_rf_path path, bool off); 177362306a36Sopenharmony_ci 177462306a36Sopenharmony_cistatic void _dpk_bkup_kip(struct rtw89_dev *rtwdev, u32 *reg, 177562306a36Sopenharmony_ci u32 reg_bkup[][RTW8852A_DPK_KIP_REG_NUM], 177662306a36Sopenharmony_ci u8 path) 177762306a36Sopenharmony_ci{ 177862306a36Sopenharmony_ci u8 i; 177962306a36Sopenharmony_ci 178062306a36Sopenharmony_ci for (i = 0; i < RTW8852A_DPK_KIP_REG_NUM; i++) { 178162306a36Sopenharmony_ci reg_bkup[path][i] = rtw89_phy_read32_mask(rtwdev, 178262306a36Sopenharmony_ci reg[i] + (path << 8), 178362306a36Sopenharmony_ci MASKDWORD); 178462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n", 178562306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 178662306a36Sopenharmony_ci } 178762306a36Sopenharmony_ci} 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_cistatic void _dpk_reload_kip(struct rtw89_dev *rtwdev, u32 *reg, 179062306a36Sopenharmony_ci u32 reg_bkup[][RTW8852A_DPK_KIP_REG_NUM], u8 path) 179162306a36Sopenharmony_ci{ 179262306a36Sopenharmony_ci u8 i; 179362306a36Sopenharmony_ci 179462306a36Sopenharmony_ci for (i = 0; i < RTW8852A_DPK_KIP_REG_NUM; i++) { 179562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), 179662306a36Sopenharmony_ci MASKDWORD, reg_bkup[path][i]); 179762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Reload 0x%x = %x\n", 179862306a36Sopenharmony_ci reg[i] + (path << 8), reg_bkup[path][i]); 179962306a36Sopenharmony_ci } 180062306a36Sopenharmony_ci} 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_cistatic u8 _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 180362306a36Sopenharmony_ci enum rtw89_rf_path path, enum rtw8852a_dpk_id id) 180462306a36Sopenharmony_ci{ 180562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_path_phymap(rtwdev, phy, path); 180662306a36Sopenharmony_ci u16 dpk_cmd = 0x0; 180762306a36Sopenharmony_ci u32 val; 180862306a36Sopenharmony_ci int ret; 180962306a36Sopenharmony_ci 181062306a36Sopenharmony_ci dpk_cmd = (u16)((id << 8) | (0x19 + (path << 4))); 181162306a36Sopenharmony_ci 181262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_ONESHOT_START); 181362306a36Sopenharmony_ci 181462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd); 181562306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_DPK_CTL, B_DPK_CTL_EN); 181662306a36Sopenharmony_ci 181762306a36Sopenharmony_ci ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55, 181862306a36Sopenharmony_ci 10, 20000, false, rtwdev, 0xbff8, MASKBYTE0); 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_N1, MASKBYTE0); 182162306a36Sopenharmony_ci 182262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_ONESHOT_STOP); 182362306a36Sopenharmony_ci 182462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 182562306a36Sopenharmony_ci "[DPK] one-shot for %s = 0x%x (ret=%d)\n", 182662306a36Sopenharmony_ci id == 0x06 ? "LBK_RXIQK" : 182762306a36Sopenharmony_ci id == 0x10 ? "SYNC" : 182862306a36Sopenharmony_ci id == 0x11 ? "MDPK_IDL" : 182962306a36Sopenharmony_ci id == 0x12 ? "MDPK_MPA" : 183062306a36Sopenharmony_ci id == 0x13 ? "GAIN_LOSS" : "PWR_CAL", 183162306a36Sopenharmony_ci dpk_cmd, ret); 183262306a36Sopenharmony_ci 183362306a36Sopenharmony_ci if (ret) { 183462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 183562306a36Sopenharmony_ci "[DPK] one-shot over 20ms!!!!\n"); 183662306a36Sopenharmony_ci return 1; 183762306a36Sopenharmony_ci } 183862306a36Sopenharmony_ci 183962306a36Sopenharmony_ci return 0; 184062306a36Sopenharmony_ci} 184162306a36Sopenharmony_ci 184262306a36Sopenharmony_cistatic void _dpk_rx_dck(struct rtw89_dev *rtwdev, 184362306a36Sopenharmony_ci enum rtw89_phy_idx phy, 184462306a36Sopenharmony_ci enum rtw89_rf_path path) 184562306a36Sopenharmony_ci{ 184662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_EN_TIA_IDA, 0x3); 184762306a36Sopenharmony_ci _set_rx_dck(rtwdev, phy, path, false); 184862306a36Sopenharmony_ci} 184962306a36Sopenharmony_ci 185062306a36Sopenharmony_cistatic void _dpk_information(struct rtw89_dev *rtwdev, 185162306a36Sopenharmony_ci enum rtw89_phy_idx phy, 185262306a36Sopenharmony_ci enum rtw89_rf_path path) 185362306a36Sopenharmony_ci{ 185462306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 185562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 185662306a36Sopenharmony_ci u8 kidx = dpk->cur_idx[path]; 185762306a36Sopenharmony_ci 185862306a36Sopenharmony_ci dpk->bp[path][kidx].band = chan->band_type; 185962306a36Sopenharmony_ci dpk->bp[path][kidx].ch = chan->channel; 186062306a36Sopenharmony_ci dpk->bp[path][kidx].bw = chan->band_width; 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 186362306a36Sopenharmony_ci "[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n", 186462306a36Sopenharmony_ci path, dpk->cur_idx[path], phy, 186562306a36Sopenharmony_ci rtwdev->is_tssi_mode[path] ? "on" : "off", 186662306a36Sopenharmony_ci rtwdev->dbcc_en ? "on" : "off", 186762306a36Sopenharmony_ci dpk->bp[path][kidx].band == 0 ? "2G" : 186862306a36Sopenharmony_ci dpk->bp[path][kidx].band == 1 ? "5G" : "6G", 186962306a36Sopenharmony_ci dpk->bp[path][kidx].ch, 187062306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 0 ? "20M" : 187162306a36Sopenharmony_ci dpk->bp[path][kidx].bw == 1 ? "40M" : "80M"); 187262306a36Sopenharmony_ci} 187362306a36Sopenharmony_ci 187462306a36Sopenharmony_cistatic void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, 187562306a36Sopenharmony_ci enum rtw89_phy_idx phy, 187662306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kpath) 187762306a36Sopenharmony_ci{ 187862306a36Sopenharmony_ci switch (kpath) { 187962306a36Sopenharmony_ci case RF_A: 188062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sf_defs_a_tbl); 188162306a36Sopenharmony_ci 188262306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_2P4G_BAND, B_2P4G_BAND_SEL) == 0x0) 188362306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS); 188462306a36Sopenharmony_ci 188562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sr_defs_a_tbl); 188662306a36Sopenharmony_ci break; 188762306a36Sopenharmony_ci case RF_B: 188862306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sf_defs_b_tbl); 188962306a36Sopenharmony_ci 189062306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_2P4G_BAND, B_2P4G_BAND_SEL) == 0x1) 189162306a36Sopenharmony_ci rtw89_phy_write32_set(rtwdev, R_RXCCA, B_RXCCA_DIS); 189262306a36Sopenharmony_ci 189362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_sr_defs_b_tbl); 189462306a36Sopenharmony_ci break; 189562306a36Sopenharmony_ci case RF_AB: 189662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_s_defs_ab_tbl); 189762306a36Sopenharmony_ci break; 189862306a36Sopenharmony_ci default: 189962306a36Sopenharmony_ci break; 190062306a36Sopenharmony_ci } 190162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 190262306a36Sopenharmony_ci "[DPK] Set BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); 190362306a36Sopenharmony_ci} 190462306a36Sopenharmony_ci 190562306a36Sopenharmony_cistatic void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, 190662306a36Sopenharmony_ci enum rtw89_phy_idx phy, 190762306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kpath) 190862306a36Sopenharmony_ci{ 190962306a36Sopenharmony_ci switch (kpath) { 191062306a36Sopenharmony_ci case RF_A: 191162306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_a_tbl); 191262306a36Sopenharmony_ci break; 191362306a36Sopenharmony_ci case RF_B: 191462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_b_tbl); 191562306a36Sopenharmony_ci break; 191662306a36Sopenharmony_ci case RF_AB: 191762306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_bb_afe_r_defs_ab_tbl); 191862306a36Sopenharmony_ci break; 191962306a36Sopenharmony_ci default: 192062306a36Sopenharmony_ci break; 192162306a36Sopenharmony_ci } 192262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 192362306a36Sopenharmony_ci "[DPK] Restore BB/AFE for PHY%d (kpath=%d)\n", phy, kpath); 192462306a36Sopenharmony_ci} 192562306a36Sopenharmony_ci 192662306a36Sopenharmony_cistatic void _dpk_tssi_pause(struct rtw89_dev *rtwdev, 192762306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_pause) 192862306a36Sopenharmony_ci{ 192962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13), 193062306a36Sopenharmony_ci B_P0_TSSI_TRK_EN, is_pause); 193162306a36Sopenharmony_ci 193262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path, 193362306a36Sopenharmony_ci is_pause ? "pause" : "resume"); 193462306a36Sopenharmony_ci} 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_cistatic void _dpk_kip_setting(struct rtw89_dev *rtwdev, 193762306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 193862306a36Sopenharmony_ci{ 193962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080); 194062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_CLK, MASKDWORD, 0x00093f3f); 194162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a); 194262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0xce000a08); 194362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG, B_DPK_CFG_IDX, 0x2); 194462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, B_NCTL_CFG_SPAGE, path); /*subpage_id*/ 194562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8) + (kidx << 2), 194662306a36Sopenharmony_ci MASKDWORD, 0x003f2e2e); 194762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 194862306a36Sopenharmony_ci MASKDWORD, 0x005b5b5b); 194962306a36Sopenharmony_ci 195062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] KIP setting for S%d[%d]!!\n", 195162306a36Sopenharmony_ci path, kidx); 195262306a36Sopenharmony_ci} 195362306a36Sopenharmony_ci 195462306a36Sopenharmony_cistatic void _dpk_kip_restore(struct rtw89_dev *rtwdev, 195562306a36Sopenharmony_ci enum rtw89_rf_path path) 195662306a36Sopenharmony_ci{ 195762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_NCTL_RPT, MASKDWORD); 195862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000); 195962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_CFIR_SYS + (path << 8), MASKDWORD, 0x10010000); 196062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_CLK, MASKDWORD); 196162306a36Sopenharmony_ci 196262306a36Sopenharmony_ci if (rtwdev->hal.cv > CHIP_CBV) 196362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_COM + (path << 8), BIT(15), 0x1); 196462306a36Sopenharmony_ci 196562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path); 196662306a36Sopenharmony_ci} 196762306a36Sopenharmony_ci 196862306a36Sopenharmony_cistatic void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, 196962306a36Sopenharmony_ci enum rtw89_phy_idx phy, 197062306a36Sopenharmony_ci enum rtw89_rf_path path) 197162306a36Sopenharmony_ci{ 197262306a36Sopenharmony_ci u8 cur_rxbb; 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_ci cur_rxbb = (u8)rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB); 197562306a36Sopenharmony_ci 197662306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_lbk_rxiqk_defs_f_tbl); 197762306a36Sopenharmony_ci 197862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc); 197962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x1); 198062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXPOW, RR_RXPOW_IQK, 0x2); 198162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RSV4, RFREG_MASK, 198262306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_CFGCH, RFREG_MASK)); 198362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13); 198462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); 198562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1); 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci fsleep(70); 198862306a36Sopenharmony_ci 198962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTL, 0x1f); 199062306a36Sopenharmony_ci 199162306a36Sopenharmony_ci if (cur_rxbb <= 0xa) 199262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x3); 199362306a36Sopenharmony_ci else if (cur_rxbb <= 0x10 && cur_rxbb >= 0xb) 199462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x1); 199562306a36Sopenharmony_ci else 199662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXIQGEN, RR_RXIQGEN_ATTH, 0x0); 199762306a36Sopenharmony_ci 199862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11); 199962306a36Sopenharmony_ci 200062306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, LBK_RXIQK); 200162306a36Sopenharmony_ci 200262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path, 200362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD)); 200462306a36Sopenharmony_ci 200562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXK, RR_RXK_PLLEN, 0x0); 200662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXPOW, RR_RXPOW_IQK, 0x0); 200762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0); /*POW IQKPLL*/ 200862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_DPK); 200962306a36Sopenharmony_ci 201062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_lbk_rxiqk_defs_r_tbl); 201162306a36Sopenharmony_ci} 201262306a36Sopenharmony_ci 201362306a36Sopenharmony_cistatic void _dpk_get_thermal(struct rtw89_dev *rtwdev, u8 kidx, 201462306a36Sopenharmony_ci enum rtw89_rf_path path) 201562306a36Sopenharmony_ci{ 201662306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk = 201962306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 202062306a36Sopenharmony_ci 202162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] thermal@DPK = 0x%x\n", 202262306a36Sopenharmony_ci dpk->bp[path][kidx].ther_dpk); 202362306a36Sopenharmony_ci} 202462306a36Sopenharmony_ci 202562306a36Sopenharmony_cistatic u8 _dpk_set_tx_pwr(struct rtw89_dev *rtwdev, u8 gain, 202662306a36Sopenharmony_ci enum rtw89_rf_path path) 202762306a36Sopenharmony_ci{ 202862306a36Sopenharmony_ci u8 txagc_ori = 0x38; 202962306a36Sopenharmony_ci 203062306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MODOPT, RFREG_MASK, txagc_ori); 203162306a36Sopenharmony_ci 203262306a36Sopenharmony_ci return txagc_ori; 203362306a36Sopenharmony_ci} 203462306a36Sopenharmony_ci 203562306a36Sopenharmony_cistatic void _dpk_rf_setting(struct rtw89_dev *rtwdev, u8 gain, 203662306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 203762306a36Sopenharmony_ci{ 203862306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 203962306a36Sopenharmony_ci 204062306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) { 204162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DPK, 0x280b); 204262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTC, 0x0); 204362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTR, 0x4); 204462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MIXER, RR_MIXER_GN, 0x0); 204562306a36Sopenharmony_ci } else { 204662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DPK, 0x282e); 204762306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BIASA2, RR_BIASA2_LB, 0x7); 204862306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXATANK, RR_TXATANK_LBSW, 0x3); 204962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RXA, RR_RXA_DPK, 0x3); 205062306a36Sopenharmony_ci } 205162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1); 205262306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1); 205362306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0); 205462306a36Sopenharmony_ci 205562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 205662306a36Sopenharmony_ci "[DPK] RF 0x0/0x1/0x1a = 0x%x/ 0x%x/ 0x%x\n", 205762306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK), 205862306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_MODOPT, RFREG_MASK), 205962306a36Sopenharmony_ci rtw89_read_rf(rtwdev, path, RR_BTC, RFREG_MASK)); 206062306a36Sopenharmony_ci} 206162306a36Sopenharmony_ci 206262306a36Sopenharmony_cistatic void _dpk_manual_txcfir(struct rtw89_dev *rtwdev, 206362306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_manual) 206462306a36Sopenharmony_ci{ 206562306a36Sopenharmony_ci u8 tmp_pad, tmp_txbb; 206662306a36Sopenharmony_ci 206762306a36Sopenharmony_ci if (is_manual) { 206862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN, 0x1); 206962306a36Sopenharmony_ci tmp_pad = (u8)rtw89_read_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_PAD); 207062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN + (path << 8), 207162306a36Sopenharmony_ci B_RFGAIN_PAD, tmp_pad); 207262306a36Sopenharmony_ci 207362306a36Sopenharmony_ci tmp_txbb = (u8)rtw89_read_rf(rtwdev, path, RR_GAINTX, RR_GAINTX_BB); 207462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RFGAIN + (path << 8), 207562306a36Sopenharmony_ci B_RFGAIN_TXBB, tmp_txbb); 207662306a36Sopenharmony_ci 207762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), 207862306a36Sopenharmony_ci B_LOAD_COEF_CFIR, 0x1); 207962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8), 208062306a36Sopenharmony_ci B_LOAD_COEF_CFIR); 208162306a36Sopenharmony_ci 208262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), BIT(1), 0x1); 208362306a36Sopenharmony_ci 208462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 208562306a36Sopenharmony_ci "[DPK] PAD_man / TXBB_man = 0x%x / 0x%x\n", tmp_pad, 208662306a36Sopenharmony_ci tmp_txbb); 208762306a36Sopenharmony_ci } else { 208862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP + (path << 8), B_KIP_RFGAIN); 208962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 209062306a36Sopenharmony_ci "[DPK] disable manual switch TXCFIR\n"); 209162306a36Sopenharmony_ci } 209262306a36Sopenharmony_ci} 209362306a36Sopenharmony_ci 209462306a36Sopenharmony_cistatic void _dpk_bypass_rxcfir(struct rtw89_dev *rtwdev, 209562306a36Sopenharmony_ci enum rtw89_rf_path path, bool is_bypass) 209662306a36Sopenharmony_ci{ 209762306a36Sopenharmony_ci if (is_bypass) { 209862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 209962306a36Sopenharmony_ci B_RXIQC_BYPASS2, 0x1); 210062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), 210162306a36Sopenharmony_ci B_RXIQC_BYPASS, 0x1); 210262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 210362306a36Sopenharmony_ci "[DPK] Bypass RXIQC (0x8%d3c = 0x%x)\n", 1 + path, 210462306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 210562306a36Sopenharmony_ci MASKDWORD)); 210662306a36Sopenharmony_ci } else { 210762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS2); 210862306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_RXIQC + (path << 8), B_RXIQC_BYPASS); 210962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 211062306a36Sopenharmony_ci "[DPK] restore 0x8%d3c = 0x%x\n", 1 + path, 211162306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), 211262306a36Sopenharmony_ci MASKDWORD)); 211362306a36Sopenharmony_ci } 211462306a36Sopenharmony_ci} 211562306a36Sopenharmony_ci 211662306a36Sopenharmony_cistatic 211762306a36Sopenharmony_civoid _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx) 211862306a36Sopenharmony_ci{ 211962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 212062306a36Sopenharmony_ci 212162306a36Sopenharmony_ci if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) 212262306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_TPG_MOD, B_TPG_MOD_F); 212362306a36Sopenharmony_ci else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) 212462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2); 212562306a36Sopenharmony_ci else 212662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1); 212762306a36Sopenharmony_ci 212862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG_Select for %s\n", 212962306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" : 213062306a36Sopenharmony_ci dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M"); 213162306a36Sopenharmony_ci} 213262306a36Sopenharmony_ci 213362306a36Sopenharmony_cistatic void _dpk_table_select(struct rtw89_dev *rtwdev, 213462306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain) 213562306a36Sopenharmony_ci{ 213662306a36Sopenharmony_ci u8 val; 213762306a36Sopenharmony_ci 213862306a36Sopenharmony_ci val = 0x80 + kidx * 0x20 + gain * 0x10; 213962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0 + (path << 8), MASKBYTE3, val); 214062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 214162306a36Sopenharmony_ci "[DPK] table select for Kidx[%d], Gain[%d] (0x%x)\n", kidx, 214262306a36Sopenharmony_ci gain, val); 214362306a36Sopenharmony_ci} 214462306a36Sopenharmony_ci 214562306a36Sopenharmony_cistatic bool _dpk_sync_check(struct rtw89_dev *rtwdev, 214662306a36Sopenharmony_ci enum rtw89_rf_path path) 214762306a36Sopenharmony_ci{ 214862306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_I 200 214962306a36Sopenharmony_ci#define DPK_SYNC_TH_DC_Q 200 215062306a36Sopenharmony_ci#define DPK_SYNC_TH_CORR 170 215162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 215262306a36Sopenharmony_ci u16 dc_i, dc_q; 215362306a36Sopenharmony_ci u8 corr_val, corr_idx; 215462306a36Sopenharmony_ci 215562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL); 215662306a36Sopenharmony_ci 215762306a36Sopenharmony_ci corr_idx = (u8)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI); 215862306a36Sopenharmony_ci corr_val = (u8)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV); 215962306a36Sopenharmony_ci 216062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 216162306a36Sopenharmony_ci "[DPK] S%d Corr_idx / Corr_val = %d / %d\n", path, corr_idx, 216262306a36Sopenharmony_ci corr_val); 216362306a36Sopenharmony_ci 216462306a36Sopenharmony_ci dpk->corr_idx[path][0] = corr_idx; 216562306a36Sopenharmony_ci dpk->corr_val[path][0] = corr_val; 216662306a36Sopenharmony_ci 216762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9); 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci dc_i = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 217062306a36Sopenharmony_ci dc_q = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ); 217162306a36Sopenharmony_ci 217262306a36Sopenharmony_ci dc_i = abs(sign_extend32(dc_i, 11)); 217362306a36Sopenharmony_ci dc_q = abs(sign_extend32(dc_q, 11)); 217462306a36Sopenharmony_ci 217562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d DC I/Q, = %d / %d\n", 217662306a36Sopenharmony_ci path, dc_i, dc_q); 217762306a36Sopenharmony_ci 217862306a36Sopenharmony_ci dpk->dc_i[path][0] = dc_i; 217962306a36Sopenharmony_ci dpk->dc_q[path][0] = dc_q; 218062306a36Sopenharmony_ci 218162306a36Sopenharmony_ci if (dc_i > DPK_SYNC_TH_DC_I || dc_q > DPK_SYNC_TH_DC_Q || 218262306a36Sopenharmony_ci corr_val < DPK_SYNC_TH_CORR) 218362306a36Sopenharmony_ci return true; 218462306a36Sopenharmony_ci else 218562306a36Sopenharmony_ci return false; 218662306a36Sopenharmony_ci} 218762306a36Sopenharmony_ci 218862306a36Sopenharmony_cistatic bool _dpk_sync(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 218962306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx) 219062306a36Sopenharmony_ci{ 219162306a36Sopenharmony_ci _dpk_tpg_sel(rtwdev, path, kidx); 219262306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, SYNC); 219362306a36Sopenharmony_ci return _dpk_sync_check(rtwdev, path); /*1= fail*/ 219462306a36Sopenharmony_ci} 219562306a36Sopenharmony_ci 219662306a36Sopenharmony_cistatic u16 _dpk_dgain_read(struct rtw89_dev *rtwdev) 219762306a36Sopenharmony_ci{ 219862306a36Sopenharmony_ci u16 dgain = 0x0; 219962306a36Sopenharmony_ci 220062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL); 220162306a36Sopenharmony_ci 220262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_SYNERR); 220362306a36Sopenharmony_ci 220462306a36Sopenharmony_ci dgain = (u16)rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI); 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x (%d)\n", dgain, 220762306a36Sopenharmony_ci dgain); 220862306a36Sopenharmony_ci 220962306a36Sopenharmony_ci return dgain; 221062306a36Sopenharmony_ci} 221162306a36Sopenharmony_ci 221262306a36Sopenharmony_cistatic s8 _dpk_dgain_mapping(struct rtw89_dev *rtwdev, u16 dgain) 221362306a36Sopenharmony_ci{ 221462306a36Sopenharmony_ci s8 offset; 221562306a36Sopenharmony_ci 221662306a36Sopenharmony_ci if (dgain >= 0x783) 221762306a36Sopenharmony_ci offset = 0x6; 221862306a36Sopenharmony_ci else if (dgain <= 0x782 && dgain >= 0x551) 221962306a36Sopenharmony_ci offset = 0x3; 222062306a36Sopenharmony_ci else if (dgain <= 0x550 && dgain >= 0x3c4) 222162306a36Sopenharmony_ci offset = 0x0; 222262306a36Sopenharmony_ci else if (dgain <= 0x3c3 && dgain >= 0x2aa) 222362306a36Sopenharmony_ci offset = -3; 222462306a36Sopenharmony_ci else if (dgain <= 0x2a9 && dgain >= 0x1e3) 222562306a36Sopenharmony_ci offset = -6; 222662306a36Sopenharmony_ci else if (dgain <= 0x1e2 && dgain >= 0x156) 222762306a36Sopenharmony_ci offset = -9; 222862306a36Sopenharmony_ci else if (dgain <= 0x155) 222962306a36Sopenharmony_ci offset = -12; 223062306a36Sopenharmony_ci else 223162306a36Sopenharmony_ci offset = 0x0; 223262306a36Sopenharmony_ci 223362306a36Sopenharmony_ci return offset; 223462306a36Sopenharmony_ci} 223562306a36Sopenharmony_ci 223662306a36Sopenharmony_cistatic u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev) 223762306a36Sopenharmony_ci{ 223862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6); 223962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1); 224062306a36Sopenharmony_ci return rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL); 224162306a36Sopenharmony_ci} 224262306a36Sopenharmony_ci 224362306a36Sopenharmony_cistatic void _dpk_gainloss(struct rtw89_dev *rtwdev, 224462306a36Sopenharmony_ci enum rtw89_phy_idx phy, enum rtw89_rf_path path, 224562306a36Sopenharmony_ci u8 kidx) 224662306a36Sopenharmony_ci{ 224762306a36Sopenharmony_ci _dpk_table_select(rtwdev, path, kidx, 1); 224862306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, GAIN_LOSS); 224962306a36Sopenharmony_ci} 225062306a36Sopenharmony_ci 225162306a36Sopenharmony_ci#define DPK_TXAGC_LOWER 0x2e 225262306a36Sopenharmony_ci#define DPK_TXAGC_UPPER 0x3f 225362306a36Sopenharmony_ci#define DPK_TXAGC_INVAL 0xff 225462306a36Sopenharmony_ci 225562306a36Sopenharmony_cistatic u8 _dpk_set_offset(struct rtw89_dev *rtwdev, 225662306a36Sopenharmony_ci enum rtw89_rf_path path, s8 gain_offset) 225762306a36Sopenharmony_ci{ 225862306a36Sopenharmony_ci u8 txagc; 225962306a36Sopenharmony_ci 226062306a36Sopenharmony_ci txagc = (u8)rtw89_read_rf(rtwdev, path, RR_MODOPT, RFREG_MASK); 226162306a36Sopenharmony_ci 226262306a36Sopenharmony_ci if (txagc - gain_offset < DPK_TXAGC_LOWER) 226362306a36Sopenharmony_ci txagc = DPK_TXAGC_LOWER; 226462306a36Sopenharmony_ci else if (txagc - gain_offset > DPK_TXAGC_UPPER) 226562306a36Sopenharmony_ci txagc = DPK_TXAGC_UPPER; 226662306a36Sopenharmony_ci else 226762306a36Sopenharmony_ci txagc = txagc - gain_offset; 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MODOPT, RFREG_MASK, txagc); 227062306a36Sopenharmony_ci 227162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp_txagc (GL=%d) = 0x%x\n", 227262306a36Sopenharmony_ci gain_offset, txagc); 227362306a36Sopenharmony_ci return txagc; 227462306a36Sopenharmony_ci} 227562306a36Sopenharmony_ci 227662306a36Sopenharmony_cienum dpk_agc_step { 227762306a36Sopenharmony_ci DPK_AGC_STEP_SYNC_DGAIN, 227862306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_ADJ, 227962306a36Sopenharmony_ci DPK_AGC_STEP_GAIN_LOSS_IDX, 228062306a36Sopenharmony_ci DPK_AGC_STEP_GL_GT_CRITERION, 228162306a36Sopenharmony_ci DPK_AGC_STEP_GL_LT_CRITERION, 228262306a36Sopenharmony_ci DPK_AGC_STEP_SET_TX_GAIN, 228362306a36Sopenharmony_ci}; 228462306a36Sopenharmony_ci 228562306a36Sopenharmony_cistatic u8 _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) 228662306a36Sopenharmony_ci{ 228762306a36Sopenharmony_ci u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 228862306a36Sopenharmony_ci u8 i; 228962306a36Sopenharmony_ci 229062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_rfk_dpk_pas_read_defs_tbl); 229162306a36Sopenharmony_ci 229262306a36Sopenharmony_ci if (is_check) { 229362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00); 229462306a36Sopenharmony_ci val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 229562306a36Sopenharmony_ci val1_i = abs(sign_extend32(val1_i, 11)); 229662306a36Sopenharmony_ci val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 229762306a36Sopenharmony_ci val1_q = abs(sign_extend32(val1_q, 11)); 229862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f); 229962306a36Sopenharmony_ci val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD); 230062306a36Sopenharmony_ci val2_i = abs(sign_extend32(val2_i, 11)); 230162306a36Sopenharmony_ci val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD); 230262306a36Sopenharmony_ci val2_q = abs(sign_extend32(val2_q, 11)); 230362306a36Sopenharmony_ci 230462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n", 230562306a36Sopenharmony_ci phy_div(val1_i * val1_i + val1_q * val1_q, 230662306a36Sopenharmony_ci val2_i * val2_i + val2_q * val2_q)); 230762306a36Sopenharmony_ci 230862306a36Sopenharmony_ci } else { 230962306a36Sopenharmony_ci for (i = 0; i < 32; i++) { 231062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i); 231162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 231262306a36Sopenharmony_ci "[DPK] PAS_Read[%02d]= 0x%08x\n", i, 231362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD)); 231462306a36Sopenharmony_ci } 231562306a36Sopenharmony_ci } 231662306a36Sopenharmony_ci if ((val1_i * val1_i + val1_q * val1_q) >= 231762306a36Sopenharmony_ci ((val2_i * val2_i + val2_q * val2_q) * 8 / 5)) 231862306a36Sopenharmony_ci return 1; 231962306a36Sopenharmony_ci else 232062306a36Sopenharmony_ci return 0; 232162306a36Sopenharmony_ci} 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_cistatic u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 232462306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 init_txagc, 232562306a36Sopenharmony_ci bool loss_only) 232662306a36Sopenharmony_ci{ 232762306a36Sopenharmony_ci#define DPK_AGC_ADJ_LMT 6 232862306a36Sopenharmony_ci#define DPK_DGAIN_UPPER 1922 232962306a36Sopenharmony_ci#define DPK_DGAIN_LOWER 342 233062306a36Sopenharmony_ci#define DPK_RXBB_UPPER 0x1f 233162306a36Sopenharmony_ci#define DPK_RXBB_LOWER 0 233262306a36Sopenharmony_ci#define DPK_GL_CRIT 7 233362306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 233462306a36Sopenharmony_ci u8 tmp_txagc, tmp_rxbb = 0, tmp_gl_idx = 0; 233562306a36Sopenharmony_ci u8 agc_cnt = 0; 233662306a36Sopenharmony_ci bool limited_rxbb = false; 233762306a36Sopenharmony_ci s8 offset = 0; 233862306a36Sopenharmony_ci u16 dgain = 0; 233962306a36Sopenharmony_ci u8 step = DPK_AGC_STEP_SYNC_DGAIN; 234062306a36Sopenharmony_ci bool goout = false; 234162306a36Sopenharmony_ci 234262306a36Sopenharmony_ci tmp_txagc = init_txagc; 234362306a36Sopenharmony_ci 234462306a36Sopenharmony_ci do { 234562306a36Sopenharmony_ci switch (step) { 234662306a36Sopenharmony_ci case DPK_AGC_STEP_SYNC_DGAIN: 234762306a36Sopenharmony_ci if (_dpk_sync(rtwdev, phy, path, kidx)) { 234862306a36Sopenharmony_ci tmp_txagc = DPK_TXAGC_INVAL; 234962306a36Sopenharmony_ci goout = true; 235062306a36Sopenharmony_ci break; 235162306a36Sopenharmony_ci } 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci dgain = _dpk_dgain_read(rtwdev); 235462306a36Sopenharmony_ci 235562306a36Sopenharmony_ci if (loss_only || limited_rxbb) 235662306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 235762306a36Sopenharmony_ci else 235862306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_ADJ; 235962306a36Sopenharmony_ci break; 236062306a36Sopenharmony_ci 236162306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_ADJ: 236262306a36Sopenharmony_ci tmp_rxbb = (u8)rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB); 236362306a36Sopenharmony_ci offset = _dpk_dgain_mapping(rtwdev, dgain); 236462306a36Sopenharmony_ci 236562306a36Sopenharmony_ci if (tmp_rxbb + offset > DPK_RXBB_UPPER) { 236662306a36Sopenharmony_ci tmp_rxbb = DPK_RXBB_UPPER; 236762306a36Sopenharmony_ci limited_rxbb = true; 236862306a36Sopenharmony_ci } else if (tmp_rxbb + offset < DPK_RXBB_LOWER) { 236962306a36Sopenharmony_ci tmp_rxbb = DPK_RXBB_LOWER; 237062306a36Sopenharmony_ci limited_rxbb = true; 237162306a36Sopenharmony_ci } else { 237262306a36Sopenharmony_ci tmp_rxbb = tmp_rxbb + offset; 237362306a36Sopenharmony_ci } 237462306a36Sopenharmony_ci 237562306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_M_RXBB, tmp_rxbb); 237662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 237762306a36Sopenharmony_ci "[DPK] Adjust RXBB (%d) = 0x%x\n", offset, 237862306a36Sopenharmony_ci tmp_rxbb); 237962306a36Sopenharmony_ci if (offset != 0 || agc_cnt == 0) { 238062306a36Sopenharmony_ci if (chan->band_width < RTW89_CHANNEL_WIDTH_80) 238162306a36Sopenharmony_ci _dpk_bypass_rxcfir(rtwdev, path, true); 238262306a36Sopenharmony_ci else 238362306a36Sopenharmony_ci _dpk_lbk_rxiqk(rtwdev, phy, path); 238462306a36Sopenharmony_ci } 238562306a36Sopenharmony_ci if (dgain > DPK_DGAIN_UPPER || dgain < DPK_DGAIN_LOWER) 238662306a36Sopenharmony_ci step = DPK_AGC_STEP_SYNC_DGAIN; 238762306a36Sopenharmony_ci else 238862306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 238962306a36Sopenharmony_ci 239062306a36Sopenharmony_ci agc_cnt++; 239162306a36Sopenharmony_ci break; 239262306a36Sopenharmony_ci 239362306a36Sopenharmony_ci case DPK_AGC_STEP_GAIN_LOSS_IDX: 239462306a36Sopenharmony_ci _dpk_gainloss(rtwdev, phy, path, kidx); 239562306a36Sopenharmony_ci tmp_gl_idx = _dpk_gainloss_read(rtwdev); 239662306a36Sopenharmony_ci 239762306a36Sopenharmony_ci if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) || 239862306a36Sopenharmony_ci tmp_gl_idx > DPK_GL_CRIT) 239962306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_GT_CRITERION; 240062306a36Sopenharmony_ci else if (tmp_gl_idx == 0) 240162306a36Sopenharmony_ci step = DPK_AGC_STEP_GL_LT_CRITERION; 240262306a36Sopenharmony_ci else 240362306a36Sopenharmony_ci step = DPK_AGC_STEP_SET_TX_GAIN; 240462306a36Sopenharmony_ci break; 240562306a36Sopenharmony_ci 240662306a36Sopenharmony_ci case DPK_AGC_STEP_GL_GT_CRITERION: 240762306a36Sopenharmony_ci if (tmp_txagc == DPK_TXAGC_LOWER) { 240862306a36Sopenharmony_ci goout = true; 240962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 241062306a36Sopenharmony_ci "[DPK] Txagc@lower bound!!\n"); 241162306a36Sopenharmony_ci } else { 241262306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, path, 3); 241362306a36Sopenharmony_ci } 241462306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 241562306a36Sopenharmony_ci agc_cnt++; 241662306a36Sopenharmony_ci break; 241762306a36Sopenharmony_ci 241862306a36Sopenharmony_ci case DPK_AGC_STEP_GL_LT_CRITERION: 241962306a36Sopenharmony_ci if (tmp_txagc == DPK_TXAGC_UPPER) { 242062306a36Sopenharmony_ci goout = true; 242162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 242262306a36Sopenharmony_ci "[DPK] Txagc@upper bound!!\n"); 242362306a36Sopenharmony_ci } else { 242462306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, path, -2); 242562306a36Sopenharmony_ci } 242662306a36Sopenharmony_ci step = DPK_AGC_STEP_GAIN_LOSS_IDX; 242762306a36Sopenharmony_ci agc_cnt++; 242862306a36Sopenharmony_ci break; 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_ci case DPK_AGC_STEP_SET_TX_GAIN: 243162306a36Sopenharmony_ci tmp_txagc = _dpk_set_offset(rtwdev, path, tmp_gl_idx); 243262306a36Sopenharmony_ci goout = true; 243362306a36Sopenharmony_ci agc_cnt++; 243462306a36Sopenharmony_ci break; 243562306a36Sopenharmony_ci 243662306a36Sopenharmony_ci default: 243762306a36Sopenharmony_ci goout = true; 243862306a36Sopenharmony_ci break; 243962306a36Sopenharmony_ci } 244062306a36Sopenharmony_ci } while (!goout && (agc_cnt < DPK_AGC_ADJ_LMT)); 244162306a36Sopenharmony_ci 244262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 244362306a36Sopenharmony_ci "[DPK] Txagc / RXBB for DPK = 0x%x / 0x%x\n", tmp_txagc, 244462306a36Sopenharmony_ci tmp_rxbb); 244562306a36Sopenharmony_ci 244662306a36Sopenharmony_ci return tmp_txagc; 244762306a36Sopenharmony_ci} 244862306a36Sopenharmony_ci 244962306a36Sopenharmony_cistatic void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order) 245062306a36Sopenharmony_ci{ 245162306a36Sopenharmony_ci switch (order) { 245262306a36Sopenharmony_ci case 0: 245362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 245462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3); 245562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN, 0x1); 245662306a36Sopenharmony_ci break; 245762306a36Sopenharmony_ci case 1: 245862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 245962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); 246062306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); 246162306a36Sopenharmony_ci break; 246262306a36Sopenharmony_ci case 2: 246362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, order); 246462306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LDL_NORM, B_LDL_NORM_PN); 246562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_MAN); 246662306a36Sopenharmony_ci break; 246762306a36Sopenharmony_ci default: 246862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 246962306a36Sopenharmony_ci "[DPK] Wrong MDPD order!!(0x%x)\n", order); 247062306a36Sopenharmony_ci break; 247162306a36Sopenharmony_ci } 247262306a36Sopenharmony_ci 247362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 247462306a36Sopenharmony_ci "[DPK] Set MDPD order to 0x%x for IDL\n", order); 247562306a36Sopenharmony_ci} 247662306a36Sopenharmony_ci 247762306a36Sopenharmony_cistatic void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 247862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain) 247962306a36Sopenharmony_ci{ 248062306a36Sopenharmony_ci _dpk_set_mdpd_para(rtwdev, 0x0); 248162306a36Sopenharmony_ci _dpk_table_select(rtwdev, path, kidx, 1); 248262306a36Sopenharmony_ci _dpk_one_shot(rtwdev, phy, path, MDPK_IDL); 248362306a36Sopenharmony_ci} 248462306a36Sopenharmony_ci 248562306a36Sopenharmony_cistatic void _dpk_fill_result(struct rtw89_dev *rtwdev, 248662306a36Sopenharmony_ci enum rtw89_rf_path path, u8 kidx, u8 gain, 248762306a36Sopenharmony_ci u8 txagc) 248862306a36Sopenharmony_ci{ 248962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 249062306a36Sopenharmony_ci 249162306a36Sopenharmony_ci u16 pwsf = 0x78; 249262306a36Sopenharmony_ci u8 gs = 0x5b; 249362306a36Sopenharmony_ci 249462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), B_COEF_SEL_MDPD, kidx); 249562306a36Sopenharmony_ci 249662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 249762306a36Sopenharmony_ci "[DPK] Fill txagc/ pwsf/ gs = 0x%x/ 0x%x/ 0x%x\n", txagc, 249862306a36Sopenharmony_ci pwsf, gs); 249962306a36Sopenharmony_ci 250062306a36Sopenharmony_ci dpk->bp[path][kidx].txagc_dpk = txagc; 250162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXAGC_RFK + (path << 8), 250262306a36Sopenharmony_ci 0x3F << ((gain << 3) + (kidx << 4)), txagc); 250362306a36Sopenharmony_ci 250462306a36Sopenharmony_ci dpk->bp[path][kidx].pwsf = pwsf; 250562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 250662306a36Sopenharmony_ci 0x1FF << (gain << 4), pwsf); 250762306a36Sopenharmony_ci 250862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1); 250962306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD); 251062306a36Sopenharmony_ci 251162306a36Sopenharmony_ci dpk->bp[path][kidx].gs = gs; 251262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 251362306a36Sopenharmony_ci MASKDWORD, 0x065b5b5b); 251462306a36Sopenharmony_ci 251562306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_DPD_V1 + (path << 8), MASKDWORD); 251662306a36Sopenharmony_ci 251762306a36Sopenharmony_ci rtw89_phy_write32_clr(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_SEL); 251862306a36Sopenharmony_ci} 251962306a36Sopenharmony_ci 252062306a36Sopenharmony_cistatic bool _dpk_reload_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 252162306a36Sopenharmony_ci enum rtw89_rf_path path) 252262306a36Sopenharmony_ci{ 252362306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 252462306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 252562306a36Sopenharmony_ci bool is_reload = false; 252662306a36Sopenharmony_ci u8 idx, cur_band, cur_ch; 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_ci cur_band = chan->band_type; 252962306a36Sopenharmony_ci cur_ch = chan->channel; 253062306a36Sopenharmony_ci 253162306a36Sopenharmony_ci for (idx = 0; idx < RTW89_DPK_BKUP_NUM; idx++) { 253262306a36Sopenharmony_ci if (cur_band != dpk->bp[path][idx].band || 253362306a36Sopenharmony_ci cur_ch != dpk->bp[path][idx].ch) 253462306a36Sopenharmony_ci continue; 253562306a36Sopenharmony_ci 253662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_COEF_SEL + (path << 8), 253762306a36Sopenharmony_ci B_COEF_SEL_MDPD, idx); 253862306a36Sopenharmony_ci dpk->cur_idx[path] = idx; 253962306a36Sopenharmony_ci is_reload = true; 254062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 254162306a36Sopenharmony_ci "[DPK] reload S%d[%d] success\n", path, idx); 254262306a36Sopenharmony_ci } 254362306a36Sopenharmony_ci 254462306a36Sopenharmony_ci return is_reload; 254562306a36Sopenharmony_ci} 254662306a36Sopenharmony_ci 254762306a36Sopenharmony_cistatic bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 254862306a36Sopenharmony_ci enum rtw89_rf_path path, u8 gain) 254962306a36Sopenharmony_ci{ 255062306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 255162306a36Sopenharmony_ci u8 txagc = 0, kidx = dpk->cur_idx[path]; 255262306a36Sopenharmony_ci bool is_fail = false; 255362306a36Sopenharmony_ci 255462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 255562306a36Sopenharmony_ci "[DPK] ========= S%d[%d] DPK Start =========\n", path, 255662306a36Sopenharmony_ci kidx); 255762306a36Sopenharmony_ci 255862306a36Sopenharmony_ci _rf_direct_cntrl(rtwdev, path, false); 255962306a36Sopenharmony_ci txagc = _dpk_set_tx_pwr(rtwdev, gain, path); 256062306a36Sopenharmony_ci _dpk_rf_setting(rtwdev, gain, path, kidx); 256162306a36Sopenharmony_ci _dpk_rx_dck(rtwdev, phy, path); 256262306a36Sopenharmony_ci 256362306a36Sopenharmony_ci _dpk_kip_setting(rtwdev, path, kidx); 256462306a36Sopenharmony_ci _dpk_manual_txcfir(rtwdev, path, true); 256562306a36Sopenharmony_ci txagc = _dpk_agc(rtwdev, phy, path, kidx, txagc, false); 256662306a36Sopenharmony_ci if (txagc == DPK_TXAGC_INVAL) 256762306a36Sopenharmony_ci is_fail = true; 256862306a36Sopenharmony_ci _dpk_get_thermal(rtwdev, kidx, path); 256962306a36Sopenharmony_ci 257062306a36Sopenharmony_ci _dpk_idl_mpa(rtwdev, phy, path, kidx, gain); 257162306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 257262306a36Sopenharmony_ci _dpk_fill_result(rtwdev, path, kidx, gain, txagc); 257362306a36Sopenharmony_ci _dpk_manual_txcfir(rtwdev, path, false); 257462306a36Sopenharmony_ci 257562306a36Sopenharmony_ci if (!is_fail) 257662306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = true; 257762306a36Sopenharmony_ci else 257862306a36Sopenharmony_ci dpk->bp[path][kidx].path_ok = false; 257962306a36Sopenharmony_ci 258062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s\n", path, kidx, 258162306a36Sopenharmony_ci is_fail ? "Check" : "Success"); 258262306a36Sopenharmony_ci 258362306a36Sopenharmony_ci return is_fail; 258462306a36Sopenharmony_ci} 258562306a36Sopenharmony_ci 258662306a36Sopenharmony_cistatic void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force, 258762306a36Sopenharmony_ci enum rtw89_phy_idx phy, u8 kpath) 258862306a36Sopenharmony_ci{ 258962306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 259062306a36Sopenharmony_ci u32 backup_bb_val[BACKUP_BB_REGS_NR]; 259162306a36Sopenharmony_ci u32 backup_rf_val[RTW8852A_DPK_RF_PATH][BACKUP_RF_REGS_NR]; 259262306a36Sopenharmony_ci u32 kip_bkup[RTW8852A_DPK_RF_PATH][RTW8852A_DPK_KIP_REG_NUM] = {{0}}; 259362306a36Sopenharmony_ci u32 kip_reg[] = {R_RXIQC, R_IQK_RES}; 259462306a36Sopenharmony_ci u8 path; 259562306a36Sopenharmony_ci bool is_fail = true, reloaded[RTW8852A_DPK_RF_PATH] = {false}; 259662306a36Sopenharmony_ci 259762306a36Sopenharmony_ci if (dpk->is_dpk_reload_en) { 259862306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 259962306a36Sopenharmony_ci if (!(kpath & BIT(path))) 260062306a36Sopenharmony_ci continue; 260162306a36Sopenharmony_ci 260262306a36Sopenharmony_ci reloaded[path] = _dpk_reload_check(rtwdev, phy, path); 260362306a36Sopenharmony_ci if (!reloaded[path] && dpk->bp[path][0].ch != 0) 260462306a36Sopenharmony_ci dpk->cur_idx[path] = !dpk->cur_idx[path]; 260562306a36Sopenharmony_ci else 260662306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, false); 260762306a36Sopenharmony_ci } 260862306a36Sopenharmony_ci } else { 260962306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) 261062306a36Sopenharmony_ci dpk->cur_idx[path] = 0; 261162306a36Sopenharmony_ci } 261262306a36Sopenharmony_ci 261362306a36Sopenharmony_ci if ((kpath == RF_A && reloaded[RF_PATH_A]) || 261462306a36Sopenharmony_ci (kpath == RF_B && reloaded[RF_PATH_B]) || 261562306a36Sopenharmony_ci (kpath == RF_AB && reloaded[RF_PATH_A] && reloaded[RF_PATH_B])) 261662306a36Sopenharmony_ci return; 261762306a36Sopenharmony_ci 261862306a36Sopenharmony_ci _rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]); 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 262162306a36Sopenharmony_ci if (!(kpath & BIT(path)) || reloaded[path]) 262262306a36Sopenharmony_ci continue; 262362306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 262462306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, true); 262562306a36Sopenharmony_ci _dpk_bkup_kip(rtwdev, kip_reg, kip_bkup, path); 262662306a36Sopenharmony_ci _rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path); 262762306a36Sopenharmony_ci _dpk_information(rtwdev, phy, path); 262862306a36Sopenharmony_ci } 262962306a36Sopenharmony_ci 263062306a36Sopenharmony_ci _dpk_bb_afe_setting(rtwdev, phy, path, kpath); 263162306a36Sopenharmony_ci 263262306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 263362306a36Sopenharmony_ci if (!(kpath & BIT(path)) || reloaded[path]) 263462306a36Sopenharmony_ci continue; 263562306a36Sopenharmony_ci 263662306a36Sopenharmony_ci is_fail = _dpk_main(rtwdev, phy, path, 1); 263762306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, is_fail); 263862306a36Sopenharmony_ci } 263962306a36Sopenharmony_ci 264062306a36Sopenharmony_ci _dpk_bb_afe_restore(rtwdev, phy, path, kpath); 264162306a36Sopenharmony_ci _rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]); 264262306a36Sopenharmony_ci 264362306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 264462306a36Sopenharmony_ci if (!(kpath & BIT(path)) || reloaded[path]) 264562306a36Sopenharmony_ci continue; 264662306a36Sopenharmony_ci 264762306a36Sopenharmony_ci _dpk_kip_restore(rtwdev, path); 264862306a36Sopenharmony_ci _dpk_reload_kip(rtwdev, kip_reg, kip_bkup, path); 264962306a36Sopenharmony_ci _rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path); 265062306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) 265162306a36Sopenharmony_ci _dpk_tssi_pause(rtwdev, path, false); 265262306a36Sopenharmony_ci } 265362306a36Sopenharmony_ci} 265462306a36Sopenharmony_ci 265562306a36Sopenharmony_cistatic bool _dpk_bypass_check(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 265662306a36Sopenharmony_ci{ 265762306a36Sopenharmony_ci struct rtw89_fem_info *fem = &rtwdev->fem; 265862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 265962306a36Sopenharmony_ci 266062306a36Sopenharmony_ci if (fem->epa_2g && chan->band_type == RTW89_BAND_2G) { 266162306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 266262306a36Sopenharmony_ci "[DPK] Skip DPK due to 2G_ext_PA exist!!\n"); 266362306a36Sopenharmony_ci return true; 266462306a36Sopenharmony_ci } else if (fem->epa_5g && chan->band_type == RTW89_BAND_5G) { 266562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 266662306a36Sopenharmony_ci "[DPK] Skip DPK due to 5G_ext_PA exist!!\n"); 266762306a36Sopenharmony_ci return true; 266862306a36Sopenharmony_ci } 266962306a36Sopenharmony_ci 267062306a36Sopenharmony_ci return false; 267162306a36Sopenharmony_ci} 267262306a36Sopenharmony_ci 267362306a36Sopenharmony_cistatic void _dpk_force_bypass(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 267462306a36Sopenharmony_ci{ 267562306a36Sopenharmony_ci u8 path, kpath; 267662306a36Sopenharmony_ci 267762306a36Sopenharmony_ci kpath = _kpath(rtwdev, phy); 267862306a36Sopenharmony_ci 267962306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 268062306a36Sopenharmony_ci if (kpath & BIT(path)) 268162306a36Sopenharmony_ci _dpk_onoff(rtwdev, path, true); 268262306a36Sopenharmony_ci } 268362306a36Sopenharmony_ci} 268462306a36Sopenharmony_ci 268562306a36Sopenharmony_cistatic void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force) 268662306a36Sopenharmony_ci{ 268762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, 268862306a36Sopenharmony_ci "[DPK] ****** DPK Start (Ver: 0x%x, Cv: %d, RF_para: %d) ******\n", 268962306a36Sopenharmony_ci RTW8852A_DPK_VER, rtwdev->hal.cv, 269062306a36Sopenharmony_ci RTW8852A_RF_REL_VERSION); 269162306a36Sopenharmony_ci 269262306a36Sopenharmony_ci if (_dpk_bypass_check(rtwdev, phy)) 269362306a36Sopenharmony_ci _dpk_force_bypass(rtwdev, phy); 269462306a36Sopenharmony_ci else 269562306a36Sopenharmony_ci _dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy)); 269662306a36Sopenharmony_ci} 269762306a36Sopenharmony_ci 269862306a36Sopenharmony_cistatic void _dpk_onoff(struct rtw89_dev *rtwdev, 269962306a36Sopenharmony_ci enum rtw89_rf_path path, bool off) 270062306a36Sopenharmony_ci{ 270162306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 270262306a36Sopenharmony_ci u8 val, kidx = dpk->cur_idx[path]; 270362306a36Sopenharmony_ci 270462306a36Sopenharmony_ci val = dpk->is_dpk_enable && !off && dpk->bp[path][kidx].path_ok; 270562306a36Sopenharmony_ci 270662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2), 270762306a36Sopenharmony_ci MASKBYTE3, 0x6 | val); 270862306a36Sopenharmony_ci 270962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path, 271062306a36Sopenharmony_ci kidx, dpk->is_dpk_enable && !off ? "enable" : "disable"); 271162306a36Sopenharmony_ci} 271262306a36Sopenharmony_ci 271362306a36Sopenharmony_cistatic void _dpk_track(struct rtw89_dev *rtwdev) 271462306a36Sopenharmony_ci{ 271562306a36Sopenharmony_ci struct rtw89_dpk_info *dpk = &rtwdev->dpk; 271662306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 271762306a36Sopenharmony_ci u8 path, kidx; 271862306a36Sopenharmony_ci u8 trk_idx = 0, txagc_rf = 0; 271962306a36Sopenharmony_ci s8 txagc_bb = 0, txagc_bb_tp = 0, ini_diff = 0, txagc_ofst = 0; 272062306a36Sopenharmony_ci u16 pwsf[2]; 272162306a36Sopenharmony_ci u8 cur_ther; 272262306a36Sopenharmony_ci s8 delta_ther[2] = {0}; 272362306a36Sopenharmony_ci 272462306a36Sopenharmony_ci for (path = 0; path < RTW8852A_DPK_RF_PATH; path++) { 272562306a36Sopenharmony_ci kidx = dpk->cur_idx[path]; 272662306a36Sopenharmony_ci 272762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 272862306a36Sopenharmony_ci "[DPK_TRK] ================[S%d[%d] (CH %d)]================\n", 272962306a36Sopenharmony_ci path, kidx, dpk->bp[path][kidx].ch); 273062306a36Sopenharmony_ci 273162306a36Sopenharmony_ci cur_ther = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 273262306a36Sopenharmony_ci 273362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 273462306a36Sopenharmony_ci "[DPK_TRK] thermal now = %d\n", cur_ther); 273562306a36Sopenharmony_ci 273662306a36Sopenharmony_ci if (dpk->bp[path][kidx].ch != 0 && cur_ther != 0) 273762306a36Sopenharmony_ci delta_ther[path] = dpk->bp[path][kidx].ther_dpk - cur_ther; 273862306a36Sopenharmony_ci 273962306a36Sopenharmony_ci if (dpk->bp[path][kidx].band == RTW89_BAND_2G) 274062306a36Sopenharmony_ci delta_ther[path] = delta_ther[path] * 3 / 2; 274162306a36Sopenharmony_ci else 274262306a36Sopenharmony_ci delta_ther[path] = delta_ther[path] * 5 / 2; 274362306a36Sopenharmony_ci 274462306a36Sopenharmony_ci txagc_rf = (u8)rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13), 274562306a36Sopenharmony_ci RR_MODOPT_M_TXPWR); 274662306a36Sopenharmony_ci 274762306a36Sopenharmony_ci if (rtwdev->is_tssi_mode[path]) { 274862306a36Sopenharmony_ci trk_idx = (u8)rtw89_read_rf(rtwdev, path, RR_TXA, RR_TXA_TRK); 274962306a36Sopenharmony_ci 275062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 275162306a36Sopenharmony_ci "[DPK_TRK] txagc_RF / track_idx = 0x%x / %d\n", 275262306a36Sopenharmony_ci txagc_rf, trk_idx); 275362306a36Sopenharmony_ci 275462306a36Sopenharmony_ci txagc_bb = 275562306a36Sopenharmony_ci (s8)rtw89_phy_read32_mask(rtwdev, 275662306a36Sopenharmony_ci R_TXAGC_BB + (path << 13), 275762306a36Sopenharmony_ci MASKBYTE2); 275862306a36Sopenharmony_ci txagc_bb_tp = 275962306a36Sopenharmony_ci (u8)rtw89_phy_read32_mask(rtwdev, 276062306a36Sopenharmony_ci R_TXAGC_TP + (path << 13), 276162306a36Sopenharmony_ci B_TXAGC_TP); 276262306a36Sopenharmony_ci 276362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 276462306a36Sopenharmony_ci "[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n", 276562306a36Sopenharmony_ci txagc_bb_tp, txagc_bb); 276662306a36Sopenharmony_ci 276762306a36Sopenharmony_ci txagc_ofst = 276862306a36Sopenharmony_ci (s8)rtw89_phy_read32_mask(rtwdev, 276962306a36Sopenharmony_ci R_TXAGC_BB + (path << 13), 277062306a36Sopenharmony_ci MASKBYTE3); 277162306a36Sopenharmony_ci 277262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 277362306a36Sopenharmony_ci "[DPK_TRK] txagc_offset / delta_ther = %d / %d\n", 277462306a36Sopenharmony_ci txagc_ofst, delta_ther[path]); 277562306a36Sopenharmony_ci 277662306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DPD_COM + (path << 8), 277762306a36Sopenharmony_ci BIT(15)) == 0x1) 277862306a36Sopenharmony_ci txagc_ofst = 0; 277962306a36Sopenharmony_ci 278062306a36Sopenharmony_ci if (txagc_rf != 0 && cur_ther != 0) 278162306a36Sopenharmony_ci ini_diff = txagc_ofst + delta_ther[path]; 278262306a36Sopenharmony_ci 278362306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_P0_TXDPD + (path << 13), 278462306a36Sopenharmony_ci B_P0_TXDPD) == 0x0) { 278562306a36Sopenharmony_ci pwsf[0] = dpk->bp[path][kidx].pwsf + txagc_bb_tp - 278662306a36Sopenharmony_ci txagc_bb + ini_diff + 278762306a36Sopenharmony_ci tssi_info->extra_ofst[path]; 278862306a36Sopenharmony_ci pwsf[1] = dpk->bp[path][kidx].pwsf + txagc_bb_tp - 278962306a36Sopenharmony_ci txagc_bb + ini_diff + 279062306a36Sopenharmony_ci tssi_info->extra_ofst[path]; 279162306a36Sopenharmony_ci } else { 279262306a36Sopenharmony_ci pwsf[0] = dpk->bp[path][kidx].pwsf + ini_diff + 279362306a36Sopenharmony_ci tssi_info->extra_ofst[path]; 279462306a36Sopenharmony_ci pwsf[1] = dpk->bp[path][kidx].pwsf + ini_diff + 279562306a36Sopenharmony_ci tssi_info->extra_ofst[path]; 279662306a36Sopenharmony_ci } 279762306a36Sopenharmony_ci 279862306a36Sopenharmony_ci } else { 279962306a36Sopenharmony_ci pwsf[0] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 280062306a36Sopenharmony_ci pwsf[1] = (dpk->bp[path][kidx].pwsf + delta_ther[path]) & 0x1ff; 280162306a36Sopenharmony_ci } 280262306a36Sopenharmony_ci 280362306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_DPK_TRK, B_DPK_TRK_DIS) == 0x0 && 280462306a36Sopenharmony_ci txagc_rf != 0) { 280562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK, 280662306a36Sopenharmony_ci "[DPK_TRK] New pwsf[0] / pwsf[1] = 0x%x / 0x%x\n", 280762306a36Sopenharmony_ci pwsf[0], pwsf[1]); 280862306a36Sopenharmony_ci 280962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 281062306a36Sopenharmony_ci 0x000001FF, pwsf[0]); 281162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_BND + (path << 8) + (kidx << 2), 281262306a36Sopenharmony_ci 0x01FF0000, pwsf[1]); 281362306a36Sopenharmony_ci } 281462306a36Sopenharmony_ci } 281562306a36Sopenharmony_ci} 281662306a36Sopenharmony_ci 281762306a36Sopenharmony_cistatic void _tssi_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 281862306a36Sopenharmony_ci enum rtw89_rf_path path) 281962306a36Sopenharmony_ci{ 282062306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 282162306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 282262306a36Sopenharmony_ci 282362306a36Sopenharmony_ci if (band == RTW89_BAND_2G) 282462306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXG, 0x1); 282562306a36Sopenharmony_ci else 282662306a36Sopenharmony_ci rtw89_write_rf(rtwdev, path, RR_TXPOW, RR_TXPOW_TXA, 0x1); 282762306a36Sopenharmony_ci} 282862306a36Sopenharmony_ci 282962306a36Sopenharmony_cistatic void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 283062306a36Sopenharmony_ci{ 283162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 283262306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 283362306a36Sopenharmony_ci 283462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_sys_defs_tbl); 283562306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 283662306a36Sopenharmony_ci &rtw8852a_tssi_sys_defs_2g_tbl, 283762306a36Sopenharmony_ci &rtw8852a_tssi_sys_defs_5g_tbl); 283862306a36Sopenharmony_ci} 283962306a36Sopenharmony_ci 284062306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 284162306a36Sopenharmony_ci enum rtw89_rf_path path) 284262306a36Sopenharmony_ci{ 284362306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 284462306a36Sopenharmony_ci enum rtw89_band band = chan->band_type; 284562306a36Sopenharmony_ci 284662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 284762306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_defs_a_tbl, 284862306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_defs_b_tbl); 284962306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G, 285062306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_defs_2g_tbl, 285162306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_defs_5g_tbl); 285262306a36Sopenharmony_ci} 285362306a36Sopenharmony_ci 285462306a36Sopenharmony_cistatic void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev, 285562306a36Sopenharmony_ci enum rtw89_phy_idx phy, 285662306a36Sopenharmony_ci enum rtw89_rf_path path) 285762306a36Sopenharmony_ci{ 285862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 285962306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_he_tb_defs_a_tbl, 286062306a36Sopenharmony_ci &rtw8852a_tssi_txpwr_ctrl_bb_he_tb_defs_b_tbl); 286162306a36Sopenharmony_ci} 286262306a36Sopenharmony_ci 286362306a36Sopenharmony_cistatic void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 286462306a36Sopenharmony_ci enum rtw89_rf_path path) 286562306a36Sopenharmony_ci{ 286662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 286762306a36Sopenharmony_ci &rtw8852a_tssi_dck_defs_a_tbl, 286862306a36Sopenharmony_ci &rtw8852a_tssi_dck_defs_b_tbl); 286962306a36Sopenharmony_ci} 287062306a36Sopenharmony_ci 287162306a36Sopenharmony_cistatic void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 287262306a36Sopenharmony_ci enum rtw89_rf_path path) 287362306a36Sopenharmony_ci{ 287462306a36Sopenharmony_ci#define __get_val(ptr, idx) \ 287562306a36Sopenharmony_ci({ \ 287662306a36Sopenharmony_ci s8 *__ptr = (ptr); \ 287762306a36Sopenharmony_ci u8 __idx = (idx), __i, __v; \ 287862306a36Sopenharmony_ci u32 __val = 0; \ 287962306a36Sopenharmony_ci for (__i = 0; __i < 4; __i++) { \ 288062306a36Sopenharmony_ci __v = (__ptr[__idx + __i]); \ 288162306a36Sopenharmony_ci __val |= (__v << (8 * __i)); \ 288262306a36Sopenharmony_ci } \ 288362306a36Sopenharmony_ci __val; \ 288462306a36Sopenharmony_ci}) 288562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 288662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 288762306a36Sopenharmony_ci u8 ch = chan->channel; 288862306a36Sopenharmony_ci u8 subband = chan->subband_type; 288962306a36Sopenharmony_ci const s8 *thm_up_a = NULL; 289062306a36Sopenharmony_ci const s8 *thm_down_a = NULL; 289162306a36Sopenharmony_ci const s8 *thm_up_b = NULL; 289262306a36Sopenharmony_ci const s8 *thm_down_b = NULL; 289362306a36Sopenharmony_ci u8 thermal = 0xff; 289462306a36Sopenharmony_ci s8 thm_ofst[64] = {0}; 289562306a36Sopenharmony_ci u32 tmp = 0; 289662306a36Sopenharmony_ci u8 i, j; 289762306a36Sopenharmony_ci 289862306a36Sopenharmony_ci switch (subband) { 289962306a36Sopenharmony_ci default: 290062306a36Sopenharmony_ci case RTW89_CH_2G: 290162306a36Sopenharmony_ci thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_p; 290262306a36Sopenharmony_ci thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_2ga_n; 290362306a36Sopenharmony_ci thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_2gb_p; 290462306a36Sopenharmony_ci thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_2gb_n; 290562306a36Sopenharmony_ci break; 290662306a36Sopenharmony_ci case RTW89_CH_5G_BAND_1: 290762306a36Sopenharmony_ci thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[0]; 290862306a36Sopenharmony_ci thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[0]; 290962306a36Sopenharmony_ci thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[0]; 291062306a36Sopenharmony_ci thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[0]; 291162306a36Sopenharmony_ci break; 291262306a36Sopenharmony_ci case RTW89_CH_5G_BAND_3: 291362306a36Sopenharmony_ci thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[1]; 291462306a36Sopenharmony_ci thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[1]; 291562306a36Sopenharmony_ci thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[1]; 291662306a36Sopenharmony_ci thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[1]; 291762306a36Sopenharmony_ci break; 291862306a36Sopenharmony_ci case RTW89_CH_5G_BAND_4: 291962306a36Sopenharmony_ci thm_up_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_p[2]; 292062306a36Sopenharmony_ci thm_down_a = rtw89_8852a_trk_cfg.delta_swingidx_5ga_n[2]; 292162306a36Sopenharmony_ci thm_up_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_p[2]; 292262306a36Sopenharmony_ci thm_down_b = rtw89_8852a_trk_cfg.delta_swingidx_5gb_n[2]; 292362306a36Sopenharmony_ci break; 292462306a36Sopenharmony_ci } 292562306a36Sopenharmony_ci 292662306a36Sopenharmony_ci if (path == RF_PATH_A) { 292762306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_A]; 292862306a36Sopenharmony_ci 292962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 293062306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal); 293162306a36Sopenharmony_ci 293262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0); 293362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1); 293462306a36Sopenharmony_ci 293562306a36Sopenharmony_ci if (thermal == 0xff) { 293662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32); 293762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32); 293862306a36Sopenharmony_ci 293962306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 294062306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0); 294162306a36Sopenharmony_ci 294262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 294362306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 294462306a36Sopenharmony_ci 0x5c00 + i, 0x0); 294562306a36Sopenharmony_ci } 294662306a36Sopenharmony_ci 294762306a36Sopenharmony_ci } else { 294862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, thermal); 294962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 295062306a36Sopenharmony_ci thermal); 295162306a36Sopenharmony_ci 295262306a36Sopenharmony_ci i = 0; 295362306a36Sopenharmony_ci for (j = 0; j < 32; j++) 295462306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 295562306a36Sopenharmony_ci -thm_down_a[i++] : 295662306a36Sopenharmony_ci -thm_down_a[DELTA_SWINGIDX_SIZE - 1]; 295762306a36Sopenharmony_ci 295862306a36Sopenharmony_ci i = 1; 295962306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 296062306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 296162306a36Sopenharmony_ci thm_up_a[i++] : 296262306a36Sopenharmony_ci thm_up_a[DELTA_SWINGIDX_SIZE - 1]; 296362306a36Sopenharmony_ci 296462306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 296562306a36Sopenharmony_ci tmp = __get_val(thm_ofst, i); 296662306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp); 296762306a36Sopenharmony_ci 296862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 296962306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 297062306a36Sopenharmony_ci 0x5c00 + i, tmp); 297162306a36Sopenharmony_ci } 297262306a36Sopenharmony_ci } 297362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1); 297462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0); 297562306a36Sopenharmony_ci 297662306a36Sopenharmony_ci } else { 297762306a36Sopenharmony_ci thermal = tssi_info->thermal[RF_PATH_B]; 297862306a36Sopenharmony_ci 297962306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 298062306a36Sopenharmony_ci "[TSSI] ch=%d thermal_pathB=0x%x\n", ch, thermal); 298162306a36Sopenharmony_ci 298262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_DIS, 0x0); 298362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER_TRK, 0x1); 298462306a36Sopenharmony_ci 298562306a36Sopenharmony_ci if (thermal == 0xff) { 298662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, 32); 298762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 32); 298862306a36Sopenharmony_ci 298962306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 299062306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, 0x0); 299162306a36Sopenharmony_ci 299262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 299362306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 299462306a36Sopenharmony_ci 0x7c00 + i, 0x0); 299562306a36Sopenharmony_ci } 299662306a36Sopenharmony_ci 299762306a36Sopenharmony_ci } else { 299862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TMETER, B_P1_TMETER, thermal); 299962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, B_P1_RFCTM_VAL, 300062306a36Sopenharmony_ci thermal); 300162306a36Sopenharmony_ci 300262306a36Sopenharmony_ci i = 0; 300362306a36Sopenharmony_ci for (j = 0; j < 32; j++) 300462306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 300562306a36Sopenharmony_ci -thm_down_b[i++] : 300662306a36Sopenharmony_ci -thm_down_b[DELTA_SWINGIDX_SIZE - 1]; 300762306a36Sopenharmony_ci 300862306a36Sopenharmony_ci i = 1; 300962306a36Sopenharmony_ci for (j = 63; j >= 32; j--) 301062306a36Sopenharmony_ci thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ? 301162306a36Sopenharmony_ci thm_up_b[i++] : 301262306a36Sopenharmony_ci thm_up_b[DELTA_SWINGIDX_SIZE - 1]; 301362306a36Sopenharmony_ci 301462306a36Sopenharmony_ci for (i = 0; i < 64; i += 4) { 301562306a36Sopenharmony_ci tmp = __get_val(thm_ofst, i); 301662306a36Sopenharmony_ci rtw89_phy_write32(rtwdev, R_TSSI_THOF + i, tmp); 301762306a36Sopenharmony_ci 301862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 301962306a36Sopenharmony_ci "[TSSI] write 0x%x val=0x%08x\n", 302062306a36Sopenharmony_ci 0x7c00 + i, tmp); 302162306a36Sopenharmony_ci } 302262306a36Sopenharmony_ci } 302362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x1); 302462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_RFCTM, R_P1_RFCTM_RDY, 0x0); 302562306a36Sopenharmony_ci } 302662306a36Sopenharmony_ci#undef __get_val 302762306a36Sopenharmony_ci} 302862306a36Sopenharmony_ci 302962306a36Sopenharmony_cistatic void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 303062306a36Sopenharmony_ci enum rtw89_rf_path path) 303162306a36Sopenharmony_ci{ 303262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 303362306a36Sopenharmony_ci &rtw8852a_tssi_dac_gain_tbl_defs_a_tbl, 303462306a36Sopenharmony_ci &rtw8852a_tssi_dac_gain_tbl_defs_b_tbl); 303562306a36Sopenharmony_ci} 303662306a36Sopenharmony_ci 303762306a36Sopenharmony_cistatic void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 303862306a36Sopenharmony_ci enum rtw89_rf_path path) 303962306a36Sopenharmony_ci{ 304062306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 304162306a36Sopenharmony_ci &rtw8852a_tssi_slope_cal_org_defs_a_tbl, 304262306a36Sopenharmony_ci &rtw8852a_tssi_slope_cal_org_defs_b_tbl); 304362306a36Sopenharmony_ci} 304462306a36Sopenharmony_ci 304562306a36Sopenharmony_cistatic void _tssi_set_rf_gap_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 304662306a36Sopenharmony_ci enum rtw89_rf_path path) 304762306a36Sopenharmony_ci{ 304862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 304962306a36Sopenharmony_ci &rtw8852a_tssi_rf_gap_tbl_defs_a_tbl, 305062306a36Sopenharmony_ci &rtw8852a_tssi_rf_gap_tbl_defs_b_tbl); 305162306a36Sopenharmony_ci} 305262306a36Sopenharmony_ci 305362306a36Sopenharmony_cistatic void _tssi_set_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 305462306a36Sopenharmony_ci enum rtw89_rf_path path) 305562306a36Sopenharmony_ci{ 305662306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 305762306a36Sopenharmony_ci &rtw8852a_tssi_slope_defs_a_tbl, 305862306a36Sopenharmony_ci &rtw8852a_tssi_slope_defs_b_tbl); 305962306a36Sopenharmony_ci} 306062306a36Sopenharmony_ci 306162306a36Sopenharmony_cistatic void _tssi_set_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 306262306a36Sopenharmony_ci enum rtw89_rf_path path) 306362306a36Sopenharmony_ci{ 306462306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 306562306a36Sopenharmony_ci &rtw8852a_tssi_track_defs_a_tbl, 306662306a36Sopenharmony_ci &rtw8852a_tssi_track_defs_b_tbl); 306762306a36Sopenharmony_ci} 306862306a36Sopenharmony_ci 306962306a36Sopenharmony_cistatic void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev, 307062306a36Sopenharmony_ci enum rtw89_phy_idx phy, 307162306a36Sopenharmony_ci enum rtw89_rf_path path) 307262306a36Sopenharmony_ci{ 307362306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 307462306a36Sopenharmony_ci &rtw8852a_tssi_txagc_ofst_mv_avg_defs_a_tbl, 307562306a36Sopenharmony_ci &rtw8852a_tssi_txagc_ofst_mv_avg_defs_b_tbl); 307662306a36Sopenharmony_ci} 307762306a36Sopenharmony_ci 307862306a36Sopenharmony_cistatic void _tssi_pak(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 307962306a36Sopenharmony_ci enum rtw89_rf_path path) 308062306a36Sopenharmony_ci{ 308162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 308262306a36Sopenharmony_ci u8 subband = chan->subband_type; 308362306a36Sopenharmony_ci 308462306a36Sopenharmony_ci switch (subband) { 308562306a36Sopenharmony_ci default: 308662306a36Sopenharmony_ci case RTW89_CH_2G: 308762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 308862306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_a_2g_tbl, 308962306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_b_2g_tbl); 309062306a36Sopenharmony_ci break; 309162306a36Sopenharmony_ci case RTW89_CH_5G_BAND_1: 309262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 309362306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_a_5g_1_tbl, 309462306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_b_5g_1_tbl); 309562306a36Sopenharmony_ci break; 309662306a36Sopenharmony_ci case RTW89_CH_5G_BAND_3: 309762306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 309862306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_a_5g_3_tbl, 309962306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_b_5g_3_tbl); 310062306a36Sopenharmony_ci break; 310162306a36Sopenharmony_ci case RTW89_CH_5G_BAND_4: 310262306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, path == RF_PATH_A, 310362306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_a_5g_4_tbl, 310462306a36Sopenharmony_ci &rtw8852a_tssi_pak_defs_b_5g_4_tbl); 310562306a36Sopenharmony_ci break; 310662306a36Sopenharmony_ci } 310762306a36Sopenharmony_ci} 310862306a36Sopenharmony_ci 310962306a36Sopenharmony_cistatic void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 311062306a36Sopenharmony_ci{ 311162306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 311262306a36Sopenharmony_ci u8 i; 311362306a36Sopenharmony_ci 311462306a36Sopenharmony_ci for (i = 0; i < RF_PATH_NUM_8852A; i++) { 311562306a36Sopenharmony_ci _tssi_set_track(rtwdev, phy, i); 311662306a36Sopenharmony_ci _tssi_set_txagc_offset_mv_avg(rtwdev, phy, i); 311762306a36Sopenharmony_ci 311862306a36Sopenharmony_ci rtw89_rfk_parser_by_cond(rtwdev, i == RF_PATH_A, 311962306a36Sopenharmony_ci &rtw8852a_tssi_enable_defs_a_tbl, 312062306a36Sopenharmony_ci &rtw8852a_tssi_enable_defs_b_tbl); 312162306a36Sopenharmony_ci 312262306a36Sopenharmony_ci tssi_info->base_thermal[i] = 312362306a36Sopenharmony_ci ewma_thermal_read(&rtwdev->phystat.avg_thermal[i]); 312462306a36Sopenharmony_ci rtwdev->is_tssi_mode[i] = true; 312562306a36Sopenharmony_ci } 312662306a36Sopenharmony_ci} 312762306a36Sopenharmony_ci 312862306a36Sopenharmony_cistatic void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 312962306a36Sopenharmony_ci{ 313062306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl); 313162306a36Sopenharmony_ci 313262306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_A] = false; 313362306a36Sopenharmony_ci rtwdev->is_tssi_mode[RF_PATH_B] = false; 313462306a36Sopenharmony_ci} 313562306a36Sopenharmony_ci 313662306a36Sopenharmony_cistatic u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch) 313762306a36Sopenharmony_ci{ 313862306a36Sopenharmony_ci switch (ch) { 313962306a36Sopenharmony_ci case 1 ... 2: 314062306a36Sopenharmony_ci return 0; 314162306a36Sopenharmony_ci case 3 ... 5: 314262306a36Sopenharmony_ci return 1; 314362306a36Sopenharmony_ci case 6 ... 8: 314462306a36Sopenharmony_ci return 2; 314562306a36Sopenharmony_ci case 9 ... 11: 314662306a36Sopenharmony_ci return 3; 314762306a36Sopenharmony_ci case 12 ... 13: 314862306a36Sopenharmony_ci return 4; 314962306a36Sopenharmony_ci case 14: 315062306a36Sopenharmony_ci return 5; 315162306a36Sopenharmony_ci } 315262306a36Sopenharmony_ci 315362306a36Sopenharmony_ci return 0; 315462306a36Sopenharmony_ci} 315562306a36Sopenharmony_ci 315662306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP_BIT (BIT(31)) 315762306a36Sopenharmony_ci#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx)) 315862306a36Sopenharmony_ci#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT) 315962306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT) 316062306a36Sopenharmony_ci#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1) 316162306a36Sopenharmony_ci 316262306a36Sopenharmony_cistatic u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch) 316362306a36Sopenharmony_ci{ 316462306a36Sopenharmony_ci switch (ch) { 316562306a36Sopenharmony_ci case 1 ... 2: 316662306a36Sopenharmony_ci return 0; 316762306a36Sopenharmony_ci case 3 ... 5: 316862306a36Sopenharmony_ci return 1; 316962306a36Sopenharmony_ci case 6 ... 8: 317062306a36Sopenharmony_ci return 2; 317162306a36Sopenharmony_ci case 9 ... 11: 317262306a36Sopenharmony_ci return 3; 317362306a36Sopenharmony_ci case 12 ... 14: 317462306a36Sopenharmony_ci return 4; 317562306a36Sopenharmony_ci case 36 ... 40: 317662306a36Sopenharmony_ci return 5; 317762306a36Sopenharmony_ci case 41 ... 43: 317862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(5); 317962306a36Sopenharmony_ci case 44 ... 48: 318062306a36Sopenharmony_ci return 6; 318162306a36Sopenharmony_ci case 49 ... 51: 318262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(6); 318362306a36Sopenharmony_ci case 52 ... 56: 318462306a36Sopenharmony_ci return 7; 318562306a36Sopenharmony_ci case 57 ... 59: 318662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(7); 318762306a36Sopenharmony_ci case 60 ... 64: 318862306a36Sopenharmony_ci return 8; 318962306a36Sopenharmony_ci case 100 ... 104: 319062306a36Sopenharmony_ci return 9; 319162306a36Sopenharmony_ci case 105 ... 107: 319262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(9); 319362306a36Sopenharmony_ci case 108 ... 112: 319462306a36Sopenharmony_ci return 10; 319562306a36Sopenharmony_ci case 113 ... 115: 319662306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(10); 319762306a36Sopenharmony_ci case 116 ... 120: 319862306a36Sopenharmony_ci return 11; 319962306a36Sopenharmony_ci case 121 ... 123: 320062306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(11); 320162306a36Sopenharmony_ci case 124 ... 128: 320262306a36Sopenharmony_ci return 12; 320362306a36Sopenharmony_ci case 129 ... 131: 320462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(12); 320562306a36Sopenharmony_ci case 132 ... 136: 320662306a36Sopenharmony_ci return 13; 320762306a36Sopenharmony_ci case 137 ... 139: 320862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(13); 320962306a36Sopenharmony_ci case 140 ... 144: 321062306a36Sopenharmony_ci return 14; 321162306a36Sopenharmony_ci case 149 ... 153: 321262306a36Sopenharmony_ci return 15; 321362306a36Sopenharmony_ci case 154 ... 156: 321462306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(15); 321562306a36Sopenharmony_ci case 157 ... 161: 321662306a36Sopenharmony_ci return 16; 321762306a36Sopenharmony_ci case 162 ... 164: 321862306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(16); 321962306a36Sopenharmony_ci case 165 ... 169: 322062306a36Sopenharmony_ci return 17; 322162306a36Sopenharmony_ci case 170 ... 172: 322262306a36Sopenharmony_ci return TSSI_EXTRA_GROUP(17); 322362306a36Sopenharmony_ci case 173 ... 177: 322462306a36Sopenharmony_ci return 18; 322562306a36Sopenharmony_ci } 322662306a36Sopenharmony_ci 322762306a36Sopenharmony_ci return 0; 322862306a36Sopenharmony_ci} 322962306a36Sopenharmony_ci 323062306a36Sopenharmony_cistatic u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch) 323162306a36Sopenharmony_ci{ 323262306a36Sopenharmony_ci switch (ch) { 323362306a36Sopenharmony_ci case 1 ... 8: 323462306a36Sopenharmony_ci return 0; 323562306a36Sopenharmony_ci case 9 ... 14: 323662306a36Sopenharmony_ci return 1; 323762306a36Sopenharmony_ci case 36 ... 48: 323862306a36Sopenharmony_ci return 2; 323962306a36Sopenharmony_ci case 52 ... 64: 324062306a36Sopenharmony_ci return 3; 324162306a36Sopenharmony_ci case 100 ... 112: 324262306a36Sopenharmony_ci return 4; 324362306a36Sopenharmony_ci case 116 ... 128: 324462306a36Sopenharmony_ci return 5; 324562306a36Sopenharmony_ci case 132 ... 144: 324662306a36Sopenharmony_ci return 6; 324762306a36Sopenharmony_ci case 149 ... 177: 324862306a36Sopenharmony_ci return 7; 324962306a36Sopenharmony_ci } 325062306a36Sopenharmony_ci 325162306a36Sopenharmony_ci return 0; 325262306a36Sopenharmony_ci} 325362306a36Sopenharmony_ci 325462306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 325562306a36Sopenharmony_ci enum rtw89_rf_path path) 325662306a36Sopenharmony_ci{ 325762306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 325862306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 325962306a36Sopenharmony_ci u8 ch = chan->channel; 326062306a36Sopenharmony_ci u32 gidx, gidx_1st, gidx_2nd; 326162306a36Sopenharmony_ci s8 de_1st = 0; 326262306a36Sopenharmony_ci s8 de_2nd = 0; 326362306a36Sopenharmony_ci s8 val; 326462306a36Sopenharmony_ci 326562306a36Sopenharmony_ci gidx = _tssi_get_ofdm_group(rtwdev, ch); 326662306a36Sopenharmony_ci 326762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 326862306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", 326962306a36Sopenharmony_ci path, gidx); 327062306a36Sopenharmony_ci 327162306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(gidx)) { 327262306a36Sopenharmony_ci gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx); 327362306a36Sopenharmony_ci gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx); 327462306a36Sopenharmony_ci de_1st = tssi_info->tssi_mcs[path][gidx_1st]; 327562306a36Sopenharmony_ci de_2nd = tssi_info->tssi_mcs[path][gidx_2nd]; 327662306a36Sopenharmony_ci val = (de_1st + de_2nd) / 2; 327762306a36Sopenharmony_ci 327862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 327962306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n", 328062306a36Sopenharmony_ci path, val, de_1st, de_2nd); 328162306a36Sopenharmony_ci } else { 328262306a36Sopenharmony_ci val = tssi_info->tssi_mcs[path][gidx]; 328362306a36Sopenharmony_ci 328462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 328562306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs de=%d\n", path, val); 328662306a36Sopenharmony_ci } 328762306a36Sopenharmony_ci 328862306a36Sopenharmony_ci return val; 328962306a36Sopenharmony_ci} 329062306a36Sopenharmony_ci 329162306a36Sopenharmony_cistatic s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, 329262306a36Sopenharmony_ci enum rtw89_phy_idx phy, 329362306a36Sopenharmony_ci enum rtw89_rf_path path) 329462306a36Sopenharmony_ci{ 329562306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 329662306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 329762306a36Sopenharmony_ci u8 ch = chan->channel; 329862306a36Sopenharmony_ci u32 tgidx, tgidx_1st, tgidx_2nd; 329962306a36Sopenharmony_ci s8 tde_1st = 0; 330062306a36Sopenharmony_ci s8 tde_2nd = 0; 330162306a36Sopenharmony_ci s8 val; 330262306a36Sopenharmony_ci 330362306a36Sopenharmony_ci tgidx = _tssi_get_trim_group(rtwdev, ch); 330462306a36Sopenharmony_ci 330562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 330662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n", 330762306a36Sopenharmony_ci path, tgidx); 330862306a36Sopenharmony_ci 330962306a36Sopenharmony_ci if (IS_TSSI_EXTRA_GROUP(tgidx)) { 331062306a36Sopenharmony_ci tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx); 331162306a36Sopenharmony_ci tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx); 331262306a36Sopenharmony_ci tde_1st = tssi_info->tssi_trim[path][tgidx_1st]; 331362306a36Sopenharmony_ci tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd]; 331462306a36Sopenharmony_ci val = (tde_1st + tde_2nd) / 2; 331562306a36Sopenharmony_ci 331662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 331762306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n", 331862306a36Sopenharmony_ci path, val, tde_1st, tde_2nd); 331962306a36Sopenharmony_ci } else { 332062306a36Sopenharmony_ci val = tssi_info->tssi_trim[path][tgidx]; 332162306a36Sopenharmony_ci 332262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 332362306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs trim_de=%d\n", 332462306a36Sopenharmony_ci path, val); 332562306a36Sopenharmony_ci } 332662306a36Sopenharmony_ci 332762306a36Sopenharmony_ci return val; 332862306a36Sopenharmony_ci} 332962306a36Sopenharmony_ci 333062306a36Sopenharmony_cistatic void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, 333162306a36Sopenharmony_ci enum rtw89_phy_idx phy) 333262306a36Sopenharmony_ci{ 333362306a36Sopenharmony_ci#define __DE_MASK 0x003ff000 333462306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 333562306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 333662306a36Sopenharmony_ci static const u32 r_cck_long[RF_PATH_NUM_8852A] = {0x5858, 0x7858}; 333762306a36Sopenharmony_ci static const u32 r_cck_short[RF_PATH_NUM_8852A] = {0x5860, 0x7860}; 333862306a36Sopenharmony_ci static const u32 r_mcs_20m[RF_PATH_NUM_8852A] = {0x5838, 0x7838}; 333962306a36Sopenharmony_ci static const u32 r_mcs_40m[RF_PATH_NUM_8852A] = {0x5840, 0x7840}; 334062306a36Sopenharmony_ci static const u32 r_mcs_80m[RF_PATH_NUM_8852A] = {0x5848, 0x7848}; 334162306a36Sopenharmony_ci static const u32 r_mcs_80m_80m[RF_PATH_NUM_8852A] = {0x5850, 0x7850}; 334262306a36Sopenharmony_ci static const u32 r_mcs_5m[RF_PATH_NUM_8852A] = {0x5828, 0x7828}; 334362306a36Sopenharmony_ci static const u32 r_mcs_10m[RF_PATH_NUM_8852A] = {0x5830, 0x7830}; 334462306a36Sopenharmony_ci u8 ch = chan->channel; 334562306a36Sopenharmony_ci u8 i, gidx; 334662306a36Sopenharmony_ci s8 ofdm_de; 334762306a36Sopenharmony_ci s8 trim_de; 334862306a36Sopenharmony_ci s32 val; 334962306a36Sopenharmony_ci 335062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n", 335162306a36Sopenharmony_ci phy, ch); 335262306a36Sopenharmony_ci 335362306a36Sopenharmony_ci for (i = 0; i < RF_PATH_NUM_8852A; i++) { 335462306a36Sopenharmony_ci gidx = _tssi_get_cck_group(rtwdev, ch); 335562306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 335662306a36Sopenharmony_ci val = tssi_info->tssi_cck[i][gidx] + trim_de; 335762306a36Sopenharmony_ci 335862306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 335962306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n", 336062306a36Sopenharmony_ci i, gidx, tssi_info->tssi_cck[i][gidx], trim_de); 336162306a36Sopenharmony_ci 336262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_cck_long[i], __DE_MASK, val); 336362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_cck_short[i], __DE_MASK, val); 336462306a36Sopenharmony_ci 336562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 336662306a36Sopenharmony_ci "[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n", 336762306a36Sopenharmony_ci r_cck_long[i], 336862306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, r_cck_long[i], 336962306a36Sopenharmony_ci __DE_MASK)); 337062306a36Sopenharmony_ci 337162306a36Sopenharmony_ci ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i); 337262306a36Sopenharmony_ci trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i); 337362306a36Sopenharmony_ci val = ofdm_de + trim_de; 337462306a36Sopenharmony_ci 337562306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 337662306a36Sopenharmony_ci "[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n", 337762306a36Sopenharmony_ci i, ofdm_de, trim_de); 337862306a36Sopenharmony_ci 337962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_20m[i], __DE_MASK, val); 338062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_40m[i], __DE_MASK, val); 338162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_80m[i], __DE_MASK, val); 338262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_80m_80m[i], __DE_MASK, val); 338362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_5m[i], __DE_MASK, val); 338462306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, r_mcs_10m[i], __DE_MASK, val); 338562306a36Sopenharmony_ci 338662306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 338762306a36Sopenharmony_ci "[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n", 338862306a36Sopenharmony_ci r_mcs_20m[i], 338962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, r_mcs_20m[i], 339062306a36Sopenharmony_ci __DE_MASK)); 339162306a36Sopenharmony_ci } 339262306a36Sopenharmony_ci#undef __DE_MASK 339362306a36Sopenharmony_ci} 339462306a36Sopenharmony_ci 339562306a36Sopenharmony_cistatic void _tssi_track(struct rtw89_dev *rtwdev) 339662306a36Sopenharmony_ci{ 339762306a36Sopenharmony_ci static const u32 tx_gain_scale_table[] = { 339862306a36Sopenharmony_ci 0x400, 0x40e, 0x41d, 0x427, 0x43c, 0x44c, 0x45c, 0x46c, 339962306a36Sopenharmony_ci 0x400, 0x39d, 0x3ab, 0x3b8, 0x3c6, 0x3d4, 0x3e2, 0x3f1 340062306a36Sopenharmony_ci }; 340162306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 340262306a36Sopenharmony_ci u8 path; 340362306a36Sopenharmony_ci u8 cur_ther; 340462306a36Sopenharmony_ci s32 delta_ther = 0, gain_offset_int, gain_offset_float; 340562306a36Sopenharmony_ci s8 gain_offset; 340662306a36Sopenharmony_ci 340762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRK] %s:\n", 340862306a36Sopenharmony_ci __func__); 340962306a36Sopenharmony_ci 341062306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A]) 341162306a36Sopenharmony_ci return; 341262306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_B]) 341362306a36Sopenharmony_ci return; 341462306a36Sopenharmony_ci 341562306a36Sopenharmony_ci for (path = RF_PATH_A; path < RF_PATH_NUM_8852A; path++) { 341662306a36Sopenharmony_ci if (!tssi_info->tssi_tracking_check[path]) { 341762306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRK] return!!!\n"); 341862306a36Sopenharmony_ci continue; 341962306a36Sopenharmony_ci } 342062306a36Sopenharmony_ci 342162306a36Sopenharmony_ci cur_ther = (u8)rtw89_phy_read32_mask(rtwdev, 342262306a36Sopenharmony_ci R_TSSI_THER + (path << 13), 342362306a36Sopenharmony_ci B_TSSI_THER); 342462306a36Sopenharmony_ci 342562306a36Sopenharmony_ci if (cur_ther == 0 || tssi_info->base_thermal[path] == 0) 342662306a36Sopenharmony_ci continue; 342762306a36Sopenharmony_ci 342862306a36Sopenharmony_ci delta_ther = cur_ther - tssi_info->base_thermal[path]; 342962306a36Sopenharmony_ci 343062306a36Sopenharmony_ci gain_offset = (s8)delta_ther * 15 / 10; 343162306a36Sopenharmony_ci 343262306a36Sopenharmony_ci tssi_info->extra_ofst[path] = gain_offset; 343362306a36Sopenharmony_ci 343462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 343562306a36Sopenharmony_ci "[TSSI][TRK] base_thermal=%d gain_offset=0x%x path=%d\n", 343662306a36Sopenharmony_ci tssi_info->base_thermal[path], gain_offset, path); 343762306a36Sopenharmony_ci 343862306a36Sopenharmony_ci gain_offset_int = gain_offset >> 3; 343962306a36Sopenharmony_ci gain_offset_float = gain_offset & 7; 344062306a36Sopenharmony_ci 344162306a36Sopenharmony_ci if (gain_offset_int > 15) 344262306a36Sopenharmony_ci gain_offset_int = 15; 344362306a36Sopenharmony_ci else if (gain_offset_int < -16) 344462306a36Sopenharmony_ci gain_offset_int = -16; 344562306a36Sopenharmony_ci 344662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_EN + (path << 13), 344762306a36Sopenharmony_ci B_DPD_OFT_EN, 0x1); 344862306a36Sopenharmony_ci 344962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXGAIN_SCALE + (path << 13), 345062306a36Sopenharmony_ci B_TXGAIN_SCALE_EN, 0x1); 345162306a36Sopenharmony_ci 345262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_DPD_OFT_ADDR + (path << 13), 345362306a36Sopenharmony_ci B_DPD_OFT_ADDR, gain_offset_int); 345462306a36Sopenharmony_ci 345562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_TXGAIN_SCALE + (path << 13), 345662306a36Sopenharmony_ci B_TXGAIN_SCALE_OFT, 345762306a36Sopenharmony_ci tx_gain_scale_table[gain_offset_float]); 345862306a36Sopenharmony_ci } 345962306a36Sopenharmony_ci} 346062306a36Sopenharmony_ci 346162306a36Sopenharmony_cistatic void _tssi_high_power(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 346262306a36Sopenharmony_ci{ 346362306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 346462306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 346562306a36Sopenharmony_ci u8 ch = chan->channel, ch_tmp; 346662306a36Sopenharmony_ci u8 bw = chan->band_width; 346762306a36Sopenharmony_ci u8 band = chan->band_type; 346862306a36Sopenharmony_ci u8 subband = chan->subband_type; 346962306a36Sopenharmony_ci s8 power; 347062306a36Sopenharmony_ci s32 xdbm; 347162306a36Sopenharmony_ci 347262306a36Sopenharmony_ci if (bw == RTW89_CHANNEL_WIDTH_40) 347362306a36Sopenharmony_ci ch_tmp = ch - 2; 347462306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_80) 347562306a36Sopenharmony_ci ch_tmp = ch - 6; 347662306a36Sopenharmony_ci else 347762306a36Sopenharmony_ci ch_tmp = ch; 347862306a36Sopenharmony_ci 347962306a36Sopenharmony_ci power = rtw89_phy_read_txpwr_limit(rtwdev, band, bw, RTW89_1TX, 348062306a36Sopenharmony_ci RTW89_RS_MCS, RTW89_NONBF, ch_tmp); 348162306a36Sopenharmony_ci 348262306a36Sopenharmony_ci xdbm = power * 100 / 4; 348362306a36Sopenharmony_ci 348462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d xdbm=%d\n", 348562306a36Sopenharmony_ci __func__, phy, xdbm); 348662306a36Sopenharmony_ci 348762306a36Sopenharmony_ci if (xdbm > 1800 && subband == RTW89_CH_2G) { 348862306a36Sopenharmony_ci tssi_info->tssi_tracking_check[RF_PATH_A] = true; 348962306a36Sopenharmony_ci tssi_info->tssi_tracking_check[RF_PATH_B] = true; 349062306a36Sopenharmony_ci } else { 349162306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_tracking_defs_tbl); 349262306a36Sopenharmony_ci tssi_info->extra_ofst[RF_PATH_A] = 0; 349362306a36Sopenharmony_ci tssi_info->extra_ofst[RF_PATH_B] = 0; 349462306a36Sopenharmony_ci tssi_info->tssi_tracking_check[RF_PATH_A] = false; 349562306a36Sopenharmony_ci tssi_info->tssi_tracking_check[RF_PATH_B] = false; 349662306a36Sopenharmony_ci } 349762306a36Sopenharmony_ci} 349862306a36Sopenharmony_ci 349962306a36Sopenharmony_cistatic void _tssi_hw_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 350062306a36Sopenharmony_ci u8 path, s16 pwr_dbm, u8 enable) 350162306a36Sopenharmony_ci{ 350262306a36Sopenharmony_ci rtw8852a_bb_set_plcp_tx(rtwdev); 350362306a36Sopenharmony_ci rtw8852a_bb_cfg_tx_path(rtwdev, path); 350462306a36Sopenharmony_ci rtw8852a_bb_set_power(rtwdev, pwr_dbm, phy); 350562306a36Sopenharmony_ci rtw8852a_bb_set_pmac_pkt_tx(rtwdev, enable, 20, 5000, 0, phy); 350662306a36Sopenharmony_ci} 350762306a36Sopenharmony_ci 350862306a36Sopenharmony_cistatic void _tssi_pre_tx(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 350962306a36Sopenharmony_ci{ 351062306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 351162306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 351262306a36Sopenharmony_ci const struct rtw89_chip_info *mac_reg = rtwdev->chip; 351362306a36Sopenharmony_ci u8 ch = chan->channel, ch_tmp; 351462306a36Sopenharmony_ci u8 bw = chan->band_width; 351562306a36Sopenharmony_ci u8 band = chan->band_type; 351662306a36Sopenharmony_ci u32 tx_en; 351762306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy, 0); 351862306a36Sopenharmony_ci s8 power; 351962306a36Sopenharmony_ci s16 xdbm; 352062306a36Sopenharmony_ci u32 i, tx_counter = 0; 352162306a36Sopenharmony_ci 352262306a36Sopenharmony_ci if (bw == RTW89_CHANNEL_WIDTH_40) 352362306a36Sopenharmony_ci ch_tmp = ch - 2; 352462306a36Sopenharmony_ci else if (bw == RTW89_CHANNEL_WIDTH_80) 352562306a36Sopenharmony_ci ch_tmp = ch - 6; 352662306a36Sopenharmony_ci else 352762306a36Sopenharmony_ci ch_tmp = ch; 352862306a36Sopenharmony_ci 352962306a36Sopenharmony_ci power = rtw89_phy_read_txpwr_limit(rtwdev, band, RTW89_CHANNEL_WIDTH_20, 353062306a36Sopenharmony_ci RTW89_1TX, RTW89_RS_OFDM, 353162306a36Sopenharmony_ci RTW89_NONBF, ch_tmp); 353262306a36Sopenharmony_ci 353362306a36Sopenharmony_ci xdbm = (power * 100) >> mac_reg->txpwr_factor_mac; 353462306a36Sopenharmony_ci 353562306a36Sopenharmony_ci if (xdbm > 1800) 353662306a36Sopenharmony_ci xdbm = 68; 353762306a36Sopenharmony_ci else 353862306a36Sopenharmony_ci xdbm = power * 2; 353962306a36Sopenharmony_ci 354062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 354162306a36Sopenharmony_ci "[TSSI] %s: phy=%d org_power=%d xdbm=%d\n", 354262306a36Sopenharmony_ci __func__, phy, power, xdbm); 354362306a36Sopenharmony_ci 354462306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 354562306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy, &tx_en, RTW89_SCH_TX_SEL_ALL); 354662306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy)); 354762306a36Sopenharmony_ci tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD); 354862306a36Sopenharmony_ci 354962306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, true); 355062306a36Sopenharmony_ci mdelay(15); 355162306a36Sopenharmony_ci _tssi_hw_tx(rtwdev, phy, RF_PATH_AB, xdbm, false); 355262306a36Sopenharmony_ci 355362306a36Sopenharmony_ci tx_counter = rtw89_phy_read32_mask(rtwdev, R_TX_COUNTER, MASKLWORD) - 355462306a36Sopenharmony_ci tx_counter; 355562306a36Sopenharmony_ci 355662306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, MASKHWORD) != 0xc000 && 355762306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, MASKHWORD) != 0x0) { 355862306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 355962306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A] = 356062306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, 356162306a36Sopenharmony_ci MASKBYTE3); 356262306a36Sopenharmony_ci 356362306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_A] != 0x0) 356462306a36Sopenharmony_ci break; 356562306a36Sopenharmony_ci } 356662306a36Sopenharmony_ci } 356762306a36Sopenharmony_ci 356862306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, MASKHWORD) != 0xc000 && 356962306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, MASKHWORD) != 0x0) { 357062306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 357162306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B] = 357262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, 357362306a36Sopenharmony_ci MASKBYTE3); 357462306a36Sopenharmony_ci 357562306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_B] != 0x0) 357662306a36Sopenharmony_ci break; 357762306a36Sopenharmony_ci } 357862306a36Sopenharmony_ci } 357962306a36Sopenharmony_ci 358062306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 358162306a36Sopenharmony_ci "[TSSI] %s: tx counter=%d\n", 358262306a36Sopenharmony_ci __func__, tx_counter); 358362306a36Sopenharmony_ci 358462306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, 358562306a36Sopenharmony_ci "[TSSI] Backup R_TXAGC_BB=0x%x R_TXAGC_BB_S1=0x%x\n", 358662306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A], 358762306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B]); 358862306a36Sopenharmony_ci 358962306a36Sopenharmony_ci rtw8852a_bb_tx_mode_switch(rtwdev, phy, 0); 359062306a36Sopenharmony_ci 359162306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy, tx_en); 359262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 359362306a36Sopenharmony_ci} 359462306a36Sopenharmony_ci 359562306a36Sopenharmony_civoid rtw8852a_rck(struct rtw89_dev *rtwdev) 359662306a36Sopenharmony_ci{ 359762306a36Sopenharmony_ci u8 path; 359862306a36Sopenharmony_ci 359962306a36Sopenharmony_ci for (path = 0; path < 2; path++) 360062306a36Sopenharmony_ci _rck(rtwdev, path); 360162306a36Sopenharmony_ci} 360262306a36Sopenharmony_ci 360362306a36Sopenharmony_civoid rtw8852a_dack(struct rtw89_dev *rtwdev) 360462306a36Sopenharmony_ci{ 360562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, RTW89_PHY_0, 0); 360662306a36Sopenharmony_ci 360762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_START); 360862306a36Sopenharmony_ci _dac_cal(rtwdev, false); 360962306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DACK, BTC_WRFK_STOP); 361062306a36Sopenharmony_ci} 361162306a36Sopenharmony_ci 361262306a36Sopenharmony_civoid rtw8852a_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 361362306a36Sopenharmony_ci{ 361462306a36Sopenharmony_ci u32 tx_en; 361562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 361662306a36Sopenharmony_ci 361762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START); 361862306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 361962306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 362062306a36Sopenharmony_ci 362162306a36Sopenharmony_ci _iqk_init(rtwdev); 362262306a36Sopenharmony_ci if (rtwdev->dbcc_en) 362362306a36Sopenharmony_ci _iqk_dbcc(rtwdev, phy_idx); 362462306a36Sopenharmony_ci else 362562306a36Sopenharmony_ci _iqk(rtwdev, phy_idx, false); 362662306a36Sopenharmony_ci 362762306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 362862306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP); 362962306a36Sopenharmony_ci} 363062306a36Sopenharmony_ci 363162306a36Sopenharmony_civoid rtw8852a_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 363262306a36Sopenharmony_ci bool is_afe) 363362306a36Sopenharmony_ci{ 363462306a36Sopenharmony_ci u32 tx_en; 363562306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 363662306a36Sopenharmony_ci 363762306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 363862306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 363962306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 364062306a36Sopenharmony_ci 364162306a36Sopenharmony_ci _rx_dck(rtwdev, phy_idx, is_afe); 364262306a36Sopenharmony_ci 364362306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 364462306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 364562306a36Sopenharmony_ci} 364662306a36Sopenharmony_ci 364762306a36Sopenharmony_civoid rtw8852a_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 364862306a36Sopenharmony_ci{ 364962306a36Sopenharmony_ci u32 tx_en; 365062306a36Sopenharmony_ci u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 365162306a36Sopenharmony_ci 365262306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START); 365362306a36Sopenharmony_ci rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 365462306a36Sopenharmony_ci _wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx)); 365562306a36Sopenharmony_ci 365662306a36Sopenharmony_ci rtwdev->dpk.is_dpk_enable = true; 365762306a36Sopenharmony_ci rtwdev->dpk.is_dpk_reload_en = false; 365862306a36Sopenharmony_ci _dpk(rtwdev, phy_idx, false); 365962306a36Sopenharmony_ci 366062306a36Sopenharmony_ci rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 366162306a36Sopenharmony_ci rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP); 366262306a36Sopenharmony_ci} 366362306a36Sopenharmony_ci 366462306a36Sopenharmony_civoid rtw8852a_dpk_track(struct rtw89_dev *rtwdev) 366562306a36Sopenharmony_ci{ 366662306a36Sopenharmony_ci _dpk_track(rtwdev); 366762306a36Sopenharmony_ci} 366862306a36Sopenharmony_ci 366962306a36Sopenharmony_civoid rtw8852a_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 367062306a36Sopenharmony_ci{ 367162306a36Sopenharmony_ci u8 i; 367262306a36Sopenharmony_ci 367362306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", 367462306a36Sopenharmony_ci __func__, phy); 367562306a36Sopenharmony_ci 367662306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 367762306a36Sopenharmony_ci 367862306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) { 367962306a36Sopenharmony_ci _tssi_rf_setting(rtwdev, phy, i); 368062306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy); 368162306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i); 368262306a36Sopenharmony_ci _tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i); 368362306a36Sopenharmony_ci _tssi_set_dck(rtwdev, phy, i); 368462306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 368562306a36Sopenharmony_ci _tssi_set_dac_gain_tbl(rtwdev, phy, i); 368662306a36Sopenharmony_ci _tssi_slope_cal_org(rtwdev, phy, i); 368762306a36Sopenharmony_ci _tssi_set_rf_gap_tbl(rtwdev, phy, i); 368862306a36Sopenharmony_ci _tssi_set_slope(rtwdev, phy, i); 368962306a36Sopenharmony_ci _tssi_pak(rtwdev, phy, i); 369062306a36Sopenharmony_ci } 369162306a36Sopenharmony_ci 369262306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 369362306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 369462306a36Sopenharmony_ci _tssi_high_power(rtwdev, phy); 369562306a36Sopenharmony_ci _tssi_pre_tx(rtwdev, phy); 369662306a36Sopenharmony_ci} 369762306a36Sopenharmony_ci 369862306a36Sopenharmony_civoid rtw8852a_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 369962306a36Sopenharmony_ci{ 370062306a36Sopenharmony_ci u8 i; 370162306a36Sopenharmony_ci 370262306a36Sopenharmony_ci rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", 370362306a36Sopenharmony_ci __func__, phy); 370462306a36Sopenharmony_ci 370562306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A]) 370662306a36Sopenharmony_ci return; 370762306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_B]) 370862306a36Sopenharmony_ci return; 370962306a36Sopenharmony_ci 371062306a36Sopenharmony_ci _tssi_disable(rtwdev, phy); 371162306a36Sopenharmony_ci 371262306a36Sopenharmony_ci for (i = RF_PATH_A; i < RF_PATH_NUM_8852A; i++) { 371362306a36Sopenharmony_ci _tssi_rf_setting(rtwdev, phy, i); 371462306a36Sopenharmony_ci _tssi_set_sys(rtwdev, phy); 371562306a36Sopenharmony_ci _tssi_set_tmeter_tbl(rtwdev, phy, i); 371662306a36Sopenharmony_ci _tssi_pak(rtwdev, phy, i); 371762306a36Sopenharmony_ci } 371862306a36Sopenharmony_ci 371962306a36Sopenharmony_ci _tssi_enable(rtwdev, phy); 372062306a36Sopenharmony_ci _tssi_set_efuse_to_de(rtwdev, phy); 372162306a36Sopenharmony_ci} 372262306a36Sopenharmony_ci 372362306a36Sopenharmony_civoid rtw8852a_tssi_track(struct rtw89_dev *rtwdev) 372462306a36Sopenharmony_ci{ 372562306a36Sopenharmony_ci _tssi_track(rtwdev); 372662306a36Sopenharmony_ci} 372762306a36Sopenharmony_ci 372862306a36Sopenharmony_cistatic 372962306a36Sopenharmony_civoid _rtw8852a_tssi_avg_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 373062306a36Sopenharmony_ci{ 373162306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 373262306a36Sopenharmony_ci return; 373362306a36Sopenharmony_ci 373462306a36Sopenharmony_ci /* disable */ 373562306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl); 373662306a36Sopenharmony_ci 373762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x0); 373862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x0); 373962306a36Sopenharmony_ci 374062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x0); 374162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x0); 374262306a36Sopenharmony_ci 374362306a36Sopenharmony_ci /* enable */ 374462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_enable_defs_ab_tbl); 374562306a36Sopenharmony_ci} 374662306a36Sopenharmony_ci 374762306a36Sopenharmony_cistatic 374862306a36Sopenharmony_civoid _rtw8852a_tssi_set_avg(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy) 374962306a36Sopenharmony_ci{ 375062306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 375162306a36Sopenharmony_ci return; 375262306a36Sopenharmony_ci 375362306a36Sopenharmony_ci /* disable */ 375462306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_disable_defs_tbl); 375562306a36Sopenharmony_ci 375662306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_AVG, 0x4); 375762306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_AVG, 0x2); 375862306a36Sopenharmony_ci 375962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_AVG, B_P1_TSSI_AVG, 0x4); 376062306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_MV_AVG, B_P1_TSSI_MV_AVG, 0x2); 376162306a36Sopenharmony_ci 376262306a36Sopenharmony_ci /* enable */ 376362306a36Sopenharmony_ci rtw89_rfk_parser(rtwdev, &rtw8852a_tssi_enable_defs_ab_tbl); 376462306a36Sopenharmony_ci} 376562306a36Sopenharmony_ci 376662306a36Sopenharmony_cistatic void rtw8852a_tssi_set_avg(struct rtw89_dev *rtwdev, 376762306a36Sopenharmony_ci enum rtw89_phy_idx phy, bool enable) 376862306a36Sopenharmony_ci{ 376962306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 377062306a36Sopenharmony_ci return; 377162306a36Sopenharmony_ci 377262306a36Sopenharmony_ci if (enable) { 377362306a36Sopenharmony_ci /* SCAN_START */ 377462306a36Sopenharmony_ci _rtw8852a_tssi_avg_scan(rtwdev, phy); 377562306a36Sopenharmony_ci } else { 377662306a36Sopenharmony_ci /* SCAN_END */ 377762306a36Sopenharmony_ci _rtw8852a_tssi_set_avg(rtwdev, phy); 377862306a36Sopenharmony_ci } 377962306a36Sopenharmony_ci} 378062306a36Sopenharmony_ci 378162306a36Sopenharmony_cistatic void rtw8852a_tssi_default_txagc(struct rtw89_dev *rtwdev, 378262306a36Sopenharmony_ci enum rtw89_phy_idx phy, bool enable) 378362306a36Sopenharmony_ci{ 378462306a36Sopenharmony_ci struct rtw89_tssi_info *tssi_info = &rtwdev->tssi; 378562306a36Sopenharmony_ci u8 i; 378662306a36Sopenharmony_ci 378762306a36Sopenharmony_ci if (!rtwdev->is_tssi_mode[RF_PATH_A] && !rtwdev->is_tssi_mode[RF_PATH_B]) 378862306a36Sopenharmony_ci return; 378962306a36Sopenharmony_ci 379062306a36Sopenharmony_ci if (enable) { 379162306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0xc000 && 379262306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, B_TXAGC_BB_OFT) != 0x0) { 379362306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 379462306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A] = 379562306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB, 379662306a36Sopenharmony_ci B_TXAGC_BB); 379762306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_A]) 379862306a36Sopenharmony_ci break; 379962306a36Sopenharmony_ci } 380062306a36Sopenharmony_ci } 380162306a36Sopenharmony_ci 380262306a36Sopenharmony_ci if (rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0xc000 && 380362306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, B_TXAGC_BB_S1_OFT) != 0x0) { 380462306a36Sopenharmony_ci for (i = 0; i < 6; i++) { 380562306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B] = 380662306a36Sopenharmony_ci rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB_S1, 380762306a36Sopenharmony_ci B_TXAGC_BB_S1); 380862306a36Sopenharmony_ci if (tssi_info->default_txagc_offset[RF_PATH_B]) 380962306a36Sopenharmony_ci break; 381062306a36Sopenharmony_ci } 381162306a36Sopenharmony_ci } 381262306a36Sopenharmony_ci } else { 381362306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 381462306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_A]); 381562306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT, 381662306a36Sopenharmony_ci tssi_info->default_txagc_offset[RF_PATH_B]); 381762306a36Sopenharmony_ci 381862306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0); 381962306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1); 382062306a36Sopenharmony_ci 382162306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x0); 382262306a36Sopenharmony_ci rtw89_phy_write32_mask(rtwdev, R_P1_TSSI_TRK, B_P1_TSSI_OFT_EN, 0x1); 382362306a36Sopenharmony_ci } 382462306a36Sopenharmony_ci} 382562306a36Sopenharmony_ci 382662306a36Sopenharmony_civoid rtw8852a_wifi_scan_notify(struct rtw89_dev *rtwdev, 382762306a36Sopenharmony_ci bool scan_start, enum rtw89_phy_idx phy_idx) 382862306a36Sopenharmony_ci{ 382962306a36Sopenharmony_ci if (scan_start) { 383062306a36Sopenharmony_ci rtw8852a_tssi_default_txagc(rtwdev, phy_idx, true); 383162306a36Sopenharmony_ci rtw8852a_tssi_set_avg(rtwdev, phy_idx, true); 383262306a36Sopenharmony_ci } else { 383362306a36Sopenharmony_ci rtw8852a_tssi_default_txagc(rtwdev, phy_idx, false); 383462306a36Sopenharmony_ci rtw8852a_tssi_set_avg(rtwdev, phy_idx, false); 383562306a36Sopenharmony_ci } 383662306a36Sopenharmony_ci} 3837