Path: blob/main/sys/contrib/dev/rtw89/rtw8851b_rfk.c
109304 views
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause1/* Copyright(c) 2022-2023 Realtek Corporation2*/34#include "coex.h"5#include "debug.h"6#include "mac.h"7#include "phy.h"8#include "reg.h"9#include "rtw8851b.h"10#include "rtw8851b_rfk.h"11#include "rtw8851b_rfk_table.h"12#include "rtw8851b_table.h"1314#define DPK_VER_8851B 0x1115#define DPK_KIP_REG_NUM_8851B 816#define DPK_RF_REG_NUM_8851B 417#define DPK_KSET_NUM 418#define RTW8851B_RXK_GROUP_NR 419#define RTW8851B_RXK_GROUP_IDX_NR 420#define RTW8851B_A_TXK_GROUP_NR 221#define RTW8851B_G_TXK_GROUP_NR 122#define RTW8851B_IQK_VER 0x1423#define RTW8851B_IQK_SS 124#define RTW8851B_LOK_GRAM 1025#define RTW8851B_TSSI_PATH_NR 12627#define _TSSI_DE_MASK GENMASK(21, 12)2829enum dpk_id {30LBK_RXIQK = 0x06,31SYNC = 0x10,32MDPK_IDL = 0x11,33MDPK_MPA = 0x12,34GAIN_LOSS = 0x13,35GAIN_CAL = 0x14,36DPK_RXAGC = 0x15,37KIP_PRESET = 0x16,38KIP_RESTORE = 0x17,39DPK_TXAGC = 0x19,40D_KIP_PRESET = 0x28,41D_TXAGC = 0x29,42D_RXAGC = 0x2a,43D_SYNC = 0x2b,44D_GAIN_LOSS = 0x2c,45D_MDPK_IDL = 0x2d,46D_MDPK_LDL = 0x2e,47D_GAIN_NORM = 0x2f,48D_KIP_THERMAL = 0x30,49D_KIP_RESTORE = 0x3150};5152enum dpk_agc_step {53DPK_AGC_STEP_SYNC_DGAIN,54DPK_AGC_STEP_GAIN_LOSS_IDX,55DPK_AGC_STEP_GL_GT_CRITERION,56DPK_AGC_STEP_GL_LT_CRITERION,57DPK_AGC_STEP_SET_TX_GAIN,58};5960enum rtw8851b_iqk_type {61ID_TXAGC = 0x0,62ID_FLOK_COARSE = 0x1,63ID_FLOK_FINE = 0x2,64ID_TXK = 0x3,65ID_RXAGC = 0x4,66ID_RXK = 0x5,67ID_NBTXK = 0x6,68ID_NBRXK = 0x7,69ID_FLOK_VBUFFER = 0x8,70ID_A_FLOK_COARSE = 0x9,71ID_G_FLOK_COARSE = 0xa,72ID_A_FLOK_FINE = 0xb,73ID_G_FLOK_FINE = 0xc,74ID_IQK_RESTORE = 0x10,75};7677enum rf_mode {78RF_SHUT_DOWN = 0x0,79RF_STANDBY = 0x1,80RF_TX = 0x2,81RF_RX = 0x3,82RF_TXIQK = 0x4,83RF_DPK = 0x5,84RF_RXK1 = 0x6,85RF_RXK2 = 0x7,86};8788enum adc_ck {89ADC_NA = 0,90ADC_480M = 1,91ADC_960M = 2,92ADC_1920M = 3,93};9495enum dac_ck {96DAC_40M = 0,97DAC_80M = 1,98DAC_120M = 2,99DAC_160M = 3,100DAC_240M = 4,101DAC_320M = 5,102DAC_480M = 6,103DAC_960M = 7,104};105106static const u32 _tssi_de_cck_long[RF_PATH_NUM_8851B] = {0x5858};107static const u32 _tssi_de_cck_short[RF_PATH_NUM_8851B] = {0x5860};108static const u32 _tssi_de_mcs_20m[RF_PATH_NUM_8851B] = {0x5838};109static const u32 _tssi_de_mcs_40m[RF_PATH_NUM_8851B] = {0x5840};110static const u32 _tssi_de_mcs_80m[RF_PATH_NUM_8851B] = {0x5848};111static const u32 _tssi_de_mcs_80m_80m[RF_PATH_NUM_8851B] = {0x5850};112static const u32 _tssi_de_mcs_5m[RF_PATH_NUM_8851B] = {0x5828};113static const u32 _tssi_de_mcs_10m[RF_PATH_NUM_8851B] = {0x5830};114static const u32 g_idxrxgain[RTW8851B_RXK_GROUP_NR] = {0x10e, 0x116, 0x28e, 0x296};115static const u32 g_idxattc2[RTW8851B_RXK_GROUP_NR] = {0x0, 0xf, 0x0, 0xf};116static const u32 g_idxrxagc[RTW8851B_RXK_GROUP_NR] = {0x0, 0x1, 0x2, 0x3};117static const u32 a_idxrxgain[RTW8851B_RXK_GROUP_IDX_NR] = {0x10C, 0x112, 0x28c, 0x292};118static const u32 a_idxattc2[RTW8851B_RXK_GROUP_IDX_NR] = {0xf, 0xf, 0xf, 0xf};119static const u32 a_idxrxagc[RTW8851B_RXK_GROUP_IDX_NR] = {0x4, 0x5, 0x6, 0x7};120static const u32 a_power_range[RTW8851B_A_TXK_GROUP_NR] = {0x0, 0x0};121static const u32 a_track_range[RTW8851B_A_TXK_GROUP_NR] = {0x7, 0x7};122static const u32 a_gain_bb[RTW8851B_A_TXK_GROUP_NR] = {0x08, 0x0d};123static const u32 a_itqt[RTW8851B_A_TXK_GROUP_NR] = {0x12, 0x12};124static const u32 a_att_smxr[RTW8851B_A_TXK_GROUP_NR] = {0x0, 0x2};125static const u32 g_power_range[RTW8851B_G_TXK_GROUP_NR] = {0x0};126static const u32 g_track_range[RTW8851B_G_TXK_GROUP_NR] = {0x6};127static const u32 g_gain_bb[RTW8851B_G_TXK_GROUP_NR] = {0x10};128static const u32 g_itqt[RTW8851B_G_TXK_GROUP_NR] = {0x12};129130static const u32 rtw8851b_backup_bb_regs[] = {1310xc0d4, 0xc0d8, 0xc0c4, 0xc0ec, 0xc0e8, 0x12a0, 0xc0f0};132static const u32 rtw8851b_backup_rf_regs[] = {1330xef, 0xde, 0x0, 0x1e, 0x2, 0x85, 0x90, 0x5};134135#define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8851b_backup_bb_regs)136#define BACKUP_RF_REGS_NR ARRAY_SIZE(rtw8851b_backup_rf_regs)137138static const u32 dpk_kip_reg[DPK_KIP_REG_NUM_8851B] = {1390x813c, 0x8124, 0xc0ec, 0xc0e8, 0xc0c4, 0xc0d4, 0xc0d8, 0x12a0};140static const u32 dpk_rf_reg[DPK_RF_REG_NUM_8851B] = {0xde, 0x8f, 0x5, 0x10005};141142static void _set_ch(struct rtw89_dev *rtwdev, u32 val);143144static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)145{146return RF_A;147}148149static void _adc_fifo_rst(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,150u8 path)151{152rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0101);153fsleep(10);154rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x1111);155}156157static void _rfk_rf_direct_cntrl(struct rtw89_dev *rtwdev,158enum rtw89_rf_path path, bool is_bybb)159{160if (is_bybb)161rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x1);162else163rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);164}165166static void _rfk_drf_direct_cntrl(struct rtw89_dev *rtwdev,167enum rtw89_rf_path path, bool is_bybb)168{169if (is_bybb)170rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x1);171else172rtw89_write_rf(rtwdev, path, RR_BBDC, RR_BBDC_SEL, 0x0);173}174175static void _txck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,176bool force, enum dac_ck ck)177{178rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x0);179180if (!force)181return;182183rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_VAL, ck);184rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_TXCK_ON, 0x1);185}186187static void _rxck_force(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,188bool force, enum adc_ck ck)189{190static const u32 ck960_8851b[] = {0x8, 0x2, 0x2, 0x4, 0xf, 0xa, 0x92};191static const u32 ck1920_8851b[] = {0x9, 0x0, 0x0, 0x3, 0xf, 0xa, 0x49};192const u32 *data;193194rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x0);195if (!force)196return;197198rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_VAL, ck);199rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x1);200201switch (ck) {202case ADC_960M:203data = ck960_8851b;204break;205case ADC_1920M:206default:207data = ck1920_8851b;208break;209}210211rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_CTL, data[0]);212rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_EN, data[1]);213rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, data[2]);214rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, data[3]);215rtw89_phy_write32_mask(rtwdev, R_DRCK | (path << 8), B_DRCK_MUL, data[4]);216rtw89_phy_write32_mask(rtwdev, R_ADCMOD | (path << 8), B_ADCMOD_LP, data[5]);217rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 8), B_P0_RXCK_ADJ, data[6]);218}219220static void _wait_rx_mode(struct rtw89_dev *rtwdev, u8 kpath)221{222u32 rf_mode;223u8 path;224int ret;225226for (path = 0; path < RF_PATH_MAX; path++) {227if (!(kpath & BIT(path)))228continue;229230ret = read_poll_timeout_atomic(rtw89_read_rf, rf_mode,231rf_mode != 2, 2, 5000, false,232rtwdev, path, 0x00, RR_MOD_MASK);233rtw89_debug(rtwdev, RTW89_DBG_RFK,234"[RFK] Wait S%d to Rx mode!! (ret = %d)\n",235path, ret);236}237}238239static void _dack_reset(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)240{241rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x0);242rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_RST, 0x1);243}244245static void _drck(struct rtw89_dev *rtwdev)246{247u32 rck_d;248u32 val;249int ret;250251rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]Ddie RCK start!!!\n");252253rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x1);254rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x1);255256ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,2571, 10000, false,258rtwdev, R_DRCK_RES, B_DRCK_POL);259if (ret)260rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DRCK timeout\n");261262rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_EN, 0x0);263rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x1);264udelay(1);265rtw89_phy_write32_mask(rtwdev, R_DRCK_FH, B_DRCK_LAT, 0x0);266267rck_d = rtw89_phy_read32_mask(rtwdev, R_DRCK_RES, 0x7c00);268rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_IDLE, 0x0);269rtw89_phy_write32_mask(rtwdev, R_DRCK, B_DRCK_VAL, rck_d);270271rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0xc0c4 = 0x%x\n",272rtw89_phy_read32_mask(rtwdev, R_DRCK, MASKDWORD));273}274275static void _addck_backup(struct rtw89_dev *rtwdev)276{277struct rtw89_dack_info *dack = &rtwdev->dack;278279rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x0);280281dack->addck_d[0][0] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A0);282dack->addck_d[0][1] = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_A1);283}284285static void _addck_reload(struct rtw89_dev *rtwdev)286{287struct rtw89_dack_info *dack = &rtwdev->dack;288289rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL1, dack->addck_d[0][0]);290rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RL0, dack->addck_d[0][1]);291rtw89_phy_write32_mask(rtwdev, R_ADDCK0_RL, B_ADDCK0_RLS, 0x3);292}293294static void _dack_backup_s0(struct rtw89_dev *rtwdev)295{296struct rtw89_dack_info *dack = &rtwdev->dack;297u8 i;298299rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);300301for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {302rtw89_phy_write32_mask(rtwdev, R_DCOF0, B_DCOF0_V, i);303dack->msbk_d[0][0][i] =304rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0M0);305306rtw89_phy_write32_mask(rtwdev, R_DCOF8, B_DCOF8_V, i);307dack->msbk_d[0][1][i] =308rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0M1);309}310311dack->biask_d[0][0] =312rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS00, B_DACK_BIAS00);313dack->biask_d[0][1] =314rtw89_phy_read32_mask(rtwdev, R_DACK_BIAS01, B_DACK_BIAS01);315dack->dadck_d[0][0] =316rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK00, B_DACK_DADCK00) + 24;317dack->dadck_d[0][1] =318rtw89_phy_read32_mask(rtwdev, R_DACK_DADCK01, B_DACK_DADCK01) + 24;319}320321static void _dack_reload_by_path(struct rtw89_dev *rtwdev,322enum rtw89_rf_path path, u8 index)323{324struct rtw89_dack_info *dack = &rtwdev->dack;325u32 idx_offset, path_offset;326u32 offset, reg;327u32 tmp;328u8 i;329330if (index == 0)331idx_offset = 0;332else333idx_offset = 0x14;334335if (path == RF_PATH_A)336path_offset = 0;337else338path_offset = 0x28;339340offset = idx_offset + path_offset;341342rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_RST, 0x1);343rtw89_phy_write32_mask(rtwdev, R_DCOF9, B_DCOF9_RST, 0x1);344345/* msbk_d: 15/14/13/12 */346tmp = 0x0;347for (i = 0; i < 4; i++)348tmp |= dack->msbk_d[path][index][i + 12] << (i * 8);349reg = 0xc200 + offset;350rtw89_phy_write32(rtwdev, reg, tmp);351rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg,352rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD));353354/* msbk_d: 11/10/9/8 */355tmp = 0x0;356for (i = 0; i < 4; i++)357tmp |= dack->msbk_d[path][index][i + 8] << (i * 8);358reg = 0xc204 + offset;359rtw89_phy_write32(rtwdev, reg, tmp);360rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg,361rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD));362363/* msbk_d: 7/6/5/4 */364tmp = 0x0;365for (i = 0; i < 4; i++)366tmp |= dack->msbk_d[path][index][i + 4] << (i * 8);367reg = 0xc208 + offset;368rtw89_phy_write32(rtwdev, reg, tmp);369rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg,370rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD));371372/* msbk_d: 3/2/1/0 */373tmp = 0x0;374for (i = 0; i < 4; i++)375tmp |= dack->msbk_d[path][index][i] << (i * 8);376reg = 0xc20c + offset;377rtw89_phy_write32(rtwdev, reg, tmp);378rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg,379rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD));380381/* dadak_d/biask_d */382tmp = 0x0;383tmp = (dack->biask_d[path][index] << 22) |384(dack->dadck_d[path][index] << 14);385reg = 0xc210 + offset;386rtw89_phy_write32(rtwdev, reg, tmp);387rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x=0x%x\n", reg,388rtw89_phy_read32_mask(rtwdev, reg, MASKDWORD));389390rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL + offset, B_DACKN0_EN, 0x1);391}392393static void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)394{395u8 index;396397for (index = 0; index < 2; index++)398_dack_reload_by_path(rtwdev, path, index);399}400401static void _addck(struct rtw89_dev *rtwdev)402{403struct rtw89_dack_info *dack = &rtwdev->dack;404u32 val;405int ret;406407rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x1);408rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x1);409rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_EN, 0x0);410udelay(1);411rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0, 0x1);412413ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,4141, 10000, false,415rtwdev, R_ADDCKR0, BIT(0));416if (ret) {417rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADDCK timeout\n");418dack->addck_timeout[0] = true;419}420421rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]ADDCK ret = %d\n", ret);422423rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_RST, 0x0);424}425426static void _new_dadck(struct rtw89_dev *rtwdev)427{428struct rtw89_dack_info *dack = &rtwdev->dack;429u32 i_dc, q_dc, ic, qc;430u32 val;431int ret;432433rtw89_rfk_parser(rtwdev, &rtw8851b_dadck_setup_defs_tbl);434435ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val,4361, 10000, false,437rtwdev, R_ADDCKR0, BIT(0));438if (ret) {439rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DADCK timeout\n");440dack->addck_timeout[0] = true;441}442443rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DADCK ret = %d\n", ret);444445rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_IQ, 0x0);446i_dc = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_DC);447rtw89_phy_write32_mask(rtwdev, R_ADDCK0, B_ADDCK0_IQ, 0x1);448q_dc = rtw89_phy_read32_mask(rtwdev, R_ADDCKR0, B_ADDCKR0_DC);449450ic = 0x80 - sign_extend32(i_dc, 11) * 6;451qc = 0x80 - sign_extend32(q_dc, 11) * 6;452453rtw89_debug(rtwdev, RTW89_DBG_RFK,454"[DACK]before DADCK, i_dc=0x%x, q_dc=0x%x\n", i_dc, q_dc);455456dack->dadck_d[0][0] = ic;457dack->dadck_d[0][1] = qc;458459rtw89_phy_write32_mask(rtwdev, R_DACKN0_CTL, B_DACKN0_V, dack->dadck_d[0][0]);460rtw89_phy_write32_mask(rtwdev, R_DACKN1_CTL, B_DACKN1_V, dack->dadck_d[0][1]);461rtw89_debug(rtwdev, RTW89_DBG_RFK,462"[DACK]after DADCK, 0xc210=0x%x, 0xc224=0x%x\n",463rtw89_phy_read32_mask(rtwdev, R_DACKN0_CTL, MASKDWORD),464rtw89_phy_read32_mask(rtwdev, R_DACKN1_CTL, MASKDWORD));465466rtw89_rfk_parser(rtwdev, &rtw8851b_dadck_post_defs_tbl);467}468469static bool _dack_s0_poll(struct rtw89_dev *rtwdev)470{471if (rtw89_phy_read32_mask(rtwdev, R_DACK_S0P0, B_DACK_S0P0_OK) == 0 ||472rtw89_phy_read32_mask(rtwdev, R_DACK_S0P1, B_DACK_S0P1_OK) == 0 ||473rtw89_phy_read32_mask(rtwdev, R_DACK_S0P2, B_DACK_S0P2_OK) == 0 ||474rtw89_phy_read32_mask(rtwdev, R_DACK_S0P3, B_DACK_S0P3_OK) == 0)475return false;476477return true;478}479480static void _dack_s0(struct rtw89_dev *rtwdev)481{482struct rtw89_dack_info *dack = &rtwdev->dack;483bool done;484int ret;485486rtw89_rfk_parser(rtwdev, &rtw8851b_dack_s0_1_defs_tbl);487_dack_reset(rtwdev, RF_PATH_A);488rtw89_phy_write32_mask(rtwdev, R_DCOF1, B_DCOF1_S, 0x1);489490ret = read_poll_timeout_atomic(_dack_s0_poll, done, done,4911, 10000, false, rtwdev);492if (ret) {493rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DACK timeout\n");494dack->msbk_timeout[0] = true;495}496497rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK ret = %d\n", ret);498499rtw89_rfk_parser(rtwdev, &rtw8851b_dack_s0_2_defs_tbl);500501rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]after S0 DADCK\n");502503_dack_backup_s0(rtwdev);504_dack_reload(rtwdev, RF_PATH_A);505506rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x0);507}508509static void _dack(struct rtw89_dev *rtwdev)510{511_dack_s0(rtwdev);512}513514static void _dack_dump(struct rtw89_dev *rtwdev)515{516struct rtw89_dack_info *dack = &rtwdev->dack;517u8 i;518u8 t;519520rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 ADC_DCK ic = 0x%x, qc = 0x%x\n",521dack->addck_d[0][0], dack->addck_d[0][1]);522rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 DAC_DCK ic = 0x%x, qc = 0x%x\n",523dack->dadck_d[0][0], dack->dadck_d[0][1]);524rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 biask ic = 0x%x, qc = 0x%x\n",525dack->biask_d[0][0], dack->biask_d[0][1]);526527rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK ic:\n");528for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {529t = dack->msbk_d[0][0][i];530rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);531}532533rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]S0 MSBK qc:\n");534for (i = 0; i < RTW89_DACK_MSBK_NR; i++) {535t = dack->msbk_d[0][1][i];536rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]0x%x\n", t);537}538}539540static void _dack_manual_off(struct rtw89_dev *rtwdev)541{542rtw89_rfk_parser(rtwdev, &rtw8851b_dack_manual_off_defs_tbl);543}544545static void _dac_cal(struct rtw89_dev *rtwdev, bool force)546{547struct rtw89_dack_info *dack = &rtwdev->dack;548u32 rf0_0;549550dack->dack_done = false;551552rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK 0x2\n");553rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK start!!!\n");554rf0_0 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK);555rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]RF0=0x%x\n", rf0_0);556557_drck(rtwdev);558_dack_manual_off(rtwdev);559rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x337e1);560rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x0);561562_addck(rtwdev);563_addck_backup(rtwdev);564_addck_reload(rtwdev);565rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RFREG_MASK, 0x40001);566567_dack(rtwdev);568_new_dadck(rtwdev);569_dack_dump(rtwdev);570rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RR_RSV1_RST, 0x1);571572dack->dack_done = true;573dack->dack_cnt++;574rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DACK]DACK finish!!!\n");575}576577static void _rx_dck_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,578enum rtw89_rf_path path, bool is_afe,579enum rtw89_chanctx_idx chanctx_idx)580{581const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);582583rtw89_debug(rtwdev, RTW89_DBG_RFK,584"[RX_DCK] ==== S%d RX DCK (%s / CH%d / %s / by %s)====\n", path,585chan->band_type == RTW89_BAND_2G ? "2G" :586chan->band_type == RTW89_BAND_5G ? "5G" : "6G",587chan->channel,588chan->band_width == RTW89_CHANNEL_WIDTH_20 ? "20M" :589chan->band_width == RTW89_CHANNEL_WIDTH_40 ? "40M" : "80M",590is_afe ? "AFE" : "RFC");591}592593static void _rxbb_ofst_swap(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 rf_mode)594{595u32 val, val_i, val_q;596597val_i = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_S1);598val_q = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_S1);599600val = val_q << 4 | val_i;601602rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_DIS, 0x1);603rtw89_write_rf(rtwdev, path, RR_LUTWA, RFREG_MASK, rf_mode);604rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, val);605rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_DIS, 0x0);606607rtw89_debug(rtwdev, RTW89_DBG_RFK,608"[RX_DCK] val_i = 0x%x, val_q = 0x%x, 0x3F = 0x%x\n",609val_i, val_q, val);610}611612static void _set_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 rf_mode)613{614u32 val;615int ret;616617rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);618rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x1);619620ret = read_poll_timeout_atomic(rtw89_read_rf, val, val,6212, 2000, false,622rtwdev, path, RR_DCK, BIT(8));623624rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_LV, 0x0);625626rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] S%d RXDCK finish (ret = %d)\n",627path, ret);628629_rxbb_ofst_swap(rtwdev, path, rf_mode);630}631632static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe,633enum rtw89_chanctx_idx chanctx_idx)634{635u32 rf_reg5;636u8 path;637638rtw89_debug(rtwdev, RTW89_DBG_RFK,639"[RX_DCK] ****** RXDCK Start (Ver: 0x%x, Cv: %d) ******\n",6400x2, rtwdev->hal.cv);641642for (path = 0; path < RF_PATH_NUM_8851B; path++) {643_rx_dck_info(rtwdev, phy, path, is_afe, chanctx_idx);644645rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);646647if (rtwdev->is_tssi_mode[path])648rtw89_phy_write32_mask(rtwdev,649R_P0_TSSI_TRK + (path << 13),650B_P0_TSSI_TRK_EN, 0x1);651652rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);653rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RF_RX);654_set_rx_dck(rtwdev, path, RF_RX);655rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);656657if (rtwdev->is_tssi_mode[path])658rtw89_phy_write32_mask(rtwdev,659R_P0_TSSI_TRK + (path << 13),660B_P0_TSSI_TRK_EN, 0x0);661}662}663664static void _iqk_sram(struct rtw89_dev *rtwdev, u8 path)665{666u32 i;667668rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);669670rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKDWORD, 0x00020000);671rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, MASKDWORD, 0x80000000);672rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000080);673rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00010000);674rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x009);675676for (i = 0; i <= 0x9f; i++) {677rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD,6780x00010000 + i);679rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n",680rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI));681}682683for (i = 0; i <= 0x9f; i++) {684rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD,6850x00010000 + i);686rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]0x%x\n",687rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ));688}689690rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX2, MASKDWORD, 0x00000000);691rtw89_phy_write32_mask(rtwdev, R_SRAM_IQRX, MASKDWORD, 0x00000000);692}693694static void _iqk_rxk_setting(struct rtw89_dev *rtwdev, u8 path)695{696rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, 0xc);697rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x0);698rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_POW, 0x1);699}700701static bool _iqk_check_cal(struct rtw89_dev *rtwdev, u8 path)702{703bool fail1 = false, fail2 = false;704u32 val;705int ret;706707ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,70810, 8200, false,709rtwdev, 0xbff8, MASKBYTE0);710if (ret) {711fail1 = true;712rtw89_debug(rtwdev, RTW89_DBG_RFK,713"[IQK]NCTL1 IQK timeout!!!\n");714}715716fsleep(10);717718ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,71910, 200, false,720rtwdev, R_RPT_COM, B_RPT_COM_RDY);721if (ret) {722fail2 = true;723rtw89_debug(rtwdev, RTW89_DBG_RFK,724"[IQK]NCTL2 IQK timeout!!!\n");725}726727fsleep(10);728rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);729730rtw89_debug(rtwdev, RTW89_DBG_RFK,731"[IQK]S%x, ret = %d, notready = %x fail=%d,%d\n",732path, ret, fail1 || fail2, fail1, fail2);733734return fail1 || fail2;735}736737static bool _iqk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,738u8 path, u8 ktype)739{740struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;741bool notready;742u32 iqk_cmd;743744switch (ktype) {745case ID_A_FLOK_COARSE:746rtw89_debug(rtwdev, RTW89_DBG_RFK,747"[IQK]============ S%d ID_A_FLOK_COARSE ============\n", path);748rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);749iqk_cmd = 0x108 | (1 << (4 + path));750break;751case ID_G_FLOK_COARSE:752rtw89_debug(rtwdev, RTW89_DBG_RFK,753"[IQK]============ S%d ID_G_FLOK_COARSE ============\n", path);754rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);755iqk_cmd = 0x108 | (1 << (4 + path));756break;757case ID_A_FLOK_FINE:758rtw89_debug(rtwdev, RTW89_DBG_RFK,759"[IQK]============ S%d ID_A_FLOK_FINE ============\n", path);760rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);761iqk_cmd = 0x308 | (1 << (4 + path));762break;763case ID_G_FLOK_FINE:764rtw89_debug(rtwdev, RTW89_DBG_RFK,765"[IQK]============ S%d ID_G_FLOK_FINE ============\n", path);766rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);767iqk_cmd = 0x308 | (1 << (4 + path));768break;769case ID_TXK:770rtw89_debug(rtwdev, RTW89_DBG_RFK,771"[IQK]============ S%d ID_TXK ============\n", path);772rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0);773iqk_cmd = 0x008 | (1 << (path + 4)) |774(((0x8 + iqk_info->iqk_bw[path]) & 0xf) << 8);775break;776case ID_RXAGC:777rtw89_debug(rtwdev, RTW89_DBG_RFK,778"[IQK]============ S%d ID_RXAGC ============\n", path);779rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);780iqk_cmd = 0x708 | (1 << (4 + path)) | (path << 1);781break;782case ID_RXK:783rtw89_debug(rtwdev, RTW89_DBG_RFK,784"[IQK]============ S%d ID_RXK ============\n", path);785rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);786iqk_cmd = 0x008 | (1 << (path + 4)) |787(((0xc + iqk_info->iqk_bw[path]) & 0xf) << 8);788break;789case ID_NBTXK:790rtw89_debug(rtwdev, RTW89_DBG_RFK,791"[IQK]============ S%d ID_NBTXK ============\n", path);792rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0);793rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT,7940x11);795iqk_cmd = 0x408 | (1 << (4 + path));796break;797case ID_NBRXK:798rtw89_debug(rtwdev, RTW89_DBG_RFK,799"[IQK]============ S%d ID_NBRXK ============\n", path);800rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);801rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT,8020x011);803iqk_cmd = 0x608 | (1 << (4 + path));804break;805default:806return false;807}808809rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, iqk_cmd + 1);810notready = _iqk_check_cal(rtwdev, path);811if (iqk_info->iqk_sram_en &&812(ktype == ID_NBRXK || ktype == ID_RXK || ktype == ID_NBTXK))813_iqk_sram(rtwdev, path);814815rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0);816rtw89_debug(rtwdev, RTW89_DBG_RFK,817"[IQK]S%x, ktype= %x, id = %x, notready = %x\n",818path, ktype, iqk_cmd + 1, notready);819820return notready;821}822823static bool _rxk_2g_group_sel(struct rtw89_dev *rtwdev,824enum rtw89_phy_idx phy_idx, u8 path)825{826struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;827bool kfail = false;828bool notready;829u32 rf_0;830u8 gp;831832rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);833834for (gp = 0; gp < RTW8851B_RXK_GROUP_NR; gp++) {835rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp);836837rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]);838rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2, g_idxattc2[gp]);839rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);840rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0);841rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp);842843rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);844fsleep(10);845rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);846rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0);847rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]);848rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);849850notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);851852rtw89_debug(rtwdev, RTW89_DBG_RFK,853"[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path,854rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD),855rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0));856857rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);858rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);859notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);860iqk_info->nb_rxcfir[path] =861rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2;862863notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);864865rtw89_debug(rtwdev, RTW89_DBG_RFK,866"[IQK]S%x, WBRXK 0x8008 = 0x%x\n", path,867rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));868}869870if (!notready)871kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);872873if (kfail)874_iqk_sram(rtwdev, path);875876if (kfail) {877rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),878MASKDWORD, iqk_info->nb_rxcfir[path] | 0x2);879iqk_info->is_wb_txiqk[path] = false;880} else {881rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),882MASKDWORD, 0x40000000);883iqk_info->is_wb_txiqk[path] = true;884}885886rtw89_debug(rtwdev, RTW89_DBG_RFK,887"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail,8881 << path, iqk_info->nb_rxcfir[path]);889return kfail;890}891892static bool _rxk_5g_group_sel(struct rtw89_dev *rtwdev,893enum rtw89_phy_idx phy_idx, u8 path)894{895struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;896bool kfail = false;897bool notready;898u32 rf_0;899u32 val;900u8 gp;901902rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);903904rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x1000);905rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x4);906rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x17);907rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x5);908rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x27);909rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x0);910911val = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20);912rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0xc);913914for (gp = 0; gp < RTW8851B_RXK_GROUP_IDX_NR; gp++) {915rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp);916917rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_RGM, a_idxrxgain[gp]);918rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, RR_RXA2_ATT, a_idxattc2[gp]);919rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20, 0x1);920921rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);922rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0);923rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp);924925rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);926fsleep(100);927rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);928rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0);929rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[gp]);930rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);931notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);932933rtw89_debug(rtwdev, RTW89_DBG_RFK,934"[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path,935rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD),936rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB));937938rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);939rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);940notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);941iqk_info->nb_rxcfir[path] =942rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2;943944rtw89_debug(rtwdev, RTW89_DBG_RFK,945"[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path,946rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));947948notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXK);949950rtw89_debug(rtwdev, RTW89_DBG_RFK,951"[IQK]S%x, WBRXK 0x8008 = 0x%x\n", path,952rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));953}954955if (!notready)956kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);957958if (kfail)959_iqk_sram(rtwdev, path);960961if (kfail) {962rtw89_phy_write32_mask(rtwdev, R_IQK_RES, B_IQK_RES_RXCFIR, 0x0);963rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD,964iqk_info->nb_rxcfir[path] | 0x2);965iqk_info->is_wb_txiqk[path] = false;966} else {967rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD,9680x40000000);969iqk_info->is_wb_txiqk[path] = true;970}971972rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20, val);973rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x1000);974rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x4);975rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x37);976rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x5);977rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x27);978rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x0);979980rtw89_debug(rtwdev, RTW89_DBG_RFK,981"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail,9821 << path, iqk_info->nb_rxcfir[path]);983return kfail;984}985986static bool _iqk_5g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,987u8 path)988{989struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;990bool kfail = false;991bool notready;992u8 gp = 2;993u32 rf_0;994u32 val;995996rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);997rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp);998999rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x1000);1000rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x4);1001rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x17);1002rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x5);1003rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x27);1004rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x0);10051006val = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20);1007rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0xc);10081009rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_RGM, a_idxrxgain[gp]);1010rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, RR_RXA2_ATT, a_idxattc2[gp]);1011rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20, 0x1);10121013rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1014rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0);1015rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp);10161017rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);1018fsleep(100);1019rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);1020rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0);1021rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, a_idxrxagc[gp]);1022rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);1023notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);10241025rtw89_debug(rtwdev, RTW89_DBG_RFK,1026"[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n", path,1027rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD),1028rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0));10291030rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);1031rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);1032notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);1033iqk_info->nb_rxcfir[path] =1034rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2;10351036rtw89_debug(rtwdev, RTW89_DBG_RFK,1037"[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path,1038rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));10391040rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, WBRXK 0x8008 = 0x%x\n",1041path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));10421043if (!notready)1044kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);10451046if (kfail) {1047rtw89_phy_write32_mask(rtwdev, R_IQK_RES + (path << 8), 0xf, 0x0);1048rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),1049MASKDWORD, 0x40000002);1050iqk_info->is_wb_rxiqk[path] = false;1051} else {1052iqk_info->is_wb_rxiqk[path] = false;1053}10541055rtw89_write_rf(rtwdev, RF_PATH_A, RR_RXA2, 0x20, val);1056rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x1000);1057rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x4);1058rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x37);1059rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RFREG_MASK, 0x5);1060rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWD0, RFREG_MASK, 0x27);1061rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RFREG_MASK, 0x0);10621063rtw89_debug(rtwdev, RTW89_DBG_RFK,1064"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail,10651 << path, iqk_info->nb_rxcfir[path]);10661067return kfail;1068}10691070static bool _iqk_2g_nbrxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1071u8 path)1072{1073struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1074bool kfail = false;1075bool notready;1076u8 gp = 0x3;1077u32 rf_0;10781079rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);1080rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, gp = %x\n", path, gp);10811082rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RGM, g_idxrxgain[gp]);1083rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_C2, g_idxattc2[gp]);1084rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1085rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x0);1086rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP_V1, gp);10871088rtw89_write_rf(rtwdev, path, RR_RXKPLL, RFREG_MASK, 0x80013);1089fsleep(10);1090rf_0 = rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK);1091rtw89_phy_write32_mask(rtwdev, R_IQK_DIF2, B_IQK_DIF2_RXPI, rf_0);1092rtw89_phy_write32_mask(rtwdev, R_IQK_RXA, B_IQK_RXAGC, g_idxrxagc[gp]);1093rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x11);1094notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_RXAGC);10951096rtw89_debug(rtwdev, RTW89_DBG_RFK,1097"[IQK]S%x, RXAGC 0x8008 = 0x%x, rxbb = %x\n",1098path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD),1099rtw89_read_rf(rtwdev, path, RR_MOD, 0x003e0));11001101rtw89_write_rf(rtwdev, path, RR_RXKPLL, RR_RXKPLL_OFF, 0x13);1102rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_RXT, 0x011);1103notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBRXK);1104iqk_info->nb_rxcfir[path] =1105rtw89_phy_read32_mask(rtwdev, R_RXIQC, MASKDWORD) | 0x2;11061107rtw89_debug(rtwdev, RTW89_DBG_RFK,1108"[IQK]S%x, NBRXK 0x8008 = 0x%x\n", path,1109rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));11101111rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, WBRXK 0x8008 = 0x%x\n",1112path, rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, MASKDWORD));11131114if (!notready)1115kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);11161117if (kfail) {1118rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8),1119MASKDWORD, 0x40000002);1120iqk_info->is_wb_rxiqk[path] = false;1121} else {1122iqk_info->is_wb_rxiqk[path] = false;1123}11241125rtw89_debug(rtwdev, RTW89_DBG_RFK,1126"[IQK]S%x, kfail = 0x%x, 0x8%x3c = 0x%x\n", path, kfail,11271 << path, iqk_info->nb_rxcfir[path]);1128return kfail;1129}11301131static void _iqk_rxclk_setting(struct rtw89_dev *rtwdev, u8 path)1132{1133struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;11341135rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1);11361137if (iqk_info->iqk_bw[path] == RTW89_CHANNEL_WIDTH_80) {1138rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0101);1139rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_DPD_GDIS, 0x1);11401141_rxck_force(rtwdev, path, true, ADC_960M);11421143rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_rxclk_80_defs_tbl);1144} else {1145rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, B_ADC_FIFO_RXK, 0x0101);1146rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_DPD_GDIS, 0x1);11471148_rxck_force(rtwdev, path, true, ADC_960M);11491150rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_rxclk_others_defs_tbl);1151}11521153rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, (2)before RXK IQK\n", path);1154rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[07:10] = 0x%x\n", path,11550xc0d4, rtw89_phy_read32_mask(rtwdev, 0xc0d4, GENMASK(10, 7)));1156rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[11:14] = 0x%x\n", path,11570xc0d4, rtw89_phy_read32_mask(rtwdev, 0xc0d4, GENMASK(14, 11)));1158rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[26:27] = 0x%x\n", path,11590xc0d4, rtw89_phy_read32_mask(rtwdev, 0xc0d4, GENMASK(27, 26)));1160rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[05:08] = 0x%x\n", path,11610xc0d8, rtw89_phy_read32_mask(rtwdev, 0xc0d8, GENMASK(8, 5)));1162rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[17:21] = 0x%x\n", path,11630xc0c4, rtw89_phy_read32_mask(rtwdev, 0xc0c4, GENMASK(21, 17)));1164rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[16:31] = 0x%x\n", path,11650xc0e8, rtw89_phy_read32_mask(rtwdev, 0xc0e8, GENMASK(31, 16)));1166rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[04:05] = 0x%x\n", path,11670xc0e4, rtw89_phy_read32_mask(rtwdev, 0xc0e4, GENMASK(5, 4)));1168rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[23:31] = 0x%x\n", path,11690x12a0, rtw89_phy_read32_mask(rtwdev, 0x12a0, GENMASK(31, 23)));1170rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[13:14] = 0x%x\n", path,11710xc0ec, rtw89_phy_read32_mask(rtwdev, 0xc0ec, GENMASK(14, 13)));1172rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, 0x%x[16:23] = 0x%x\n", path,11730xc0ec, rtw89_phy_read32_mask(rtwdev, 0xc0ec, GENMASK(23, 16)));1174}11751176static bool _txk_5g_group_sel(struct rtw89_dev *rtwdev,1177enum rtw89_phy_idx phy_idx, u8 path)1178{1179static const u8 a_idx[RTW8851B_A_TXK_GROUP_NR] = {2, 3};1180struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1181bool kfail = false;1182bool notready;1183u8 gp;11841185rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);11861187rtw89_phy_write32_mask(rtwdev, R_CFIR_COEF, MASKDWORD, 0x33332222);11881189for (gp = 0x0; gp < RTW8851B_A_TXK_GROUP_NR; gp++) {1190rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]);1191rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]);1192rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]);1193rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, a_att_smxr[gp]);11941195rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1196rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1);1197rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0);1198rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, a_idx[gp]);1199rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1200rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x11);1201rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, a_itqt[gp]);12021203notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);1204iqk_info->nb_txcfir[path] =1205rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2;12061207rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),1208MASKDWORD, a_itqt[gp]);1209notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);1210}12111212if (!notready)1213kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);12141215if (kfail) {1216rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1217MASKDWORD, iqk_info->nb_txcfir[path] | 0x2);1218iqk_info->is_wb_txiqk[path] = false;1219} else {1220rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1221MASKDWORD, 0x40000000);1222iqk_info->is_wb_txiqk[path] = true;1223}12241225rtw89_debug(rtwdev, RTW89_DBG_RFK,1226"[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail,12271 << path, iqk_info->nb_txcfir[path]);1228return kfail;1229}12301231static bool _txk_2g_group_sel(struct rtw89_dev *rtwdev,1232enum rtw89_phy_idx phy_idx, u8 path)1233{1234struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1235bool kfail = false;1236bool notready;1237u8 gp;12381239rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);12401241rtw89_phy_write32_mask(rtwdev, R_CFIR_COEF, MASKDWORD, 0x0);12421243for (gp = 0x0; gp < RTW8851B_G_TXK_GROUP_NR; gp++) {1244rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, g_power_range[gp]);1245rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, g_track_range[gp]);1246rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, g_gain_bb[gp]);12471248rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, g_itqt[gp]);1249rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1250rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1);1251rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0);1252rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp);1253rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);12541255notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);1256iqk_info->nb_txcfir[path] =1257rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2;12581259rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8),1260MASKDWORD, g_itqt[gp]);1261notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_TXK);1262}12631264if (!notready)1265kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);12661267if (kfail) {1268rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1269MASKDWORD, iqk_info->nb_txcfir[path] | 0x2);1270iqk_info->is_wb_txiqk[path] = false;1271} else {1272rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1273MASKDWORD, 0x40000000);1274iqk_info->is_wb_txiqk[path] = true;1275}12761277rtw89_debug(rtwdev, RTW89_DBG_RFK,1278"[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail,12791 << path, iqk_info->nb_txcfir[path]);1280return kfail;1281}12821283static bool _iqk_5g_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1284u8 path)1285{1286static const u8 a_idx[RTW8851B_A_TXK_GROUP_NR] = {2, 3};1287struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1288bool kfail = false;1289bool notready;1290u8 gp = 0;12911292rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);12931294rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, a_power_range[gp]);1295rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, a_track_range[gp]);1296rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, a_gain_bb[gp]);1297rtw89_write_rf(rtwdev, path, RR_BIASA, RR_BIASA_A, a_att_smxr[gp]);12981299rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1300rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1);1301rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0);1302rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, a_idx[gp]);1303rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1304rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, a_itqt[gp]);13051306notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);1307iqk_info->nb_txcfir[path] =1308rtw89_phy_read32_mask(rtwdev, R_TXIQC, MASKDWORD) | 0x2;13091310if (!notready)1311kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);13121313if (kfail) {1314rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1315MASKDWORD, 0x40000002);1316iqk_info->is_wb_rxiqk[path] = false;1317} else {1318iqk_info->is_wb_rxiqk[path] = false;1319}13201321rtw89_debug(rtwdev, RTW89_DBG_RFK,1322"[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail,13231 << path, iqk_info->nb_txcfir[path]);1324return kfail;1325}13261327static bool _iqk_2g_nbtxk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1328u8 path)1329{1330struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1331bool kfail = false;1332bool notready;1333u8 gp;13341335rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);13361337for (gp = 0x0; gp < RTW8851B_G_TXK_GROUP_NR; gp++) {1338rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, g_power_range[gp]);1339rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, g_track_range[gp]);1340rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, g_gain_bb[gp]);13411342rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, MASKDWORD, g_itqt[gp]);1343rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_SEL, 0x1);1344rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G3, 0x1);1345rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_G2, 0x0);1346rtw89_phy_write32_mask(rtwdev, R_CFIR_LUT, B_CFIR_LUT_GP, gp);1347rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);13481349notready = _iqk_one_shot(rtwdev, phy_idx, path, ID_NBTXK);1350iqk_info->nb_txcfir[path] =1351rtw89_phy_read32_mask(rtwdev, R_TXIQC + (path << 8),1352MASKDWORD) | 0x2;1353}13541355if (!notready)1356kfail = !!rtw89_phy_read32_mask(rtwdev, R_NCTL_RPT, B_NCTL_RPT_FLG);13571358if (kfail) {1359rtw89_phy_write32_mask(rtwdev, R_TXIQC + (path << 8),1360MASKDWORD, 0x40000002);1361iqk_info->is_wb_rxiqk[path] = false;1362} else {1363iqk_info->is_wb_rxiqk[path] = false;1364}13651366rtw89_debug(rtwdev, RTW89_DBG_RFK,1367"[IQK]S%x, kfail = 0x%x, 0x8%x38 = 0x%x\n", path, kfail,13681 << path, iqk_info->nb_txcfir[path]);1369return kfail;1370}13711372static bool _iqk_2g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1373u8 path)1374{1375static const u32 g_txbb[RTW8851B_LOK_GRAM] = {13760x02, 0x06, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17};1377static const u32 g_itqt[RTW8851B_LOK_GRAM] = {13780x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x12, 0x12, 0x12, 0x1b};1379static const u32 g_wa[RTW8851B_LOK_GRAM] = {13800x00, 0x04, 0x08, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17};1381bool fail = false;1382u8 i;13831384rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);13851386rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_LOK, 0x0);1387rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR0, 0x0);1388rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR1, 0x6);13891390for (i = 0; i < RTW8851B_LOK_GRAM; i++) {1391rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_TG, g_txbb[i]);1392rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RR_LUTWA_M1, g_wa[i]);1393rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);1394rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, g_itqt[i]);1395rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);1396rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,13970x00000109 | (1 << (4 + path)));1398fail |= _iqk_check_cal(rtwdev, path);13991400rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1401rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, g_itqt[i]);1402rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,14030x00000309 | (1 << (4 + path)));1404fail |= _iqk_check_cal(rtwdev, path);14051406rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1407rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0);14081409rtw89_debug(rtwdev, RTW89_DBG_RFK,1410"[IQK]S0, i = %x, 0x8[19:15] = 0x%x,0x8[09:05] = 0x%x\n", i,1411rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0xf8000),1412rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0x003e0));1413rtw89_debug(rtwdev, RTW89_DBG_RFK,1414"[IQK]S0, i = %x, 0x9[19:16] = 0x%x,0x9[09:06] = 0x%x\n", i,1415rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0xf0000),1416rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0x003c0));1417rtw89_debug(rtwdev, RTW89_DBG_RFK,1418"[IQK]S0, i = %x, 0x58 = %x\n", i,1419rtw89_read_rf(rtwdev, RF_PATH_A, RR_TXMO, RFREG_MASK));1420}14211422return fail;1423}14241425static bool _iqk_5g_lok(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1426u8 path)1427{1428static const u32 a_txbb[RTW8851B_LOK_GRAM] = {14290x02, 0x06, 0x0a, 0x0c, 0x0e, 0x10, 0x12, 0x14, 0x16, 0x17};1430static const u32 a_itqt[RTW8851B_LOK_GRAM] = {14310x09, 0x09, 0x09, 0x12, 0x12, 0x12, 0x1b, 0x1b, 0x1b, 0x1b};1432static const u32 a_wa[RTW8851B_LOK_GRAM] = {14330x80, 0x84, 0x88, 0x8c, 0x8e, 0x90, 0x92, 0x94, 0x96, 0x97};1434bool fail = false;1435u8 i;14361437rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);14381439rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_LOK, 0x0);1440rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR0, 0x0);1441rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_GR1, 0x7);14421443for (i = 0; i < RTW8851B_LOK_GRAM; i++) {1444rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXIG, RR_TXIG_TG, a_txbb[i]);1445rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWA, RR_LUTWA_M1, a_wa[i]);1446rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x1);1447rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, a_itqt[i]);1448rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);1449rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,14500x00000109 | (1 << (4 + path)));1451fail |= _iqk_check_cal(rtwdev, path);14521453rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1454rtw89_phy_write32_mask(rtwdev, R_KIP_IQP, B_KIP_IQP_IQSW, a_itqt[i]);1455rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, B_IQK_DIF4_TXT, 0x021);1456rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD,14570x00000309 | (1 << (4 + path)));1458fail |= _iqk_check_cal(rtwdev, path);14591460rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1461rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_IQK_RFC_ON, 0x0);14621463rtw89_debug(rtwdev, RTW89_DBG_RFK,1464"[IQK]S0, i = %x, 0x8[19:15] = 0x%x,0x8[09:05] = 0x%x\n", i,1465rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0xf8000),1466rtw89_read_rf(rtwdev, RF_PATH_A, RR_DTXLOK, 0x003e0));1467rtw89_debug(rtwdev, RTW89_DBG_RFK,1468"[IQK]S0, i = %x, 0x9[19:16] = 0x%x,0x9[09:06] = 0x%x\n", i,1469rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0xf0000),1470rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV2, 0x003c0));1471rtw89_debug(rtwdev, RTW89_DBG_RFK,1472"[IQK]S0, i = %x, 0x58 = %x\n", i,1473rtw89_read_rf(rtwdev, RF_PATH_A, RR_TXMO, RFREG_MASK));1474}14751476return fail;1477}14781479static void _iqk_txk_setting(struct rtw89_dev *rtwdev, u8 path)1480{1481struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;14821483switch (iqk_info->iqk_band[path]) {1484case RTW89_BAND_2G:1485rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RTW89_BAND_2G\n");1486rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_txk_2ghz_defs_tbl);1487break;1488case RTW89_BAND_5G:1489rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]RTW89_BAND_5G\n");1490rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_txk_5ghz_defs_tbl);1491break;1492default:1493break;1494}1495}14961497#define IQK_LOK_RETRY 114981499static void _iqk_by_path(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1500u8 path)1501{1502struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1503bool lok_is_fail;1504u8 i;15051506rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);15071508for (i = 0; i < IQK_LOK_RETRY; i++) {1509_iqk_txk_setting(rtwdev, path);1510if (iqk_info->iqk_band[path] == RTW89_BAND_2G)1511lok_is_fail = _iqk_2g_lok(rtwdev, phy_idx, path);1512else1513lok_is_fail = _iqk_5g_lok(rtwdev, phy_idx, path);15141515if (!lok_is_fail)1516break;1517}15181519if (iqk_info->is_nbiqk) {1520if (iqk_info->iqk_band[path] == RTW89_BAND_2G)1521iqk_info->iqk_tx_fail[0][path] =1522_iqk_2g_nbtxk(rtwdev, phy_idx, path);1523else1524iqk_info->iqk_tx_fail[0][path] =1525_iqk_5g_nbtxk(rtwdev, phy_idx, path);1526} else {1527if (iqk_info->iqk_band[path] == RTW89_BAND_2G)1528iqk_info->iqk_tx_fail[0][path] =1529_txk_2g_group_sel(rtwdev, phy_idx, path);1530else1531iqk_info->iqk_tx_fail[0][path] =1532_txk_5g_group_sel(rtwdev, phy_idx, path);1533}15341535_iqk_rxclk_setting(rtwdev, path);1536_iqk_rxk_setting(rtwdev, path);1537_adc_fifo_rst(rtwdev, phy_idx, path);15381539if (iqk_info->is_nbiqk) {1540if (iqk_info->iqk_band[path] == RTW89_BAND_2G)1541iqk_info->iqk_rx_fail[0][path] =1542_iqk_2g_nbrxk(rtwdev, phy_idx, path);1543else1544iqk_info->iqk_rx_fail[0][path] =1545_iqk_5g_nbrxk(rtwdev, phy_idx, path);1546} else {1547if (iqk_info->iqk_band[path] == RTW89_BAND_2G)1548iqk_info->iqk_rx_fail[0][path] =1549_rxk_2g_group_sel(rtwdev, phy_idx, path);1550else1551iqk_info->iqk_rx_fail[0][path] =1552_rxk_5g_group_sel(rtwdev, phy_idx, path);1553}1554}15551556static void _rfk_backup_bb_reg(struct rtw89_dev *rtwdev,1557u32 backup_bb_reg_val[])1558{1559u32 i;15601561for (i = 0; i < BACKUP_BB_REGS_NR; i++) {1562backup_bb_reg_val[i] =1563rtw89_phy_read32_mask(rtwdev, rtw8851b_backup_bb_regs[i],1564MASKDWORD);1565rtw89_debug(rtwdev, RTW89_DBG_RFK,1566"[RFK]backup bb reg : %x, value =%x\n",1567rtw8851b_backup_bb_regs[i], backup_bb_reg_val[i]);1568}1569}15701571static void _rfk_backup_rf_reg(struct rtw89_dev *rtwdev,1572u32 backup_rf_reg_val[], u8 rf_path)1573{1574u32 i;15751576for (i = 0; i < BACKUP_RF_REGS_NR; i++) {1577backup_rf_reg_val[i] =1578rtw89_read_rf(rtwdev, rf_path,1579rtw8851b_backup_rf_regs[i], RFREG_MASK);1580rtw89_debug(rtwdev, RTW89_DBG_RFK,1581"[RFK]backup rf S%d reg : %x, value =%x\n", rf_path,1582rtw8851b_backup_rf_regs[i], backup_rf_reg_val[i]);1583}1584}15851586static void _rfk_restore_bb_reg(struct rtw89_dev *rtwdev,1587const u32 backup_bb_reg_val[])1588{1589u32 i;15901591for (i = 0; i < BACKUP_BB_REGS_NR; i++) {1592rtw89_phy_write32_mask(rtwdev, rtw8851b_backup_bb_regs[i],1593MASKDWORD, backup_bb_reg_val[i]);1594rtw89_debug(rtwdev, RTW89_DBG_RFK,1595"[RFK]restore bb reg : %x, value =%x\n",1596rtw8851b_backup_bb_regs[i], backup_bb_reg_val[i]);1597}1598}15991600static void _rfk_restore_rf_reg(struct rtw89_dev *rtwdev,1601const u32 backup_rf_reg_val[], u8 rf_path)1602{1603u32 i;16041605for (i = 0; i < BACKUP_RF_REGS_NR; i++) {1606rtw89_write_rf(rtwdev, rf_path, rtw8851b_backup_rf_regs[i],1607RFREG_MASK, backup_rf_reg_val[i]);16081609rtw89_debug(rtwdev, RTW89_DBG_RFK,1610"[RFK]restore rf S%d reg: %x, value =%x\n", rf_path,1611rtw8851b_backup_rf_regs[i], backup_rf_reg_val[i]);1612}1613}16141615static void _iqk_get_ch_info(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,1616u8 path, enum rtw89_chanctx_idx chanctx_idx)1617{1618const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);1619struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1620u8 idx = 0;16211622iqk_info->iqk_band[path] = chan->band_type;1623iqk_info->iqk_bw[path] = chan->band_width;1624iqk_info->iqk_ch[path] = chan->channel;1625iqk_info->iqk_table_idx[path] = idx;16261627rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%d (PHY%d): / DBCC %s/ %s/ CH%d/ %s\n",1628path, phy, str_on_off(rtwdev->dbcc_en),1629iqk_info->iqk_band[path] == 0 ? "2G" :1630iqk_info->iqk_band[path] == 1 ? "5G" : "6G",1631iqk_info->iqk_ch[path],1632iqk_info->iqk_bw[path] == 0 ? "20M" :1633iqk_info->iqk_bw[path] == 1 ? "40M" : "80M");1634rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]times = 0x%x, ch =%x\n",1635iqk_info->iqk_times, idx);1636rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]S%x, iqk_info->syn1to2= 0x%x\n",1637path, iqk_info->syn1to2);1638}16391640static void _iqk_start_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1641u8 path)1642{1643_iqk_by_path(rtwdev, phy_idx, path);1644}16451646static void _iqk_restore(struct rtw89_dev *rtwdev, u8 path)1647{1648bool fail;16491650rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);16511652rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, 0x00001219);1653fsleep(10);1654fail = _iqk_check_cal(rtwdev, path);1655rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK] restore fail=%d\n", fail);16561657rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTWE, RR_LUTWE_LOK, 0x0);1658rtw89_write_rf(rtwdev, RF_PATH_A, RR_LUTDBG, RR_LUTDBG_TIA, 0x0);16591660rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, B_NCTL_N1_CIP, 0x00);1661rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);1662rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);1663}16641665static void _iqk_afebb_restore(struct rtw89_dev *rtwdev,1666enum rtw89_phy_idx phy_idx, u8 path)1667{1668rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_afebb_restore_defs_tbl);1669}16701671static void _iqk_preset(struct rtw89_dev *rtwdev, u8 path)1672{1673rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);16741675rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);1676rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);1677rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x81ff010a);1678}16791680static void _iqk_macbb_setting(struct rtw89_dev *rtwdev,1681enum rtw89_phy_idx phy_idx, u8 path)1682{1683rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);16841685rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_macbb_defs_tbl);16861687_txck_force(rtwdev, path, true, DAC_960M);16881689rtw89_phy_write32_mask(rtwdev, R_UPD_CLK, B_DPD_GDIS, 0x1);16901691_rxck_force(rtwdev, path, true, ADC_1920M);16921693rtw89_rfk_parser(rtwdev, &rtw8851b_iqk_macbb_bh_defs_tbl);1694}16951696static void _iqk_init(struct rtw89_dev *rtwdev)1697{1698struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1699u8 idx, path;17001701if (iqk_info->is_iqk_init)1702return;17031704rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]===>%s\n", __func__);17051706iqk_info->is_iqk_init = true;1707iqk_info->is_nbiqk = false;1708iqk_info->iqk_fft_en = false;1709iqk_info->iqk_sram_en = false;1710iqk_info->iqk_cfir_en = false;1711iqk_info->iqk_xym_en = false;1712iqk_info->iqk_times = 0x0;17131714for (idx = 0; idx < RTW89_IQK_CHS_NR; idx++) {1715iqk_info->iqk_channel[idx] = 0x0;1716for (path = 0; path < RF_PATH_NUM_8851B; path++) {1717iqk_info->lok_cor_fail[idx][path] = false;1718iqk_info->lok_fin_fail[idx][path] = false;1719iqk_info->iqk_tx_fail[idx][path] = false;1720iqk_info->iqk_rx_fail[idx][path] = false;1721iqk_info->iqk_table_idx[path] = 0x0;1722}1723}1724}17251726static void _doiqk(struct rtw89_dev *rtwdev, bool force,1727enum rtw89_phy_idx phy_idx, u8 path,1728enum rtw89_chanctx_idx chanctx_idx)1729{1730struct rtw89_iqk_info *iqk_info = &rtwdev->iqk;1731u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, RF_AB, chanctx_idx);1732u32 backup_rf_val[RTW8851B_IQK_SS][BACKUP_RF_REGS_NR];1733u32 backup_bb_val[BACKUP_BB_REGS_NR];17341735rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK,1736BTC_WRFK_ONESHOT_START);17371738rtw89_debug(rtwdev, RTW89_DBG_RFK,1739"[IQK]==========IQK start!!!!!==========\n");1740iqk_info->iqk_times++;1741iqk_info->version = RTW8851B_IQK_VER;17421743rtw89_debug(rtwdev, RTW89_DBG_RFK, "[IQK]Test Ver 0x%x\n", iqk_info->version);1744_iqk_get_ch_info(rtwdev, phy_idx, path, chanctx_idx);17451746_rfk_backup_bb_reg(rtwdev, &backup_bb_val[0]);1747_rfk_backup_rf_reg(rtwdev, &backup_rf_val[path][0], path);1748_iqk_macbb_setting(rtwdev, phy_idx, path);1749_iqk_preset(rtwdev, path);1750_iqk_start_iqk(rtwdev, phy_idx, path);1751_iqk_restore(rtwdev, path);1752_iqk_afebb_restore(rtwdev, phy_idx, path);1753_rfk_restore_bb_reg(rtwdev, &backup_bb_val[0]);1754_rfk_restore_rf_reg(rtwdev, &backup_rf_val[path][0], path);17551756rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK,1757BTC_WRFK_ONESHOT_STOP);1758}17591760static void _iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,1761bool force, enum rtw89_chanctx_idx chanctx_idx)1762{1763_doiqk(rtwdev, force, phy_idx, RF_PATH_A, chanctx_idx);1764}17651766static void _dpk_bkup_kip(struct rtw89_dev *rtwdev, const u32 *reg,1767u32 reg_bkup[][DPK_KIP_REG_NUM_8851B], u8 path)1768{1769u8 i;17701771for (i = 0; i < DPK_KIP_REG_NUM_8851B; i++) {1772reg_bkup[path][i] =1773rtw89_phy_read32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD);17741775rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup 0x%x = %x\n",1776reg[i] + (path << 8), reg_bkup[path][i]);1777}1778}17791780static void _dpk_bkup_rf(struct rtw89_dev *rtwdev, const u32 *rf_reg,1781u32 rf_bkup[][DPK_RF_REG_NUM_8851B], u8 path)1782{1783u8 i;17841785for (i = 0; i < DPK_RF_REG_NUM_8851B; i++) {1786rf_bkup[path][i] = rtw89_read_rf(rtwdev, path, rf_reg[i], RFREG_MASK);17871788rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Backup RF S%d 0x%x = %x\n",1789path, rf_reg[i], rf_bkup[path][i]);1790}1791}17921793static void _dpk_reload_kip(struct rtw89_dev *rtwdev, const u32 *reg,1794u32 reg_bkup[][DPK_KIP_REG_NUM_8851B], u8 path)1795{1796u8 i;17971798for (i = 0; i < DPK_KIP_REG_NUM_8851B; i++) {1799rtw89_phy_write32_mask(rtwdev, reg[i] + (path << 8), MASKDWORD,1800reg_bkup[path][i]);18011802rtw89_debug(rtwdev, RTW89_DBG_RFK,1803"[DPK] Reload 0x%x = %x\n",1804reg[i] + (path << 8), reg_bkup[path][i]);1805}1806}18071808static void _dpk_reload_rf(struct rtw89_dev *rtwdev, const u32 *rf_reg,1809u32 rf_bkup[][DPK_RF_REG_NUM_8851B], u8 path)1810{1811u8 i;18121813for (i = 0; i < DPK_RF_REG_NUM_8851B; i++) {1814rtw89_write_rf(rtwdev, path, rf_reg[i], RFREG_MASK, rf_bkup[path][i]);18151816rtw89_debug(rtwdev, RTW89_DBG_RFK,1817"[DPK] Reload RF S%d 0x%x = %x\n", path,1818rf_reg[i], rf_bkup[path][i]);1819}1820}18211822static void _dpk_one_shot(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,1823enum rtw89_rf_path path, enum dpk_id id)1824{1825u16 dpk_cmd;1826u32 val;1827int ret;18281829dpk_cmd = ((id << 8) | (0x19 + path * 0x12));1830rtw89_phy_write32_mask(rtwdev, R_NCTL_CFG, MASKDWORD, dpk_cmd);18311832ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x55,183310, 20000, false,1834rtwdev, 0xbff8, MASKBYTE0);1835if (ret)1836rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 1 timeout\n");18371838udelay(1);18391840ret = read_poll_timeout_atomic(rtw89_phy_read32_mask, val, val == 0x8000,18411, 2000, false,1842rtwdev, R_RPT_COM, MASKLWORD);1843if (ret)1844rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] one-shot 2 timeout\n");18451846rtw89_phy_write32_mask(rtwdev, R_NCTL_N1, MASKBYTE0, 0x0);18471848rtw89_debug(rtwdev, RTW89_DBG_RFK,1849"[DPK] one-shot for %s = 0x%04x\n",1850id == 0x28 ? "KIP_PRESET" :1851id == 0x29 ? "DPK_TXAGC" :1852id == 0x2a ? "DPK_RXAGC" :1853id == 0x2b ? "SYNC" :1854id == 0x2c ? "GAIN_LOSS" :1855id == 0x2d ? "MDPK_IDL" :1856id == 0x2f ? "DPK_GAIN_NORM" :1857id == 0x31 ? "KIP_RESTORE" :1858id == 0x6 ? "LBK_RXIQK" : "Unknown id",1859dpk_cmd);1860}18611862static void _dpk_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,1863bool off)1864{1865struct rtw89_dpk_info *dpk = &rtwdev->dpk;1866u8 kidx = dpk->cur_idx[path];1867u8 off_reverse = off ? 0 : 1;1868u8 val;18691870val = dpk->is_dpk_enable * off_reverse * dpk->bp[path][kidx].path_ok;18711872rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),18730xf0000000, val);18741875rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] DPK %s !!!\n", path,1876kidx, val == 0 ? "disable" : "enable");1877}18781879static void _dpk_init(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)1880{1881struct rtw89_dpk_info *dpk = &rtwdev->dpk;18821883u8 kidx = dpk->cur_idx[path];18841885dpk->bp[path][kidx].path_ok = 0;1886}18871888static void _dpk_information(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,1889enum rtw89_rf_path path, enum rtw89_chanctx_idx chanctx_idx)1890{1891const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);1892struct rtw89_dpk_info *dpk = &rtwdev->dpk;18931894u8 kidx = dpk->cur_idx[path];18951896dpk->bp[path][kidx].band = chan->band_type;1897dpk->bp[path][kidx].ch = chan->band_width;1898dpk->bp[path][kidx].bw = chan->channel;18991900rtw89_debug(rtwdev, RTW89_DBG_RFK,1901"[DPK] S%d[%d] (PHY%d): TSSI %s/ DBCC %s/ %s/ CH%d/ %s\n",1902path, dpk->cur_idx[path], phy,1903str_on_off(rtwdev->is_tssi_mode[path]),1904str_on_off(rtwdev->dbcc_en),1905dpk->bp[path][kidx].band == 0 ? "2G" :1906dpk->bp[path][kidx].band == 1 ? "5G" : "6G",1907dpk->bp[path][kidx].ch,1908dpk->bp[path][kidx].bw == 0 ? "20M" :1909dpk->bp[path][kidx].bw == 1 ? "40M" :1910dpk->bp[path][kidx].bw == 2 ? "80M" : "160M");1911}19121913static void _dpk_rxagc_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,1914bool turn_on)1915{1916if (path == RF_PATH_A)1917rtw89_phy_write32_mask(rtwdev, R_P0_AGC_CTL, B_P0_AGC_EN, turn_on);1918else1919rtw89_phy_write32_mask(rtwdev, R_P1_AGC_CTL, B_P1_AGC_EN, turn_on);19201921rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d RXAGC is %s\n", path,1922turn_on ? "turn_on" : "turn_off");1923}19241925static void _dpk_bb_afe_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)1926{1927rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x1);1928rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x0);1929rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x1);1930rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x0);1931rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0xd801dffd);19321933_txck_force(rtwdev, path, true, DAC_960M);1934_rxck_force(rtwdev, path, true, ADC_1920M);19351936rtw89_phy_write32_mask(rtwdev, R_DCIM, B_DCIM_FR, 0x0);1937rtw89_phy_write32_mask(rtwdev, R_ADCMOD, B_ADCMOD_AUTO_RST, 0x1);1938rtw89_phy_write32_mask(rtwdev, R_P0_NRBW, B_P0_NRBW_DBG, 0x1);1939udelay(1);1940rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f);1941udelay(10);1942rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13);1943udelay(2);1944rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0001);1945udelay(2);1946rtw89_phy_write32_mask(rtwdev, R_ANAPAR, B_ANAPAR_15, 0x0041);1947udelay(10);19481949rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x1);1950rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x1);19511952rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE setting\n", path);1953}19541955static void _dpk_bb_afe_restore(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)1956{1957rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x0);1958rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x1);1959rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(20 + path), 0x0);1960rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x1);1961rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(28 + path), 0x0);1962rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), MASKDWORD, 0x00000000);1963rtw89_phy_write32_mask(rtwdev, R_P0_RXCK + (path << 13), B_P0_TXCK_ALL, 0x00);1964rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(16 + path), 0x0);1965rtw89_phy_write32_mask(rtwdev, R_ADC_FIFO, BIT(24 + path), 0x0);19661967rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d BB/AFE restore\n", path);1968}19691970static void _dpk_tssi_pause(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,1971bool is_pause)1972{1973rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK + (path << 13),1974B_P0_TSSI_TRK_EN, is_pause);19751976rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI %s\n", path,1977is_pause ? "pause" : "resume");1978}19791980static1981void _dpk_tssi_slope_k_onoff(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,1982bool is_on)1983{1984rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_SLOPE_CAL + (path << 13),1985B_P0_TSSI_SLOPE_CAL_EN, is_on);19861987rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d TSSI slpoe_k %s\n", path,1988str_on_off(is_on));1989}19901991static void _dpk_tpg_sel(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)1992{1993struct rtw89_dpk_info *dpk = &rtwdev->dpk;19941995if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80) {1996rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x0);1997rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xffe0fa00);1998} else if (dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40) {1999rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x2);2000rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xff4009e0);2001} else {2002rtw89_phy_write32_mask(rtwdev, R_TPG_MOD, B_TPG_MOD_F, 0x1);2003rtw89_phy_write32_mask(rtwdev, R_TPG_SEL, MASKDWORD, 0xf9f007d0);2004}20052006rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] TPG Select for %s\n",2007dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_80 ? "80M" :2008dpk->bp[path][kidx].bw == RTW89_CHANNEL_WIDTH_40 ? "40M" : "20M");2009}20102011static void _dpk_txpwr_bb_force(struct rtw89_dev *rtwdev,2012enum rtw89_rf_path path, bool force)2013{2014rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13), B_TXPWRB_ON, force);2015rtw89_phy_write32_mask(rtwdev, R_TXPWRB_H + (path << 13), B_TXPWRB_RDY, force);20162017rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d txpwr_bb_force %s\n",2018path, str_on_off(force));2019}20202021static void _dpk_kip_pwr_clk_onoff(struct rtw89_dev *rtwdev, bool turn_on)2022{2023if (turn_on) {2024rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000080);2025rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x807f030a);2026} else {2027rtw89_phy_write32_mask(rtwdev, R_NCTL_RPT, MASKDWORD, 0x00000000);2028rtw89_phy_write32_mask(rtwdev, R_KIP_SYSCFG, MASKDWORD, 0x80000000);2029rtw89_phy_write32_mask(rtwdev, R_DPK_WR, BIT(18), 0x1);2030}2031}20322033static void _dpk_kip_control_rfc(struct rtw89_dev *rtwdev,2034enum rtw89_rf_path path, bool ctrl_by_kip)2035{2036rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13),2037B_IQK_RFC_ON, ctrl_by_kip);2038}20392040static void _dpk_kip_preset(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2041enum rtw89_rf_path path, u8 kidx)2042{2043rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD,2044rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));2045rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),2046B_DPD_SEL, 0x01);20472048_dpk_kip_control_rfc(rtwdev, path, true);2049_dpk_one_shot(rtwdev, phy, path, D_KIP_PRESET);2050}20512052static void _dpk_kip_restore(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2053enum rtw89_rf_path path)2054{2055_dpk_one_shot(rtwdev, phy, path, D_KIP_RESTORE);2056_dpk_kip_control_rfc(rtwdev, path, false);2057_dpk_txpwr_bb_force(rtwdev, path, false);20582059rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d restore KIP\n", path);2060}20612062static void _dpk_kset_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)2063{2064struct rtw89_dpk_info *dpk = &rtwdev->dpk;20652066rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8), B_KIP_RPT_SEL, 0x10);20672068dpk->cur_k_set =2069rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8), B_RPT_PER_KSET) - 1;2070}20712072static void _dpk_para_query(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)2073{2074static const u32 reg[RTW89_DPK_BKUP_NUM][DPK_KSET_NUM] = {2075{0x8190, 0x8194, 0x8198, 0x81a4},2076{0x81a8, 0x81c4, 0x81c8, 0x81e8}2077};2078struct rtw89_dpk_info *dpk = &rtwdev->dpk;2079u8 cur_k_set = dpk->cur_k_set;2080u32 para;20812082if (cur_k_set >= DPK_KSET_NUM) {2083rtw89_warn(rtwdev, "DPK cur_k_set = %d\n", cur_k_set);2084cur_k_set = 2;2085}20862087para = rtw89_phy_read32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8),2088MASKDWORD);20892090dpk->bp[path][kidx].txagc_dpk = (para >> 10) & 0x3f;2091dpk->bp[path][kidx].ther_dpk = (para >> 26) & 0x3f;20922093rtw89_debug(rtwdev, RTW89_DBG_RFK,2094"[DPK] thermal/ txagc_RF (K%d) = 0x%x/ 0x%x\n",2095dpk->cur_k_set, dpk->bp[path][kidx].ther_dpk,2096dpk->bp[path][kidx].txagc_dpk);2097}20982099static bool _dpk_sync_check(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)2100{2101struct rtw89_dpk_info *dpk = &rtwdev->dpk;2102u8 corr_val, corr_idx, rxbb;2103u16 dc_i, dc_q;2104u8 rxbb_ov;21052106rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);21072108corr_idx = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORI);2109corr_val = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_CORV);2110dpk->corr_idx[path][kidx] = corr_idx;2111dpk->corr_val[path][kidx] = corr_val;21122113rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x9);21142115dc_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);2116dc_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCQ);21172118dc_i = abs(sign_extend32(dc_i, 11));2119dc_q = abs(sign_extend32(dc_q, 11));21202121rtw89_debug(rtwdev, RTW89_DBG_RFK,2122"[DPK] S%d Corr_idx/ Corr_val /DC I/Q, = %d / %d / %d / %d\n",2123path, corr_idx, corr_val, dc_i, dc_q);21242125dpk->dc_i[path][kidx] = dc_i;2126dpk->dc_q[path][kidx] = dc_q;21272128rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x8);2129rxbb = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXBB);21302131rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x31);2132rxbb_ov = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_RXOV);21332134rtw89_debug(rtwdev, RTW89_DBG_RFK,2135"[DPK] S%d RXBB/ RXAGC_done /RXBB_ovlmt = %d / %d / %d\n",2136path, rxbb,2137rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DONE),2138rxbb_ov);21392140if (dc_i > 200 || dc_q > 200 || corr_val < 170)2141return true;2142else2143return false;2144}21452146static void _dpk_kip_set_txagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2147enum rtw89_rf_path path, u8 dbm,2148bool set_from_bb)2149{2150if (set_from_bb) {2151dbm = clamp_t(u8, dbm, 7, 24);21522153rtw89_debug(rtwdev, RTW89_DBG_RFK,2154"[DPK] set S%d txagc to %ddBm\n", path, dbm);2155rtw89_phy_write32_mask(rtwdev, R_TXPWRB + (path << 13),2156B_TXPWRB_VAL, dbm << 2);2157}21582159_dpk_one_shot(rtwdev, phy, path, D_TXAGC);2160_dpk_kset_query(rtwdev, path);2161}21622163static bool _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2164enum rtw89_rf_path path, u8 kidx)2165{2166_dpk_kip_control_rfc(rtwdev, path, false);2167rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD,2168rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));2169_dpk_kip_control_rfc(rtwdev, path, true);21702171_dpk_one_shot(rtwdev, phy, path, D_RXAGC);2172return _dpk_sync_check(rtwdev, path, kidx);2173}21742175static void _dpk_lbk_rxiqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2176enum rtw89_rf_path path)2177{2178u32 rf_11, reg_81cc;2179u8 cur_rxbb;21802181rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1);2182rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x1);21832184_dpk_kip_control_rfc(rtwdev, path, false);21852186cur_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB);2187rf_11 = rtw89_read_rf(rtwdev, path, RR_TXIG, RFREG_MASK);2188reg_81cc = rtw89_phy_read32_mask(rtwdev, R_KIP_IQP + (path << 8),2189B_KIP_IQP_SW);21902191rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR0, 0x0);2192rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_GR1, 0x3);2193rtw89_write_rf(rtwdev, path, RR_TXIG, RR_TXIG_TG, 0xd);2194rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, 0x1f);21952196rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_IQSW, 0x12);2197rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, 0x3);21982199_dpk_kip_control_rfc(rtwdev, path, true);22002201rtw89_phy_write32_mask(rtwdev, R_IQK_DIF4, MASKDWORD, 0x00250025);22022203_dpk_one_shot(rtwdev, phy, path, LBK_RXIQK);22042205rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d LBK RXIQC = 0x%x\n", path,2206rtw89_phy_read32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD));22072208_dpk_kip_control_rfc(rtwdev, path, false);22092210rtw89_write_rf(rtwdev, path, RR_TXIG, RFREG_MASK, rf_11);2211rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, cur_rxbb);2212rtw89_phy_write32_mask(rtwdev, R_KIP_IQP + (path << 8), B_KIP_IQP_SW, reg_81cc);22132214rtw89_phy_write32_mask(rtwdev, R_MDPK_RX_DCK, B_MDPK_RX_DCK_EN, 0x0);2215rtw89_phy_write32_mask(rtwdev, R_KPATH_CFG, B_KPATH_CFG_ED, 0x0);2216rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_DI, 0x1);22172218_dpk_kip_control_rfc(rtwdev, path, true);2219}22202221static void _dpk_rf_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path, u8 kidx)2222{2223struct rtw89_dpk_info *dpk = &rtwdev->dpk;22242225if (dpk->bp[path][kidx].band == RTW89_BAND_2G) {2226rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK, 0x50521);2227rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK);2228rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTC, 0x0);2229rtw89_write_rf(rtwdev, path, RR_RXBB, RR_RXBB_ATTR, 0x7);2230} else {2231rtw89_write_rf(rtwdev, path, RR_MOD, RFREG_MASK,22320x50521 | BIT(rtwdev->dbcc_en));2233rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK);2234rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RAA2_SATT, 0x3);2235}22362237rtw89_write_rf(rtwdev, path, RR_RCKD, RR_RCKD_BW, 0x1);2238rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_TXBB, dpk->bp[path][kidx].bw + 1);2239rtw89_write_rf(rtwdev, path, RR_BTC, RR_BTC_RXBB, 0x0);2240rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_EBW, 0x0);2241}22422243static void _dpk_bypass_rxiqc(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)2244{2245rtw89_phy_write32_mask(rtwdev, R_DPD_V1 + (path << 8), B_DPD_LBK, 0x1);2246rtw89_phy_write32_mask(rtwdev, R_RXIQC + (path << 8), MASKDWORD, 0x40000002);22472248rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Bypass RXIQC\n");2249}22502251static u16 _dpk_dgain_read(struct rtw89_dev *rtwdev)2252{2253u16 dgain;22542255rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x0);2256dgain = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_DCI);22572258rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] DGain = 0x%x\n", dgain);22592260return dgain;2261}22622263static u8 _dpk_gainloss_read(struct rtw89_dev *rtwdev)2264{2265u8 result;22662267rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, B_KIP_RPT1_SEL, 0x6);2268rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x1);2269result = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, B_PRT_COM_GL);22702271rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] tmp GL = %d\n", result);22722273return result;2274}22752276static u8 _dpk_gainloss(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2277enum rtw89_rf_path path, u8 kidx)2278{2279_dpk_one_shot(rtwdev, phy, path, D_GAIN_LOSS);2280_dpk_kip_set_txagc(rtwdev, phy, path, 0xff, false);22812282rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A1, 0xf078);2283rtw89_phy_write32_mask(rtwdev, R_DPK_GL + (path << 8), B_DPK_GL_A0, 0x0);22842285return _dpk_gainloss_read(rtwdev);2286}22872288static u8 _dpk_pas_read(struct rtw89_dev *rtwdev, u8 is_check)2289{2290u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0;2291u32 val1_sqrt_sum, val2_sqrt_sum;2292u8 i;22932294rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06);2295rtw89_phy_write32_mask(rtwdev, R_DPK_CFG2, B_DPK_CFG2_ST, 0x0);2296rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE2, 0x08);22972298if (is_check) {2299rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x00);2300val1_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);2301val1_i = abs(sign_extend32(val1_i, 11));2302val1_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);2303val1_q = abs(sign_extend32(val1_q, 11));23042305rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, 0x1f);2306val2_i = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKHWORD);2307val2_i = abs(sign_extend32(val2_i, 11));2308val2_q = rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKLWORD);2309val2_q = abs(sign_extend32(val2_q, 11));23102311rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] PAS_delta = 0x%x\n",2312phy_div(val1_i * val1_i + val1_q * val1_q,2313val2_i * val2_i + val2_q * val2_q));2314} else {2315for (i = 0; i < 32; i++) {2316rtw89_phy_write32_mask(rtwdev, R_DPK_CFG3, MASKBYTE3, i);2317rtw89_debug(rtwdev, RTW89_DBG_RFK,2318"[DPK] PAS_Read[%02d]= 0x%08x\n", i,2319rtw89_phy_read32_mask(rtwdev, R_RPT_COM, MASKDWORD));2320}2321}23222323val1_sqrt_sum = val1_i * val1_i + val1_q * val1_q;2324val2_sqrt_sum = val2_i * val2_i + val2_q * val2_q;23252326if (val1_sqrt_sum < val2_sqrt_sum)2327return 2;2328else if (val1_sqrt_sum >= val2_sqrt_sum * 8 / 5)2329return 1;2330else2331return 0;2332}23332334static u8 _dpk_agc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2335enum rtw89_rf_path path, u8 kidx, u8 init_xdbm, u8 loss_only)2336{2337struct rtw89_dpk_info *dpk = &rtwdev->dpk;2338u8 tmp_dbm = init_xdbm, tmp_gl_idx = 0;2339u8 step = DPK_AGC_STEP_SYNC_DGAIN;2340u8 goout = 0, agc_cnt = 0;2341bool is_fail = false;2342int limit = 200;2343u8 tmp_rxbb;2344u16 dgain;23452346do {2347switch (step) {2348case DPK_AGC_STEP_SYNC_DGAIN:2349is_fail = _dpk_kip_set_rxagc(rtwdev, phy, path, kidx);23502351if (is_fail) {2352goout = 1;2353break;2354}23552356dgain = _dpk_dgain_read(rtwdev);23572358if (dgain > 0x5fc || dgain < 0x556) {2359_dpk_one_shot(rtwdev, phy, path, D_SYNC);2360_dpk_dgain_read(rtwdev);2361}23622363if (agc_cnt == 0) {2364if (dpk->bp[path][kidx].band == RTW89_BAND_2G)2365_dpk_bypass_rxiqc(rtwdev, path);2366else2367_dpk_lbk_rxiqk(rtwdev, phy, path);2368}2369step = DPK_AGC_STEP_GAIN_LOSS_IDX;2370break;23712372case DPK_AGC_STEP_GAIN_LOSS_IDX:2373tmp_gl_idx = _dpk_gainloss(rtwdev, phy, path, kidx);23742375if (_dpk_pas_read(rtwdev, true) == 2 && tmp_gl_idx > 0)2376step = DPK_AGC_STEP_GL_LT_CRITERION;2377else if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true) == 1) ||2378tmp_gl_idx >= 7)2379step = DPK_AGC_STEP_GL_GT_CRITERION;2380else if (tmp_gl_idx == 0)2381step = DPK_AGC_STEP_GL_LT_CRITERION;2382else2383step = DPK_AGC_STEP_SET_TX_GAIN;2384break;23852386case DPK_AGC_STEP_GL_GT_CRITERION:2387if (tmp_dbm <= 7) {2388goout = 1;2389rtw89_debug(rtwdev, RTW89_DBG_RFK,2390"[DPK] Txagc@lower bound!!\n");2391} else {2392tmp_dbm = max_t(u8, tmp_dbm - 3, 7);2393_dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true);2394}2395step = DPK_AGC_STEP_SYNC_DGAIN;2396agc_cnt++;2397break;23982399case DPK_AGC_STEP_GL_LT_CRITERION:2400if (tmp_dbm >= 24) {2401goout = 1;2402rtw89_debug(rtwdev, RTW89_DBG_RFK,2403"[DPK] Txagc@upper bound!!\n");2404} else {2405tmp_dbm = min_t(u8, tmp_dbm + 2, 24);2406_dpk_kip_set_txagc(rtwdev, phy, path, tmp_dbm, true);2407}2408step = DPK_AGC_STEP_SYNC_DGAIN;2409agc_cnt++;2410break;24112412case DPK_AGC_STEP_SET_TX_GAIN:2413_dpk_kip_control_rfc(rtwdev, path, false);2414tmp_rxbb = rtw89_read_rf(rtwdev, path, RR_MOD, RR_MOD_RXB);2415tmp_rxbb = min_t(u8, tmp_rxbb + tmp_gl_idx, 0x1f);24162417rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_RXB, tmp_rxbb);24182419rtw89_debug(rtwdev, RTW89_DBG_RFK,2420"[DPK] Adjust RXBB (%+d) = 0x%x\n",2421tmp_gl_idx, tmp_rxbb);2422_dpk_kip_control_rfc(rtwdev, path, true);2423goout = 1;2424break;2425default:2426goout = 1;2427break;2428}2429} while (!goout && agc_cnt < 6 && limit-- > 0);24302431return is_fail;2432}24332434static void _dpk_set_mdpd_para(struct rtw89_dev *rtwdev, u8 order)2435{2436switch (order) {2437case 0: /* (5,3,1) */2438rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x0);2439rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x2);2440rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x3);2441rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x1);2442break;2443case 1: /* (5,3,0) */2444rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x1);2445rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x1);2446rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0);2447rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x0);2448break;2449case 2: /* (5,0,0) */2450rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x2);2451rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x0);2452rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x0);2453rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x0);2454break;2455case 3: /* (7,3,1) */2456rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP, 0x3);2457rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL_SEL, 0x3);2458rtw89_phy_write32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_PN, 0x4);2459rtw89_phy_write32_mask(rtwdev, R_MDPK_SYNC, B_MDPK_SYNC_DMAN, 0x1);2460break;2461default:2462rtw89_debug(rtwdev, RTW89_DBG_RFK,2463"[DPK] Wrong MDPD order!!(0x%x)\n", order);2464break;2465}24662467rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] Set %s for IDL\n",2468order == 0x0 ? "(5,3,1)" :2469order == 0x1 ? "(5,3,0)" :2470order == 0x2 ? "(5,0,0)" : "(7,3,1)");2471}24722473static void _dpk_idl_mpa(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2474enum rtw89_rf_path path, u8 kidx)2475{2476if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_MD500) == 0x1)2477_dpk_set_mdpd_para(rtwdev, 0x2);2478else if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_MD530) == 0x1)2479_dpk_set_mdpd_para(rtwdev, 0x1);2480else2481_dpk_set_mdpd_para(rtwdev, 0x0);24822483rtw89_phy_write32_mask(rtwdev, R_DPK_IDL, B_DPK_IDL, 0x0);2484fsleep(1000);24852486_dpk_one_shot(rtwdev, phy, path, D_MDPK_IDL);2487}24882489static u8 _dpk_order_convert(struct rtw89_dev *rtwdev)2490{2491u32 order;2492u8 val;24932494order = rtw89_phy_read32_mask(rtwdev, R_LDL_NORM, B_LDL_NORM_OP);24952496switch (order) {2497case 0: /* (5,3,1) */2498val = 0x6;2499break;2500case 1: /* (5,3,0) */2501val = 0x2;2502break;2503case 2: /* (5,0,0) */2504val = 0x0;2505break;2506default:2507val = 0xff;2508break;2509}25102511rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] convert MDPD order to 0x%x\n", val);25122513return val;2514}25152516static void _dpk_gain_normalize(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2517enum rtw89_rf_path path, u8 kidx, bool is_execute)2518{2519static const u32 reg[RTW89_DPK_BKUP_NUM][DPK_KSET_NUM] = {2520{0x8190, 0x8194, 0x8198, 0x81a4},2521{0x81a8, 0x81c4, 0x81c8, 0x81e8}2522};2523struct rtw89_dpk_info *dpk = &rtwdev->dpk;2524u8 cur_k_set = dpk->cur_k_set;25252526if (cur_k_set >= DPK_KSET_NUM) {2527rtw89_warn(rtwdev, "DPK cur_k_set = %d\n", cur_k_set);2528cur_k_set = 2;2529}25302531if (is_execute) {2532rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8),2533B_DPK_GN_AG, 0x200);2534rtw89_phy_write32_mask(rtwdev, R_DPK_GN + (path << 8),2535B_DPK_GN_EN, 0x3);25362537_dpk_one_shot(rtwdev, phy, path, D_GAIN_NORM);2538} else {2539rtw89_phy_write32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8),25400x0000007F, 0x5b);2541}25422543dpk->bp[path][kidx].gs =2544rtw89_phy_read32_mask(rtwdev, reg[kidx][cur_k_set] + (path << 8),25450x0000007F);2546}25472548static void _dpk_on(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2549enum rtw89_rf_path path, u8 kidx)2550{2551struct rtw89_dpk_info *dpk = &rtwdev->dpk;25522553rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x1);2554rtw89_phy_write32_mask(rtwdev, R_LOAD_COEF + (path << 8), B_LOAD_COEF_MDPD, 0x0);2555rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),2556B_DPD_ORDER, _dpk_order_convert(rtwdev));25572558dpk->bp[path][kidx].path_ok =2559dpk->bp[path][kidx].path_ok | BIT(dpk->cur_k_set);25602561rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d] path_ok = 0x%x\n",2562path, kidx, dpk->bp[path][kidx].path_ok);25632564rtw89_phy_write32_mask(rtwdev, R_DPD_CH0A + (path << 8) + (kidx << 2),2565B_DPD_MEN, dpk->bp[path][kidx].path_ok);25662567_dpk_gain_normalize(rtwdev, phy, path, kidx, false);2568}25692570static bool _dpk_main(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2571enum rtw89_rf_path path)2572{2573struct rtw89_dpk_info *dpk = &rtwdev->dpk;2574u8 kidx = dpk->cur_idx[path];2575u8 init_xdbm = 17;2576bool is_fail;25772578_dpk_kip_control_rfc(rtwdev, path, false);2579_rfk_rf_direct_cntrl(rtwdev, path, false);2580rtw89_write_rf(rtwdev, path, RR_BBDC, RFREG_MASK, 0x03ffd);25812582_dpk_rf_setting(rtwdev, path, kidx);2583_set_rx_dck(rtwdev, path, RF_DPK);25842585_dpk_kip_pwr_clk_onoff(rtwdev, true);2586_dpk_kip_preset(rtwdev, phy, path, kidx);2587_dpk_txpwr_bb_force(rtwdev, path, true);2588_dpk_kip_set_txagc(rtwdev, phy, path, init_xdbm, true);2589_dpk_tpg_sel(rtwdev, path, kidx);2590is_fail = _dpk_agc(rtwdev, phy, path, kidx, init_xdbm, false);2591if (is_fail)2592goto _error;25932594_dpk_idl_mpa(rtwdev, phy, path, kidx);2595_dpk_para_query(rtwdev, path, kidx);25962597_dpk_on(rtwdev, phy, path, kidx);2598_error:2599_dpk_kip_control_rfc(rtwdev, path, false);2600rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RF_RX);26012602rtw89_debug(rtwdev, RTW89_DBG_RFK, "[DPK] S%d[%d]_K%d %s\n", path, kidx,2603dpk->cur_k_set, is_fail ? "need Check" : "is Success");26042605return is_fail;2606}26072608static void _dpk_cal_select(struct rtw89_dev *rtwdev, bool force,2609enum rtw89_phy_idx phy, u8 kpath,2610enum rtw89_chanctx_idx chanctx_idx)2611{2612struct rtw89_dpk_info *dpk = &rtwdev->dpk;2613u32 kip_bkup[RF_PATH_NUM_8851B][DPK_KIP_REG_NUM_8851B] = {};2614u32 rf_bkup[RF_PATH_NUM_8851B][DPK_RF_REG_NUM_8851B] = {};2615bool is_fail;2616u8 path;26172618for (path = 0; path < RF_PATH_NUM_8851B; path++)2619dpk->cur_idx[path] = 0;26202621for (path = 0; path < RF_PATH_NUM_8851B; path++) {2622if (!(kpath & BIT(path)))2623continue;2624_dpk_bkup_kip(rtwdev, dpk_kip_reg, kip_bkup, path);2625_dpk_bkup_rf(rtwdev, dpk_rf_reg, rf_bkup, path);2626_dpk_information(rtwdev, phy, path, chanctx_idx);2627_dpk_init(rtwdev, path);26282629if (rtwdev->is_tssi_mode[path])2630_dpk_tssi_pause(rtwdev, path, true);2631}26322633for (path = 0; path < RF_PATH_NUM_8851B; path++) {2634if (!(kpath & BIT(path)))2635continue;26362637rtw89_debug(rtwdev, RTW89_DBG_RFK,2638"[DPK] ========= S%d[%d] DPK Start =========\n",2639path, dpk->cur_idx[path]);26402641_dpk_tssi_slope_k_onoff(rtwdev, path, false);2642_dpk_rxagc_onoff(rtwdev, path, false);2643_rfk_drf_direct_cntrl(rtwdev, path, false);2644_dpk_bb_afe_setting(rtwdev, path);26452646is_fail = _dpk_main(rtwdev, phy, path);2647_dpk_onoff(rtwdev, path, is_fail);2648}26492650for (path = 0; path < RF_PATH_NUM_8851B; path++) {2651if (!(kpath & BIT(path)))2652continue;26532654_dpk_kip_restore(rtwdev, phy, path);2655_dpk_reload_kip(rtwdev, dpk_kip_reg, kip_bkup, path);2656_dpk_reload_rf(rtwdev, dpk_rf_reg, rf_bkup, path);2657_dpk_bb_afe_restore(rtwdev, path);2658_dpk_rxagc_onoff(rtwdev, path, true);2659_dpk_tssi_slope_k_onoff(rtwdev, path, true);2660if (rtwdev->is_tssi_mode[path])2661_dpk_tssi_pause(rtwdev, path, false);2662}26632664_dpk_kip_pwr_clk_onoff(rtwdev, false);2665}26662667static void _dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool force,2668enum rtw89_chanctx_idx chanctx_idx)2669{2670rtw89_debug(rtwdev, RTW89_DBG_RFK,2671"[DPK] ****** 8851B DPK Start (Ver: 0x%x, Cv: %d) ******\n",2672DPK_VER_8851B, rtwdev->hal.cv);26732674_dpk_cal_select(rtwdev, force, phy, _kpath(rtwdev, phy), chanctx_idx);2675}26762677static void _dpk_track(struct rtw89_dev *rtwdev)2678{2679struct rtw89_dpk_info *dpk = &rtwdev->dpk;2680s8 txagc_bb, txagc_bb_tp, txagc_ofst;2681s16 pwsf_tssi_ofst;2682s8 delta_ther = 0;2683u8 path, kidx;2684u8 txagc_rf;2685u8 cur_ther;26862687for (path = 0; path < RF_PATH_NUM_8851B; path++) {2688kidx = dpk->cur_idx[path];26892690rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2691"[DPK_TRK] ================[S%d[%d] (CH %d)]================\n",2692path, kidx, dpk->bp[path][kidx].ch);26932694txagc_rf = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),2695B_TXAGC_RF);2696txagc_bb = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BB + (path << 13),2697MASKBYTE2);2698txagc_bb_tp = rtw89_phy_read32_mask(rtwdev, R_TXAGC_BTP + (path << 13),2699B_TXAGC_BTP);27002701rtw89_phy_write32_mask(rtwdev, R_KIP_RPT + (path << 8),2702B_KIP_RPT_SEL, 0xf);2703cur_ther = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8),2704B_RPT_PER_TH);2705txagc_ofst = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8),2706B_RPT_PER_OF);2707pwsf_tssi_ofst = rtw89_phy_read32_mask(rtwdev, R_RPT_PER + (path << 8),2708B_RPT_PER_TSSI);2709pwsf_tssi_ofst = sign_extend32(pwsf_tssi_ofst, 12);27102711delta_ther = cur_ther - dpk->bp[path][kidx].ther_dpk;27122713delta_ther = delta_ther * 2 / 3;27142715rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2716"[DPK_TRK] extra delta_ther = %d (0x%x / 0x%x@k)\n",2717delta_ther, cur_ther, dpk->bp[path][kidx].ther_dpk);27182719rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2720"[DPK_TRK] delta_txagc = %d (0x%x / 0x%x@k)\n",2721txagc_rf - dpk->bp[path][kidx].txagc_dpk,2722txagc_rf, dpk->bp[path][kidx].txagc_dpk);27232724rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2725"[DPK_TRK] txagc_offset / pwsf_tssi_ofst = 0x%x / %+d\n",2726txagc_ofst, pwsf_tssi_ofst);27272728rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2729"[DPK_TRK] txagc_bb_tp / txagc_bb = 0x%x / 0x%x\n",2730txagc_bb_tp, txagc_bb);27312732if (rtw89_phy_read32_mask(rtwdev, R_IDL_MPA, B_IDL_DN) == 0x0 &&2733txagc_rf != 0) {2734rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,2735"[DPK_TRK] New pwsf = 0x%x\n", 0x78 - delta_ther);27362737rtw89_phy_write32_mask(rtwdev,2738R_DPD_BND + (path << 8) + (kidx << 2),27390x07FC0000, 0x78 - delta_ther);2740}2741}2742}27432744static void _rck(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)2745{2746u32 rf_reg5;2747u32 rck_val;2748u32 val;2749int ret;27502751rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] ====== S%d RCK ======\n", path);27522753rf_reg5 = rtw89_read_rf(rtwdev, path, RR_RSV1, RFREG_MASK);27542755rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0);2756rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX);27572758rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF0x00 = 0x%05x\n",2759rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK));27602761/* RCK trigger */2762rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, 0x00240);27632764ret = read_poll_timeout_atomic(rtw89_read_rf, val, val, 2, 30,2765false, rtwdev, path, RR_RCKS, BIT(3));27662767rck_val = rtw89_read_rf(rtwdev, path, RR_RCKC, RR_RCKC_CA);27682769rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] rck_val = 0x%x, ret = %d\n",2770rck_val, ret);27712772rtw89_write_rf(rtwdev, path, RR_RCKC, RFREG_MASK, rck_val);2773rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5);27742775rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RCK] RF 0x1b = 0x%x\n",2776rtw89_read_rf(rtwdev, path, RR_RCKC, RFREG_MASK));2777}27782779static void _tssi_set_sys(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2780enum rtw89_rf_path path, const struct rtw89_chan *chan)2781{2782enum rtw89_band band = chan->band_type;27832784rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_sys_defs_tbl);27852786rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,2787&rtw8851b_tssi_sys_a_defs_2g_tbl,2788&rtw8851b_tssi_sys_a_defs_5g_tbl);2789}27902791static void _tssi_ini_txpwr_ctrl_bb(struct rtw89_dev *rtwdev,2792enum rtw89_phy_idx phy,2793enum rtw89_rf_path path)2794{2795rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_init_txpwr_defs_a_tbl);2796}27972798static void _tssi_ini_txpwr_ctrl_bb_he_tb(struct rtw89_dev *rtwdev,2799enum rtw89_phy_idx phy,2800enum rtw89_rf_path path)2801{2802rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_init_txpwr_he_tb_defs_a_tbl);2803}28042805static void _tssi_set_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2806enum rtw89_rf_path path)2807{2808rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_dck_defs_a_tbl);2809}28102811static void _tssi_set_tmeter_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2812enum rtw89_rf_path path, const struct rtw89_chan *chan)2813{2814#define RTW8851B_TSSI_GET_VAL(ptr, idx) \2815({ \2816s8 *__ptr = (ptr); \2817u8 __idx = (idx), __i, __v; \2818u32 __val = 0; \2819for (__i = 0; __i < 4; __i++) { \2820__v = (__ptr[__idx + __i]); \2821__val |= (__v << (8 * __i)); \2822} \2823__val; \2824})2825struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;2826u8 ch = chan->channel;2827u8 subband = chan->subband_type;2828const s8 *thm_up_a = NULL;2829const s8 *thm_down_a = NULL;2830u8 thermal = 0xff;2831s8 thm_ofst[64] = {0};2832u32 tmp = 0;2833u8 i, j;28342835switch (subband) {2836default:2837case RTW89_CH_2G:2838thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_2ga_p;2839thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_2ga_n;2840break;2841case RTW89_CH_5G_BAND_1:2842thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[0];2843thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[0];2844break;2845case RTW89_CH_5G_BAND_3:2846thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[1];2847thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[1];2848break;2849case RTW89_CH_5G_BAND_4:2850thm_up_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_p[2];2851thm_down_a = rtw89_8851b_trk_cfg.delta_swingidx_5ga_n[2];2852break;2853}28542855if (path == RF_PATH_A) {2856thermal = tssi_info->thermal[RF_PATH_A];28572858rtw89_debug(rtwdev, RTW89_DBG_TSSI,2859"[TSSI] ch=%d thermal_pathA=0x%x\n", ch, thermal);28602861rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_DIS, 0x0);2862rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER_TRK, 0x1);28632864if (thermal == 0xff) {2865rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER, 32);2866rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL, 32);28672868for (i = 0; i < 64; i += 4) {2869rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, 0x0);28702871rtw89_debug(rtwdev, RTW89_DBG_TSSI,2872"[TSSI] write 0x%x val=0x%08x\n",2873R_P0_TSSI_BASE + i, 0x0);2874}28752876} else {2877rtw89_phy_write32_mask(rtwdev, R_P0_TMETER, B_P0_TMETER,2878thermal);2879rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, B_P0_RFCTM_VAL,2880thermal);28812882i = 0;2883for (j = 0; j < 32; j++)2884thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?2885-thm_down_a[i++] :2886-thm_down_a[DELTA_SWINGIDX_SIZE - 1];28872888i = 1;2889for (j = 63; j >= 32; j--)2890thm_ofst[j] = i < DELTA_SWINGIDX_SIZE ?2891thm_up_a[i++] :2892thm_up_a[DELTA_SWINGIDX_SIZE - 1];28932894for (i = 0; i < 64; i += 4) {2895tmp = RTW8851B_TSSI_GET_VAL(thm_ofst, i);2896rtw89_phy_write32(rtwdev, R_P0_TSSI_BASE + i, tmp);28972898rtw89_debug(rtwdev, RTW89_DBG_TSSI,2899"[TSSI] write 0x%x val=0x%08x\n",29000x5c00 + i, tmp);2901}2902}2903rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x1);2904rtw89_phy_write32_mask(rtwdev, R_P0_RFCTM, R_P0_RFCTM_RDY, 0x0);2905}2906#undef RTW8851B_TSSI_GET_VAL2907}29082909static void _tssi_set_dac_gain_tbl(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2910enum rtw89_rf_path path)2911{2912rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_dac_gain_defs_a_tbl);2913}29142915static void _tssi_slope_cal_org(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2916enum rtw89_rf_path path, const struct rtw89_chan *chan)2917{2918enum rtw89_band band = chan->band_type;29192920rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,2921&rtw8851b_tssi_slope_a_defs_2g_tbl,2922&rtw8851b_tssi_slope_a_defs_5g_tbl);2923}29242925static void _tssi_alignment_default(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2926enum rtw89_rf_path path, bool all,2927const struct rtw89_chan *chan)2928{2929enum rtw89_band band = chan->band_type;29302931rtw89_rfk_parser_by_cond(rtwdev, band == RTW89_BAND_2G,2932&rtw8851b_tssi_align_a_2g_defs_tbl,2933&rtw8851b_tssi_align_a_5g_defs_tbl);2934}29352936static void _tssi_set_tssi_slope(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2937enum rtw89_rf_path path)2938{2939rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_slope_defs_a_tbl);2940}29412942static void _tssi_set_tssi_track(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,2943enum rtw89_rf_path path)2944{2945rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_track_defs_a_tbl);2946}29472948static void _tssi_set_txagc_offset_mv_avg(struct rtw89_dev *rtwdev,2949enum rtw89_phy_idx phy,2950enum rtw89_rf_path path)2951{2952rtw89_rfk_parser(rtwdev, &rtw8851b_tssi_mv_avg_defs_a_tbl);2953}29542955static void _tssi_enable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)2956{2957_tssi_set_tssi_track(rtwdev, phy, RF_PATH_A);2958_tssi_set_txagc_offset_mv_avg(rtwdev, phy, RF_PATH_A);29592960rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x0);2961rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0);2962rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x1);2963rtw89_write_rf(rtwdev, RF_PATH_A, RR_TXGA_V1, RR_TXGA_V1_TRK_EN, 0x1);29642965rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);2966rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_RFC, 0x3);2967rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0);2968rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);2969rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);29702971rtwdev->is_tssi_mode[RF_PATH_A] = true;2972}29732974static void _tssi_disable(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy)2975{2976rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_AVG, B_P0_TSSI_EN, 0x0);2977rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);2978rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);2979rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);2980rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_MV_AVG, B_P0_TSSI_MV_CLR, 0x1);29812982rtwdev->is_tssi_mode[RF_PATH_A] = false;2983}29842985static u32 _tssi_get_cck_group(struct rtw89_dev *rtwdev, u8 ch)2986{2987switch (ch) {2988case 1 ... 2:2989return 0;2990case 3 ... 5:2991return 1;2992case 6 ... 8:2993return 2;2994case 9 ... 11:2995return 3;2996case 12 ... 13:2997return 4;2998case 14:2999return 5;3000}30013002return 0;3003}30043005#define TSSI_EXTRA_GROUP_BIT (BIT(31))3006#define TSSI_EXTRA_GROUP(idx) (TSSI_EXTRA_GROUP_BIT | (idx))3007#define IS_TSSI_EXTRA_GROUP(group) ((group) & TSSI_EXTRA_GROUP_BIT)3008#define TSSI_EXTRA_GET_GROUP_IDX1(group) ((group) & ~TSSI_EXTRA_GROUP_BIT)3009#define TSSI_EXTRA_GET_GROUP_IDX2(group) (TSSI_EXTRA_GET_GROUP_IDX1(group) + 1)30103011static u32 _tssi_get_ofdm_group(struct rtw89_dev *rtwdev, u8 ch)3012{3013switch (ch) {3014case 1 ... 2:3015return 0;3016case 3 ... 5:3017return 1;3018case 6 ... 8:3019return 2;3020case 9 ... 11:3021return 3;3022case 12 ... 14:3023return 4;3024case 36 ... 40:3025return 5;3026case 41 ... 43:3027return TSSI_EXTRA_GROUP(5);3028case 44 ... 48:3029return 6;3030case 49 ... 51:3031return TSSI_EXTRA_GROUP(6);3032case 52 ... 56:3033return 7;3034case 57 ... 59:3035return TSSI_EXTRA_GROUP(7);3036case 60 ... 64:3037return 8;3038case 100 ... 104:3039return 9;3040case 105 ... 107:3041return TSSI_EXTRA_GROUP(9);3042case 108 ... 112:3043return 10;3044case 113 ... 115:3045return TSSI_EXTRA_GROUP(10);3046case 116 ... 120:3047return 11;3048case 121 ... 123:3049return TSSI_EXTRA_GROUP(11);3050case 124 ... 128:3051return 12;3052case 129 ... 131:3053return TSSI_EXTRA_GROUP(12);3054case 132 ... 136:3055return 13;3056case 137 ... 139:3057return TSSI_EXTRA_GROUP(13);3058case 140 ... 144:3059return 14;3060case 149 ... 153:3061return 15;3062case 154 ... 156:3063return TSSI_EXTRA_GROUP(15);3064case 157 ... 161:3065return 16;3066case 162 ... 164:3067return TSSI_EXTRA_GROUP(16);3068case 165 ... 169:3069return 17;3070case 170 ... 172:3071return TSSI_EXTRA_GROUP(17);3072case 173 ... 177:3073return 18;3074}30753076return 0;3077}30783079static u32 _tssi_get_trim_group(struct rtw89_dev *rtwdev, u8 ch)3080{3081switch (ch) {3082case 1 ... 8:3083return 0;3084case 9 ... 14:3085return 1;3086case 36 ... 48:3087return 2;3088case 52 ... 64:3089return 3;3090case 100 ... 112:3091return 4;3092case 116 ... 128:3093return 5;3094case 132 ... 144:3095return 6;3096case 149 ... 177:3097return 7;3098}30993100return 0;3101}31023103static s8 _tssi_get_ofdm_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3104enum rtw89_rf_path path, const struct rtw89_chan *chan)3105{3106struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;3107u32 gidx, gidx_1st, gidx_2nd;3108u8 ch = chan->channel;3109s8 de_1st;3110s8 de_2nd;3111s8 val;31123113gidx = _tssi_get_ofdm_group(rtwdev, ch);31143115rtw89_debug(rtwdev, RTW89_DBG_TSSI,3116"[TSSI][TRIM]: path=%d mcs group_idx=0x%x\n", path, gidx);31173118if (IS_TSSI_EXTRA_GROUP(gidx)) {3119gidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(gidx);3120gidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(gidx);3121de_1st = tssi_info->tssi_mcs[path][gidx_1st];3122de_2nd = tssi_info->tssi_mcs[path][gidx_2nd];3123val = (de_1st + de_2nd) / 2;31243125rtw89_debug(rtwdev, RTW89_DBG_TSSI,3126"[TSSI][TRIM]: path=%d mcs de=%d 1st=%d 2nd=%d\n",3127path, val, de_1st, de_2nd);3128} else {3129val = tssi_info->tssi_mcs[path][gidx];31303131rtw89_debug(rtwdev, RTW89_DBG_TSSI,3132"[TSSI][TRIM]: path=%d mcs de=%d\n", path, val);3133}31343135return val;3136}31373138static s8 _tssi_get_ofdm_trim_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3139enum rtw89_rf_path path, const struct rtw89_chan *chan)3140{3141struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;3142u32 tgidx, tgidx_1st, tgidx_2nd;3143u8 ch = chan->channel;3144s8 tde_1st;3145s8 tde_2nd;3146s8 val;31473148tgidx = _tssi_get_trim_group(rtwdev, ch);31493150rtw89_debug(rtwdev, RTW89_DBG_TSSI,3151"[TSSI][TRIM]: path=%d mcs trim_group_idx=0x%x\n",3152path, tgidx);31533154if (IS_TSSI_EXTRA_GROUP(tgidx)) {3155tgidx_1st = TSSI_EXTRA_GET_GROUP_IDX1(tgidx);3156tgidx_2nd = TSSI_EXTRA_GET_GROUP_IDX2(tgidx);3157tde_1st = tssi_info->tssi_trim[path][tgidx_1st];3158tde_2nd = tssi_info->tssi_trim[path][tgidx_2nd];3159val = (tde_1st + tde_2nd) / 2;31603161rtw89_debug(rtwdev, RTW89_DBG_TSSI,3162"[TSSI][TRIM]: path=%d mcs trim_de=%d 1st=%d 2nd=%d\n",3163path, val, tde_1st, tde_2nd);3164} else {3165val = tssi_info->tssi_trim[path][tgidx];31663167rtw89_debug(rtwdev, RTW89_DBG_TSSI,3168"[TSSI][TRIM]: path=%d mcs trim_de=%d\n",3169path, val);3170}31713172return val;3173}31743175static void _tssi_set_efuse_to_de(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3176const struct rtw89_chan *chan)3177{3178struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;3179u8 ch = chan->channel;3180u8 gidx;3181s8 ofdm_de;3182s8 trim_de;3183s32 val;3184u32 i;31853186rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI][TRIM]: phy=%d ch=%d\n",3187phy, ch);31883189for (i = RF_PATH_A; i < RTW8851B_TSSI_PATH_NR; i++) {3190gidx = _tssi_get_cck_group(rtwdev, ch);3191trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);3192val = tssi_info->tssi_cck[i][gidx] + trim_de;31933194rtw89_debug(rtwdev, RTW89_DBG_TSSI,3195"[TSSI][TRIM]: path=%d cck[%d]=0x%x trim=0x%x\n",3196i, gidx, tssi_info->tssi_cck[i][gidx], trim_de);31973198rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_long[i], _TSSI_DE_MASK, val);3199rtw89_phy_write32_mask(rtwdev, _tssi_de_cck_short[i], _TSSI_DE_MASK, val);32003201rtw89_debug(rtwdev, RTW89_DBG_TSSI,3202"[TSSI] Set TSSI CCK DE 0x%x[21:12]=0x%x\n",3203_tssi_de_cck_long[i],3204rtw89_phy_read32_mask(rtwdev, _tssi_de_cck_long[i],3205_TSSI_DE_MASK));32063207ofdm_de = _tssi_get_ofdm_de(rtwdev, phy, i, chan);3208trim_de = _tssi_get_ofdm_trim_de(rtwdev, phy, i, chan);3209val = ofdm_de + trim_de;32103211rtw89_debug(rtwdev, RTW89_DBG_TSSI,3212"[TSSI][TRIM]: path=%d mcs=0x%x trim=0x%x\n",3213i, ofdm_de, trim_de);32143215rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_20m[i], _TSSI_DE_MASK, val);3216rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_40m[i], _TSSI_DE_MASK, val);3217rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m[i], _TSSI_DE_MASK, val);3218rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_80m_80m[i], _TSSI_DE_MASK, val);3219rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_5m[i], _TSSI_DE_MASK, val);3220rtw89_phy_write32_mask(rtwdev, _tssi_de_mcs_10m[i], _TSSI_DE_MASK, val);32213222rtw89_debug(rtwdev, RTW89_DBG_TSSI,3223"[TSSI] Set TSSI MCS DE 0x%x[21:12]=0x%x\n",3224_tssi_de_mcs_20m[i],3225rtw89_phy_read32_mask(rtwdev, _tssi_de_mcs_20m[i],3226_TSSI_DE_MASK));3227}3228}32293230static void _tssi_alimentk_dump_result(struct rtw89_dev *rtwdev, enum rtw89_rf_path path)3231{3232rtw89_debug(rtwdev, RTW89_DBG_RFK,3233"[TSSI PA K]\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n"3234"0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n0x%x = 0x%08x\n",3235R_TSSI_PA_K1 + (path << 13),3236rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K1 + (path << 13), MASKDWORD),3237R_TSSI_PA_K2 + (path << 13),3238rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K2 + (path << 13), MASKDWORD),3239R_P0_TSSI_ALIM1 + (path << 13),3240rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD),3241R_P0_TSSI_ALIM3 + (path << 13),3242rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD),3243R_TSSI_PA_K5 + (path << 13),3244rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K5 + (path << 13), MASKDWORD),3245R_P0_TSSI_ALIM2 + (path << 13),3246rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD),3247R_P0_TSSI_ALIM4 + (path << 13),3248rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD),3249R_TSSI_PA_K8 + (path << 13),3250rtw89_phy_read32_mask(rtwdev, R_TSSI_PA_K8 + (path << 13), MASKDWORD));3251}32523253static void _tssi_alimentk_done(struct rtw89_dev *rtwdev,3254enum rtw89_phy_idx phy, enum rtw89_rf_path path,3255const struct rtw89_chan *chan)3256{3257struct rtw89_tssi_info *tssi_info = &rtwdev->tssi;3258u8 channel = chan->channel;3259u8 band;32603261rtw89_debug(rtwdev, RTW89_DBG_RFK,3262"======>%s phy=%d path=%d\n", __func__, phy, path);32633264if (channel >= 1 && channel <= 14)3265band = TSSI_ALIMK_2G;3266else if (channel >= 36 && channel <= 64)3267band = TSSI_ALIMK_5GL;3268else if (channel >= 100 && channel <= 144)3269band = TSSI_ALIMK_5GM;3270else if (channel >= 149 && channel <= 177)3271band = TSSI_ALIMK_5GH;3272else3273band = TSSI_ALIMK_2G;32743275if (tssi_info->alignment_done[path][band]) {3276rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM1 + (path << 13), MASKDWORD,3277tssi_info->alignment_value[path][band][0]);3278rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM3 + (path << 13), MASKDWORD,3279tssi_info->alignment_value[path][band][1]);3280rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM2 + (path << 13), MASKDWORD,3281tssi_info->alignment_value[path][band][2]);3282rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_ALIM4 + (path << 13), MASKDWORD,3283tssi_info->alignment_value[path][band][3]);3284}32853286_tssi_alimentk_dump_result(rtwdev, path);3287}32883289static void rtw8851b_by_rate_dpd(struct rtw89_dev *rtwdev)3290{3291rtw89_write32_mask(rtwdev, R_AX_PWR_SWING_OTHER_CTRL0,3292B_AX_CFIR_BY_RATE_OFF_MASK, 0x21861);3293}32943295void rtw8851b_dpk_init(struct rtw89_dev *rtwdev)3296{3297rtw8851b_by_rate_dpd(rtwdev);3298}32993300void rtw8851b_aack(struct rtw89_dev *rtwdev)3301{3302u32 tmp05, tmpd3, ib[4];3303u32 tmp;3304int ret;3305int rek;3306int i;33073308rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]DO AACK\n");33093310tmp05 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK);3311tmpd3 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK);3312rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0x3);3313rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0);3314rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_ST, 0x0);33153316for (rek = 0; rek < 4; rek++) {3317rtw89_write_rf(rtwdev, RF_PATH_A, RR_AACK, RFREG_MASK, 0x8201e);3318rtw89_write_rf(rtwdev, RF_PATH_A, RR_AACK, RFREG_MASK, 0x8201f);3319fsleep(100);33203321ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp,33221, 1000, false,3323rtwdev, RF_PATH_A, 0xd0, BIT(16));3324if (ret)3325rtw89_warn(rtwdev, "[LCK]AACK timeout\n");33263327rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCI, RR_VCI_ON, 0x1);3328for (i = 0; i < 4; i++) {3329rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCO, RR_VCO_SEL, i);3330ib[i] = rtw89_read_rf(rtwdev, RF_PATH_A, RR_IBD, RR_IBD_VAL);3331}3332rtw89_write_rf(rtwdev, RF_PATH_A, RR_VCI, RR_VCI_ON, 0x0);33333334if (ib[0] != 0 && ib[1] != 0 && ib[2] != 0 && ib[3] != 0)3335break;3336}33373338if (rek != 0)3339rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]AACK rek = %d\n", rek);33403341rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, tmp05);3342rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK, tmpd3);3343}33443345static void _lck_keep_thermal(struct rtw89_dev *rtwdev)3346{3347struct rtw89_lck_info *lck = &rtwdev->lck;33483349lck->thermal[RF_PATH_A] =3350ewma_thermal_read(&rtwdev->phystat.avg_thermal[RF_PATH_A]);3351rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,3352"[LCK] path=%d thermal=0x%x", RF_PATH_A, lck->thermal[RF_PATH_A]);3353}33543355static void rtw8851b_lck(struct rtw89_dev *rtwdev)3356{3357u32 tmp05, tmp18, tmpd3;33583359rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]DO LCK\n");33603361tmp05 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK);3362tmp18 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);3363tmpd3 = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK);33643365rtw89_write_rf(rtwdev, RF_PATH_A, RR_MOD, RR_MOD_MASK, 0x3);3366rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, 0x0);3367rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);33683369_set_ch(rtwdev, tmp18);3370rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RFREG_MASK, tmpd3);3371rtw89_write_rf(rtwdev, RF_PATH_A, RR_RSV1, RFREG_MASK, tmp05);33723373_lck_keep_thermal(rtwdev);3374}33753376#define RTW8851B_LCK_TH 833773378void rtw8851b_lck_track(struct rtw89_dev *rtwdev)3379{3380struct rtw89_lck_info *lck = &rtwdev->lck;3381u8 cur_thermal;3382int delta;33833384cur_thermal =3385ewma_thermal_read(&rtwdev->phystat.avg_thermal[RF_PATH_A]);3386delta = abs((int)cur_thermal - lck->thermal[RF_PATH_A]);33873388rtw89_debug(rtwdev, RTW89_DBG_RFK_TRACK,3389"[LCK] path=%d current thermal=0x%x delta=0x%x\n",3390RF_PATH_A, cur_thermal, delta);33913392if (delta >= RTW8851B_LCK_TH) {3393rtw8851b_aack(rtwdev);3394rtw8851b_lck(rtwdev);3395}3396}33973398void rtw8851b_lck_init(struct rtw89_dev *rtwdev)3399{3400_lck_keep_thermal(rtwdev);3401}34023403void rtw8851b_rck(struct rtw89_dev *rtwdev)3404{3405_rck(rtwdev, RF_PATH_A);3406}34073408void rtw8851b_dack(struct rtw89_dev *rtwdev)3409{3410_dac_cal(rtwdev, false);3411}34123413void rtw8851b_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,3414enum rtw89_chanctx_idx chanctx_idx)3415{3416u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);3417u32 tx_en;34183419rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_START);3420rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);3421_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));34223423_iqk_init(rtwdev);3424_iqk(rtwdev, phy_idx, false, chanctx_idx);34253426rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);3427rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_STOP);3428}34293430void rtw8851b_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,3431enum rtw89_chanctx_idx chanctx_idx)3432{3433u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);3434u32 tx_en;34353436rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START);3437rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);3438_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));34393440_rx_dck(rtwdev, phy_idx, false, chanctx_idx);34413442rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);3443rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP);3444}34453446void rtw8851b_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx,3447enum rtw89_chanctx_idx chanctx_idx)3448{3449u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0, chanctx_idx);3450u32 tx_en;34513452rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_START);3453rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL);3454_wait_rx_mode(rtwdev, _kpath(rtwdev, phy_idx));34553456rtwdev->dpk.is_dpk_enable = true;3457rtwdev->dpk.is_dpk_reload_en = false;3458_dpk(rtwdev, phy_idx, false, chanctx_idx);34593460rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en);3461rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_DPK, BTC_WRFK_STOP);3462}34633464void rtw8851b_dpk_track(struct rtw89_dev *rtwdev)3465{3466_dpk_track(rtwdev);3467}34683469void rtw8851b_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3470bool hwtx_en, enum rtw89_chanctx_idx chanctx_idx)3471{3472const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);3473u8 phy_map = rtw89_btc_phymap(rtwdev, phy, RF_A, chanctx_idx);3474u8 i;34753476rtw89_debug(rtwdev, RTW89_DBG_TSSI, "[TSSI] %s: phy=%d\n", __func__, phy);3477rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START);34783479_tssi_disable(rtwdev, phy);34803481for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) {3482_tssi_set_sys(rtwdev, phy, i, chan);3483_tssi_ini_txpwr_ctrl_bb(rtwdev, phy, i);3484_tssi_ini_txpwr_ctrl_bb_he_tb(rtwdev, phy, i);3485_tssi_set_dck(rtwdev, phy, i);3486_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);3487_tssi_set_dac_gain_tbl(rtwdev, phy, i);3488_tssi_slope_cal_org(rtwdev, phy, i, chan);3489_tssi_alignment_default(rtwdev, phy, i, true, chan);3490_tssi_set_tssi_slope(rtwdev, phy, i);3491}34923493_tssi_enable(rtwdev, phy);3494_tssi_set_efuse_to_de(rtwdev, phy, chan);34953496rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_STOP);3497}34983499void rtw8851b_tssi_scan(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3500const struct rtw89_chan *chan)3501{3502u8 channel = chan->channel;3503u32 i;35043505rtw89_debug(rtwdev, RTW89_DBG_RFK,3506"======>%s phy=%d channel=%d\n", __func__, phy, channel);35073508_tssi_disable(rtwdev, phy);35093510for (i = RF_PATH_A; i < RF_PATH_NUM_8851B; i++) {3511_tssi_set_sys(rtwdev, phy, i, chan);3512_tssi_set_tmeter_tbl(rtwdev, phy, i, chan);3513_tssi_slope_cal_org(rtwdev, phy, i, chan);3514_tssi_alignment_default(rtwdev, phy, i, true, chan);3515}35163517_tssi_enable(rtwdev, phy);3518_tssi_set_efuse_to_de(rtwdev, phy, chan);3519}35203521static void rtw8851b_tssi_default_txagc(struct rtw89_dev *rtwdev,3522enum rtw89_phy_idx phy, bool enable,3523enum rtw89_chanctx_idx chanctx_idx)3524{3525const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx);3526u8 channel = chan->channel;35273528rtw89_debug(rtwdev, RTW89_DBG_RFK, "======> %s ch=%d\n",3529__func__, channel);35303531if (enable)3532return;35333534rtw89_debug(rtwdev, RTW89_DBG_RFK,3535"======>%s 1 SCAN_END Set 0x5818[7:0]=0x%x\n",3536__func__,3537rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT));35383539rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT, 0xc0);3540rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x0);3541rtw89_phy_write32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT_EN, 0x1);35423543_tssi_alimentk_done(rtwdev, phy, RF_PATH_A, chan);35443545rtw89_debug(rtwdev, RTW89_DBG_RFK,3546"======>%s 2 SCAN_END Set 0x5818[7:0]=0x%x\n",3547__func__,3548rtw89_phy_read32_mask(rtwdev, R_P0_TSSI_TRK, B_P0_TSSI_OFT));35493550rtw89_debug(rtwdev, RTW89_DBG_RFK,3551"======> %s SCAN_END\n", __func__);3552}35533554void rtw8851b_wifi_scan_notify(struct rtw89_dev *rtwdev, bool scan_start,3555enum rtw89_phy_idx phy_idx,3556enum rtw89_chanctx_idx chanctx_idx)3557{3558if (scan_start)3559rtw8851b_tssi_default_txagc(rtwdev, phy_idx, true, chanctx_idx);3560else3561rtw8851b_tssi_default_txagc(rtwdev, phy_idx, false, chanctx_idx);3562}35633564static void _bw_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,3565enum rtw89_bandwidth bw, bool dav)3566{3567u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;3568u32 rf_reg18;35693570rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);35713572rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);3573if (rf_reg18 == INV_RF_DATA) {3574rtw89_debug(rtwdev, RTW89_DBG_RFK,3575"[RFK]Invalid RF_0x18 for Path-%d\n", path);3576return;3577}3578rf_reg18 &= ~RR_CFGCH_BW;35793580switch (bw) {3581case RTW89_CHANNEL_WIDTH_5:3582case RTW89_CHANNEL_WIDTH_10:3583case RTW89_CHANNEL_WIDTH_20:3584rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_20M);3585break;3586case RTW89_CHANNEL_WIDTH_40:3587rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_40M);3588break;3589case RTW89_CHANNEL_WIDTH_80:3590rf_reg18 |= FIELD_PREP(RR_CFGCH_BW, CFGCH_BW_80M);3591break;3592default:3593rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]Fail to set CH\n");3594}35953596rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |3597RR_CFGCH_BW2) & RFREG_MASK;3598rf_reg18 |= RR_CFGCH_BW2;3599rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);36003601rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set %x at path%d, %x =0x%x\n",3602bw, path, reg18_addr,3603rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));3604}36053606static void _ctrl_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3607enum rtw89_bandwidth bw)3608{3609_bw_setting(rtwdev, RF_PATH_A, bw, true);3610_bw_setting(rtwdev, RF_PATH_A, bw, false);3611}36123613static bool _set_s0_arfc18(struct rtw89_dev *rtwdev, u32 val)3614{3615u32 bak;3616u32 tmp;3617int ret;36183619bak = rtw89_read_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK);3620rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RR_LDO_SEL, 0x1);3621rtw89_write_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK, val);36223623ret = read_poll_timeout_atomic(rtw89_read_rf, tmp, tmp == 0, 1, 1000,3624false, rtwdev, RF_PATH_A, RR_LPF, RR_LPF_BUSY);3625if (ret)3626rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]LCK timeout\n");36273628rtw89_write_rf(rtwdev, RF_PATH_A, RR_LDO, RFREG_MASK, bak);36293630return !!ret;3631}36323633static void _lck_check(struct rtw89_dev *rtwdev)3634{3635u32 tmp;36363637if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {3638rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN MMD reset\n");36393640rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x1);3641rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x0);3642rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_SYN, 0x1);3643rtw89_write_rf(rtwdev, RF_PATH_A, RR_MMD, RR_MMD_RST_EN, 0x0);3644}36453646udelay(10);36473648if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {3649rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]re-set RF 0x18\n");36503651rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);3652tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);3653_set_s0_arfc18(rtwdev, tmp);3654rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);3655}36563657if (rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RR_SYNFB_LK) == 0) {3658rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]SYN off/on\n");36593660tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK);3661rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RFREG_MASK, tmp);3662tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK);3663rtw89_write_rf(rtwdev, RF_PATH_A, RR_SX, RFREG_MASK, tmp);36643665rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x1);3666rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x0);3667rtw89_write_rf(rtwdev, RF_PATH_A, RR_POW, RR_POW_SYN, 0x3);3668rtw89_write_rf(rtwdev, RF_PATH_A, RR_SYNLUT, RR_SYNLUT_MOD, 0x0);36693670rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x1);3671tmp = rtw89_read_rf(rtwdev, RF_PATH_A, RR_CFGCH, RFREG_MASK);3672_set_s0_arfc18(rtwdev, tmp);3673rtw89_write_rf(rtwdev, RF_PATH_A, RR_LCK_TRG, RR_LCK_TRGSEL, 0x0);36743675rtw89_debug(rtwdev, RTW89_DBG_RFK, "[LCK]0xb2=%x, 0xc5=%x\n",3676rtw89_read_rf(rtwdev, RF_PATH_A, RR_VCO, RFREG_MASK),3677rtw89_read_rf(rtwdev, RF_PATH_A, RR_SYNFB, RFREG_MASK));3678}3679}36803681static void _set_ch(struct rtw89_dev *rtwdev, u32 val)3682{3683bool timeout;36843685timeout = _set_s0_arfc18(rtwdev, val);3686if (!timeout)3687_lck_check(rtwdev);3688}36893690static void _ch_setting(struct rtw89_dev *rtwdev, enum rtw89_rf_path path,3691u8 central_ch, bool dav)3692{3693u32 reg18_addr = dav ? RR_CFGCH : RR_CFGCH_V1;3694bool is_2g_ch = central_ch <= 14;3695u32 rf_reg18;36963697rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK]===> %s\n", __func__);36983699rf_reg18 = rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK);3700rf_reg18 &= ~(RR_CFGCH_BAND1 | RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH |3701RR_CFGCH_BCN | RR_CFGCH_BAND0 | RR_CFGCH_CH);3702rf_reg18 |= FIELD_PREP(RR_CFGCH_CH, central_ch);37033704if (!is_2g_ch)3705rf_reg18 |= FIELD_PREP(RR_CFGCH_BAND1, CFGCH_BAND1_5G) |3706FIELD_PREP(RR_CFGCH_BAND0, CFGCH_BAND0_5G);37073708rf_reg18 &= ~(RR_CFGCH_POW_LCK | RR_CFGCH_TRX_AH | RR_CFGCH_BCN |3709RR_CFGCH_BW2) & RFREG_MASK;3710rf_reg18 |= RR_CFGCH_BW2;37113712if (path == RF_PATH_A && dav)3713_set_ch(rtwdev, rf_reg18);3714else3715rtw89_write_rf(rtwdev, path, reg18_addr, RFREG_MASK, rf_reg18);37163717rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 0);3718rtw89_write_rf(rtwdev, path, RR_LCKST, RR_LCKST_BIN, 1);37193720rtw89_debug(rtwdev, RTW89_DBG_RFK,3721"[RFK]CH: %d for Path-%d, reg0x%x = 0x%x\n",3722central_ch, path, reg18_addr,3723rtw89_read_rf(rtwdev, path, reg18_addr, RFREG_MASK));3724}37253726static void _ctrl_ch(struct rtw89_dev *rtwdev, u8 central_ch)3727{3728_ch_setting(rtwdev, RF_PATH_A, central_ch, true);3729_ch_setting(rtwdev, RF_PATH_A, central_ch, false);3730}37313732static void _set_rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_bandwidth bw,3733enum rtw89_rf_path path)3734{3735rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x1);3736rtw89_write_rf(rtwdev, path, RR_LUTWA, RR_LUTWA_M2, 0x12);37373738if (bw == RTW89_CHANNEL_WIDTH_20)3739rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x1b);3740else if (bw == RTW89_CHANNEL_WIDTH_40)3741rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x13);3742else if (bw == RTW89_CHANNEL_WIDTH_80)3743rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0xb);3744else3745rtw89_write_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB, 0x3);37463747rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RFK] set S%d RXBB BW 0x3F = 0x%x\n", path,3748rtw89_read_rf(rtwdev, path, RR_LUTWD0, RR_LUTWD0_LB));37493750rtw89_write_rf(rtwdev, path, RR_LUTWE2, RR_LUTWE2_RTXBW, 0x0);3751}37523753static void _rxbb_bw(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy,3754enum rtw89_bandwidth bw)3755{3756u8 kpath, path;37573758kpath = _kpath(rtwdev, phy);37593760for (path = 0; path < RF_PATH_NUM_8851B; path++) {3761if (!(kpath & BIT(path)))3762continue;37633764_set_rxbb_bw(rtwdev, bw, path);3765}3766}37673768static void rtw8851b_ctrl_bw_ch(struct rtw89_dev *rtwdev,3769enum rtw89_phy_idx phy, u8 central_ch,3770enum rtw89_band band, enum rtw89_bandwidth bw)3771{3772_ctrl_ch(rtwdev, central_ch);3773_ctrl_bw(rtwdev, phy, bw);3774_rxbb_bw(rtwdev, phy, bw);3775}37763777void rtw8851b_set_channel_rf(struct rtw89_dev *rtwdev,3778const struct rtw89_chan *chan,3779enum rtw89_phy_idx phy_idx)3780{3781rtw8851b_ctrl_bw_ch(rtwdev, phy_idx, chan->channel, chan->band_type,3782chan->band_width);3783}378437853786