0001
0002
0003
0004
0005 #include "main.h"
0006 #include "coex.h"
0007 #include "fw.h"
0008 #include "tx.h"
0009 #include "rx.h"
0010 #include "phy.h"
0011 #include "rtw8821c.h"
0012 #include "rtw8821c_table.h"
0013 #include "mac.h"
0014 #include "reg.h"
0015 #include "debug.h"
0016 #include "bf.h"
0017 #include "regd.h"
0018
0019 static const s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52};
0020 static const s8 lna_gain_table_1[16] = {10, 6, 2, -2, -6, -10, -14, -17,
0021 -20, -24, -28, -31, -34, -37, -40, -44};
0022
0023 static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse,
0024 struct rtw8821c_efuse *map)
0025 {
0026 ether_addr_copy(efuse->addr, map->e.mac_addr);
0027 }
0028
0029 enum rtw8821ce_rf_set {
0030 SWITCH_TO_BTG,
0031 SWITCH_TO_WLG,
0032 SWITCH_TO_WLA,
0033 SWITCH_TO_BT,
0034 };
0035
0036 static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
0037 {
0038 struct rtw_efuse *efuse = &rtwdev->efuse;
0039 struct rtw8821c_efuse *map;
0040 int i;
0041
0042 map = (struct rtw8821c_efuse *)log_map;
0043
0044 efuse->rfe_option = map->rfe_option;
0045 efuse->rf_board_option = map->rf_board_option;
0046 efuse->crystal_cap = map->xtal_k;
0047 efuse->pa_type_2g = map->pa_type;
0048 efuse->pa_type_5g = map->pa_type;
0049 efuse->lna_type_2g = map->lna_type_2g[0];
0050 efuse->lna_type_5g = map->lna_type_5g[0];
0051 efuse->channel_plan = map->channel_plan;
0052 efuse->country_code[0] = map->country_code[0];
0053 efuse->country_code[1] = map->country_code[1];
0054 efuse->bt_setting = map->rf_bt_setting;
0055 efuse->regd = map->rf_board_option & 0x7;
0056 efuse->thermal_meter[0] = map->thermal_meter;
0057 efuse->thermal_meter_k = map->thermal_meter;
0058 efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g;
0059 efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g;
0060
0061 for (i = 0; i < 4; i++)
0062 efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
0063
0064 if (rtwdev->efuse.rfe_option == 2 || rtwdev->efuse.rfe_option == 4)
0065 efuse->txpwr_idx_table[0].pwr_idx_2g = map->txpwr_idx_table[1].pwr_idx_2g;
0066
0067 switch (rtw_hci_type(rtwdev)) {
0068 case RTW_HCI_TYPE_PCIE:
0069 rtw8821ce_efuse_parsing(efuse, map);
0070 break;
0071 default:
0072
0073 return -ENOTSUPP;
0074 }
0075
0076 return 0;
0077 }
0078
0079 static const u32 rtw8821c_txscale_tbl[] = {
0080 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
0081 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
0082 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
0083 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
0084 };
0085
0086 static u8 rtw8821c_get_swing_index(struct rtw_dev *rtwdev)
0087 {
0088 u8 i = 0;
0089 u32 swing, table_value;
0090
0091 swing = rtw_read32_mask(rtwdev, REG_TXSCALE_A, 0xffe00000);
0092 for (i = 0; i < ARRAY_SIZE(rtw8821c_txscale_tbl); i++) {
0093 table_value = rtw8821c_txscale_tbl[i];
0094 if (swing == table_value)
0095 break;
0096 }
0097
0098 return i;
0099 }
0100
0101 static void rtw8821c_pwrtrack_init(struct rtw_dev *rtwdev)
0102 {
0103 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0104 u8 swing_idx = rtw8821c_get_swing_index(rtwdev);
0105
0106 if (swing_idx >= ARRAY_SIZE(rtw8821c_txscale_tbl))
0107 dm_info->default_ofdm_index = 24;
0108 else
0109 dm_info->default_ofdm_index = swing_idx;
0110
0111 ewma_thermal_init(&dm_info->avg_thermal[RF_PATH_A]);
0112 dm_info->delta_power_index[RF_PATH_A] = 0;
0113 dm_info->delta_power_index_last[RF_PATH_A] = 0;
0114 dm_info->pwr_trk_triggered = false;
0115 dm_info->pwr_trk_init_trigger = true;
0116 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
0117 }
0118
0119 static void rtw8821c_phy_bf_init(struct rtw_dev *rtwdev)
0120 {
0121 rtw_bf_phy_init(rtwdev);
0122
0123 rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF);
0124 }
0125
0126 static void rtw8821c_phy_set_param(struct rtw_dev *rtwdev)
0127 {
0128 struct rtw_hal *hal = &rtwdev->hal;
0129 u8 crystal_cap, val;
0130
0131
0132 val = rtw_read8(rtwdev, REG_SYS_FUNC_EN);
0133 val |= BIT_FEN_PCIEA;
0134 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val);
0135
0136
0137 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST;
0138 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val);
0139 val &= ~(BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
0140 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val);
0141 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST;
0142 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val);
0143
0144 rtw_write8(rtwdev, REG_RF_CTRL,
0145 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
0146 usleep_range(10, 11);
0147 rtw_write8(rtwdev, REG_WLRF1 + 3,
0148 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
0149 usleep_range(10, 11);
0150
0151
0152 rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
0153
0154 rtw_phy_load_tables(rtwdev);
0155
0156 crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
0157 rtw_write32_mask(rtwdev, REG_AFE_XTAL_CTRL, 0x7e000000, crystal_cap);
0158 rtw_write32_mask(rtwdev, REG_AFE_PLL_CTRL, 0x7e, crystal_cap);
0159 rtw_write32_mask(rtwdev, REG_CCK0_FAREPORT, BIT(18) | BIT(22), 0);
0160
0161
0162 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
0163 hal->ch_param[0] = rtw_read32_mask(rtwdev, REG_TXSF2, MASKDWORD);
0164 hal->ch_param[1] = rtw_read32_mask(rtwdev, REG_TXSF6, MASKDWORD);
0165 hal->ch_param[2] = rtw_read32_mask(rtwdev, REG_TXFILTER, MASKDWORD);
0166
0167 rtw_phy_init(rtwdev);
0168 rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
0169
0170 rtw8821c_pwrtrack_init(rtwdev);
0171
0172 rtw8821c_phy_bf_init(rtwdev);
0173 }
0174
0175 static int rtw8821c_mac_init(struct rtw_dev *rtwdev)
0176 {
0177 u32 value32;
0178 u16 pre_txcnt;
0179
0180
0181 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
0182 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
0183 pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT;
0184 rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF));
0185 rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8));
0186 value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
0187 (WLAN_MAX_AGG_PKT_LIMIT << 16) |
0188 (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
0189 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
0190 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
0191 WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
0192 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
0193 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
0194 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
0195 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
0196 rtw_write8_set(rtwdev, REG_INIRTS_RATE_SEL, BIT(5));
0197
0198
0199 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
0200 rtw_write16(rtwdev, REG_TXPAUSE, 0);
0201 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
0202 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
0203 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
0204 rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
0205 rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
0206 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
0207 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
0208
0209
0210 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
0211
0212
0213 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
0214 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
0215 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
0216 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
0217
0218
0219 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
0220 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
0221 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
0222 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
0223 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
0224 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
0225 rtw_write8(rtwdev, REG_ACKTO_CCK, 0x40);
0226 rtw_write8_set(rtwdev, REG_WMAC_TRXPTCL_CTL_H, BIT(1));
0227 rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
0228 BIT_DIS_CHK_VHTSIGB_CRC);
0229 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
0230 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
0231
0232 return 0;
0233 }
0234
0235 static void rtw8821c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
0236 {
0237 u8 ldo_pwr;
0238
0239 ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
0240 ldo_pwr = enable ? ldo_pwr | BIT(7) : ldo_pwr & ~BIT(7);
0241 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
0242 }
0243
0244 static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set)
0245 {
0246 u32 reg;
0247
0248 rtw_write32_set(rtwdev, REG_DMEM_CTRL, BIT_WL_RST);
0249 rtw_write32_set(rtwdev, REG_SYS_CTRL, BIT_FEN_EN);
0250
0251 reg = rtw_read32(rtwdev, REG_RFECTL);
0252 switch (rf_set) {
0253 case SWITCH_TO_BTG:
0254 reg |= B_BTG_SWITCH;
0255 reg &= ~(B_CTRL_SWITCH | B_WL_SWITCH | B_WLG_SWITCH |
0256 B_WLA_SWITCH);
0257 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, BTG_CCA);
0258 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, BTG_LNA);
0259 break;
0260 case SWITCH_TO_WLG:
0261 reg |= B_WL_SWITCH | B_WLG_SWITCH;
0262 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLA_SWITCH);
0263 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, WLG_CCA);
0264 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, WLG_LNA);
0265 break;
0266 case SWITCH_TO_WLA:
0267 reg |= B_WL_SWITCH | B_WLA_SWITCH;
0268 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLG_SWITCH);
0269 break;
0270 case SWITCH_TO_BT:
0271 default:
0272 break;
0273 }
0274
0275 rtw_write32(rtwdev, REG_RFECTL, reg);
0276 }
0277
0278 static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
0279 {
0280 u32 rf_reg18;
0281
0282 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
0283
0284 rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
0285 RF18_BW_MASK);
0286
0287 rf_reg18 |= (channel <= 14 ? RF18_BAND_2G : RF18_BAND_5G);
0288 rf_reg18 |= (channel & RF18_CHANNEL_MASK);
0289
0290 if (channel >= 100 && channel <= 140)
0291 rf_reg18 |= RF18_RFSI_GE;
0292 else if (channel > 140)
0293 rf_reg18 |= RF18_RFSI_GT;
0294
0295 switch (bw) {
0296 case RTW_CHANNEL_WIDTH_5:
0297 case RTW_CHANNEL_WIDTH_10:
0298 case RTW_CHANNEL_WIDTH_20:
0299 default:
0300 rf_reg18 |= RF18_BW_20M;
0301 break;
0302 case RTW_CHANNEL_WIDTH_40:
0303 rf_reg18 |= RF18_BW_40M;
0304 break;
0305 case RTW_CHANNEL_WIDTH_80:
0306 rf_reg18 |= RF18_BW_80M;
0307 break;
0308 }
0309
0310 if (channel <= 14) {
0311 if (rtwdev->efuse.rfe_option == 0)
0312 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLG);
0313 else if (rtwdev->efuse.rfe_option == 2 ||
0314 rtwdev->efuse.rfe_option == 4)
0315 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_BTG);
0316 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1);
0317 rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf);
0318 } else {
0319 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLA);
0320 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x0);
0321 }
0322
0323 rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18);
0324
0325 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0);
0326 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1);
0327 }
0328
0329 static void rtw8821c_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
0330 {
0331 if (bw == RTW_CHANNEL_WIDTH_40) {
0332
0333 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
0334 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
0335 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
0336 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0);
0337 } else if (bw == RTW_CHANNEL_WIDTH_80) {
0338
0339 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
0340 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1);
0341 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
0342 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x1);
0343 } else {
0344
0345 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
0346 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
0347 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1);
0348 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0);
0349 }
0350 }
0351
0352 static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
0353 u8 primary_ch_idx)
0354 {
0355 struct rtw_hal *hal = &rtwdev->hal;
0356 u32 val32;
0357
0358 if (channel <= 14) {
0359 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1);
0360 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0);
0361 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0);
0362 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
0363
0364 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x0);
0365 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
0366 if (channel == 14) {
0367 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
0368 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
0369 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667);
0370 } else {
0371 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD,
0372 hal->ch_param[0]);
0373 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD,
0374 hal->ch_param[1] & MASKLWORD);
0375 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD,
0376 hal->ch_param[2]);
0377 }
0378 } else if (channel > 35) {
0379 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
0380 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
0381 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
0382 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
0383
0384 if (channel >= 36 && channel <= 64)
0385 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x1);
0386 else if (channel >= 100 && channel <= 144)
0387 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x2);
0388 else if (channel >= 149)
0389 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x3);
0390
0391 if (channel >= 36 && channel <= 48)
0392 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
0393 else if (channel >= 52 && channel <= 64)
0394 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
0395 else if (channel >= 100 && channel <= 116)
0396 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
0397 else if (channel >= 118 && channel <= 177)
0398 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
0399 }
0400
0401 switch (bw) {
0402 case RTW_CHANNEL_WIDTH_20:
0403 default:
0404 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0405 val32 &= 0xffcffc00;
0406 val32 |= 0x10010000;
0407 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0408
0409 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0410 break;
0411 case RTW_CHANNEL_WIDTH_40:
0412 if (primary_ch_idx == 1)
0413 rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
0414 else
0415 rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
0416
0417 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0418 val32 &= 0xff3ff300;
0419 val32 |= 0x20020000 | ((primary_ch_idx & 0xf) << 2) |
0420 RTW_CHANNEL_WIDTH_40;
0421 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0422
0423 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0424 break;
0425 case RTW_CHANNEL_WIDTH_80:
0426 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0427 val32 &= 0xfcffcf00;
0428 val32 |= 0x40040000 | ((primary_ch_idx & 0xf) << 2) |
0429 RTW_CHANNEL_WIDTH_80;
0430 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0431
0432 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0433 break;
0434 case RTW_CHANNEL_WIDTH_5:
0435 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0436 val32 &= 0xefcefc00;
0437 val32 |= 0x200240;
0438 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0439
0440 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
0441 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
0442 break;
0443 case RTW_CHANNEL_WIDTH_10:
0444 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0445 val32 &= 0xefcefc00;
0446 val32 |= 0x300380;
0447 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0448
0449 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
0450 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
0451 break;
0452 }
0453 }
0454
0455 static u32 rtw8821c_get_bb_swing(struct rtw_dev *rtwdev, u8 channel)
0456 {
0457 struct rtw_efuse efuse = rtwdev->efuse;
0458 u8 tx_bb_swing;
0459 u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6};
0460
0461 tx_bb_swing = channel <= 14 ? efuse.tx_bb_swing_setting_2g :
0462 efuse.tx_bb_swing_setting_5g;
0463 if (tx_bb_swing > 9)
0464 tx_bb_swing = 0;
0465
0466 return swing2setting[(tx_bb_swing / 3)];
0467 }
0468
0469 static void rtw8821c_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 channel,
0470 u8 bw, u8 primary_ch_idx)
0471 {
0472 rtw_write32_mask(rtwdev, REG_TXSCALE_A, GENMASK(31, 21),
0473 rtw8821c_get_bb_swing(rtwdev, channel));
0474 rtw8821c_pwrtrack_init(rtwdev);
0475 }
0476
0477 static void rtw8821c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
0478 u8 primary_chan_idx)
0479 {
0480 rtw8821c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
0481 rtw8821c_set_channel_bb_swing(rtwdev, channel, bw, primary_chan_idx);
0482 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
0483 rtw8821c_set_channel_rf(rtwdev, channel, bw);
0484 rtw8821c_set_channel_rxdfir(rtwdev, bw);
0485 }
0486
0487 static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx)
0488 {
0489 struct rtw_efuse *efuse = &rtwdev->efuse;
0490 const s8 *lna_gain_table;
0491 int lna_gain_table_size;
0492 s8 rx_pwr_all = 0;
0493 s8 lna_gain = 0;
0494
0495 if (efuse->rfe_option == 0) {
0496 lna_gain_table = lna_gain_table_0;
0497 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_0);
0498 } else {
0499 lna_gain_table = lna_gain_table_1;
0500 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_1);
0501 }
0502
0503 if (lna_idx >= lna_gain_table_size) {
0504 rtw_warn(rtwdev, "incorrect lna index (%d)\n", lna_idx);
0505 return -120;
0506 }
0507
0508 lna_gain = lna_gain_table[lna_idx];
0509 rx_pwr_all = lna_gain - 2 * vga_idx;
0510
0511 return rx_pwr_all;
0512 }
0513
0514 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
0515 struct rtw_rx_pkt_stat *pkt_stat)
0516 {
0517 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0518 s8 rx_power;
0519 u8 lna_idx = 0;
0520 u8 vga_idx = 0;
0521
0522 vga_idx = GET_PHY_STAT_P0_VGA(phy_status);
0523 lna_idx = FIELD_PREP(BIT_LNA_H_MASK, GET_PHY_STAT_P0_LNA_H(phy_status)) |
0524 FIELD_PREP(BIT_LNA_L_MASK, GET_PHY_STAT_P0_LNA_L(phy_status));
0525 rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx);
0526
0527 pkt_stat->rx_power[RF_PATH_A] = rx_power;
0528 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
0529 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
0530 pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
0531 pkt_stat->signal_power = rx_power;
0532 }
0533
0534 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
0535 struct rtw_rx_pkt_stat *pkt_stat)
0536 {
0537 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0538 u8 rxsc, bw;
0539 s8 min_rx_power = -120;
0540
0541 if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
0542 rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
0543 else
0544 rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
0545
0546 if (rxsc >= 1 && rxsc <= 8)
0547 bw = RTW_CHANNEL_WIDTH_20;
0548 else if (rxsc >= 9 && rxsc <= 12)
0549 bw = RTW_CHANNEL_WIDTH_40;
0550 else if (rxsc >= 13)
0551 bw = RTW_CHANNEL_WIDTH_80;
0552 else
0553 bw = GET_PHY_STAT_P1_RF_MODE(phy_status);
0554
0555 pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
0556 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
0557 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
0558 pkt_stat->bw = bw;
0559 pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
0560 min_rx_power);
0561 }
0562
0563 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
0564 struct rtw_rx_pkt_stat *pkt_stat)
0565 {
0566 u8 page;
0567
0568 page = *phy_status & 0xf;
0569
0570 switch (page) {
0571 case 0:
0572 query_phy_status_page0(rtwdev, phy_status, pkt_stat);
0573 break;
0574 case 1:
0575 query_phy_status_page1(rtwdev, phy_status, pkt_stat);
0576 break;
0577 default:
0578 rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
0579 return;
0580 }
0581 }
0582
0583 static void rtw8821c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
0584 struct rtw_rx_pkt_stat *pkt_stat,
0585 struct ieee80211_rx_status *rx_status)
0586 {
0587 struct ieee80211_hdr *hdr;
0588 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
0589 u8 *phy_status = NULL;
0590
0591 memset(pkt_stat, 0, sizeof(*pkt_stat));
0592
0593 pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
0594 pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
0595 pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
0596 pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
0597 GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
0598 pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
0599 pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
0600 pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
0601 pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
0602 pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
0603 pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
0604 pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
0605 pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
0606
0607
0608 pkt_stat->drv_info_sz *= 8;
0609
0610
0611 if (pkt_stat->is_c2h)
0612 return;
0613
0614 hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
0615 pkt_stat->drv_info_sz);
0616 if (pkt_stat->phy_status) {
0617 phy_status = rx_desc + desc_sz + pkt_stat->shift;
0618 query_phy_status(rtwdev, phy_status, pkt_stat);
0619 }
0620
0621 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
0622 }
0623
0624 static void
0625 rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
0626 {
0627 struct rtw_hal *hal = &rtwdev->hal;
0628 static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
0629 static u32 phy_pwr_idx;
0630 u8 rate, rate_idx, pwr_index, shift;
0631 int j;
0632
0633 for (j = 0; j < rtw_rate_size[rs]; j++) {
0634 rate = rtw_rate_section[rs][j];
0635 pwr_index = hal->tx_pwr_tbl[path][rate];
0636 shift = rate & 0x3;
0637 phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
0638 if (shift == 0x3 || rate == DESC_RATEVHT1SS_MCS9) {
0639 rate_idx = rate & 0xfc;
0640 rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
0641 phy_pwr_idx);
0642 phy_pwr_idx = 0;
0643 }
0644 }
0645 }
0646
0647 static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev)
0648 {
0649 struct rtw_hal *hal = &rtwdev->hal;
0650 int rs, path;
0651
0652 for (path = 0; path < hal->rf_path_num; path++) {
0653 for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) {
0654 if (rs == RTW_RATE_SECTION_HT_2S ||
0655 rs == RTW_RATE_SECTION_VHT_2S)
0656 continue;
0657 rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs);
0658 }
0659 }
0660 }
0661
0662 static void rtw8821c_false_alarm_statistics(struct rtw_dev *rtwdev)
0663 {
0664 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0665 u32 cck_enable;
0666 u32 cck_fa_cnt;
0667 u32 ofdm_fa_cnt;
0668 u32 crc32_cnt;
0669 u32 cca32_cnt;
0670
0671 cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28);
0672 cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK);
0673 ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM);
0674
0675 dm_info->cck_fa_cnt = cck_fa_cnt;
0676 dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
0677 if (cck_enable)
0678 dm_info->total_fa_cnt += cck_fa_cnt;
0679 dm_info->total_fa_cnt = ofdm_fa_cnt;
0680
0681 crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK);
0682 dm_info->cck_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt);
0683 dm_info->cck_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt);
0684
0685 crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM);
0686 dm_info->ofdm_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt);
0687 dm_info->ofdm_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt);
0688
0689 crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT);
0690 dm_info->ht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt);
0691 dm_info->ht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt);
0692
0693 crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT);
0694 dm_info->vht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt);
0695 dm_info->vht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt);
0696
0697 cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM);
0698 dm_info->ofdm_cca_cnt = FIELD_GET(GENMASK(31, 16), cca32_cnt);
0699 dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
0700 if (cck_enable) {
0701 cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK);
0702 dm_info->cck_cca_cnt = FIELD_GET(GENMASK(15, 0), cca32_cnt);
0703 dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
0704 }
0705
0706 rtw_write32_set(rtwdev, REG_FAS, BIT(17));
0707 rtw_write32_clr(rtwdev, REG_FAS, BIT(17));
0708 rtw_write32_clr(rtwdev, REG_RXDESC, BIT(15));
0709 rtw_write32_set(rtwdev, REG_RXDESC, BIT(15));
0710 rtw_write32_set(rtwdev, REG_CNTRST, BIT(0));
0711 rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0));
0712 }
0713
0714 static void rtw8821c_do_iqk(struct rtw_dev *rtwdev)
0715 {
0716 static int do_iqk_cnt;
0717 struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
0718 u32 rf_reg, iqk_fail_mask;
0719 int counter;
0720 bool reload;
0721
0722 if (rtw_is_assoc(rtwdev))
0723 para.segment_iqk = 1;
0724
0725 rtw_fw_do_iqk(rtwdev, ¶);
0726
0727 for (counter = 0; counter < 300; counter++) {
0728 rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
0729 if (rf_reg == 0xabcde)
0730 break;
0731 msleep(20);
0732 }
0733 rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
0734
0735 reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
0736 iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
0737 rtw_dbg(rtwdev, RTW_DBG_PHY,
0738 "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
0739 counter, reload, ++do_iqk_cnt, iqk_fail_mask);
0740 }
0741
0742 static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev)
0743 {
0744 rtw8821c_do_iqk(rtwdev);
0745 }
0746
0747
0748 static void rtw8821c_coex_cfg_init(struct rtw_dev *rtwdev)
0749 {
0750
0751 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
0752
0753
0754 rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
0755
0756
0757 rtw_write8(rtwdev, REG_BT_STAT_CTRL, BT_CNT_ENABLE);
0758
0759
0760 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
0761 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
0762
0763
0764 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
0765
0766 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
0767
0768 rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
0769
0770
0771 rtw_write8_mask(rtwdev, REG_BT_COEX_TABLE_H + 3, BIT_BCN_QUEUE,
0772 BCN_PRI_EN);
0773 }
0774
0775 static void rtw8821c_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type,
0776 u8 pos_type)
0777 {
0778 struct rtw_coex *coex = &rtwdev->coex;
0779 struct rtw_coex_dm *coex_dm = &coex->dm;
0780 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
0781 u32 switch_status = FIELD_PREP(CTRL_TYPE_MASK, ctrl_type) | pos_type;
0782 bool polarity_inverse;
0783 u8 regval = 0;
0784
0785 if (switch_status == coex_dm->cur_switch_status)
0786 return;
0787
0788 if (coex_rfe->wlg_at_btg) {
0789 ctrl_type = COEX_SWITCH_CTRL_BY_BBSW;
0790
0791 if (coex_rfe->ant_switch_polarity)
0792 pos_type = COEX_SWITCH_TO_WLA;
0793 else
0794 pos_type = COEX_SWITCH_TO_WLG_BT;
0795 }
0796
0797 coex_dm->cur_switch_status = switch_status;
0798
0799 if (coex_rfe->ant_switch_diversity &&
0800 ctrl_type == COEX_SWITCH_CTRL_BY_BBSW)
0801 ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV;
0802
0803 polarity_inverse = (coex_rfe->ant_switch_polarity == 1);
0804
0805 switch (ctrl_type) {
0806 default:
0807 case COEX_SWITCH_CTRL_BY_BBSW:
0808 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0809 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
0810
0811 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89,
0812 DPDT_CTRL_PIN);
0813
0814 if (pos_type == COEX_SWITCH_TO_WLG_BT) {
0815 if (coex_rfe->rfe_module_type != 0x4 &&
0816 coex_rfe->rfe_module_type != 0x2)
0817 regval = 0x3;
0818 else
0819 regval = (!polarity_inverse ? 0x2 : 0x1);
0820 } else if (pos_type == COEX_SWITCH_TO_WLG) {
0821 regval = (!polarity_inverse ? 0x2 : 0x1);
0822 } else {
0823 regval = (!polarity_inverse ? 0x1 : 0x2);
0824 }
0825
0826 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15,
0827 regval);
0828 break;
0829 case COEX_SWITCH_CTRL_BY_PTA:
0830 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0831 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
0832
0833 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89,
0834 PTA_CTRL_PIN);
0835
0836 regval = (!polarity_inverse ? 0x2 : 0x1);
0837 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15,
0838 regval);
0839 break;
0840 case COEX_SWITCH_CTRL_BY_ANTDIV:
0841 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0842 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
0843 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89,
0844 ANTDIC_CTRL_PIN);
0845 break;
0846 case COEX_SWITCH_CTRL_BY_MAC:
0847 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0848
0849 regval = (!polarity_inverse ? 0x0 : 0x1);
0850 rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA,
0851 regval);
0852 break;
0853 case COEX_SWITCH_CTRL_BY_FW:
0854 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0855 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
0856 break;
0857 case COEX_SWITCH_CTRL_BY_BT:
0858 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN);
0859 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL);
0860 break;
0861 }
0862
0863 if (ctrl_type == COEX_SWITCH_CTRL_BY_BT) {
0864 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1);
0865 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2);
0866 } else {
0867 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1);
0868 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2);
0869 }
0870 }
0871
0872 static void rtw8821c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
0873 {}
0874
0875 static void rtw8821c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
0876 {
0877 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_SPI_EN);
0878 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_JTAG_EN);
0879 rtw_write32_clr(rtwdev, REG_GPIO_MUXCFG, BIT_FSPI_EN);
0880 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_LED1DIS);
0881 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_SDIO_INT);
0882 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_DBG_GNT_WL_BT);
0883 }
0884
0885 static void rtw8821c_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
0886 {
0887 struct rtw_coex *coex = &rtwdev->coex;
0888 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
0889 struct rtw_efuse *efuse = &rtwdev->efuse;
0890
0891 coex_rfe->rfe_module_type = efuse->rfe_option;
0892 coex_rfe->ant_switch_polarity = 0;
0893 coex_rfe->ant_switch_exist = true;
0894 coex_rfe->wlg_at_btg = false;
0895
0896 switch (coex_rfe->rfe_module_type) {
0897 case 0:
0898 case 8:
0899 case 1:
0900 case 9:
0901 default:
0902 break;
0903 case 2:
0904 case 10:
0905 case 7:
0906 case 15:
0907 coex_rfe->wlg_at_btg = true;
0908 break;
0909 case 3:
0910 case 11:
0911 coex_rfe->ant_switch_polarity = 1;
0912 break;
0913 case 4:
0914 case 12:
0915 coex_rfe->wlg_at_btg = true;
0916 coex_rfe->ant_switch_polarity = 1;
0917 break;
0918 case 5:
0919 case 13:
0920 case 6:
0921 case 14:
0922 coex_rfe->ant_switch_exist = false;
0923 break;
0924 }
0925 }
0926
0927 static void rtw8821c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
0928 {
0929 struct rtw_coex *coex = &rtwdev->coex;
0930 struct rtw_coex_dm *coex_dm = &coex->dm;
0931 struct rtw_efuse *efuse = &rtwdev->efuse;
0932 bool share_ant = efuse->share_ant;
0933
0934 if (share_ant)
0935 return;
0936
0937 if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
0938 return;
0939
0940 coex_dm->cur_wl_pwr_lvl = wl_pwr;
0941 }
0942
0943 static void rtw8821c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
0944 {}
0945
0946 static void
0947 rtw8821c_txagc_swing_offset(struct rtw_dev *rtwdev, u8 pwr_idx_offset,
0948 s8 pwr_idx_offset_lower,
0949 s8 *txagc_idx, u8 *swing_idx)
0950 {
0951 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0952 s8 delta_pwr_idx = dm_info->delta_power_index[RF_PATH_A];
0953 u8 swing_upper_bound = dm_info->default_ofdm_index + 10;
0954 u8 swing_lower_bound = 0;
0955 u8 max_pwr_idx_offset = 0xf;
0956 s8 agc_index = 0;
0957 u8 swing_index = dm_info->default_ofdm_index;
0958
0959 pwr_idx_offset = min_t(u8, pwr_idx_offset, max_pwr_idx_offset);
0960 pwr_idx_offset_lower = max_t(s8, pwr_idx_offset_lower, -15);
0961
0962 if (delta_pwr_idx >= 0) {
0963 if (delta_pwr_idx <= pwr_idx_offset) {
0964 agc_index = delta_pwr_idx;
0965 swing_index = dm_info->default_ofdm_index;
0966 } else if (delta_pwr_idx > pwr_idx_offset) {
0967 agc_index = pwr_idx_offset;
0968 swing_index = dm_info->default_ofdm_index +
0969 delta_pwr_idx - pwr_idx_offset;
0970 swing_index = min_t(u8, swing_index, swing_upper_bound);
0971 }
0972 } else if (delta_pwr_idx < 0) {
0973 if (delta_pwr_idx >= pwr_idx_offset_lower) {
0974 agc_index = delta_pwr_idx;
0975 swing_index = dm_info->default_ofdm_index;
0976 } else if (delta_pwr_idx < pwr_idx_offset_lower) {
0977 if (dm_info->default_ofdm_index >
0978 (pwr_idx_offset_lower - delta_pwr_idx))
0979 swing_index = dm_info->default_ofdm_index +
0980 delta_pwr_idx - pwr_idx_offset_lower;
0981 else
0982 swing_index = swing_lower_bound;
0983
0984 agc_index = pwr_idx_offset_lower;
0985 }
0986 }
0987
0988 if (swing_index >= ARRAY_SIZE(rtw8821c_txscale_tbl)) {
0989 rtw_warn(rtwdev, "swing index overflow\n");
0990 swing_index = ARRAY_SIZE(rtw8821c_txscale_tbl) - 1;
0991 }
0992
0993 *txagc_idx = agc_index;
0994 *swing_idx = swing_index;
0995 }
0996
0997 static void rtw8821c_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 pwr_idx_offset,
0998 s8 pwr_idx_offset_lower)
0999 {
1000 s8 txagc_idx;
1001 u8 swing_idx;
1002
1003 rtw8821c_txagc_swing_offset(rtwdev, pwr_idx_offset, pwr_idx_offset_lower,
1004 &txagc_idx, &swing_idx);
1005 rtw_write32_mask(rtwdev, REG_TXAGCIDX, GENMASK(6, 1), txagc_idx);
1006 rtw_write32_mask(rtwdev, REG_TXSCALE_A, GENMASK(31, 21),
1007 rtw8821c_txscale_tbl[swing_idx]);
1008 }
1009
1010 static void rtw8821c_pwrtrack_set(struct rtw_dev *rtwdev)
1011 {
1012 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1013 u8 pwr_idx_offset, tx_pwr_idx;
1014 s8 pwr_idx_offset_lower;
1015 u8 channel = rtwdev->hal.current_channel;
1016 u8 band_width = rtwdev->hal.current_band_width;
1017 u8 regd = rtw_regd_get(rtwdev);
1018 u8 tx_rate = dm_info->tx_rate;
1019 u8 max_pwr_idx = rtwdev->chip->max_power_index;
1020
1021 tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, RF_PATH_A, tx_rate,
1022 band_width, channel, regd);
1023
1024 tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx);
1025
1026 pwr_idx_offset = max_pwr_idx - tx_pwr_idx;
1027 pwr_idx_offset_lower = 0 - tx_pwr_idx;
1028
1029 rtw8821c_pwrtrack_set_pwr(rtwdev, pwr_idx_offset, pwr_idx_offset_lower);
1030 }
1031
1032 static void rtw8821c_phy_pwrtrack(struct rtw_dev *rtwdev)
1033 {
1034 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1035 struct rtw_swing_table swing_table;
1036 u8 thermal_value, delta;
1037
1038 rtw_phy_config_swing_table(rtwdev, &swing_table);
1039
1040 if (rtwdev->efuse.thermal_meter[0] == 0xff)
1041 return;
1042
1043 thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1044
1045 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1046
1047 if (dm_info->pwr_trk_init_trigger)
1048 dm_info->pwr_trk_init_trigger = false;
1049 else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1050 RF_PATH_A))
1051 goto iqk;
1052
1053 delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1054
1055 delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
1056
1057 dm_info->delta_power_index[RF_PATH_A] =
1058 rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table, RF_PATH_A,
1059 RF_PATH_A, delta);
1060 if (dm_info->delta_power_index[RF_PATH_A] ==
1061 dm_info->delta_power_index_last[RF_PATH_A])
1062 goto iqk;
1063 else
1064 dm_info->delta_power_index_last[RF_PATH_A] =
1065 dm_info->delta_power_index[RF_PATH_A];
1066 rtw8821c_pwrtrack_set(rtwdev);
1067
1068 iqk:
1069 if (rtw_phy_pwrtrack_need_iqk(rtwdev))
1070 rtw8821c_do_iqk(rtwdev);
1071 }
1072
1073 static void rtw8821c_pwr_track(struct rtw_dev *rtwdev)
1074 {
1075 struct rtw_efuse *efuse = &rtwdev->efuse;
1076 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1077
1078 if (efuse->power_track_type != 0)
1079 return;
1080
1081 if (!dm_info->pwr_trk_triggered) {
1082 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1083 GENMASK(17, 16), 0x03);
1084 dm_info->pwr_trk_triggered = true;
1085 return;
1086 }
1087
1088 rtw8821c_phy_pwrtrack(rtwdev);
1089 dm_info->pwr_trk_triggered = false;
1090 }
1091
1092 static void rtw8821c_bf_config_bfee_su(struct rtw_dev *rtwdev,
1093 struct rtw_vif *vif,
1094 struct rtw_bfee *bfee, bool enable)
1095 {
1096 if (enable)
1097 rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
1098 else
1099 rtw_bf_remove_bfee_su(rtwdev, bfee);
1100 }
1101
1102 static void rtw8821c_bf_config_bfee_mu(struct rtw_dev *rtwdev,
1103 struct rtw_vif *vif,
1104 struct rtw_bfee *bfee, bool enable)
1105 {
1106 if (enable)
1107 rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
1108 else
1109 rtw_bf_remove_bfee_mu(rtwdev, bfee);
1110 }
1111
1112 static void rtw8821c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
1113 struct rtw_bfee *bfee, bool enable)
1114 {
1115 if (bfee->role == RTW_BFEE_SU)
1116 rtw8821c_bf_config_bfee_su(rtwdev, vif, bfee, enable);
1117 else if (bfee->role == RTW_BFEE_MU)
1118 rtw8821c_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
1119 else
1120 rtw_warn(rtwdev, "wrong bfee role\n");
1121 }
1122
1123 static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
1124 {
1125 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1126 u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
1127 u8 cck_n_rx;
1128
1129 rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
1130 dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
1131
1132 if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
1133 return;
1134
1135 cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
1136 rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
1137 rtw_dbg(rtwdev, RTW_DBG_PHY,
1138 "is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
1139 rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
1140 dm_info->cck_pd_default + new_lvl * 2,
1141 pd[new_lvl], dm_info->cck_fa_avg);
1142
1143 dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
1144
1145 dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
1146 rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
1147 rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
1148 dm_info->cck_pd_default + new_lvl * 2);
1149 }
1150
1151 static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
1152 {0x0086,
1153 RTW_PWR_CUT_ALL_MSK,
1154 RTW_PWR_INTF_SDIO_MSK,
1155 RTW_PWR_ADDR_SDIO,
1156 RTW_PWR_CMD_WRITE, BIT(0), 0},
1157 {0x0086,
1158 RTW_PWR_CUT_ALL_MSK,
1159 RTW_PWR_INTF_SDIO_MSK,
1160 RTW_PWR_ADDR_SDIO,
1161 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1162 {0x004A,
1163 RTW_PWR_CUT_ALL_MSK,
1164 RTW_PWR_INTF_USB_MSK,
1165 RTW_PWR_ADDR_MAC,
1166 RTW_PWR_CMD_WRITE, BIT(0), 0},
1167 {0x0005,
1168 RTW_PWR_CUT_ALL_MSK,
1169 RTW_PWR_INTF_ALL_MSK,
1170 RTW_PWR_ADDR_MAC,
1171 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
1172 {0x0300,
1173 RTW_PWR_CUT_ALL_MSK,
1174 RTW_PWR_INTF_PCI_MSK,
1175 RTW_PWR_ADDR_MAC,
1176 RTW_PWR_CMD_WRITE, 0xFF, 0},
1177 {0x0301,
1178 RTW_PWR_CUT_ALL_MSK,
1179 RTW_PWR_INTF_PCI_MSK,
1180 RTW_PWR_ADDR_MAC,
1181 RTW_PWR_CMD_WRITE, 0xFF, 0},
1182 {0xFFFF,
1183 RTW_PWR_CUT_ALL_MSK,
1184 RTW_PWR_INTF_ALL_MSK,
1185 0,
1186 RTW_PWR_CMD_END, 0, 0},
1187 };
1188
1189 static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
1190 {0x0020,
1191 RTW_PWR_CUT_ALL_MSK,
1192 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1193 RTW_PWR_ADDR_MAC,
1194 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1195 {0x0001,
1196 RTW_PWR_CUT_ALL_MSK,
1197 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1198 RTW_PWR_ADDR_MAC,
1199 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
1200 {0x0000,
1201 RTW_PWR_CUT_ALL_MSK,
1202 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1203 RTW_PWR_ADDR_MAC,
1204 RTW_PWR_CMD_WRITE, BIT(5), 0},
1205 {0x0005,
1206 RTW_PWR_CUT_ALL_MSK,
1207 RTW_PWR_INTF_ALL_MSK,
1208 RTW_PWR_ADDR_MAC,
1209 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
1210 {0x0075,
1211 RTW_PWR_CUT_ALL_MSK,
1212 RTW_PWR_INTF_PCI_MSK,
1213 RTW_PWR_ADDR_MAC,
1214 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1215 {0x0006,
1216 RTW_PWR_CUT_ALL_MSK,
1217 RTW_PWR_INTF_ALL_MSK,
1218 RTW_PWR_ADDR_MAC,
1219 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1220 {0x0075,
1221 RTW_PWR_CUT_ALL_MSK,
1222 RTW_PWR_INTF_PCI_MSK,
1223 RTW_PWR_ADDR_MAC,
1224 RTW_PWR_CMD_WRITE, BIT(0), 0},
1225 {0x0006,
1226 RTW_PWR_CUT_ALL_MSK,
1227 RTW_PWR_INTF_ALL_MSK,
1228 RTW_PWR_ADDR_MAC,
1229 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1230 {0x0005,
1231 RTW_PWR_CUT_ALL_MSK,
1232 RTW_PWR_INTF_ALL_MSK,
1233 RTW_PWR_ADDR_MAC,
1234 RTW_PWR_CMD_WRITE, BIT(7), 0},
1235 {0x0005,
1236 RTW_PWR_CUT_ALL_MSK,
1237 RTW_PWR_INTF_ALL_MSK,
1238 RTW_PWR_ADDR_MAC,
1239 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
1240 {0x10C3,
1241 RTW_PWR_CUT_ALL_MSK,
1242 RTW_PWR_INTF_USB_MSK,
1243 RTW_PWR_ADDR_MAC,
1244 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1245 {0x0005,
1246 RTW_PWR_CUT_ALL_MSK,
1247 RTW_PWR_INTF_ALL_MSK,
1248 RTW_PWR_ADDR_MAC,
1249 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1250 {0x0005,
1251 RTW_PWR_CUT_ALL_MSK,
1252 RTW_PWR_INTF_ALL_MSK,
1253 RTW_PWR_ADDR_MAC,
1254 RTW_PWR_CMD_POLLING, BIT(0), 0},
1255 {0x0020,
1256 RTW_PWR_CUT_ALL_MSK,
1257 RTW_PWR_INTF_ALL_MSK,
1258 RTW_PWR_ADDR_MAC,
1259 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
1260 {0x0074,
1261 RTW_PWR_CUT_ALL_MSK,
1262 RTW_PWR_INTF_PCI_MSK,
1263 RTW_PWR_ADDR_MAC,
1264 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1265 {0x0022,
1266 RTW_PWR_CUT_ALL_MSK,
1267 RTW_PWR_INTF_PCI_MSK,
1268 RTW_PWR_ADDR_MAC,
1269 RTW_PWR_CMD_WRITE, BIT(1), 0},
1270 {0x0062,
1271 RTW_PWR_CUT_ALL_MSK,
1272 RTW_PWR_INTF_PCI_MSK,
1273 RTW_PWR_ADDR_MAC,
1274 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)),
1275 (BIT(7) | BIT(6) | BIT(5))},
1276 {0x0061,
1277 RTW_PWR_CUT_ALL_MSK,
1278 RTW_PWR_INTF_PCI_MSK,
1279 RTW_PWR_ADDR_MAC,
1280 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)), 0},
1281 {0x007C,
1282 RTW_PWR_CUT_ALL_MSK,
1283 RTW_PWR_INTF_ALL_MSK,
1284 RTW_PWR_ADDR_MAC,
1285 RTW_PWR_CMD_WRITE, BIT(1), 0},
1286 {0xFFFF,
1287 RTW_PWR_CUT_ALL_MSK,
1288 RTW_PWR_INTF_ALL_MSK,
1289 0,
1290 RTW_PWR_CMD_END, 0, 0},
1291 };
1292
1293 static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
1294 {0x0093,
1295 RTW_PWR_CUT_ALL_MSK,
1296 RTW_PWR_INTF_ALL_MSK,
1297 RTW_PWR_ADDR_MAC,
1298 RTW_PWR_CMD_WRITE, BIT(3), 0},
1299 {0x001F,
1300 RTW_PWR_CUT_ALL_MSK,
1301 RTW_PWR_INTF_ALL_MSK,
1302 RTW_PWR_ADDR_MAC,
1303 RTW_PWR_CMD_WRITE, 0xFF, 0},
1304 {0x0049,
1305 RTW_PWR_CUT_ALL_MSK,
1306 RTW_PWR_INTF_ALL_MSK,
1307 RTW_PWR_ADDR_MAC,
1308 RTW_PWR_CMD_WRITE, BIT(1), 0},
1309 {0x0006,
1310 RTW_PWR_CUT_ALL_MSK,
1311 RTW_PWR_INTF_ALL_MSK,
1312 RTW_PWR_ADDR_MAC,
1313 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1314 {0x0002,
1315 RTW_PWR_CUT_ALL_MSK,
1316 RTW_PWR_INTF_ALL_MSK,
1317 RTW_PWR_ADDR_MAC,
1318 RTW_PWR_CMD_WRITE, BIT(1), 0},
1319 {0x10C3,
1320 RTW_PWR_CUT_ALL_MSK,
1321 RTW_PWR_INTF_USB_MSK,
1322 RTW_PWR_ADDR_MAC,
1323 RTW_PWR_CMD_WRITE, BIT(0), 0},
1324 {0x0005,
1325 RTW_PWR_CUT_ALL_MSK,
1326 RTW_PWR_INTF_ALL_MSK,
1327 RTW_PWR_ADDR_MAC,
1328 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1329 {0x0005,
1330 RTW_PWR_CUT_ALL_MSK,
1331 RTW_PWR_INTF_ALL_MSK,
1332 RTW_PWR_ADDR_MAC,
1333 RTW_PWR_CMD_POLLING, BIT(1), 0},
1334 {0x0020,
1335 RTW_PWR_CUT_ALL_MSK,
1336 RTW_PWR_INTF_ALL_MSK,
1337 RTW_PWR_ADDR_MAC,
1338 RTW_PWR_CMD_WRITE, BIT(3), 0},
1339 {0x0000,
1340 RTW_PWR_CUT_ALL_MSK,
1341 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1342 RTW_PWR_ADDR_MAC,
1343 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1344 {0xFFFF,
1345 RTW_PWR_CUT_ALL_MSK,
1346 RTW_PWR_INTF_ALL_MSK,
1347 0,
1348 RTW_PWR_CMD_END, 0, 0},
1349 };
1350
1351 static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
1352 {0x0007,
1353 RTW_PWR_CUT_ALL_MSK,
1354 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1355 RTW_PWR_ADDR_MAC,
1356 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
1357 {0x0067,
1358 RTW_PWR_CUT_ALL_MSK,
1359 RTW_PWR_INTF_ALL_MSK,
1360 RTW_PWR_ADDR_MAC,
1361 RTW_PWR_CMD_WRITE, BIT(5), 0},
1362 {0x0005,
1363 RTW_PWR_CUT_ALL_MSK,
1364 RTW_PWR_INTF_PCI_MSK,
1365 RTW_PWR_ADDR_MAC,
1366 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
1367 {0x004A,
1368 RTW_PWR_CUT_ALL_MSK,
1369 RTW_PWR_INTF_USB_MSK,
1370 RTW_PWR_ADDR_MAC,
1371 RTW_PWR_CMD_WRITE, BIT(0), 0},
1372 {0x0067,
1373 RTW_PWR_CUT_ALL_MSK,
1374 RTW_PWR_INTF_SDIO_MSK,
1375 RTW_PWR_ADDR_MAC,
1376 RTW_PWR_CMD_WRITE, BIT(5), 0},
1377 {0x0067,
1378 RTW_PWR_CUT_ALL_MSK,
1379 RTW_PWR_INTF_SDIO_MSK,
1380 RTW_PWR_ADDR_MAC,
1381 RTW_PWR_CMD_WRITE, BIT(4), 0},
1382 {0x004F,
1383 RTW_PWR_CUT_ALL_MSK,
1384 RTW_PWR_INTF_SDIO_MSK,
1385 RTW_PWR_ADDR_MAC,
1386 RTW_PWR_CMD_WRITE, BIT(0), 0},
1387 {0x0067,
1388 RTW_PWR_CUT_ALL_MSK,
1389 RTW_PWR_INTF_SDIO_MSK,
1390 RTW_PWR_ADDR_MAC,
1391 RTW_PWR_CMD_WRITE, BIT(1), 0},
1392 {0x0046,
1393 RTW_PWR_CUT_ALL_MSK,
1394 RTW_PWR_INTF_SDIO_MSK,
1395 RTW_PWR_ADDR_MAC,
1396 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1397 {0x0067,
1398 RTW_PWR_CUT_ALL_MSK,
1399 RTW_PWR_INTF_SDIO_MSK,
1400 RTW_PWR_ADDR_MAC,
1401 RTW_PWR_CMD_WRITE, BIT(2), 0},
1402 {0x0046,
1403 RTW_PWR_CUT_ALL_MSK,
1404 RTW_PWR_INTF_SDIO_MSK,
1405 RTW_PWR_ADDR_MAC,
1406 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1407 {0x0062,
1408 RTW_PWR_CUT_ALL_MSK,
1409 RTW_PWR_INTF_SDIO_MSK,
1410 RTW_PWR_ADDR_MAC,
1411 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1412 {0x0081,
1413 RTW_PWR_CUT_ALL_MSK,
1414 RTW_PWR_INTF_ALL_MSK,
1415 RTW_PWR_ADDR_MAC,
1416 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
1417 {0x0005,
1418 RTW_PWR_CUT_ALL_MSK,
1419 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1420 RTW_PWR_ADDR_MAC,
1421 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
1422 {0x0086,
1423 RTW_PWR_CUT_ALL_MSK,
1424 RTW_PWR_INTF_SDIO_MSK,
1425 RTW_PWR_ADDR_SDIO,
1426 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1427 {0x0086,
1428 RTW_PWR_CUT_ALL_MSK,
1429 RTW_PWR_INTF_SDIO_MSK,
1430 RTW_PWR_ADDR_SDIO,
1431 RTW_PWR_CMD_POLLING, BIT(1), 0},
1432 {0x0090,
1433 RTW_PWR_CUT_ALL_MSK,
1434 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK,
1435 RTW_PWR_ADDR_MAC,
1436 RTW_PWR_CMD_WRITE, BIT(1), 0},
1437 {0x0044,
1438 RTW_PWR_CUT_ALL_MSK,
1439 RTW_PWR_INTF_SDIO_MSK,
1440 RTW_PWR_ADDR_SDIO,
1441 RTW_PWR_CMD_WRITE, 0xFF, 0},
1442 {0x0040,
1443 RTW_PWR_CUT_ALL_MSK,
1444 RTW_PWR_INTF_SDIO_MSK,
1445 RTW_PWR_ADDR_SDIO,
1446 RTW_PWR_CMD_WRITE, 0xFF, 0x90},
1447 {0x0041,
1448 RTW_PWR_CUT_ALL_MSK,
1449 RTW_PWR_INTF_SDIO_MSK,
1450 RTW_PWR_ADDR_SDIO,
1451 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1452 {0x0042,
1453 RTW_PWR_CUT_ALL_MSK,
1454 RTW_PWR_INTF_SDIO_MSK,
1455 RTW_PWR_ADDR_SDIO,
1456 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
1457 {0xFFFF,
1458 RTW_PWR_CUT_ALL_MSK,
1459 RTW_PWR_INTF_ALL_MSK,
1460 0,
1461 RTW_PWR_CMD_END, 0, 0},
1462 };
1463
1464 static const struct rtw_pwr_seq_cmd *card_enable_flow_8821c[] = {
1465 trans_carddis_to_cardemu_8821c,
1466 trans_cardemu_to_act_8821c,
1467 NULL
1468 };
1469
1470 static const struct rtw_pwr_seq_cmd *card_disable_flow_8821c[] = {
1471 trans_act_to_cardemu_8821c,
1472 trans_cardemu_to_carddis_8821c,
1473 NULL
1474 };
1475
1476 static const struct rtw_intf_phy_para usb2_param_8821c[] = {
1477 {0xFFFF, 0x00,
1478 RTW_IP_SEL_PHY,
1479 RTW_INTF_PHY_CUT_ALL,
1480 RTW_INTF_PHY_PLATFORM_ALL},
1481 };
1482
1483 static const struct rtw_intf_phy_para usb3_param_8821c[] = {
1484 {0xFFFF, 0x0000,
1485 RTW_IP_SEL_PHY,
1486 RTW_INTF_PHY_CUT_ALL,
1487 RTW_INTF_PHY_PLATFORM_ALL},
1488 };
1489
1490 static const struct rtw_intf_phy_para pcie_gen1_param_8821c[] = {
1491 {0x0009, 0x6380,
1492 RTW_IP_SEL_PHY,
1493 RTW_INTF_PHY_CUT_ALL,
1494 RTW_INTF_PHY_PLATFORM_ALL},
1495 {0xFFFF, 0x0000,
1496 RTW_IP_SEL_PHY,
1497 RTW_INTF_PHY_CUT_ALL,
1498 RTW_INTF_PHY_PLATFORM_ALL},
1499 };
1500
1501 static const struct rtw_intf_phy_para pcie_gen2_param_8821c[] = {
1502 {0xFFFF, 0x0000,
1503 RTW_IP_SEL_PHY,
1504 RTW_INTF_PHY_CUT_ALL,
1505 RTW_INTF_PHY_PLATFORM_ALL},
1506 };
1507
1508 static const struct rtw_intf_phy_para_table phy_para_table_8821c = {
1509 .usb2_para = usb2_param_8821c,
1510 .usb3_para = usb3_param_8821c,
1511 .gen1_para = pcie_gen1_param_8821c,
1512 .gen2_para = pcie_gen2_param_8821c,
1513 .n_usb2_para = ARRAY_SIZE(usb2_param_8821c),
1514 .n_usb3_para = ARRAY_SIZE(usb2_param_8821c),
1515 .n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8821c),
1516 .n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8821c),
1517 };
1518
1519 static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
1520 [0] = RTW_DEF_RFE(8821c, 0, 0),
1521 [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
1522 [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
1523 [6] = RTW_DEF_RFE(8821c, 0, 0),
1524 };
1525
1526 static struct rtw_hw_reg rtw8821c_dig[] = {
1527 [0] = { .addr = 0xc50, .mask = 0x7f },
1528 };
1529
1530 static const struct rtw_ltecoex_addr rtw8821c_ltecoex_addr = {
1531 .ctrl = LTECOEX_ACCESS_CTRL,
1532 .wdata = LTECOEX_WRITE_DATA,
1533 .rdata = LTECOEX_READ_DATA,
1534 };
1535
1536 static struct rtw_page_table page_table_8821c[] = {
1537
1538 {16, 16, 16, 14, 1},
1539 {16, 16, 16, 14, 1},
1540 {16, 16, 0, 0, 1},
1541 {16, 16, 16, 0, 1},
1542 {16, 16, 16, 14, 1},
1543 };
1544
1545 static struct rtw_rqpn rqpn_table_8821c[] = {
1546
1547 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1548 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1549 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1550 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1551 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1552 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1553 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1554 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
1555 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
1556 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1557 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1558 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
1559 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
1560 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
1561 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
1562 };
1563
1564 static struct rtw_prioq_addrs prioq_addrs_8821c = {
1565 .prio[RTW_DMA_MAPPING_EXTRA] = {
1566 .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
1567 },
1568 .prio[RTW_DMA_MAPPING_LOW] = {
1569 .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
1570 },
1571 .prio[RTW_DMA_MAPPING_NORMAL] = {
1572 .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
1573 },
1574 .prio[RTW_DMA_MAPPING_HIGH] = {
1575 .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
1576 },
1577 .wsize = true,
1578 };
1579
1580 static struct rtw_chip_ops rtw8821c_ops = {
1581 .phy_set_param = rtw8821c_phy_set_param,
1582 .read_efuse = rtw8821c_read_efuse,
1583 .query_rx_desc = rtw8821c_query_rx_desc,
1584 .set_channel = rtw8821c_set_channel,
1585 .mac_init = rtw8821c_mac_init,
1586 .read_rf = rtw_phy_read_rf,
1587 .write_rf = rtw_phy_write_rf_reg_sipi,
1588 .set_antenna = NULL,
1589 .set_tx_power_index = rtw8821c_set_tx_power_index,
1590 .cfg_ldo25 = rtw8821c_cfg_ldo25,
1591 .false_alarm_statistics = rtw8821c_false_alarm_statistics,
1592 .phy_calibration = rtw8821c_phy_calibration,
1593 .cck_pd_set = rtw8821c_phy_cck_pd_set,
1594 .pwr_track = rtw8821c_pwr_track,
1595 .config_bfee = rtw8821c_bf_config_bfee,
1596 .set_gid_table = rtw_bf_set_gid_table,
1597 .cfg_csi_rate = rtw_bf_cfg_csi_rate,
1598
1599 .coex_set_init = rtw8821c_coex_cfg_init,
1600 .coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch,
1601 .coex_set_gnt_fix = rtw8821c_coex_cfg_gnt_fix,
1602 .coex_set_gnt_debug = rtw8821c_coex_cfg_gnt_debug,
1603 .coex_set_rfe_type = rtw8821c_coex_cfg_rfe_type,
1604 .coex_set_wl_tx_power = rtw8821c_coex_cfg_wl_tx_power,
1605 .coex_set_wl_rx_gain = rtw8821c_coex_cfg_wl_rx_gain,
1606 };
1607
1608
1609 static const u8 wl_rssi_step_8821c[] = {101, 45, 101, 40};
1610 static const u8 bt_rssi_step_8821c[] = {101, 101, 101, 101};
1611
1612
1613 static const struct coex_table_para table_sant_8821c[] = {
1614 {0x55555555, 0x55555555},
1615 {0x55555555, 0x55555555},
1616 {0x66555555, 0x66555555},
1617 {0xaaaaaaaa, 0xaaaaaaaa},
1618 {0x5a5a5a5a, 0x5a5a5a5a},
1619 {0xfafafafa, 0xfafafafa},
1620 {0x6a5a5555, 0xaaaaaaaa},
1621 {0x6a5a56aa, 0x6a5a56aa},
1622 {0x6a5a5a5a, 0x6a5a5a5a},
1623 {0x66555555, 0x5a5a5a5a},
1624 {0x66555555, 0x6a5a5a5a},
1625 {0x66555555, 0xaaaaaaaa},
1626 {0x66555555, 0x6a5a5aaa},
1627 {0x66555555, 0x6aaa6aaa},
1628 {0x66555555, 0x6a5a5aaa},
1629 {0x66555555, 0xaaaaaaaa},
1630 {0xffff55ff, 0xfafafafa},
1631 {0xffff55ff, 0x6afa5afa},
1632 {0xaaffffaa, 0xfafafafa},
1633 {0xaa5555aa, 0x5a5a5a5a},
1634 {0xaa5555aa, 0x6a5a5a5a},
1635 {0xaa5555aa, 0xaaaaaaaa},
1636 {0xffffffff, 0x55555555},
1637 {0xffffffff, 0x5a5a5a5a},
1638 {0xffffffff, 0x5a5a5a5a},
1639 {0xffffffff, 0x5a5a5aaa},
1640 {0x55555555, 0x5a5a5a5a},
1641 {0x55555555, 0xaaaaaaaa},
1642 {0x66555555, 0x6a5a6a5a},
1643 {0x66556655, 0x66556655},
1644 {0x66556aaa, 0x6a5a6aaa},
1645 {0xffffffff, 0x5aaa5aaa},
1646 {0x56555555, 0x5a5a5aaa}
1647 };
1648
1649
1650 static const struct coex_table_para table_nsant_8821c[] = {
1651 {0xffffffff, 0xffffffff},
1652 {0xffff55ff, 0xfafafafa},
1653 {0x66555555, 0x66555555},
1654 {0xaaaaaaaa, 0xaaaaaaaa},
1655 {0x5a5a5a5a, 0x5a5a5a5a},
1656 {0xffffffff, 0xffffffff},
1657 {0x5afa5afa, 0x5afa5afa},
1658 {0x55555555, 0xfafafafa},
1659 {0x66555555, 0xfafafafa},
1660 {0x66555555, 0x5a5a5a5a},
1661 {0x66555555, 0x6a5a5a5a},
1662 {0x66555555, 0xaaaaaaaa},
1663 {0xffff55ff, 0xfafafafa},
1664 {0xffff55ff, 0x5afa5afa},
1665 {0xffff55ff, 0xaaaaaaaa},
1666 {0xffff55ff, 0xffff55ff},
1667 {0xaaffffaa, 0x5afa5afa},
1668 {0xaaffffaa, 0xaaaaaaaa},
1669 {0xffffffff, 0xfafafafa},
1670 {0xffff55ff, 0xfafafafa},
1671 {0xffffffff, 0xaaaaaaaa},
1672 {0xffff55ff, 0x5afa5afa},
1673 {0xffff55ff, 0x5afa5afa},
1674 {0x55ff55ff, 0x55ff55ff}
1675 };
1676
1677
1678 static const struct coex_tdma_para tdma_sant_8821c[] = {
1679 { {0x00, 0x00, 0x00, 0x00, 0x00} },
1680 { {0x61, 0x45, 0x03, 0x11, 0x11} },
1681 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
1682 { {0x61, 0x35, 0x03, 0x11, 0x11} },
1683 { {0x61, 0x20, 0x03, 0x11, 0x11} },
1684 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
1685 { {0x61, 0x45, 0x03, 0x11, 0x10} },
1686 { {0x61, 0x35, 0x03, 0x11, 0x10} },
1687 { {0x61, 0x30, 0x03, 0x11, 0x10} },
1688 { {0x61, 0x20, 0x03, 0x11, 0x10} },
1689 { {0x61, 0x10, 0x03, 0x11, 0x10} },
1690 { {0x61, 0x08, 0x03, 0x11, 0x15} },
1691 { {0x61, 0x08, 0x03, 0x10, 0x14} },
1692 { {0x51, 0x08, 0x03, 0x10, 0x54} },
1693 { {0x51, 0x08, 0x03, 0x10, 0x55} },
1694 { {0x51, 0x08, 0x07, 0x10, 0x54} },
1695 { {0x51, 0x45, 0x03, 0x10, 0x50} },
1696 { {0x51, 0x3a, 0x03, 0x11, 0x50} },
1697 { {0x51, 0x30, 0x03, 0x10, 0x50} },
1698 { {0x51, 0x21, 0x03, 0x10, 0x50} },
1699 { {0x51, 0x10, 0x03, 0x10, 0x50} },
1700 { {0x51, 0x4a, 0x03, 0x10, 0x50} },
1701 { {0x51, 0x08, 0x03, 0x30, 0x54} },
1702 { {0x55, 0x08, 0x03, 0x10, 0x54} },
1703 { {0x65, 0x10, 0x03, 0x11, 0x10} },
1704 { {0x51, 0x10, 0x03, 0x10, 0x51} },
1705 { {0x51, 0x21, 0x03, 0x10, 0x50} },
1706 { {0x61, 0x08, 0x03, 0x11, 0x11} }
1707 };
1708
1709
1710 static const struct coex_tdma_para tdma_nsant_8821c[] = {
1711 { {0x00, 0x00, 0x00, 0x40, 0x00} },
1712 { {0x61, 0x45, 0x03, 0x11, 0x11} },
1713 { {0x61, 0x25, 0x03, 0x11, 0x11} },
1714 { {0x61, 0x35, 0x03, 0x11, 0x11} },
1715 { {0x61, 0x20, 0x03, 0x11, 0x11} },
1716 { {0x61, 0x10, 0x03, 0x11, 0x11} },
1717 { {0x61, 0x45, 0x03, 0x11, 0x10} },
1718 { {0x61, 0x30, 0x03, 0x11, 0x10} },
1719 { {0x61, 0x30, 0x03, 0x11, 0x10} },
1720 { {0x61, 0x20, 0x03, 0x11, 0x10} },
1721 { {0x61, 0x10, 0x03, 0x11, 0x10} },
1722 { {0x61, 0x10, 0x03, 0x11, 0x11} },
1723 { {0x61, 0x08, 0x03, 0x10, 0x14} },
1724 { {0x51, 0x08, 0x03, 0x10, 0x54} },
1725 { {0x51, 0x08, 0x03, 0x10, 0x55} },
1726 { {0x51, 0x08, 0x07, 0x10, 0x54} },
1727 { {0x51, 0x45, 0x03, 0x10, 0x50} },
1728 { {0x51, 0x3a, 0x03, 0x10, 0x50} },
1729 { {0x51, 0x30, 0x03, 0x10, 0x50} },
1730 { {0x51, 0x21, 0x03, 0x10, 0x50} },
1731 { {0x51, 0x21, 0x03, 0x10, 0x50} },
1732 { {0x51, 0x10, 0x03, 0x10, 0x50} }
1733 };
1734
1735 static const struct coex_5g_afh_map afh_5g_8821c[] = { {0, 0, 0} };
1736
1737
1738 static const struct coex_rf_para rf_para_tx_8821c[] = {
1739 {0, 0, false, 7},
1740 {0, 20, false, 7},
1741 {8, 17, true, 4},
1742 {7, 18, true, 4},
1743 {6, 19, true, 4},
1744 {5, 20, true, 4}
1745 };
1746
1747 static const struct coex_rf_para rf_para_rx_8821c[] = {
1748 {0, 0, false, 7},
1749 {0, 20, false, 7},
1750 {3, 24, true, 5},
1751 {2, 26, true, 5},
1752 {1, 27, true, 5},
1753 {0, 28, true, 5}
1754 };
1755
1756 static_assert(ARRAY_SIZE(rf_para_tx_8821c) == ARRAY_SIZE(rf_para_rx_8821c));
1757
1758 static const u8 rtw8821c_pwrtrk_5gb_n[][RTW_PWR_TRK_TBL_SZ] = {
1759 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10,
1760 11, 11, 12, 12, 12, 12, 12},
1761 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11,
1762 11, 12, 12, 12, 12, 12, 12, 12},
1763 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11,
1764 11, 12, 12, 12, 12, 12, 12},
1765 };
1766
1767 static const u8 rtw8821c_pwrtrk_5gb_p[][RTW_PWR_TRK_TBL_SZ] = {
1768 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11,
1769 12, 12, 12, 12, 12, 12, 12},
1770 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11,
1771 12, 12, 12, 12, 12, 12, 12, 12},
1772 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11,
1773 11, 12, 12, 12, 12, 12, 12, 12},
1774 };
1775
1776 static const u8 rtw8821c_pwrtrk_5ga_n[][RTW_PWR_TRK_TBL_SZ] = {
1777 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10,
1778 11, 11, 12, 12, 12, 12, 12},
1779 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11,
1780 11, 12, 12, 12, 12, 12, 12, 12},
1781 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11,
1782 11, 12, 12, 12, 12, 12, 12},
1783 };
1784
1785 static const u8 rtw8821c_pwrtrk_5ga_p[][RTW_PWR_TRK_TBL_SZ] = {
1786 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11,
1787 12, 12, 12, 12, 12, 12, 12},
1788 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11,
1789 12, 12, 12, 12, 12, 12, 12, 12},
1790 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11,
1791 11, 12, 12, 12, 12, 12, 12, 12},
1792 };
1793
1794 static const u8 rtw8821c_pwrtrk_2gb_n[] = {
1795 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4,
1796 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9
1797 };
1798
1799 static const u8 rtw8821c_pwrtrk_2gb_p[] = {
1800 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5,
1801 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9
1802 };
1803
1804 static const u8 rtw8821c_pwrtrk_2ga_n[] = {
1805 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4,
1806 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9
1807 };
1808
1809 static const u8 rtw8821c_pwrtrk_2ga_p[] = {
1810 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5,
1811 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9
1812 };
1813
1814 static const u8 rtw8821c_pwrtrk_2g_cck_b_n[] = {
1815 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
1816 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9
1817 };
1818
1819 static const u8 rtw8821c_pwrtrk_2g_cck_b_p[] = {
1820 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5,
1821 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9
1822 };
1823
1824 static const u8 rtw8821c_pwrtrk_2g_cck_a_n[] = {
1825 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4,
1826 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9
1827 };
1828
1829 static const u8 rtw8821c_pwrtrk_2g_cck_a_p[] = {
1830 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5,
1831 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9
1832 };
1833
1834 static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = {
1835 .pwrtrk_5gb_n[0] = rtw8821c_pwrtrk_5gb_n[0],
1836 .pwrtrk_5gb_n[1] = rtw8821c_pwrtrk_5gb_n[1],
1837 .pwrtrk_5gb_n[2] = rtw8821c_pwrtrk_5gb_n[2],
1838 .pwrtrk_5gb_p[0] = rtw8821c_pwrtrk_5gb_p[0],
1839 .pwrtrk_5gb_p[1] = rtw8821c_pwrtrk_5gb_p[1],
1840 .pwrtrk_5gb_p[2] = rtw8821c_pwrtrk_5gb_p[2],
1841 .pwrtrk_5ga_n[0] = rtw8821c_pwrtrk_5ga_n[0],
1842 .pwrtrk_5ga_n[1] = rtw8821c_pwrtrk_5ga_n[1],
1843 .pwrtrk_5ga_n[2] = rtw8821c_pwrtrk_5ga_n[2],
1844 .pwrtrk_5ga_p[0] = rtw8821c_pwrtrk_5ga_p[0],
1845 .pwrtrk_5ga_p[1] = rtw8821c_pwrtrk_5ga_p[1],
1846 .pwrtrk_5ga_p[2] = rtw8821c_pwrtrk_5ga_p[2],
1847 .pwrtrk_2gb_n = rtw8821c_pwrtrk_2gb_n,
1848 .pwrtrk_2gb_p = rtw8821c_pwrtrk_2gb_p,
1849 .pwrtrk_2ga_n = rtw8821c_pwrtrk_2ga_n,
1850 .pwrtrk_2ga_p = rtw8821c_pwrtrk_2ga_p,
1851 .pwrtrk_2g_cckb_n = rtw8821c_pwrtrk_2g_cck_b_n,
1852 .pwrtrk_2g_cckb_p = rtw8821c_pwrtrk_2g_cck_b_p,
1853 .pwrtrk_2g_ccka_n = rtw8821c_pwrtrk_2g_cck_a_n,
1854 .pwrtrk_2g_ccka_p = rtw8821c_pwrtrk_2g_cck_a_p,
1855 };
1856
1857 static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = {
1858 {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1859 {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1860 {0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1861 {0, 0, RTW_REG_DOMAIN_NL},
1862 {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1863 {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1864 {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
1865 {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1866 {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
1867 {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
1868 {0, 0, RTW_REG_DOMAIN_NL},
1869 {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
1870 {0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
1871 {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
1872 {0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
1873 {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A},
1874 {0, 0, RTW_REG_DOMAIN_NL},
1875 {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
1876 {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1877 {0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
1878 {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1879 {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
1880 };
1881
1882 const struct rtw_chip_info rtw8821c_hw_spec = {
1883 .ops = &rtw8821c_ops,
1884 .id = RTW_CHIP_TYPE_8821C,
1885 .fw_name = "rtw88/rtw8821c_fw.bin",
1886 .wlan_cpu = RTW_WCPU_11AC,
1887 .tx_pkt_desc_sz = 48,
1888 .tx_buf_desc_sz = 16,
1889 .rx_pkt_desc_sz = 24,
1890 .rx_buf_desc_sz = 8,
1891 .phy_efuse_size = 512,
1892 .log_efuse_size = 512,
1893 .ptct_efuse_size = 96,
1894 .txff_size = 65536,
1895 .rxff_size = 16384,
1896 .txgi_factor = 1,
1897 .is_pwr_by_rate_dec = true,
1898 .max_power_index = 0x3f,
1899 .csi_buf_pg_num = 0,
1900 .band = RTW_BAND_2G | RTW_BAND_5G,
1901 .page_size = 128,
1902 .dig_min = 0x1c,
1903 .ht_supported = true,
1904 .vht_supported = true,
1905 .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
1906 .sys_func_en = 0xD8,
1907 .pwr_on_seq = card_enable_flow_8821c,
1908 .pwr_off_seq = card_disable_flow_8821c,
1909 .page_table = page_table_8821c,
1910 .rqpn_table = rqpn_table_8821c,
1911 .prioq_addrs = &prioq_addrs_8821c,
1912 .intf_table = &phy_para_table_8821c,
1913 .dig = rtw8821c_dig,
1914 .rf_base_addr = {0x2800, 0x2c00},
1915 .rf_sipi_addr = {0xc90, 0xe90},
1916 .ltecoex_addr = &rtw8821c_ltecoex_addr,
1917 .mac_tbl = &rtw8821c_mac_tbl,
1918 .agc_tbl = &rtw8821c_agc_tbl,
1919 .bb_tbl = &rtw8821c_bb_tbl,
1920 .rf_tbl = {&rtw8821c_rf_a_tbl},
1921 .rfe_defs = rtw8821c_rfe_defs,
1922 .rfe_defs_size = ARRAY_SIZE(rtw8821c_rfe_defs),
1923 .rx_ldpc = false,
1924 .pwr_track_tbl = &rtw8821c_rtw_pwr_track_tbl,
1925 .iqk_threshold = 8,
1926 .bfer_su_max_num = 2,
1927 .bfer_mu_max_num = 1,
1928 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
1929
1930 .coex_para_ver = 0x19092746,
1931 .bt_desired_ver = 0x46,
1932 .scbd_support = true,
1933 .new_scbd10_def = false,
1934 .ble_hid_profile_support = false,
1935 .wl_mimo_ps_support = false,
1936 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
1937 .bt_rssi_type = COEX_BTRSSI_RATIO,
1938 .ant_isolation = 15,
1939 .rssi_tolerance = 2,
1940 .wl_rssi_step = wl_rssi_step_8821c,
1941 .bt_rssi_step = bt_rssi_step_8821c,
1942 .table_sant_num = ARRAY_SIZE(table_sant_8821c),
1943 .table_sant = table_sant_8821c,
1944 .table_nsant_num = ARRAY_SIZE(table_nsant_8821c),
1945 .table_nsant = table_nsant_8821c,
1946 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8821c),
1947 .tdma_sant = tdma_sant_8821c,
1948 .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821c),
1949 .tdma_nsant = tdma_nsant_8821c,
1950 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821c),
1951 .wl_rf_para_tx = rf_para_tx_8821c,
1952 .wl_rf_para_rx = rf_para_rx_8821c,
1953 .bt_afh_span_bw20 = 0x24,
1954 .bt_afh_span_bw40 = 0x36,
1955 .afh_5g_num = ARRAY_SIZE(afh_5g_8821c),
1956 .afh_5g = afh_5g_8821c,
1957
1958 .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821c),
1959 .coex_info_hw_regs = coex_info_hw_regs_8821c,
1960 };
1961 EXPORT_SYMBOL(rtw8821c_hw_spec);
1962
1963 MODULE_FIRMWARE("rtw88/rtw8821c_fw.bin");
1964
1965 MODULE_AUTHOR("Realtek Corporation");
1966 MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821c driver");
1967 MODULE_LICENSE("Dual BSD/GPL");