1*32e284a2SBitterblue Smith // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2*32e284a2SBitterblue Smith /* Copyright(c) 2024 Realtek Corporation 3*32e284a2SBitterblue Smith */ 4*32e284a2SBitterblue Smith 5*32e284a2SBitterblue Smith #include "main.h" 6*32e284a2SBitterblue Smith #include "coex.h" 7*32e284a2SBitterblue Smith #include "phy.h" 8*32e284a2SBitterblue Smith #include "reg.h" 9*32e284a2SBitterblue Smith #include "rtw88xxa.h" 10*32e284a2SBitterblue Smith #include "rtw8821a.h" 11*32e284a2SBitterblue Smith #include "rtw8821a_table.h" 12*32e284a2SBitterblue Smith #include "tx.h" 13*32e284a2SBitterblue Smith 14*32e284a2SBitterblue Smith static void rtw8821a_power_off(struct rtw_dev *rtwdev) 15*32e284a2SBitterblue Smith { 16*32e284a2SBitterblue Smith rtw88xxa_power_off(rtwdev, enter_lps_flow_8821a); 17*32e284a2SBitterblue Smith } 18*32e284a2SBitterblue Smith 19*32e284a2SBitterblue Smith static s8 rtw8821a_cck_rx_pwr(u8 lna_idx, u8 vga_idx) 20*32e284a2SBitterblue Smith { 21*32e284a2SBitterblue Smith static const s8 lna_gain_table[] = {15, -1, -17, 0, -30, -38}; 22*32e284a2SBitterblue Smith s8 rx_pwr_all = 0; 23*32e284a2SBitterblue Smith s8 lna_gain; 24*32e284a2SBitterblue Smith 25*32e284a2SBitterblue Smith switch (lna_idx) { 26*32e284a2SBitterblue Smith case 5: 27*32e284a2SBitterblue Smith case 4: 28*32e284a2SBitterblue Smith case 2: 29*32e284a2SBitterblue Smith case 1: 30*32e284a2SBitterblue Smith case 0: 31*32e284a2SBitterblue Smith lna_gain = lna_gain_table[lna_idx]; 32*32e284a2SBitterblue Smith rx_pwr_all = lna_gain - 2 * vga_idx; 33*32e284a2SBitterblue Smith break; 34*32e284a2SBitterblue Smith default: 35*32e284a2SBitterblue Smith break; 36*32e284a2SBitterblue Smith } 37*32e284a2SBitterblue Smith 38*32e284a2SBitterblue Smith return rx_pwr_all; 39*32e284a2SBitterblue Smith } 40*32e284a2SBitterblue Smith 41*32e284a2SBitterblue Smith static void rtw8821a_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 42*32e284a2SBitterblue Smith struct rtw_rx_pkt_stat *pkt_stat) 43*32e284a2SBitterblue Smith { 44*32e284a2SBitterblue Smith rtw88xxa_query_phy_status(rtwdev, phy_status, pkt_stat, 45*32e284a2SBitterblue Smith rtw8821a_cck_rx_pwr); 46*32e284a2SBitterblue Smith } 47*32e284a2SBitterblue Smith 48*32e284a2SBitterblue Smith static void rtw8821a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) 49*32e284a2SBitterblue Smith { 50*32e284a2SBitterblue Smith } 51*32e284a2SBitterblue Smith 52*32e284a2SBitterblue Smith #define CAL_NUM_8821A 3 53*32e284a2SBitterblue Smith #define MACBB_REG_NUM_8821A 8 54*32e284a2SBitterblue Smith #define AFE_REG_NUM_8821A 4 55*32e284a2SBitterblue Smith #define RF_REG_NUM_8821A 3 56*32e284a2SBitterblue Smith 57*32e284a2SBitterblue Smith static void rtw8821a_iqk_backup_rf(struct rtw_dev *rtwdev, u32 *rfa_backup, 58*32e284a2SBitterblue Smith const u32 *backup_rf_reg, u32 rf_num) 59*32e284a2SBitterblue Smith { 60*32e284a2SBitterblue Smith u32 i; 61*32e284a2SBitterblue Smith 62*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 63*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 64*32e284a2SBitterblue Smith 65*32e284a2SBitterblue Smith /* Save RF Parameters */ 66*32e284a2SBitterblue Smith for (i = 0; i < rf_num; i++) 67*32e284a2SBitterblue Smith rfa_backup[i] = rtw_read_rf(rtwdev, RF_PATH_A, 68*32e284a2SBitterblue Smith backup_rf_reg[i], MASKDWORD); 69*32e284a2SBitterblue Smith } 70*32e284a2SBitterblue Smith 71*32e284a2SBitterblue Smith static void rtw8821a_iqk_restore_rf(struct rtw_dev *rtwdev, 72*32e284a2SBitterblue Smith const u32 *backup_rf_reg, 73*32e284a2SBitterblue Smith u32 *RF_backup, u32 rf_reg_num) 74*32e284a2SBitterblue Smith { 75*32e284a2SBitterblue Smith u32 i; 76*32e284a2SBitterblue Smith 77*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 78*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 79*32e284a2SBitterblue Smith 80*32e284a2SBitterblue Smith for (i = 0; i < rf_reg_num; i++) 81*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, backup_rf_reg[i], 82*32e284a2SBitterblue Smith RFREG_MASK, RF_backup[i]); 83*32e284a2SBitterblue Smith } 84*32e284a2SBitterblue Smith 85*32e284a2SBitterblue Smith static void rtw8821a_iqk_restore_afe(struct rtw_dev *rtwdev, u32 *afe_backup, 86*32e284a2SBitterblue Smith const u32 *backup_afe_reg, u32 afe_num) 87*32e284a2SBitterblue Smith { 88*32e284a2SBitterblue Smith u32 i; 89*32e284a2SBitterblue Smith 90*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 91*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 92*32e284a2SBitterblue Smith 93*32e284a2SBitterblue Smith /* Reload AFE Parameters */ 94*32e284a2SBitterblue Smith for (i = 0; i < afe_num; i++) 95*32e284a2SBitterblue Smith rtw_write32(rtwdev, backup_afe_reg[i], afe_backup[i]); 96*32e284a2SBitterblue Smith 97*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 98*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 99*32e284a2SBitterblue Smith 100*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x0); 101*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x0); 102*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x0); 103*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x3c000000); 104*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080); 105*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TXAGCIDX, 0x00000000); 106*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000); 107*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000); 108*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x0); 109*32e284a2SBitterblue Smith } 110*32e284a2SBitterblue Smith 111*32e284a2SBitterblue Smith static void rtw8821a_iqk_rx_fill(struct rtw_dev *rtwdev, 112*32e284a2SBitterblue Smith unsigned int rx_x, unsigned int rx_y) 113*32e284a2SBitterblue Smith { 114*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 115*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 116*32e284a2SBitterblue Smith 117*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A, 118*32e284a2SBitterblue Smith 0x000003ff, rx_x >> 1); 119*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A, 120*32e284a2SBitterblue Smith 0x03ff0000, (rx_y >> 1) & 0x3ff); 121*32e284a2SBitterblue Smith } 122*32e284a2SBitterblue Smith 123*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_fill(struct rtw_dev *rtwdev, 124*32e284a2SBitterblue Smith unsigned int tx_x, unsigned int tx_y) 125*32e284a2SBitterblue Smith { 126*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 127*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 128*32e284a2SBitterblue Smith 129*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_LSSI_WRITE_A, 0x00000080); 130*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_DPD_CFG, 0x20040000); 131*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_CFG_PMPD, 0x20000000); 132*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, tx_y); 133*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, tx_x); 134*32e284a2SBitterblue Smith } 135*32e284a2SBitterblue Smith 136*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_vdf_true(struct rtw_dev *rtwdev, u32 cal, 137*32e284a2SBitterblue Smith bool *tx0iqkok, 138*32e284a2SBitterblue Smith int tx_x0[CAL_NUM_8821A], 139*32e284a2SBitterblue Smith int tx_y0[CAL_NUM_8821A]) 140*32e284a2SBitterblue Smith { 141*32e284a2SBitterblue Smith u32 cal_retry, delay_count, iqk_ready, tx_fail; 142*32e284a2SBitterblue Smith int tx_dt[3], vdf_y[3], vdf_x[3]; 143*32e284a2SBitterblue Smith int k; 144*32e284a2SBitterblue Smith 145*32e284a2SBitterblue Smith for (k = 0; k < 3; k++) { 146*32e284a2SBitterblue Smith switch (k) { 147*32e284a2SBitterblue Smith case 0: 148*32e284a2SBitterblue Smith /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 149*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 150*32e284a2SBitterblue Smith 0x18008c38); 151*32e284a2SBitterblue Smith /* RX_Tone_idx[9:0], RxK_Mask[29] */ 152*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c38); 153*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0); 154*32e284a2SBitterblue Smith break; 155*32e284a2SBitterblue Smith case 1: 156*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 157*32e284a2SBitterblue Smith BIT(28), 0x0); 158*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_OFDM0_A_TX_AFE, 159*32e284a2SBitterblue Smith BIT(28), 0x0); 160*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x0); 161*32e284a2SBitterblue Smith break; 162*32e284a2SBitterblue Smith case 2: 163*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 164*32e284a2SBitterblue Smith "vdf_y[1] = %x vdf_y[0] = %x\n", 165*32e284a2SBitterblue Smith vdf_y[1] >> 21 & 0x00007ff, 166*32e284a2SBitterblue Smith vdf_y[0] >> 21 & 0x00007ff); 167*32e284a2SBitterblue Smith 168*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 169*32e284a2SBitterblue Smith "vdf_x[1] = %x vdf_x[0] = %x\n", 170*32e284a2SBitterblue Smith vdf_x[1] >> 21 & 0x00007ff, 171*32e284a2SBitterblue Smith vdf_x[0] >> 21 & 0x00007ff); 172*32e284a2SBitterblue Smith 173*32e284a2SBitterblue Smith tx_dt[cal] = (vdf_y[1] >> 20) - (vdf_y[0] >> 20); 174*32e284a2SBitterblue Smith tx_dt[cal] = (16 * tx_dt[cal]) * 10000 / 15708; 175*32e284a2SBitterblue Smith tx_dt[cal] = (tx_dt[cal] >> 1) + (tx_dt[cal] & BIT(0)); 176*32e284a2SBitterblue Smith 177*32e284a2SBitterblue Smith /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 178*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 179*32e284a2SBitterblue Smith 0x18008c20); 180*32e284a2SBitterblue Smith /* RX_Tone_idx[9:0], RxK_Mask[29] */ 181*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c20); 182*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_INTPO_SETA, BIT(31), 0x1); 183*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_INTPO_SETA, 0x3fff0000, 184*32e284a2SBitterblue Smith tx_dt[cal] & 0x00003fff); 185*32e284a2SBitterblue Smith break; 186*32e284a2SBitterblue Smith } 187*32e284a2SBitterblue Smith 188*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000); 189*32e284a2SBitterblue Smith 190*32e284a2SBitterblue Smith for (cal_retry = 0; cal_retry < 10; cal_retry++) { 191*32e284a2SBitterblue Smith /* one shot */ 192*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000); 193*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000); 194*32e284a2SBitterblue Smith 195*32e284a2SBitterblue Smith mdelay(10); 196*32e284a2SBitterblue Smith 197*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000); 198*32e284a2SBitterblue Smith 199*32e284a2SBitterblue Smith for (delay_count = 0; delay_count < 20; delay_count++) { 200*32e284a2SBitterblue Smith iqk_ready = rtw_read32_mask(rtwdev, 201*32e284a2SBitterblue Smith REG_IQKA_END, 202*32e284a2SBitterblue Smith BIT(10)); 203*32e284a2SBitterblue Smith 204*32e284a2SBitterblue Smith /* Originally: if (~iqk_ready || delay_count > 20) 205*32e284a2SBitterblue Smith * that looks like a typo so make it more explicit 206*32e284a2SBitterblue Smith */ 207*32e284a2SBitterblue Smith iqk_ready = true; 208*32e284a2SBitterblue Smith 209*32e284a2SBitterblue Smith if (iqk_ready) 210*32e284a2SBitterblue Smith break; 211*32e284a2SBitterblue Smith 212*32e284a2SBitterblue Smith mdelay(1); 213*32e284a2SBitterblue Smith } 214*32e284a2SBitterblue Smith 215*32e284a2SBitterblue Smith if (delay_count < 20) { 216*32e284a2SBitterblue Smith /* ============TXIQK Check============== */ 217*32e284a2SBitterblue Smith tx_fail = rtw_read32_mask(rtwdev, 218*32e284a2SBitterblue Smith REG_IQKA_END, 219*32e284a2SBitterblue Smith BIT(12)); 220*32e284a2SBitterblue Smith 221*32e284a2SBitterblue Smith /* Originally: if (~tx_fail) { 222*32e284a2SBitterblue Smith * It looks like a typo, so make it more explicit. 223*32e284a2SBitterblue Smith */ 224*32e284a2SBitterblue Smith tx_fail = false; 225*32e284a2SBitterblue Smith 226*32e284a2SBitterblue Smith if (!tx_fail) { 227*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 228*32e284a2SBitterblue Smith 0x02000000); 229*32e284a2SBitterblue Smith vdf_x[k] = rtw_read32_mask(rtwdev, 230*32e284a2SBitterblue Smith REG_IQKA_END, 231*32e284a2SBitterblue Smith 0x07ff0000); 232*32e284a2SBitterblue Smith vdf_x[k] <<= 21; 233*32e284a2SBitterblue Smith 234*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 235*32e284a2SBitterblue Smith 0x04000000); 236*32e284a2SBitterblue Smith vdf_y[k] = rtw_read32_mask(rtwdev, 237*32e284a2SBitterblue Smith REG_IQKA_END, 238*32e284a2SBitterblue Smith 0x07ff0000); 239*32e284a2SBitterblue Smith vdf_y[k] <<= 21; 240*32e284a2SBitterblue Smith 241*32e284a2SBitterblue Smith *tx0iqkok = true; 242*32e284a2SBitterblue Smith break; 243*32e284a2SBitterblue Smith } 244*32e284a2SBitterblue Smith 245*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_Y, 246*32e284a2SBitterblue Smith 0x000007ff, 0x0); 247*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_X, 248*32e284a2SBitterblue Smith 0x000007ff, 0x200); 249*32e284a2SBitterblue Smith } 250*32e284a2SBitterblue Smith 251*32e284a2SBitterblue Smith *tx0iqkok = false; 252*32e284a2SBitterblue Smith } 253*32e284a2SBitterblue Smith } 254*32e284a2SBitterblue Smith 255*32e284a2SBitterblue Smith if (k == 3) { 256*32e284a2SBitterblue Smith tx_x0[cal] = vdf_x[k - 1]; 257*32e284a2SBitterblue Smith tx_y0[cal] = vdf_y[k - 1]; 258*32e284a2SBitterblue Smith } 259*32e284a2SBitterblue Smith } 260*32e284a2SBitterblue Smith 261*32e284a2SBitterblue Smith static void rtw8821a_iqk_tx_vdf_false(struct rtw_dev *rtwdev, u32 cal, 262*32e284a2SBitterblue Smith bool *tx0iqkok, 263*32e284a2SBitterblue Smith int tx_x0[CAL_NUM_8821A], 264*32e284a2SBitterblue Smith int tx_y0[CAL_NUM_8821A]) 265*32e284a2SBitterblue Smith { 266*32e284a2SBitterblue Smith u32 cal_retry, delay_count, iqk_ready, tx_fail; 267*32e284a2SBitterblue Smith 268*32e284a2SBitterblue Smith /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 269*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10); 270*32e284a2SBitterblue Smith /* RX_Tone_idx[9:0], RxK_Mask[29] */ 271*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10); 272*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000); 273*32e284a2SBitterblue Smith 274*32e284a2SBitterblue Smith for (cal_retry = 0; cal_retry < 10; cal_retry++) { 275*32e284a2SBitterblue Smith /* one shot */ 276*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000); 277*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000); 278*32e284a2SBitterblue Smith 279*32e284a2SBitterblue Smith mdelay(10); 280*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000); 281*32e284a2SBitterblue Smith 282*32e284a2SBitterblue Smith for (delay_count = 0; delay_count < 20; delay_count++) { 283*32e284a2SBitterblue Smith iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10)); 284*32e284a2SBitterblue Smith 285*32e284a2SBitterblue Smith /* Originally: if (~iqk_ready || delay_count > 20) 286*32e284a2SBitterblue Smith * that looks like a typo so make it more explicit 287*32e284a2SBitterblue Smith */ 288*32e284a2SBitterblue Smith iqk_ready = true; 289*32e284a2SBitterblue Smith 290*32e284a2SBitterblue Smith if (iqk_ready) 291*32e284a2SBitterblue Smith break; 292*32e284a2SBitterblue Smith 293*32e284a2SBitterblue Smith mdelay(1); 294*32e284a2SBitterblue Smith } 295*32e284a2SBitterblue Smith 296*32e284a2SBitterblue Smith if (delay_count < 20) { 297*32e284a2SBitterblue Smith /* ============TXIQK Check============== */ 298*32e284a2SBitterblue Smith tx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(12)); 299*32e284a2SBitterblue Smith 300*32e284a2SBitterblue Smith /* Originally: if (~tx_fail) { 301*32e284a2SBitterblue Smith * It looks like a typo, so make it more explicit. 302*32e284a2SBitterblue Smith */ 303*32e284a2SBitterblue Smith tx_fail = false; 304*32e284a2SBitterblue Smith 305*32e284a2SBitterblue Smith if (!tx_fail) { 306*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x02000000); 307*32e284a2SBitterblue Smith tx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END, 308*32e284a2SBitterblue Smith 0x07ff0000); 309*32e284a2SBitterblue Smith tx_x0[cal] <<= 21; 310*32e284a2SBitterblue Smith 311*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x04000000); 312*32e284a2SBitterblue Smith tx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END, 313*32e284a2SBitterblue Smith 0x07ff0000); 314*32e284a2SBitterblue Smith tx_y0[cal] <<= 21; 315*32e284a2SBitterblue Smith 316*32e284a2SBitterblue Smith *tx0iqkok = true; 317*32e284a2SBitterblue Smith break; 318*32e284a2SBitterblue Smith } 319*32e284a2SBitterblue Smith 320*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_Y, 0x000007ff, 0x0); 321*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQC_X, 0x000007ff, 0x200); 322*32e284a2SBitterblue Smith } 323*32e284a2SBitterblue Smith 324*32e284a2SBitterblue Smith *tx0iqkok = false; 325*32e284a2SBitterblue Smith } 326*32e284a2SBitterblue Smith } 327*32e284a2SBitterblue Smith 328*32e284a2SBitterblue Smith static void rtw8821a_iqk_rx(struct rtw_dev *rtwdev, u32 cal, bool *rx0iqkok, 329*32e284a2SBitterblue Smith int rx_x0[CAL_NUM_8821A], 330*32e284a2SBitterblue Smith int rx_y0[CAL_NUM_8821A]) 331*32e284a2SBitterblue Smith { 332*32e284a2SBitterblue Smith u32 cal_retry, delay_count, iqk_ready, rx_fail; 333*32e284a2SBitterblue Smith 334*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000); 335*32e284a2SBitterblue Smith 336*32e284a2SBitterblue Smith for (cal_retry = 0; cal_retry < 10; cal_retry++) { 337*32e284a2SBitterblue Smith /* one shot */ 338*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000); 339*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000); 340*32e284a2SBitterblue Smith 341*32e284a2SBitterblue Smith mdelay(10); 342*32e284a2SBitterblue Smith 343*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000); 344*32e284a2SBitterblue Smith 345*32e284a2SBitterblue Smith for (delay_count = 0; delay_count < 20; delay_count++) { 346*32e284a2SBitterblue Smith iqk_ready = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(10)); 347*32e284a2SBitterblue Smith 348*32e284a2SBitterblue Smith /* Originally: if (~iqk_ready || delay_count > 20) 349*32e284a2SBitterblue Smith * that looks like a typo so make it more explicit 350*32e284a2SBitterblue Smith */ 351*32e284a2SBitterblue Smith iqk_ready = true; 352*32e284a2SBitterblue Smith 353*32e284a2SBitterblue Smith if (iqk_ready) 354*32e284a2SBitterblue Smith break; 355*32e284a2SBitterblue Smith 356*32e284a2SBitterblue Smith mdelay(1); 357*32e284a2SBitterblue Smith } 358*32e284a2SBitterblue Smith 359*32e284a2SBitterblue Smith if (delay_count < 20) { 360*32e284a2SBitterblue Smith /* ============RXIQK Check============== */ 361*32e284a2SBitterblue Smith rx_fail = rtw_read32_mask(rtwdev, REG_IQKA_END, BIT(11)); 362*32e284a2SBitterblue Smith if (!rx_fail) { 363*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x06000000); 364*32e284a2SBitterblue Smith rx_x0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END, 365*32e284a2SBitterblue Smith 0x07ff0000); 366*32e284a2SBitterblue Smith rx_x0[cal] <<= 21; 367*32e284a2SBitterblue Smith 368*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x08000000); 369*32e284a2SBitterblue Smith rx_y0[cal] = rtw_read32_mask(rtwdev, REG_IQKA_END, 370*32e284a2SBitterblue Smith 0x07ff0000); 371*32e284a2SBitterblue Smith rx_y0[cal] <<= 21; 372*32e284a2SBitterblue Smith 373*32e284a2SBitterblue Smith *rx0iqkok = true; 374*32e284a2SBitterblue Smith break; 375*32e284a2SBitterblue Smith } 376*32e284a2SBitterblue Smith 377*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A, 378*32e284a2SBitterblue Smith 0x000003ff, 0x200 >> 1); 379*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RX_IQC_AB_A, 380*32e284a2SBitterblue Smith 0x03ff0000, 0x0 >> 1); 381*32e284a2SBitterblue Smith } 382*32e284a2SBitterblue Smith 383*32e284a2SBitterblue Smith *rx0iqkok = false; 384*32e284a2SBitterblue Smith } 385*32e284a2SBitterblue Smith } 386*32e284a2SBitterblue Smith 387*32e284a2SBitterblue Smith static void rtw8821a_iqk(struct rtw_dev *rtwdev) 388*32e284a2SBitterblue Smith { 389*32e284a2SBitterblue Smith int tx_average = 0, rx_average = 0, rx_iqk_loop = 0; 390*32e284a2SBitterblue Smith const struct rtw_efuse *efuse = &rtwdev->efuse; 391*32e284a2SBitterblue Smith int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0; 392*32e284a2SBitterblue Smith const struct rtw_hal *hal = &rtwdev->hal; 393*32e284a2SBitterblue Smith bool tx0iqkok = false, rx0iqkok = false; 394*32e284a2SBitterblue Smith int rx_x_temp = 0, rx_y_temp = 0; 395*32e284a2SBitterblue Smith int rx_x0[2][CAL_NUM_8821A]; 396*32e284a2SBitterblue Smith int rx_y0[2][CAL_NUM_8821A]; 397*32e284a2SBitterblue Smith int tx_x0[CAL_NUM_8821A]; 398*32e284a2SBitterblue Smith int tx_y0[CAL_NUM_8821A]; 399*32e284a2SBitterblue Smith bool rx_finish1 = false; 400*32e284a2SBitterblue Smith bool rx_finish2 = false; 401*32e284a2SBitterblue Smith bool vdf_enable; 402*32e284a2SBitterblue Smith u32 cal; 403*32e284a2SBitterblue Smith int i; 404*32e284a2SBitterblue Smith 405*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 406*32e284a2SBitterblue Smith "band_width = %d, ext_pa = %d, ext_pa_5g = %d\n", 407*32e284a2SBitterblue Smith hal->current_band_width, efuse->ext_pa_2g, efuse->ext_pa_5g); 408*32e284a2SBitterblue Smith 409*32e284a2SBitterblue Smith vdf_enable = hal->current_band_width == RTW_CHANNEL_WIDTH_80; 410*32e284a2SBitterblue Smith 411*32e284a2SBitterblue Smith for (cal = 0; cal < CAL_NUM_8821A; cal++) { 412*32e284a2SBitterblue Smith /* path-A LOK */ 413*32e284a2SBitterblue Smith 414*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 415*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 416*32e284a2SBitterblue Smith 417*32e284a2SBitterblue Smith /* ========path-A AFE all on======== */ 418*32e284a2SBitterblue Smith /* Port 0 DAC/ADC on */ 419*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x77777777); 420*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR2_A, 0x77777777); 421*32e284a2SBitterblue Smith 422*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RX_WAIT_CCA_TX_CCK_RFON_A, 0x19791979); 423*32e284a2SBitterblue Smith 424*32e284a2SBitterblue Smith /* hardware 3-wire off */ 425*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_3WIRE_SWA, 0xf, 0x4); 426*32e284a2SBitterblue Smith 427*32e284a2SBitterblue Smith /* LOK setting */ 428*32e284a2SBitterblue Smith 429*32e284a2SBitterblue Smith /* 1. DAC/ADC sampling rate (160 MHz) */ 430*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CK_MONHA, GENMASK(26, 24), 0x7); 431*32e284a2SBitterblue Smith 432*32e284a2SBitterblue Smith /* 2. LoK RF setting (at BW = 20M) */ 433*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80002); 434*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 0x00c00, 0x3); 435*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK, 436*32e284a2SBitterblue Smith 0x20000); 437*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK, 438*32e284a2SBitterblue Smith 0x0003f); 439*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK, 440*32e284a2SBitterblue Smith 0xf3fc3); 441*32e284a2SBitterblue Smith 442*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 443*32e284a2SBitterblue Smith 0x931d5); 444*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001); 445*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000); 446*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1); 447*32e284a2SBitterblue Smith /* TX (X,Y) */ 448*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000); 449*32e284a2SBitterblue Smith /* RX (X,Y) */ 450*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000); 451*32e284a2SBitterblue Smith /* [0]:AGC_en, [15]:idac_K_Mask */ 452*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM96, 0x00462910); 453*32e284a2SBitterblue Smith 454*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 455*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 456*32e284a2SBitterblue Smith 457*32e284a2SBitterblue Smith if (efuse->ext_pa_5g) 458*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 459*32e284a2SBitterblue Smith 0x821403f7); 460*32e284a2SBitterblue Smith else 461*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 462*32e284a2SBitterblue Smith 0x821403f4); 463*32e284a2SBitterblue Smith 464*32e284a2SBitterblue Smith if (hal->current_band_type == RTW_BAND_5G) 465*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x68163e96); 466*32e284a2SBitterblue Smith else 467*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28163e96); 468*32e284a2SBitterblue Smith 469*32e284a2SBitterblue Smith /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 470*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x18008c10); 471*32e284a2SBitterblue Smith /* RX_Tone_idx[9:0], RxK_Mask[29] */ 472*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x38008c10); 473*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00100000); 474*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xfa000000); 475*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM64, 0xf8000000); 476*32e284a2SBitterblue Smith 477*32e284a2SBitterblue Smith mdelay(10); 478*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_RFECTL_A, 0x00000000); 479*32e284a2SBitterblue Smith 480*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 481*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 482*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, 0x7fe00, 483*32e284a2SBitterblue Smith rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, 0xffc00)); 484*32e284a2SBitterblue Smith 485*32e284a2SBitterblue Smith if (hal->current_band_width == RTW_CHANNEL_WIDTH_40) 486*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 487*32e284a2SBitterblue Smith RF18_BW_MASK, 0x1); 488*32e284a2SBitterblue Smith else if (hal->current_band_width == RTW_CHANNEL_WIDTH_80) 489*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, 490*32e284a2SBitterblue Smith RF18_BW_MASK, 0x0); 491*32e284a2SBitterblue Smith 492*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 493*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 494*32e284a2SBitterblue Smith 495*32e284a2SBitterblue Smith /* 3. TX RF setting */ 496*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 497*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 498*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000); 499*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK, 500*32e284a2SBitterblue Smith 0x20000); 501*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK, 502*32e284a2SBitterblue Smith 0x0003f); 503*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK, 504*32e284a2SBitterblue Smith 0xf3fc3); 505*32e284a2SBitterblue Smith 506*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 0x931d5); 507*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x8a001); 508*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000); 509*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000); 510*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXAGCIDX, BIT(0), 0x1); 511*32e284a2SBitterblue Smith /* TX (X,Y) */ 512*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM00, 0x29002000); 513*32e284a2SBitterblue Smith /* RX (X,Y) */ 514*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM32, 0xa9002000); 515*32e284a2SBitterblue Smith /* [0]:AGC_en, [15]:idac_K_Mask */ 516*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a910); 517*32e284a2SBitterblue Smith 518*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 519*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 520*32e284a2SBitterblue Smith 521*32e284a2SBitterblue Smith if (efuse->ext_pa_5g) 522*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 523*32e284a2SBitterblue Smith 0x821403f7); 524*32e284a2SBitterblue Smith else 525*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 526*32e284a2SBitterblue Smith 0x821403e3); 527*32e284a2SBitterblue Smith 528*32e284a2SBitterblue Smith if (hal->current_band_type == RTW_BAND_5G) 529*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x40163e96); 530*32e284a2SBitterblue Smith else 531*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x00163e96); 532*32e284a2SBitterblue Smith 533*32e284a2SBitterblue Smith if (vdf_enable) 534*32e284a2SBitterblue Smith rtw8821a_iqk_tx_vdf_true(rtwdev, cal, &tx0iqkok, 535*32e284a2SBitterblue Smith tx_x0, tx_y0); 536*32e284a2SBitterblue Smith else 537*32e284a2SBitterblue Smith rtw8821a_iqk_tx_vdf_false(rtwdev, cal, &tx0iqkok, 538*32e284a2SBitterblue Smith tx_x0, tx_y0); 539*32e284a2SBitterblue Smith 540*32e284a2SBitterblue Smith if (!tx0iqkok) 541*32e284a2SBitterblue Smith break; /* TXK fail, Don't do RXK */ 542*32e284a2SBitterblue Smith 543*32e284a2SBitterblue Smith /* ====== RX IQK ====== */ 544*32e284a2SBitterblue Smith /* [31] = 0 --> Page C */ 545*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x0); 546*32e284a2SBitterblue Smith /* 1. RX RF setting */ 547*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000); 548*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_ADDR, RFREG_MASK, 549*32e284a2SBitterblue Smith 0x30000); 550*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA0, RFREG_MASK, 551*32e284a2SBitterblue Smith 0x0002f); 552*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_MODE_TABLE_DATA1, RFREG_MASK, 553*32e284a2SBitterblue Smith 0xfffbb); 554*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001); 555*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_TXA_PREPAD, RFREG_MASK, 0x931d8); 556*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000); 557*32e284a2SBitterblue Smith 558*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x03FF8000, 559*32e284a2SBitterblue Smith (tx_x0[cal] >> 21) & 0x000007ff); 560*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQK_COM00, 0x000007FF, 561*32e284a2SBitterblue Smith (tx_y0[cal] >> 21) & 0x000007ff); 562*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x1); 563*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_IQK_COM00, BIT(31), 0x0); 564*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_DAC_RSTB, 0x00008000); 565*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_IQK_COM96, 0x0046a911); 566*32e284a2SBitterblue Smith 567*32e284a2SBitterblue Smith /* [31] = 1 --> Page C1 */ 568*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, BIT(31), 0x1); 569*32e284a2SBitterblue Smith 570*32e284a2SBitterblue Smith /* TX_Tone_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 571*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XA_TX_IQ_IMBALANCE, 0x38008c10); 572*32e284a2SBitterblue Smith /* RX_Tone_idx[9:0], RxK_Mask[29] */ 573*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x18008c10); 574*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_OFDM0_XB_TX_IQ_IMBALANCE, 0x02140119); 575*32e284a2SBitterblue Smith 576*32e284a2SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) 577*32e284a2SBitterblue Smith rx_iqk_loop = 2; /* for 2% fail; */ 578*32e284a2SBitterblue Smith else 579*32e284a2SBitterblue Smith rx_iqk_loop = 1; 580*32e284a2SBitterblue Smith 581*32e284a2SBitterblue Smith for (i = 0; i < rx_iqk_loop; i++) { 582*32e284a2SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && i == 0) 583*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28161100); /* Good */ 584*32e284a2SBitterblue Smith else 585*32e284a2SBitterblue Smith rtw_write32(rtwdev, REG_TSSI_TRK_SW, 0x28160d00); 586*32e284a2SBitterblue Smith 587*32e284a2SBitterblue Smith rtw8821a_iqk_rx(rtwdev, cal, &rx0iqkok, 588*32e284a2SBitterblue Smith rx_x0[i], rx_y0[i]); 589*32e284a2SBitterblue Smith } 590*32e284a2SBitterblue Smith 591*32e284a2SBitterblue Smith if (tx0iqkok) 592*32e284a2SBitterblue Smith tx_average++; 593*32e284a2SBitterblue Smith if (rx0iqkok) 594*32e284a2SBitterblue Smith rx_average++; 595*32e284a2SBitterblue Smith } 596*32e284a2SBitterblue Smith 597*32e284a2SBitterblue Smith /* FillIQK Result */ 598*32e284a2SBitterblue Smith 599*32e284a2SBitterblue Smith if (tx_average == 0) 600*32e284a2SBitterblue Smith return; 601*32e284a2SBitterblue Smith 602*32e284a2SBitterblue Smith for (i = 0; i < tx_average; i++) 603*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 604*32e284a2SBitterblue Smith "tx_x0[%d] = %x ;; tx_y0[%d] = %x\n", 605*32e284a2SBitterblue Smith i, (tx_x0[i] >> 21) & 0x000007ff, 606*32e284a2SBitterblue Smith i, (tx_y0[i] >> 21) & 0x000007ff); 607*32e284a2SBitterblue Smith 608*32e284a2SBitterblue Smith if (rtw88xxa_iqk_finish(tx_average, 3, tx_x0, tx_y0, 609*32e284a2SBitterblue Smith &tx_x, &tx_y, true, true)) 610*32e284a2SBitterblue Smith rtw8821a_iqk_tx_fill(rtwdev, tx_x, tx_y); 611*32e284a2SBitterblue Smith else 612*32e284a2SBitterblue Smith rtw8821a_iqk_tx_fill(rtwdev, 0x200, 0x0); 613*32e284a2SBitterblue Smith 614*32e284a2SBitterblue Smith if (rx_average == 0) 615*32e284a2SBitterblue Smith return; 616*32e284a2SBitterblue Smith 617*32e284a2SBitterblue Smith for (i = 0; i < rx_average; i++) { 618*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 619*32e284a2SBitterblue Smith "rx_x0[0][%d] = %x ;; rx_y0[0][%d] = %x\n", 620*32e284a2SBitterblue Smith i, (rx_x0[0][i] >> 21) & 0x000007ff, 621*32e284a2SBitterblue Smith i, (rx_y0[0][i] >> 21) & 0x000007ff); 622*32e284a2SBitterblue Smith 623*32e284a2SBitterblue Smith if (rx_iqk_loop == 2) 624*32e284a2SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 625*32e284a2SBitterblue Smith "rx_x0[1][%d] = %x ;; rx_y0[1][%d] = %x\n", 626*32e284a2SBitterblue Smith i, (rx_x0[1][i] >> 21) & 0x000007ff, 627*32e284a2SBitterblue Smith i, (rx_y0[1][i] >> 21) & 0x000007ff); 628*32e284a2SBitterblue Smith } 629*32e284a2SBitterblue Smith 630*32e284a2SBitterblue Smith rx_finish1 = rtw88xxa_iqk_finish(rx_average, 4, rx_x0[0], rx_y0[0], 631*32e284a2SBitterblue Smith &rx_x_temp, &rx_y_temp, true, true); 632*32e284a2SBitterblue Smith 633*32e284a2SBitterblue Smith if (rx_finish1) { 634*32e284a2SBitterblue Smith rx_x = rx_x_temp; 635*32e284a2SBitterblue Smith rx_y = rx_y_temp; 636*32e284a2SBitterblue Smith } 637*32e284a2SBitterblue Smith 638*32e284a2SBitterblue Smith if (rx_iqk_loop == 2) { 639*32e284a2SBitterblue Smith rx_finish2 = rtw88xxa_iqk_finish(rx_average, 4, 640*32e284a2SBitterblue Smith rx_x0[1], rx_y0[1], 641*32e284a2SBitterblue Smith &rx_x, &rx_y, true, true); 642*32e284a2SBitterblue Smith 643*32e284a2SBitterblue Smith if (rx_finish1 && rx_finish2) { 644*32e284a2SBitterblue Smith rx_x = (rx_x + rx_x_temp) / 2; 645*32e284a2SBitterblue Smith rx_y = (rx_y + rx_y_temp) / 2; 646*32e284a2SBitterblue Smith } 647*32e284a2SBitterblue Smith } 648*32e284a2SBitterblue Smith 649*32e284a2SBitterblue Smith if (rx_finish1 || rx_finish2) 650*32e284a2SBitterblue Smith rtw8821a_iqk_rx_fill(rtwdev, rx_x, rx_y); 651*32e284a2SBitterblue Smith else 652*32e284a2SBitterblue Smith rtw8821a_iqk_rx_fill(rtwdev, 0x200, 0x0); 653*32e284a2SBitterblue Smith } 654*32e284a2SBitterblue Smith 655*32e284a2SBitterblue Smith static void rtw8821a_do_iqk(struct rtw_dev *rtwdev) 656*32e284a2SBitterblue Smith { 657*32e284a2SBitterblue Smith static const u32 backup_macbb_reg[MACBB_REG_NUM_8821A] = { 658*32e284a2SBitterblue Smith 0x520, 0x550, 0x808, 0xa04, 0x90c, 0xc00, 0x838, 0x82c 659*32e284a2SBitterblue Smith }; 660*32e284a2SBitterblue Smith static const u32 backup_afe_reg[AFE_REG_NUM_8821A] = { 661*32e284a2SBitterblue Smith 0xc5c, 0xc60, 0xc64, 0xc68 662*32e284a2SBitterblue Smith }; 663*32e284a2SBitterblue Smith static const u32 backup_rf_reg[RF_REG_NUM_8821A] = { 664*32e284a2SBitterblue Smith 0x65, 0x8f, 0x0 665*32e284a2SBitterblue Smith }; 666*32e284a2SBitterblue Smith u32 macbb_backup[MACBB_REG_NUM_8821A]; 667*32e284a2SBitterblue Smith u32 afe_backup[AFE_REG_NUM_8821A]; 668*32e284a2SBitterblue Smith u32 rfa_backup[RF_REG_NUM_8821A]; 669*32e284a2SBitterblue Smith 670*32e284a2SBitterblue Smith rtw88xxa_iqk_backup_mac_bb(rtwdev, macbb_backup, 671*32e284a2SBitterblue Smith backup_macbb_reg, MACBB_REG_NUM_8821A); 672*32e284a2SBitterblue Smith rtw88xxa_iqk_backup_afe(rtwdev, afe_backup, 673*32e284a2SBitterblue Smith backup_afe_reg, AFE_REG_NUM_8821A); 674*32e284a2SBitterblue Smith rtw8821a_iqk_backup_rf(rtwdev, rfa_backup, 675*32e284a2SBitterblue Smith backup_rf_reg, RF_REG_NUM_8821A); 676*32e284a2SBitterblue Smith 677*32e284a2SBitterblue Smith rtw88xxa_iqk_configure_mac(rtwdev); 678*32e284a2SBitterblue Smith 679*32e284a2SBitterblue Smith rtw8821a_iqk(rtwdev); 680*32e284a2SBitterblue Smith 681*32e284a2SBitterblue Smith rtw8821a_iqk_restore_rf(rtwdev, backup_rf_reg, 682*32e284a2SBitterblue Smith rfa_backup, RF_REG_NUM_8821A); 683*32e284a2SBitterblue Smith rtw8821a_iqk_restore_afe(rtwdev, afe_backup, 684*32e284a2SBitterblue Smith backup_afe_reg, AFE_REG_NUM_8821A); 685*32e284a2SBitterblue Smith rtw88xxa_iqk_restore_mac_bb(rtwdev, macbb_backup, 686*32e284a2SBitterblue Smith backup_macbb_reg, MACBB_REG_NUM_8821A); 687*32e284a2SBitterblue Smith } 688*32e284a2SBitterblue Smith 689*32e284a2SBitterblue Smith static void rtw8821a_phy_calibration(struct rtw_dev *rtwdev) 690*32e284a2SBitterblue Smith { 691*32e284a2SBitterblue Smith rtw8821a_do_iqk(rtwdev); 692*32e284a2SBitterblue Smith } 693*32e284a2SBitterblue Smith 694*32e284a2SBitterblue Smith static void rtw8821a_pwr_track(struct rtw_dev *rtwdev) 695*32e284a2SBitterblue Smith { 696*32e284a2SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 697*32e284a2SBitterblue Smith 698*32e284a2SBitterblue Smith if (!dm_info->pwr_trk_triggered) { 699*32e284a2SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, 700*32e284a2SBitterblue Smith GENMASK(17, 16), 0x03); 701*32e284a2SBitterblue Smith dm_info->pwr_trk_triggered = true; 702*32e284a2SBitterblue Smith return; 703*32e284a2SBitterblue Smith } 704*32e284a2SBitterblue Smith 705*32e284a2SBitterblue Smith rtw88xxa_phy_pwrtrack(rtwdev, NULL, rtw8821a_do_iqk); 706*32e284a2SBitterblue Smith dm_info->pwr_trk_triggered = false; 707*32e284a2SBitterblue Smith } 708*32e284a2SBitterblue Smith 709*32e284a2SBitterblue Smith static void rtw8821a_fill_txdesc_checksum(struct rtw_dev *rtwdev, 710*32e284a2SBitterblue Smith struct rtw_tx_pkt_info *pkt_info, 711*32e284a2SBitterblue Smith u8 *txdesc) 712*32e284a2SBitterblue Smith { 713*32e284a2SBitterblue Smith fill_txdesc_checksum_common(txdesc, 16); 714*32e284a2SBitterblue Smith } 715*32e284a2SBitterblue Smith 716*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_init(struct rtw_dev *rtwdev) 717*32e284a2SBitterblue Smith { 718*32e284a2SBitterblue Smith u8 val8; 719*32e284a2SBitterblue Smith 720*32e284a2SBitterblue Smith /* BT report packet sample rate */ 721*32e284a2SBitterblue Smith rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5); 722*32e284a2SBitterblue Smith 723*32e284a2SBitterblue Smith val8 = BIT_STATIS_BT_EN; 724*32e284a2SBitterblue Smith if (rtwdev->efuse.share_ant) 725*32e284a2SBitterblue Smith val8 |= BIT_R_GRANTALL_WLMASK; 726*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_BT_COEX_ENH_INTR_CTRL, val8); 727*32e284a2SBitterblue Smith 728*32e284a2SBitterblue Smith /* enable BT counter statistics */ 729*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x3); 730*32e284a2SBitterblue Smith 731*32e284a2SBitterblue Smith /* enable PTA */ 732*32e284a2SBitterblue Smith rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN); 733*32e284a2SBitterblue Smith } 734*32e284a2SBitterblue Smith 735*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, 736*32e284a2SBitterblue Smith u8 pos_type) 737*32e284a2SBitterblue Smith { 738*32e284a2SBitterblue Smith bool share_ant = rtwdev->efuse.share_ant; 739*32e284a2SBitterblue Smith struct rtw_coex *coex = &rtwdev->coex; 740*32e284a2SBitterblue Smith struct rtw_coex_dm *coex_dm = &coex->dm; 741*32e284a2SBitterblue Smith u32 phase = coex_dm->cur_ant_pos_type; 742*32e284a2SBitterblue Smith 743*32e284a2SBitterblue Smith if (!rtwdev->efuse.btcoex) 744*32e284a2SBitterblue Smith return; 745*32e284a2SBitterblue Smith 746*32e284a2SBitterblue Smith switch (phase) { 747*32e284a2SBitterblue Smith case COEX_SET_ANT_POWERON: 748*32e284a2SBitterblue Smith case COEX_SET_ANT_INIT: 749*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 750*32e284a2SBitterblue Smith rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 751*32e284a2SBitterblue Smith rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL); 752*32e284a2SBitterblue Smith 753*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_RFE_CTRL8, 754*32e284a2SBitterblue Smith share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN); 755*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1); 756*32e284a2SBitterblue Smith break; 757*32e284a2SBitterblue Smith case COEX_SET_ANT_WONLY: 758*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 759*32e284a2SBitterblue Smith rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 760*32e284a2SBitterblue Smith rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL); 761*32e284a2SBitterblue Smith 762*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN); 763*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1); 764*32e284a2SBitterblue Smith break; 765*32e284a2SBitterblue Smith case COEX_SET_ANT_2G: 766*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 767*32e284a2SBitterblue Smith rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 768*32e284a2SBitterblue Smith rtw_write8_clr(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL); 769*32e284a2SBitterblue Smith 770*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_RFE_CTRL8, 771*32e284a2SBitterblue Smith share_ant ? PTA_CTRL_PIN : DPDT_CTRL_PIN); 772*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 0x1); 773*32e284a2SBitterblue Smith break; 774*32e284a2SBitterblue Smith case COEX_SET_ANT_5G: 775*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 776*32e284a2SBitterblue Smith rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 777*32e284a2SBitterblue Smith rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL); 778*32e284a2SBitterblue Smith 779*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN); 780*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 781*32e284a2SBitterblue Smith share_ant ? 0x2 : 0x1); 782*32e284a2SBitterblue Smith break; 783*32e284a2SBitterblue Smith case COEX_SET_ANT_WOFF: 784*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 785*32e284a2SBitterblue Smith rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 786*32e284a2SBitterblue Smith rtw_write8_set(rtwdev, REG_GNT_BT, BIT_PTA_SW_CTL); 787*32e284a2SBitterblue Smith 788*32e284a2SBitterblue Smith rtw_write8(rtwdev, REG_RFE_CTRL8, DPDT_CTRL_PIN); 789*32e284a2SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_CTRL8, 0x30000000, 790*32e284a2SBitterblue Smith share_ant ? 0x2 : 0x1); 791*32e284a2SBitterblue Smith break; 792*32e284a2SBitterblue Smith default: 793*32e284a2SBitterblue Smith rtw_warn(rtwdev, "%s: not handling phase %d\n", 794*32e284a2SBitterblue Smith __func__, phase); 795*32e284a2SBitterblue Smith break; 796*32e284a2SBitterblue Smith } 797*32e284a2SBitterblue Smith } 798*32e284a2SBitterblue Smith 799*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) 800*32e284a2SBitterblue Smith { 801*32e284a2SBitterblue Smith } 802*32e284a2SBitterblue Smith 803*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) 804*32e284a2SBitterblue Smith { 805*32e284a2SBitterblue Smith } 806*32e284a2SBitterblue Smith 807*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_rfe_type(struct rtw_dev *rtwdev) 808*32e284a2SBitterblue Smith { 809*32e284a2SBitterblue Smith struct rtw_coex *coex = &rtwdev->coex; 810*32e284a2SBitterblue Smith struct rtw_coex_rfe *coex_rfe = &coex->rfe; 811*32e284a2SBitterblue Smith 812*32e284a2SBitterblue Smith coex_rfe->ant_switch_exist = true; 813*32e284a2SBitterblue Smith } 814*32e284a2SBitterblue Smith 815*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 816*32e284a2SBitterblue Smith { 817*32e284a2SBitterblue Smith struct rtw_coex *coex = &rtwdev->coex; 818*32e284a2SBitterblue Smith struct rtw_coex_dm *coex_dm = &coex->dm; 819*32e284a2SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 820*32e284a2SBitterblue Smith bool share_ant = efuse->share_ant; 821*32e284a2SBitterblue Smith 822*32e284a2SBitterblue Smith if (share_ant) 823*32e284a2SBitterblue Smith return; 824*32e284a2SBitterblue Smith 825*32e284a2SBitterblue Smith if (wl_pwr == coex_dm->cur_wl_pwr_lvl) 826*32e284a2SBitterblue Smith return; 827*32e284a2SBitterblue Smith 828*32e284a2SBitterblue Smith coex_dm->cur_wl_pwr_lvl = wl_pwr; 829*32e284a2SBitterblue Smith } 830*32e284a2SBitterblue Smith 831*32e284a2SBitterblue Smith static void rtw8821a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 832*32e284a2SBitterblue Smith { 833*32e284a2SBitterblue Smith } 834*32e284a2SBitterblue Smith 835*32e284a2SBitterblue Smith static const struct rtw_chip_ops rtw8821a_ops = { 836*32e284a2SBitterblue Smith .power_on = rtw88xxa_power_on, 837*32e284a2SBitterblue Smith .power_off = rtw8821a_power_off, 838*32e284a2SBitterblue Smith .phy_set_param = NULL, 839*32e284a2SBitterblue Smith .read_efuse = rtw88xxa_read_efuse, 840*32e284a2SBitterblue Smith .query_phy_status = rtw8821a_query_phy_status, 841*32e284a2SBitterblue Smith .set_channel = rtw88xxa_set_channel, 842*32e284a2SBitterblue Smith .mac_init = NULL, 843*32e284a2SBitterblue Smith .read_rf = rtw88xxa_phy_read_rf, 844*32e284a2SBitterblue Smith .write_rf = rtw_phy_write_rf_reg_sipi, 845*32e284a2SBitterblue Smith .set_antenna = NULL, 846*32e284a2SBitterblue Smith .set_tx_power_index = rtw88xxa_set_tx_power_index, 847*32e284a2SBitterblue Smith .cfg_ldo25 = rtw8821a_cfg_ldo25, 848*32e284a2SBitterblue Smith .efuse_grant = rtw88xxa_efuse_grant, 849*32e284a2SBitterblue Smith .false_alarm_statistics = rtw88xxa_false_alarm_statistics, 850*32e284a2SBitterblue Smith .phy_calibration = rtw8821a_phy_calibration, 851*32e284a2SBitterblue Smith .cck_pd_set = rtw88xxa_phy_cck_pd_set, 852*32e284a2SBitterblue Smith .pwr_track = rtw8821a_pwr_track, 853*32e284a2SBitterblue Smith .config_bfee = NULL, 854*32e284a2SBitterblue Smith .set_gid_table = NULL, 855*32e284a2SBitterblue Smith .cfg_csi_rate = NULL, 856*32e284a2SBitterblue Smith .fill_txdesc_checksum = rtw8821a_fill_txdesc_checksum, 857*32e284a2SBitterblue Smith .coex_set_init = rtw8821a_coex_cfg_init, 858*32e284a2SBitterblue Smith .coex_set_ant_switch = rtw8821a_coex_cfg_ant_switch, 859*32e284a2SBitterblue Smith .coex_set_gnt_fix = rtw8821a_coex_cfg_gnt_fix, 860*32e284a2SBitterblue Smith .coex_set_gnt_debug = rtw8821a_coex_cfg_gnt_debug, 861*32e284a2SBitterblue Smith .coex_set_rfe_type = rtw8821a_coex_cfg_rfe_type, 862*32e284a2SBitterblue Smith .coex_set_wl_tx_power = rtw8821a_coex_cfg_wl_tx_power, 863*32e284a2SBitterblue Smith .coex_set_wl_rx_gain = rtw8821a_coex_cfg_wl_rx_gain, 864*32e284a2SBitterblue Smith }; 865*32e284a2SBitterblue Smith 866*32e284a2SBitterblue Smith static const struct rtw_page_table page_table_8821a[] = { 867*32e284a2SBitterblue Smith /* hq_num, nq_num, lq_num, exq_num, gapq_num */ 868*32e284a2SBitterblue Smith {0, 0, 0, 0, 0}, /* SDIO */ 869*32e284a2SBitterblue Smith {0, 0, 0, 0, 0}, /* PCI */ 870*32e284a2SBitterblue Smith {8, 0, 0, 0, 1}, /* 2 bulk out endpoints */ 871*32e284a2SBitterblue Smith {8, 0, 8, 0, 1}, /* 3 bulk out endpoints */ 872*32e284a2SBitterblue Smith {8, 0, 8, 4, 1}, /* 4 bulk out endpoints */ 873*32e284a2SBitterblue Smith }; 874*32e284a2SBitterblue Smith 875*32e284a2SBitterblue Smith static const struct rtw_rqpn rqpn_table_8821a[] = { 876*32e284a2SBitterblue Smith {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 877*32e284a2SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 878*32e284a2SBitterblue Smith RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 879*32e284a2SBitterblue Smith 880*32e284a2SBitterblue Smith {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 881*32e284a2SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 882*32e284a2SBitterblue Smith RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 883*32e284a2SBitterblue Smith 884*32e284a2SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH, 885*32e284a2SBitterblue Smith RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 886*32e284a2SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 887*32e284a2SBitterblue Smith 888*32e284a2SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL, 889*32e284a2SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 890*32e284a2SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 891*32e284a2SBitterblue Smith 892*32e284a2SBitterblue Smith {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 893*32e284a2SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 894*32e284a2SBitterblue Smith RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 895*32e284a2SBitterblue Smith }; 896*32e284a2SBitterblue Smith 897*32e284a2SBitterblue Smith static const struct rtw_prioq_addrs prioq_addrs_8821a = { 898*32e284a2SBitterblue Smith .prio[RTW_DMA_MAPPING_EXTRA] = { 899*32e284a2SBitterblue Smith .rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3, 900*32e284a2SBitterblue Smith }, 901*32e284a2SBitterblue Smith .prio[RTW_DMA_MAPPING_LOW] = { 902*32e284a2SBitterblue Smith .rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1, 903*32e284a2SBitterblue Smith }, 904*32e284a2SBitterblue Smith .prio[RTW_DMA_MAPPING_NORMAL] = { 905*32e284a2SBitterblue Smith .rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1, 906*32e284a2SBitterblue Smith }, 907*32e284a2SBitterblue Smith .prio[RTW_DMA_MAPPING_HIGH] = { 908*32e284a2SBitterblue Smith .rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2, 909*32e284a2SBitterblue Smith }, 910*32e284a2SBitterblue Smith .wsize = false, 911*32e284a2SBitterblue Smith }; 912*32e284a2SBitterblue Smith 913*32e284a2SBitterblue Smith static const struct rtw_hw_reg rtw8821a_dig[] = { 914*32e284a2SBitterblue Smith [0] = { .addr = REG_RXIGI_A, .mask = 0x7f }, 915*32e284a2SBitterblue Smith }; 916*32e284a2SBitterblue Smith 917*32e284a2SBitterblue Smith static const struct rtw_rfe_def rtw8821a_rfe_defs[] = { 918*32e284a2SBitterblue Smith [0] = { .phy_pg_tbl = &rtw8821a_bb_pg_tbl, 919*32e284a2SBitterblue Smith .txpwr_lmt_tbl = &rtw8821a_txpwr_lmt_tbl, 920*32e284a2SBitterblue Smith .pwr_track_tbl = &rtw8821a_rtw_pwr_track_tbl, }, 921*32e284a2SBitterblue Smith }; 922*32e284a2SBitterblue Smith 923*32e284a2SBitterblue Smith /* TODO */ 924*32e284a2SBitterblue Smith /* rssi in percentage % (dbm = % - 100) */ 925*32e284a2SBitterblue Smith static const u8 wl_rssi_step_8821a[] = {101, 45, 101, 40}; 926*32e284a2SBitterblue Smith static const u8 bt_rssi_step_8821a[] = {101, 101, 101, 101}; 927*32e284a2SBitterblue Smith 928*32e284a2SBitterblue Smith /* table_sant_8821a, table_nsant_8821a, tdma_sant_8821a, and tdma_nsant_8821a 929*32e284a2SBitterblue Smith * are copied from rtw8821c.c because the 8821au driver's tables are not 930*32e284a2SBitterblue Smith * compatible with the coex code in rtw88. 931*32e284a2SBitterblue Smith * 932*32e284a2SBitterblue Smith * tdma case 112 (A2DP) byte 0 had to be modified from 0x61 to 0x51, 933*32e284a2SBitterblue Smith * otherwise the firmware gets confused after pausing the music: 934*32e284a2SBitterblue Smith * rtw_8821au 1-2:1.2: [BTCoex], Bt_info[1], len=7, data=[81 00 0a 01 00 00] 935*32e284a2SBitterblue Smith * - 81 means PAN (personal area network) when it should be 4x (A2DP) 936*32e284a2SBitterblue Smith * The music is not smooth with the PAN algorithm. 937*32e284a2SBitterblue Smith */ 938*32e284a2SBitterblue Smith 939*32e284a2SBitterblue Smith /* Shared-Antenna Coex Table */ 940*32e284a2SBitterblue Smith static const struct coex_table_para table_sant_8821a[] = { 941*32e284a2SBitterblue Smith {0x55555555, 0x55555555}, /* case-0 */ 942*32e284a2SBitterblue Smith {0x55555555, 0x55555555}, 943*32e284a2SBitterblue Smith {0x66555555, 0x66555555}, 944*32e284a2SBitterblue Smith {0xaaaaaaaa, 0xaaaaaaaa}, 945*32e284a2SBitterblue Smith {0x5a5a5a5a, 0x5a5a5a5a}, 946*32e284a2SBitterblue Smith {0xfafafafa, 0xfafafafa}, /* case-5 */ 947*32e284a2SBitterblue Smith {0x6a5a5555, 0xaaaaaaaa}, 948*32e284a2SBitterblue Smith {0x6a5a56aa, 0x6a5a56aa}, 949*32e284a2SBitterblue Smith {0x6a5a5a5a, 0x6a5a5a5a}, 950*32e284a2SBitterblue Smith {0x66555555, 0x5a5a5a5a}, 951*32e284a2SBitterblue Smith {0x66555555, 0x6a5a5a5a}, /* case-10 */ 952*32e284a2SBitterblue Smith {0x66555555, 0xaaaaaaaa}, 953*32e284a2SBitterblue Smith {0x66555555, 0x6a5a5aaa}, 954*32e284a2SBitterblue Smith {0x66555555, 0x6aaa6aaa}, 955*32e284a2SBitterblue Smith {0x66555555, 0x6a5a5aaa}, 956*32e284a2SBitterblue Smith {0x66555555, 0xaaaaaaaa}, /* case-15 */ 957*32e284a2SBitterblue Smith {0xffff55ff, 0xfafafafa}, 958*32e284a2SBitterblue Smith {0xffff55ff, 0x6afa5afa}, 959*32e284a2SBitterblue Smith {0xaaffffaa, 0xfafafafa}, 960*32e284a2SBitterblue Smith {0xaa5555aa, 0x5a5a5a5a}, 961*32e284a2SBitterblue Smith {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */ 962*32e284a2SBitterblue Smith {0xaa5555aa, 0xaaaaaaaa}, 963*32e284a2SBitterblue Smith {0xffffffff, 0x55555555}, 964*32e284a2SBitterblue Smith {0xffffffff, 0x5a5a5a5a}, 965*32e284a2SBitterblue Smith {0xffffffff, 0x5a5a5a5a}, 966*32e284a2SBitterblue Smith {0xffffffff, 0x5a5a5aaa}, /* case-25 */ 967*32e284a2SBitterblue Smith {0x55555555, 0x5a5a5a5a}, 968*32e284a2SBitterblue Smith {0x55555555, 0xaaaaaaaa}, 969*32e284a2SBitterblue Smith {0x66555555, 0x6a5a6a5a}, 970*32e284a2SBitterblue Smith {0x66556655, 0x66556655}, 971*32e284a2SBitterblue Smith {0x66556aaa, 0x6a5a6aaa}, /* case-30 */ 972*32e284a2SBitterblue Smith {0xffffffff, 0x5aaa5aaa}, 973*32e284a2SBitterblue Smith {0x56555555, 0x5a5a5aaa} 974*32e284a2SBitterblue Smith }; 975*32e284a2SBitterblue Smith 976*32e284a2SBitterblue Smith /* Non-Shared-Antenna Coex Table */ 977*32e284a2SBitterblue Smith static const struct coex_table_para table_nsant_8821a[] = { 978*32e284a2SBitterblue Smith {0xffffffff, 0xffffffff}, /* case-100 */ 979*32e284a2SBitterblue Smith {0xffff55ff, 0xfafafafa}, 980*32e284a2SBitterblue Smith {0x66555555, 0x66555555}, 981*32e284a2SBitterblue Smith {0xaaaaaaaa, 0xaaaaaaaa}, 982*32e284a2SBitterblue Smith {0x5a5a5a5a, 0x5a5a5a5a}, 983*32e284a2SBitterblue Smith {0xffffffff, 0xffffffff}, /* case-105 */ 984*32e284a2SBitterblue Smith {0x5afa5afa, 0x5afa5afa}, 985*32e284a2SBitterblue Smith {0x55555555, 0xfafafafa}, 986*32e284a2SBitterblue Smith {0x66555555, 0xfafafafa}, 987*32e284a2SBitterblue Smith {0x66555555, 0x5a5a5a5a}, 988*32e284a2SBitterblue Smith {0x66555555, 0x6a5a5a5a}, /* case-110 */ 989*32e284a2SBitterblue Smith {0x66555555, 0xaaaaaaaa}, 990*32e284a2SBitterblue Smith {0xffff55ff, 0xfafafafa}, 991*32e284a2SBitterblue Smith {0xffff55ff, 0x5afa5afa}, 992*32e284a2SBitterblue Smith {0xffff55ff, 0xaaaaaaaa}, 993*32e284a2SBitterblue Smith {0xffff55ff, 0xffff55ff}, /* case-115 */ 994*32e284a2SBitterblue Smith {0xaaffffaa, 0x5afa5afa}, 995*32e284a2SBitterblue Smith {0xaaffffaa, 0xaaaaaaaa}, 996*32e284a2SBitterblue Smith {0xffffffff, 0xfafafafa}, 997*32e284a2SBitterblue Smith {0xffff55ff, 0xfafafafa}, 998*32e284a2SBitterblue Smith {0xffffffff, 0xaaaaaaaa}, /* case-120 */ 999*32e284a2SBitterblue Smith {0xffff55ff, 0x5afa5afa}, 1000*32e284a2SBitterblue Smith {0xffff55ff, 0x5afa5afa}, 1001*32e284a2SBitterblue Smith {0x55ff55ff, 0x55ff55ff} 1002*32e284a2SBitterblue Smith }; 1003*32e284a2SBitterblue Smith 1004*32e284a2SBitterblue Smith /* Shared-Antenna TDMA */ 1005*32e284a2SBitterblue Smith static const struct coex_tdma_para tdma_sant_8821a[] = { 1006*32e284a2SBitterblue Smith { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */ 1007*32e284a2SBitterblue Smith { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */ 1008*32e284a2SBitterblue Smith { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 1009*32e284a2SBitterblue Smith { {0x61, 0x35, 0x03, 0x11, 0x11} }, 1010*32e284a2SBitterblue Smith { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1011*32e284a2SBitterblue Smith { {0x61, 0x3a, 0x03, 0x11, 0x11} }, /* case-5 */ 1012*32e284a2SBitterblue Smith { {0x61, 0x45, 0x03, 0x11, 0x10} }, 1013*32e284a2SBitterblue Smith { {0x61, 0x35, 0x03, 0x11, 0x10} }, 1014*32e284a2SBitterblue Smith { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1015*32e284a2SBitterblue Smith { {0x61, 0x20, 0x03, 0x11, 0x10} }, 1016*32e284a2SBitterblue Smith { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */ 1017*32e284a2SBitterblue Smith { {0x61, 0x08, 0x03, 0x11, 0x15} }, 1018*32e284a2SBitterblue Smith { {0x61, 0x08, 0x03, 0x10, 0x14} }, 1019*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x10, 0x54} }, 1020*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x10, 0x55} }, 1021*32e284a2SBitterblue Smith { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */ 1022*32e284a2SBitterblue Smith { {0x51, 0x45, 0x03, 0x10, 0x50} }, 1023*32e284a2SBitterblue Smith { {0x51, 0x3a, 0x03, 0x11, 0x50} }, 1024*32e284a2SBitterblue Smith { {0x51, 0x30, 0x03, 0x10, 0x50} }, 1025*32e284a2SBitterblue Smith { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1026*32e284a2SBitterblue Smith { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */ 1027*32e284a2SBitterblue Smith { {0x51, 0x4a, 0x03, 0x10, 0x50} }, 1028*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x30, 0x54} }, 1029*32e284a2SBitterblue Smith { {0x55, 0x08, 0x03, 0x10, 0x54} }, 1030*32e284a2SBitterblue Smith { {0x65, 0x10, 0x03, 0x11, 0x10} }, 1031*32e284a2SBitterblue Smith { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */ 1032*32e284a2SBitterblue Smith { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1033*32e284a2SBitterblue Smith { {0x61, 0x08, 0x03, 0x11, 0x11} } 1034*32e284a2SBitterblue Smith }; 1035*32e284a2SBitterblue Smith 1036*32e284a2SBitterblue Smith /* Non-Shared-Antenna TDMA */ 1037*32e284a2SBitterblue Smith static const struct coex_tdma_para tdma_nsant_8821a[] = { 1038*32e284a2SBitterblue Smith { {0x00, 0x00, 0x00, 0x40, 0x00} }, /* case-100 */ 1039*32e284a2SBitterblue Smith { {0x61, 0x45, 0x03, 0x11, 0x11} }, 1040*32e284a2SBitterblue Smith { {0x61, 0x25, 0x03, 0x11, 0x11} }, 1041*32e284a2SBitterblue Smith { {0x61, 0x35, 0x03, 0x11, 0x11} }, 1042*32e284a2SBitterblue Smith { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1043*32e284a2SBitterblue Smith { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */ 1044*32e284a2SBitterblue Smith { {0x61, 0x45, 0x03, 0x11, 0x10} }, 1045*32e284a2SBitterblue Smith { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1046*32e284a2SBitterblue Smith { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1047*32e284a2SBitterblue Smith { {0x61, 0x20, 0x03, 0x11, 0x10} }, 1048*32e284a2SBitterblue Smith { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */ 1049*32e284a2SBitterblue Smith { {0x61, 0x10, 0x03, 0x11, 0x11} }, 1050*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x10, 0x14} }, /* a2dp high rssi */ 1051*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x10, 0x54} }, /* a2dp not high rssi */ 1052*32e284a2SBitterblue Smith { {0x51, 0x08, 0x03, 0x10, 0x55} }, 1053*32e284a2SBitterblue Smith { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */ 1054*32e284a2SBitterblue Smith { {0x51, 0x45, 0x03, 0x10, 0x50} }, 1055*32e284a2SBitterblue Smith { {0x51, 0x3a, 0x03, 0x10, 0x50} }, 1056*32e284a2SBitterblue Smith { {0x51, 0x30, 0x03, 0x10, 0x50} }, 1057*32e284a2SBitterblue Smith { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1058*32e284a2SBitterblue Smith { {0x51, 0x21, 0x03, 0x10, 0x50} }, /* case-120 */ 1059*32e284a2SBitterblue Smith { {0x51, 0x10, 0x03, 0x10, 0x50} } 1060*32e284a2SBitterblue Smith }; 1061*32e284a2SBitterblue Smith 1062*32e284a2SBitterblue Smith /* TODO */ 1063*32e284a2SBitterblue Smith static const struct coex_rf_para rf_para_tx_8821a[] = { 1064*32e284a2SBitterblue Smith {0, 0, false, 7}, /* for normal */ 1065*32e284a2SBitterblue Smith {0, 20, false, 7}, /* for WL-CPT */ 1066*32e284a2SBitterblue Smith {8, 17, true, 4}, 1067*32e284a2SBitterblue Smith {7, 18, true, 4}, 1068*32e284a2SBitterblue Smith {6, 19, true, 4}, 1069*32e284a2SBitterblue Smith {5, 20, true, 4} 1070*32e284a2SBitterblue Smith }; 1071*32e284a2SBitterblue Smith 1072*32e284a2SBitterblue Smith static const struct coex_rf_para rf_para_rx_8821a[] = { 1073*32e284a2SBitterblue Smith {0, 0, false, 7}, /* for normal */ 1074*32e284a2SBitterblue Smith {0, 20, false, 7}, /* for WL-CPT */ 1075*32e284a2SBitterblue Smith {3, 24, true, 5}, 1076*32e284a2SBitterblue Smith {2, 26, true, 5}, 1077*32e284a2SBitterblue Smith {1, 27, true, 5}, 1078*32e284a2SBitterblue Smith {0, 28, true, 5} 1079*32e284a2SBitterblue Smith }; 1080*32e284a2SBitterblue Smith 1081*32e284a2SBitterblue Smith static_assert(ARRAY_SIZE(rf_para_tx_8821a) == ARRAY_SIZE(rf_para_rx_8821a)); 1082*32e284a2SBitterblue Smith 1083*32e284a2SBitterblue Smith static const struct coex_5g_afh_map afh_5g_8821a[] = { {0, 0, 0} }; 1084*32e284a2SBitterblue Smith 1085*32e284a2SBitterblue Smith static const struct rtw_reg_domain coex_info_hw_regs_8821a[] = { 1086*32e284a2SBitterblue Smith {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1087*32e284a2SBitterblue Smith {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1088*32e284a2SBitterblue Smith {0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1089*32e284a2SBitterblue Smith {0, 0, RTW_REG_DOMAIN_NL}, 1090*32e284a2SBitterblue Smith {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1091*32e284a2SBitterblue Smith {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1092*32e284a2SBitterblue Smith {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1093*32e284a2SBitterblue Smith {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1094*32e284a2SBitterblue Smith {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8}, 1095*32e284a2SBitterblue Smith {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1096*32e284a2SBitterblue Smith {0, 0, RTW_REG_DOMAIN_NL}, 1097*32e284a2SBitterblue Smith {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32}, 1098*32e284a2SBitterblue Smith {0x64, BIT(0), RTW_REG_DOMAIN_MAC8}, 1099*32e284a2SBitterblue Smith {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8}, 1100*32e284a2SBitterblue Smith {0x40, BIT(5), RTW_REG_DOMAIN_MAC8}, 1101*32e284a2SBitterblue Smith {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A}, 1102*32e284a2SBitterblue Smith {0, 0, RTW_REG_DOMAIN_NL}, 1103*32e284a2SBitterblue Smith {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1104*32e284a2SBitterblue Smith {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1105*32e284a2SBitterblue Smith {0x953, BIT(1), RTW_REG_DOMAIN_MAC8}, 1106*32e284a2SBitterblue Smith {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1107*32e284a2SBitterblue Smith {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1108*32e284a2SBitterblue Smith }; 1109*32e284a2SBitterblue Smith 1110*32e284a2SBitterblue Smith const struct rtw_chip_info rtw8821a_hw_spec = { 1111*32e284a2SBitterblue Smith .ops = &rtw8821a_ops, 1112*32e284a2SBitterblue Smith .id = RTW_CHIP_TYPE_8821A, 1113*32e284a2SBitterblue Smith .fw_name = "rtw88/rtw8821a_fw.bin", 1114*32e284a2SBitterblue Smith .wlan_cpu = RTW_WCPU_11N, 1115*32e284a2SBitterblue Smith .tx_pkt_desc_sz = 40, 1116*32e284a2SBitterblue Smith .tx_buf_desc_sz = 16, 1117*32e284a2SBitterblue Smith .rx_pkt_desc_sz = 24, 1118*32e284a2SBitterblue Smith .rx_buf_desc_sz = 8, 1119*32e284a2SBitterblue Smith .phy_efuse_size = 512, 1120*32e284a2SBitterblue Smith .log_efuse_size = 512, 1121*32e284a2SBitterblue Smith .ptct_efuse_size = 96 + 1, /* TODO or just 18? */ 1122*32e284a2SBitterblue Smith .txff_size = 65536, 1123*32e284a2SBitterblue Smith .rxff_size = 16128, 1124*32e284a2SBitterblue Smith .rsvd_drv_pg_num = 8, 1125*32e284a2SBitterblue Smith .txgi_factor = 1, 1126*32e284a2SBitterblue Smith .is_pwr_by_rate_dec = true, 1127*32e284a2SBitterblue Smith .max_power_index = 0x3f, 1128*32e284a2SBitterblue Smith .csi_buf_pg_num = 0, 1129*32e284a2SBitterblue Smith .band = RTW_BAND_2G | RTW_BAND_5G, 1130*32e284a2SBitterblue Smith .page_size = 256, 1131*32e284a2SBitterblue Smith .dig_min = 0x20, 1132*32e284a2SBitterblue Smith .ht_supported = true, 1133*32e284a2SBitterblue Smith .vht_supported = true, 1134*32e284a2SBitterblue Smith .lps_deep_mode_supported = 0, 1135*32e284a2SBitterblue Smith .sys_func_en = 0xFD, 1136*32e284a2SBitterblue Smith .pwr_on_seq = card_enable_flow_8821a, 1137*32e284a2SBitterblue Smith .pwr_off_seq = card_disable_flow_8821a, 1138*32e284a2SBitterblue Smith .page_table = page_table_8821a, 1139*32e284a2SBitterblue Smith .rqpn_table = rqpn_table_8821a, 1140*32e284a2SBitterblue Smith .prioq_addrs = &prioq_addrs_8821a, 1141*32e284a2SBitterblue Smith .intf_table = NULL, 1142*32e284a2SBitterblue Smith .dig = rtw8821a_dig, 1143*32e284a2SBitterblue Smith .rf_sipi_addr = {REG_LSSI_WRITE_A, REG_LSSI_WRITE_B}, 1144*32e284a2SBitterblue Smith .ltecoex_addr = NULL, 1145*32e284a2SBitterblue Smith .mac_tbl = &rtw8821a_mac_tbl, 1146*32e284a2SBitterblue Smith .agc_tbl = &rtw8821a_agc_tbl, 1147*32e284a2SBitterblue Smith .bb_tbl = &rtw8821a_bb_tbl, 1148*32e284a2SBitterblue Smith .rf_tbl = {&rtw8821a_rf_a_tbl}, 1149*32e284a2SBitterblue Smith .rfe_defs = rtw8821a_rfe_defs, 1150*32e284a2SBitterblue Smith .rfe_defs_size = ARRAY_SIZE(rtw8821a_rfe_defs), 1151*32e284a2SBitterblue Smith .rx_ldpc = false, 1152*32e284a2SBitterblue Smith .hw_feature_report = false, 1153*32e284a2SBitterblue Smith .c2h_ra_report_size = 4, 1154*32e284a2SBitterblue Smith .old_datarate_fb_limit = true, 1155*32e284a2SBitterblue Smith .usb_tx_agg_desc_num = 6, 1156*32e284a2SBitterblue Smith .iqk_threshold = 8, 1157*32e284a2SBitterblue Smith .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16, 1158*32e284a2SBitterblue Smith .max_scan_ie_len = IEEE80211_MAX_DATA_LEN, 1159*32e284a2SBitterblue Smith 1160*32e284a2SBitterblue Smith .coex_para_ver = 20190509, /* glcoex_ver_date_8821a_1ant */ 1161*32e284a2SBitterblue Smith .bt_desired_ver = 0x62, /* But for 2 ant it's 0x5c */ 1162*32e284a2SBitterblue Smith .scbd_support = false, 1163*32e284a2SBitterblue Smith .new_scbd10_def = false, 1164*32e284a2SBitterblue Smith .ble_hid_profile_support = false, 1165*32e284a2SBitterblue Smith .wl_mimo_ps_support = false, 1166*32e284a2SBitterblue Smith .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 1167*32e284a2SBitterblue Smith .bt_rssi_type = COEX_BTRSSI_RATIO, 1168*32e284a2SBitterblue Smith .ant_isolation = 10, 1169*32e284a2SBitterblue Smith .rssi_tolerance = 2, 1170*32e284a2SBitterblue Smith .wl_rssi_step = wl_rssi_step_8821a, 1171*32e284a2SBitterblue Smith .bt_rssi_step = bt_rssi_step_8821a, 1172*32e284a2SBitterblue Smith .table_sant_num = ARRAY_SIZE(table_sant_8821a), 1173*32e284a2SBitterblue Smith .table_sant = table_sant_8821a, 1174*32e284a2SBitterblue Smith .table_nsant_num = ARRAY_SIZE(table_nsant_8821a), 1175*32e284a2SBitterblue Smith .table_nsant = table_nsant_8821a, 1176*32e284a2SBitterblue Smith .tdma_sant_num = ARRAY_SIZE(tdma_sant_8821a), 1177*32e284a2SBitterblue Smith .tdma_sant = tdma_sant_8821a, 1178*32e284a2SBitterblue Smith .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821a), 1179*32e284a2SBitterblue Smith .tdma_nsant = tdma_nsant_8821a, 1180*32e284a2SBitterblue Smith .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821a), 1181*32e284a2SBitterblue Smith .wl_rf_para_tx = rf_para_tx_8821a, 1182*32e284a2SBitterblue Smith .wl_rf_para_rx = rf_para_rx_8821a, 1183*32e284a2SBitterblue Smith .bt_afh_span_bw20 = 0x20, 1184*32e284a2SBitterblue Smith .bt_afh_span_bw40 = 0x30, 1185*32e284a2SBitterblue Smith .afh_5g_num = ARRAY_SIZE(afh_5g_8821a), 1186*32e284a2SBitterblue Smith .afh_5g = afh_5g_8821a, 1187*32e284a2SBitterblue Smith 1188*32e284a2SBitterblue Smith .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821a), 1189*32e284a2SBitterblue Smith .coex_info_hw_regs = coex_info_hw_regs_8821a, 1190*32e284a2SBitterblue Smith }; 1191*32e284a2SBitterblue Smith EXPORT_SYMBOL(rtw8821a_hw_spec); 1192*32e284a2SBitterblue Smith 1193*32e284a2SBitterblue Smith MODULE_FIRMWARE("rtw88/rtw8821a_fw.bin"); 1194*32e284a2SBitterblue Smith 1195*32e284a2SBitterblue Smith MODULE_AUTHOR("Realtek Corporation"); 1196*32e284a2SBitterblue Smith MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821a/8811a driver"); 1197*32e284a2SBitterblue Smith MODULE_LICENSE("Dual BSD/GPL"); 1198