rtw8821c.c (59560B)
1// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2/* Copyright(c) 2018-2019 Realtek Corporation 3 */ 4 5#include "main.h" 6#include "coex.h" 7#include "fw.h" 8#include "tx.h" 9#include "rx.h" 10#include "phy.h" 11#include "rtw8821c.h" 12#include "rtw8821c_table.h" 13#include "mac.h" 14#include "reg.h" 15#include "debug.h" 16#include "bf.h" 17#include "regd.h" 18 19static const s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52}; 20static const s8 lna_gain_table_1[16] = {10, 6, 2, -2, -6, -10, -14, -17, 21 -20, -24, -28, -31, -34, -37, -40, -44}; 22 23static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse, 24 struct rtw8821c_efuse *map) 25{ 26 ether_addr_copy(efuse->addr, map->e.mac_addr); 27} 28 29enum rtw8821ce_rf_set { 30 SWITCH_TO_BTG, 31 SWITCH_TO_WLG, 32 SWITCH_TO_WLA, 33 SWITCH_TO_BT, 34}; 35 36static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) 37{ 38 struct rtw_efuse *efuse = &rtwdev->efuse; 39 struct rtw8821c_efuse *map; 40 int i; 41 42 map = (struct rtw8821c_efuse *)log_map; 43 44 efuse->rfe_option = map->rfe_option; 45 efuse->rf_board_option = map->rf_board_option; 46 efuse->crystal_cap = map->xtal_k; 47 efuse->pa_type_2g = map->pa_type; 48 efuse->pa_type_5g = map->pa_type; 49 efuse->lna_type_2g = map->lna_type_2g[0]; 50 efuse->lna_type_5g = map->lna_type_5g[0]; 51 efuse->channel_plan = map->channel_plan; 52 efuse->country_code[0] = map->country_code[0]; 53 efuse->country_code[1] = map->country_code[1]; 54 efuse->bt_setting = map->rf_bt_setting; 55 efuse->regd = map->rf_board_option & 0x7; 56 efuse->thermal_meter[0] = map->thermal_meter; 57 efuse->thermal_meter_k = map->thermal_meter; 58 efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g; 59 efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g; 60 61 for (i = 0; i < 4; i++) 62 efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; 63 64 if (rtwdev->efuse.rfe_option == 2 || rtwdev->efuse.rfe_option == 4) 65 efuse->txpwr_idx_table[0].pwr_idx_2g = map->txpwr_idx_table[1].pwr_idx_2g; 66 67 switch (rtw_hci_type(rtwdev)) { 68 case RTW_HCI_TYPE_PCIE: 69 rtw8821ce_efuse_parsing(efuse, map); 70 break; 71 default: 72 /* unsupported now */ 73 return -ENOTSUPP; 74 } 75 76 return 0; 77} 78 79static const u32 rtw8821c_txscale_tbl[] = { 80 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8, 81 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180, 82 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab, 83 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe 84}; 85 86static u8 rtw8821c_get_swing_index(struct rtw_dev *rtwdev) 87{ 88 u8 i = 0; 89 u32 swing, table_value; 90 91 swing = rtw_read32_mask(rtwdev, REG_TXSCALE_A, 0xffe00000); 92 for (i = 0; i < ARRAY_SIZE(rtw8821c_txscale_tbl); i++) { 93 table_value = rtw8821c_txscale_tbl[i]; 94 if (swing == table_value) 95 break; 96 } 97 98 return i; 99} 100 101static void rtw8821c_pwrtrack_init(struct rtw_dev *rtwdev) 102{ 103 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 104 u8 swing_idx = rtw8821c_get_swing_index(rtwdev); 105 106 if (swing_idx >= ARRAY_SIZE(rtw8821c_txscale_tbl)) 107 dm_info->default_ofdm_index = 24; 108 else 109 dm_info->default_ofdm_index = swing_idx; 110 111 ewma_thermal_init(&dm_info->avg_thermal[RF_PATH_A]); 112 dm_info->delta_power_index[RF_PATH_A] = 0; 113 dm_info->delta_power_index_last[RF_PATH_A] = 0; 114 dm_info->pwr_trk_triggered = false; 115 dm_info->pwr_trk_init_trigger = true; 116 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k; 117} 118 119static void rtw8821c_phy_bf_init(struct rtw_dev *rtwdev) 120{ 121 rtw_bf_phy_init(rtwdev); 122 /* Grouping bitmap parameters */ 123 rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF); 124} 125 126static void rtw8821c_phy_set_param(struct rtw_dev *rtwdev) 127{ 128 u8 crystal_cap, val; 129 130 /* power on BB/RF domain */ 131 val = rtw_read8(rtwdev, REG_SYS_FUNC_EN); 132 val |= BIT_FEN_PCIEA; 133 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 134 135 /* toggle BB reset */ 136 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST; 137 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 138 val &= ~(BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST); 139 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 140 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST; 141 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 142 143 rtw_write8(rtwdev, REG_RF_CTRL, 144 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 145 usleep_range(10, 11); 146 rtw_write8(rtwdev, REG_WLRF1 + 3, 147 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 148 usleep_range(10, 11); 149 150 /* pre init before header files config */ 151 rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 152 153 rtw_phy_load_tables(rtwdev); 154 155 crystal_cap = rtwdev->efuse.crystal_cap & 0x3F; 156 rtw_write32_mask(rtwdev, REG_AFE_XTAL_CTRL, 0x7e000000, crystal_cap); 157 rtw_write32_mask(rtwdev, REG_AFE_PLL_CTRL, 0x7e, crystal_cap); 158 rtw_write32_mask(rtwdev, REG_CCK0_FAREPORT, BIT(18) | BIT(22), 0); 159 160 /* post init after header files config */ 161 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 162 rtwdev->chip->ch_param[0] = rtw_read32_mask(rtwdev, REG_TXSF2, MASKDWORD); 163 rtwdev->chip->ch_param[1] = rtw_read32_mask(rtwdev, REG_TXSF6, MASKDWORD); 164 rtwdev->chip->ch_param[2] = rtw_read32_mask(rtwdev, REG_TXFILTER, MASKDWORD); 165 166 rtw_phy_init(rtwdev); 167 rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f; 168 169 rtw8821c_pwrtrack_init(rtwdev); 170 171 rtw8821c_phy_bf_init(rtwdev); 172} 173 174static int rtw8821c_mac_init(struct rtw_dev *rtwdev) 175{ 176 u32 value32; 177 u16 pre_txcnt; 178 179 /* protocol configuration */ 180 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME); 181 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1); 182 pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT; 183 rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF)); 184 rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8)); 185 value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) | 186 (WLAN_MAX_AGG_PKT_LIMIT << 16) | 187 (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24); 188 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32); 189 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2, 190 WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8); 191 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH); 192 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH); 193 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH); 194 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH); 195 rtw_write8_set(rtwdev, REG_INIRTS_RATE_SEL, BIT(5)); 196 197 /* EDCA configuration */ 198 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0); 199 rtw_write16(rtwdev, REG_TXPAUSE, 0); 200 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME); 201 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME); 202 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG); 203 rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT); 204 rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT); 205 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG); 206 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG); 207 208 /* Set beacon cotnrol - enable TSF and other related functions */ 209 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 210 211 /* Set send beacon related registers */ 212 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME); 213 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT); 214 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME); 215 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8); 216 217 /* WMAC configuration */ 218 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0); 219 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2); 220 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG); 221 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512); 222 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2); 223 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1); 224 rtw_write8(rtwdev, REG_ACKTO_CCK, 0x40); 225 rtw_write8_set(rtwdev, REG_WMAC_TRXPTCL_CTL_H, BIT(1)); 226 rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL, 227 BIT_DIS_CHK_VHTSIGB_CRC); 228 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2); 229 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1); 230 231 return 0; 232} 233 234static void rtw8821c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) 235{ 236 u8 ldo_pwr; 237 238 ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3); 239 ldo_pwr = enable ? ldo_pwr | BIT(7) : ldo_pwr & ~BIT(7); 240 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr); 241} 242 243static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set) 244{ 245 u32 reg; 246 247 rtw_write32_set(rtwdev, REG_DMEM_CTRL, BIT_WL_RST); 248 rtw_write32_set(rtwdev, REG_SYS_CTRL, BIT_FEN_EN); 249 250 reg = rtw_read32(rtwdev, REG_RFECTL); 251 switch (rf_set) { 252 case SWITCH_TO_BTG: 253 reg |= B_BTG_SWITCH; 254 reg &= ~(B_CTRL_SWITCH | B_WL_SWITCH | B_WLG_SWITCH | 255 B_WLA_SWITCH); 256 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, BTG_CCA); 257 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, BTG_LNA); 258 break; 259 case SWITCH_TO_WLG: 260 reg |= B_WL_SWITCH | B_WLG_SWITCH; 261 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLA_SWITCH); 262 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, WLG_CCA); 263 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, WLG_LNA); 264 break; 265 case SWITCH_TO_WLA: 266 reg |= B_WL_SWITCH | B_WLA_SWITCH; 267 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLG_SWITCH); 268 break; 269 case SWITCH_TO_BT: 270 default: 271 break; 272 } 273 274 rtw_write32(rtwdev, REG_RFECTL, reg); 275} 276 277static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) 278{ 279 u32 rf_reg18; 280 281 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); 282 283 rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK | 284 RF18_BW_MASK); 285 286 rf_reg18 |= (channel <= 14 ? RF18_BAND_2G : RF18_BAND_5G); 287 rf_reg18 |= (channel & RF18_CHANNEL_MASK); 288 289 if (channel >= 100 && channel <= 140) 290 rf_reg18 |= RF18_RFSI_GE; 291 else if (channel > 140) 292 rf_reg18 |= RF18_RFSI_GT; 293 294 switch (bw) { 295 case RTW_CHANNEL_WIDTH_5: 296 case RTW_CHANNEL_WIDTH_10: 297 case RTW_CHANNEL_WIDTH_20: 298 default: 299 rf_reg18 |= RF18_BW_20M; 300 break; 301 case RTW_CHANNEL_WIDTH_40: 302 rf_reg18 |= RF18_BW_40M; 303 break; 304 case RTW_CHANNEL_WIDTH_80: 305 rf_reg18 |= RF18_BW_80M; 306 break; 307 } 308 309 if (channel <= 14) { 310 if (rtwdev->efuse.rfe_option == 0) 311 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLG); 312 else if (rtwdev->efuse.rfe_option == 2 || 313 rtwdev->efuse.rfe_option == 4) 314 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_BTG); 315 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1); 316 rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf); 317 } else { 318 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLA); 319 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x0); 320 } 321 322 rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18); 323 324 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0); 325 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1); 326} 327 328static void rtw8821c_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw) 329{ 330 if (bw == RTW_CHANNEL_WIDTH_40) { 331 /* RX DFIR for BW40 */ 332 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 333 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2); 334 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 335 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0); 336 } else if (bw == RTW_CHANNEL_WIDTH_80) { 337 /* RX DFIR for BW80 */ 338 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 339 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1); 340 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 341 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x1); 342 } else { 343 /* RX DFIR for BW20, BW10 and BW5 */ 344 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 345 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2); 346 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1); 347 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0); 348 } 349} 350 351static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, 352 u8 primary_ch_idx) 353{ 354 u32 val32; 355 356 if (channel <= 14) { 357 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1); 358 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0); 359 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0); 360 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15); 361 362 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x0); 363 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a); 364 if (channel == 14) { 365 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c); 366 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000); 367 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667); 368 } else { 369 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 370 rtwdev->chip->ch_param[0]); 371 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 372 rtwdev->chip->ch_param[1] & MASKLWORD); 373 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 374 rtwdev->chip->ch_param[2]); 375 } 376 } else if (channel > 35) { 377 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1); 378 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1); 379 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0); 380 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15); 381 382 if (channel >= 36 && channel <= 64) 383 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x1); 384 else if (channel >= 100 && channel <= 144) 385 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x2); 386 else if (channel >= 149) 387 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x3); 388 389 if (channel >= 36 && channel <= 48) 390 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494); 391 else if (channel >= 52 && channel <= 64) 392 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453); 393 else if (channel >= 100 && channel <= 116) 394 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452); 395 else if (channel >= 118 && channel <= 177) 396 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412); 397 } 398 399 switch (bw) { 400 case RTW_CHANNEL_WIDTH_20: 401 default: 402 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 403 val32 &= 0xffcffc00; 404 val32 |= 0x10010000; 405 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 406 407 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 408 break; 409 case RTW_CHANNEL_WIDTH_40: 410 if (primary_ch_idx == 1) 411 rtw_write32_set(rtwdev, REG_RXSB, BIT(4)); 412 else 413 rtw_write32_clr(rtwdev, REG_RXSB, BIT(4)); 414 415 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 416 val32 &= 0xff3ff300; 417 val32 |= 0x20020000 | ((primary_ch_idx & 0xf) << 2) | 418 RTW_CHANNEL_WIDTH_40; 419 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 420 421 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 422 break; 423 case RTW_CHANNEL_WIDTH_80: 424 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 425 val32 &= 0xfcffcf00; 426 val32 |= 0x40040000 | ((primary_ch_idx & 0xf) << 2) | 427 RTW_CHANNEL_WIDTH_80; 428 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 429 430 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 431 break; 432 case RTW_CHANNEL_WIDTH_5: 433 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 434 val32 &= 0xefcefc00; 435 val32 |= 0x200240; 436 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 437 438 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 439 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 440 break; 441 case RTW_CHANNEL_WIDTH_10: 442 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 443 val32 &= 0xefcefc00; 444 val32 |= 0x300380; 445 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 446 447 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 448 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 449 break; 450 } 451} 452 453static u32 rtw8821c_get_bb_swing(struct rtw_dev *rtwdev, u8 channel) 454{ 455 struct rtw_efuse efuse = rtwdev->efuse; 456 u8 tx_bb_swing; 457 u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6}; 458 459 tx_bb_swing = channel <= 14 ? efuse.tx_bb_swing_setting_2g : 460 efuse.tx_bb_swing_setting_5g; 461 if (tx_bb_swing > 9) 462 tx_bb_swing = 0; 463 464 return swing2setting[(tx_bb_swing / 3)]; 465} 466 467static void rtw8821c_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 channel, 468 u8 bw, u8 primary_ch_idx) 469{ 470 rtw_write32_mask(rtwdev, REG_TXSCALE_A, GENMASK(31, 21), 471 rtw8821c_get_bb_swing(rtwdev, channel)); 472 rtw8821c_pwrtrack_init(rtwdev); 473} 474 475static void rtw8821c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw, 476 u8 primary_chan_idx) 477{ 478 rtw8821c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx); 479 rtw8821c_set_channel_bb_swing(rtwdev, channel, bw, primary_chan_idx); 480 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx); 481 rtw8821c_set_channel_rf(rtwdev, channel, bw); 482 rtw8821c_set_channel_rxdfir(rtwdev, bw); 483} 484 485static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx) 486{ 487 struct rtw_efuse *efuse = &rtwdev->efuse; 488 const s8 *lna_gain_table; 489 int lna_gain_table_size; 490 s8 rx_pwr_all = 0; 491 s8 lna_gain = 0; 492 493 if (efuse->rfe_option == 0) { 494 lna_gain_table = lna_gain_table_0; 495 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_0); 496 } else { 497 lna_gain_table = lna_gain_table_1; 498 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_1); 499 } 500 501 if (lna_idx >= lna_gain_table_size) { 502 rtw_warn(rtwdev, "incorrect lna index (%d)\n", lna_idx); 503 return -120; 504 } 505 506 lna_gain = lna_gain_table[lna_idx]; 507 rx_pwr_all = lna_gain - 2 * vga_idx; 508 509 return rx_pwr_all; 510} 511 512static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status, 513 struct rtw_rx_pkt_stat *pkt_stat) 514{ 515 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 516 s8 rx_power; 517 u8 lna_idx = 0; 518 u8 vga_idx = 0; 519 520 vga_idx = GET_PHY_STAT_P0_VGA(phy_status); 521 lna_idx = FIELD_PREP(BIT_LNA_H_MASK, GET_PHY_STAT_P0_LNA_H(phy_status)) | 522 FIELD_PREP(BIT_LNA_L_MASK, GET_PHY_STAT_P0_LNA_L(phy_status)); 523 rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx); 524 525 pkt_stat->rx_power[RF_PATH_A] = rx_power; 526 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 527 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 528 pkt_stat->bw = RTW_CHANNEL_WIDTH_20; 529 pkt_stat->signal_power = rx_power; 530} 531 532static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status, 533 struct rtw_rx_pkt_stat *pkt_stat) 534{ 535 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 536 u8 rxsc, bw; 537 s8 min_rx_power = -120; 538 539 if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0) 540 rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status); 541 else 542 rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status); 543 544 if (rxsc >= 1 && rxsc <= 8) 545 bw = RTW_CHANNEL_WIDTH_20; 546 else if (rxsc >= 9 && rxsc <= 12) 547 bw = RTW_CHANNEL_WIDTH_40; 548 else if (rxsc >= 13) 549 bw = RTW_CHANNEL_WIDTH_80; 550 else 551 bw = GET_PHY_STAT_P1_RF_MODE(phy_status); 552 553 pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110; 554 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 555 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 556 pkt_stat->bw = bw; 557 pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A], 558 min_rx_power); 559} 560 561static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 562 struct rtw_rx_pkt_stat *pkt_stat) 563{ 564 u8 page; 565 566 page = *phy_status & 0xf; 567 568 switch (page) { 569 case 0: 570 query_phy_status_page0(rtwdev, phy_status, pkt_stat); 571 break; 572 case 1: 573 query_phy_status_page1(rtwdev, phy_status, pkt_stat); 574 break; 575 default: 576 rtw_warn(rtwdev, "unused phy status page (%d)\n", page); 577 return; 578 } 579} 580 581static void rtw8821c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, 582 struct rtw_rx_pkt_stat *pkt_stat, 583 struct ieee80211_rx_status *rx_status) 584{ 585 struct ieee80211_hdr *hdr; 586 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz; 587 u8 *phy_status = NULL; 588 589 memset(pkt_stat, 0, sizeof(*pkt_stat)); 590 591 pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc); 592 pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc); 593 pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc); 594 pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) && 595 GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE; 596 pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc); 597 pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc); 598 pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc); 599 pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc); 600 pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc); 601 pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc); 602 pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc); 603 pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc); 604 605 /* drv_info_sz is in unit of 8-bytes */ 606 pkt_stat->drv_info_sz *= 8; 607 608 /* c2h cmd pkt's rx/phy status is not interested */ 609 if (pkt_stat->is_c2h) 610 return; 611 612 hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift + 613 pkt_stat->drv_info_sz); 614 if (pkt_stat->phy_status) { 615 phy_status = rx_desc + desc_sz + pkt_stat->shift; 616 query_phy_status(rtwdev, phy_status, pkt_stat); 617 } 618 619 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status); 620} 621 622static void 623rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) 624{ 625 struct rtw_hal *hal = &rtwdev->hal; 626 static const u32 offset_txagc[2] = {0x1d00, 0x1d80}; 627 static u32 phy_pwr_idx; 628 u8 rate, rate_idx, pwr_index, shift; 629 int j; 630 631 for (j = 0; j < rtw_rate_size[rs]; j++) { 632 rate = rtw_rate_section[rs][j]; 633 pwr_index = hal->tx_pwr_tbl[path][rate]; 634 shift = rate & 0x3; 635 phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); 636 if (shift == 0x3 || rate == DESC_RATEVHT1SS_MCS9) { 637 rate_idx = rate & 0xfc; 638 rtw_write32(rtwdev, offset_txagc[path] + rate_idx, 639 phy_pwr_idx); 640 phy_pwr_idx = 0; 641 } 642 } 643} 644 645static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev) 646{ 647 struct rtw_hal *hal = &rtwdev->hal; 648 int rs, path; 649 650 for (path = 0; path < hal->rf_path_num; path++) { 651 for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) { 652 if (rs == RTW_RATE_SECTION_HT_2S || 653 rs == RTW_RATE_SECTION_VHT_2S) 654 continue; 655 rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs); 656 } 657 } 658} 659 660static void rtw8821c_false_alarm_statistics(struct rtw_dev *rtwdev) 661{ 662 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 663 u32 cck_enable; 664 u32 cck_fa_cnt; 665 u32 ofdm_fa_cnt; 666 u32 crc32_cnt; 667 u32 cca32_cnt; 668 669 cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28); 670 cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK); 671 ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM); 672 673 dm_info->cck_fa_cnt = cck_fa_cnt; 674 dm_info->ofdm_fa_cnt = ofdm_fa_cnt; 675 if (cck_enable) 676 dm_info->total_fa_cnt += cck_fa_cnt; 677 dm_info->total_fa_cnt = ofdm_fa_cnt; 678 679 crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK); 680 dm_info->cck_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 681 dm_info->cck_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 682 683 crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM); 684 dm_info->ofdm_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 685 dm_info->ofdm_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 686 687 crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT); 688 dm_info->ht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 689 dm_info->ht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 690 691 crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT); 692 dm_info->vht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 693 dm_info->vht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 694 695 cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM); 696 dm_info->ofdm_cca_cnt = FIELD_GET(GENMASK(31, 16), cca32_cnt); 697 dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt; 698 if (cck_enable) { 699 cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK); 700 dm_info->cck_cca_cnt = FIELD_GET(GENMASK(15, 0), cca32_cnt); 701 dm_info->total_cca_cnt += dm_info->cck_cca_cnt; 702 } 703 704 rtw_write32_set(rtwdev, REG_FAS, BIT(17)); 705 rtw_write32_clr(rtwdev, REG_FAS, BIT(17)); 706 rtw_write32_clr(rtwdev, REG_RXDESC, BIT(15)); 707 rtw_write32_set(rtwdev, REG_RXDESC, BIT(15)); 708 rtw_write32_set(rtwdev, REG_CNTRST, BIT(0)); 709 rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0)); 710} 711 712static void rtw8821c_do_iqk(struct rtw_dev *rtwdev) 713{ 714 static int do_iqk_cnt; 715 struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0}; 716 u32 rf_reg, iqk_fail_mask; 717 int counter; 718 bool reload; 719 720 if (rtw_is_assoc(rtwdev)) 721 para.segment_iqk = 1; 722 723 rtw_fw_do_iqk(rtwdev, ¶); 724 725 for (counter = 0; counter < 300; counter++) { 726 rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK); 727 if (rf_reg == 0xabcde) 728 break; 729 msleep(20); 730 } 731 rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0); 732 733 reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16)); 734 iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0)); 735 rtw_dbg(rtwdev, RTW_DBG_PHY, 736 "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n", 737 counter, reload, ++do_iqk_cnt, iqk_fail_mask); 738} 739 740static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev) 741{ 742 rtw8821c_do_iqk(rtwdev); 743} 744 745/* for coex */ 746static void rtw8821c_coex_cfg_init(struct rtw_dev *rtwdev) 747{ 748 /* enable TBTT nterrupt */ 749 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 750 751 /* BT report packet sample rate */ 752 rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5); 753 754 /* enable BT counter statistics */ 755 rtw_write8(rtwdev, REG_BT_STAT_CTRL, BT_CNT_ENABLE); 756 757 /* enable PTA (3-wire function form BT side) */ 758 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN); 759 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS); 760 761 /* enable PTA (tx/rx signal form WiFi side) */ 762 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN); 763 /* wl tx signal to PTA not case EDCCA */ 764 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN); 765 /* GNT_BT=1 while select both */ 766 rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY); 767 768 /* beacon queue always hi-pri */ 769 rtw_write8_mask(rtwdev, REG_BT_COEX_TABLE_H + 3, BIT_BCN_QUEUE, 770 BCN_PRI_EN); 771} 772 773static void rtw8821c_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, 774 u8 pos_type) 775{ 776 struct rtw_coex *coex = &rtwdev->coex; 777 struct rtw_coex_dm *coex_dm = &coex->dm; 778 struct rtw_coex_rfe *coex_rfe = &coex->rfe; 779 u32 switch_status = FIELD_PREP(CTRL_TYPE_MASK, ctrl_type) | pos_type; 780 bool polarity_inverse; 781 u8 regval = 0; 782 783 if (switch_status == coex_dm->cur_switch_status) 784 return; 785 786 if (coex_rfe->wlg_at_btg) { 787 ctrl_type = COEX_SWITCH_CTRL_BY_BBSW; 788 789 if (coex_rfe->ant_switch_polarity) 790 pos_type = COEX_SWITCH_TO_WLA; 791 else 792 pos_type = COEX_SWITCH_TO_WLG_BT; 793 } 794 795 coex_dm->cur_switch_status = switch_status; 796 797 if (coex_rfe->ant_switch_diversity && 798 ctrl_type == COEX_SWITCH_CTRL_BY_BBSW) 799 ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV; 800 801 polarity_inverse = (coex_rfe->ant_switch_polarity == 1); 802 803 switch (ctrl_type) { 804 default: 805 case COEX_SWITCH_CTRL_BY_BBSW: 806 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 807 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 808 /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 809 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 810 DPDT_CTRL_PIN); 811 812 if (pos_type == COEX_SWITCH_TO_WLG_BT) { 813 if (coex_rfe->rfe_module_type != 0x4 && 814 coex_rfe->rfe_module_type != 0x2) 815 regval = 0x3; 816 else 817 regval = (!polarity_inverse ? 0x2 : 0x1); 818 } else if (pos_type == COEX_SWITCH_TO_WLG) { 819 regval = (!polarity_inverse ? 0x2 : 0x1); 820 } else { 821 regval = (!polarity_inverse ? 0x1 : 0x2); 822 } 823 824 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15, 825 regval); 826 break; 827 case COEX_SWITCH_CTRL_BY_PTA: 828 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 829 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 830 /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 831 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 832 PTA_CTRL_PIN); 833 834 regval = (!polarity_inverse ? 0x2 : 0x1); 835 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15, 836 regval); 837 break; 838 case COEX_SWITCH_CTRL_BY_ANTDIV: 839 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 840 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 841 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 842 ANTDIC_CTRL_PIN); 843 break; 844 case COEX_SWITCH_CTRL_BY_MAC: 845 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 846 847 regval = (!polarity_inverse ? 0x0 : 0x1); 848 rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, 849 regval); 850 break; 851 case COEX_SWITCH_CTRL_BY_FW: 852 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 853 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 854 break; 855 case COEX_SWITCH_CTRL_BY_BT: 856 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 857 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 858 break; 859 } 860 861 if (ctrl_type == COEX_SWITCH_CTRL_BY_BT) { 862 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1); 863 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2); 864 } else { 865 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1); 866 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2); 867 } 868} 869 870static void rtw8821c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) 871{} 872 873static void rtw8821c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) 874{ 875 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_SPI_EN); 876 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_JTAG_EN); 877 rtw_write32_clr(rtwdev, REG_GPIO_MUXCFG, BIT_FSPI_EN); 878 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_LED1DIS); 879 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_SDIO_INT); 880 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_DBG_GNT_WL_BT); 881} 882 883static void rtw8821c_coex_cfg_rfe_type(struct rtw_dev *rtwdev) 884{ 885 struct rtw_coex *coex = &rtwdev->coex; 886 struct rtw_coex_rfe *coex_rfe = &coex->rfe; 887 struct rtw_efuse *efuse = &rtwdev->efuse; 888 889 coex_rfe->rfe_module_type = efuse->rfe_option; 890 coex_rfe->ant_switch_polarity = 0; 891 coex_rfe->ant_switch_exist = true; 892 coex_rfe->wlg_at_btg = false; 893 894 switch (coex_rfe->rfe_module_type) { 895 case 0: 896 case 8: 897 case 1: 898 case 9: /* 1-Ant, Main, WLG */ 899 default: /* 2-Ant, DPDT, WLG */ 900 break; 901 case 2: 902 case 10: /* 1-Ant, Main, BTG */ 903 case 7: 904 case 15: /* 2-Ant, DPDT, BTG */ 905 coex_rfe->wlg_at_btg = true; 906 break; 907 case 3: 908 case 11: /* 1-Ant, Aux, WLG */ 909 coex_rfe->ant_switch_polarity = 1; 910 break; 911 case 4: 912 case 12: /* 1-Ant, Aux, BTG */ 913 coex_rfe->wlg_at_btg = true; 914 coex_rfe->ant_switch_polarity = 1; 915 break; 916 case 5: 917 case 13: /* 2-Ant, no switch, WLG */ 918 case 6: 919 case 14: /* 2-Ant, no antenna switch, WLG */ 920 coex_rfe->ant_switch_exist = false; 921 break; 922 } 923} 924 925static void rtw8821c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 926{ 927 struct rtw_coex *coex = &rtwdev->coex; 928 struct rtw_coex_dm *coex_dm = &coex->dm; 929 struct rtw_efuse *efuse = &rtwdev->efuse; 930 bool share_ant = efuse->share_ant; 931 932 if (share_ant) 933 return; 934 935 if (wl_pwr == coex_dm->cur_wl_pwr_lvl) 936 return; 937 938 coex_dm->cur_wl_pwr_lvl = wl_pwr; 939} 940 941static void rtw8821c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 942{} 943 944static void 945rtw8821c_txagc_swing_offset(struct rtw_dev *rtwdev, u8 pwr_idx_offset, 946 s8 pwr_idx_offset_lower, 947 s8 *txagc_idx, u8 *swing_idx) 948{ 949 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 950 s8 delta_pwr_idx = dm_info->delta_power_index[RF_PATH_A]; 951 u8 swing_upper_bound = dm_info->default_ofdm_index + 10; 952 u8 swing_lower_bound = 0; 953 u8 max_pwr_idx_offset = 0xf; 954 s8 agc_index = 0; 955 u8 swing_index = dm_info->default_ofdm_index; 956 957 pwr_idx_offset = min_t(u8, pwr_idx_offset, max_pwr_idx_offset); 958 pwr_idx_offset_lower = max_t(s8, pwr_idx_offset_lower, -15); 959 960 if (delta_pwr_idx >= 0) { 961 if (delta_pwr_idx <= pwr_idx_offset) { 962 agc_index = delta_pwr_idx; 963 swing_index = dm_info->default_ofdm_index; 964 } else if (delta_pwr_idx > pwr_idx_offset) { 965 agc_index = pwr_idx_offset; 966 swing_index = dm_info->default_ofdm_index + 967 delta_pwr_idx - pwr_idx_offset; 968 swing_index = min_t(u8, swing_index, swing_upper_bound); 969 } 970 } else if (delta_pwr_idx < 0) { 971 if (delta_pwr_idx >= pwr_idx_offset_lower) { 972 agc_index = delta_pwr_idx; 973 swing_index = dm_info->default_ofdm_index; 974 } else if (delta_pwr_idx < pwr_idx_offset_lower) { 975 if (dm_info->default_ofdm_index > 976 (pwr_idx_offset_lower - delta_pwr_idx)) 977 swing_index = dm_info->default_ofdm_index + 978 delta_pwr_idx - pwr_idx_offset_lower; 979 else 980 swing_index = swing_lower_bound; 981 982 agc_index = pwr_idx_offset_lower; 983 } 984 } 985 986 if (swing_index >= ARRAY_SIZE(rtw8821c_txscale_tbl)) { 987 rtw_warn(rtwdev, "swing index overflow\n"); 988 swing_index = ARRAY_SIZE(rtw8821c_txscale_tbl) - 1; 989 } 990 991 *txagc_idx = agc_index; 992 *swing_idx = swing_index; 993} 994 995static void rtw8821c_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 pwr_idx_offset, 996 s8 pwr_idx_offset_lower) 997{ 998 s8 txagc_idx; 999 u8 swing_idx; 1000 1001 rtw8821c_txagc_swing_offset(rtwdev, pwr_idx_offset, pwr_idx_offset_lower, 1002 &txagc_idx, &swing_idx); 1003 rtw_write32_mask(rtwdev, REG_TXAGCIDX, GENMASK(6, 1), txagc_idx); 1004 rtw_write32_mask(rtwdev, REG_TXSCALE_A, GENMASK(31, 21), 1005 rtw8821c_txscale_tbl[swing_idx]); 1006} 1007 1008static void rtw8821c_pwrtrack_set(struct rtw_dev *rtwdev) 1009{ 1010 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1011 u8 pwr_idx_offset, tx_pwr_idx; 1012 s8 pwr_idx_offset_lower; 1013 u8 channel = rtwdev->hal.current_channel; 1014 u8 band_width = rtwdev->hal.current_band_width; 1015 u8 regd = rtw_regd_get(rtwdev); 1016 u8 tx_rate = dm_info->tx_rate; 1017 u8 max_pwr_idx = rtwdev->chip->max_power_index; 1018 1019 tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, RF_PATH_A, tx_rate, 1020 band_width, channel, regd); 1021 1022 tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx); 1023 1024 pwr_idx_offset = max_pwr_idx - tx_pwr_idx; 1025 pwr_idx_offset_lower = 0 - tx_pwr_idx; 1026 1027 rtw8821c_pwrtrack_set_pwr(rtwdev, pwr_idx_offset, pwr_idx_offset_lower); 1028} 1029 1030static void rtw8821c_phy_pwrtrack(struct rtw_dev *rtwdev) 1031{ 1032 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1033 struct rtw_swing_table swing_table; 1034 u8 thermal_value, delta; 1035 1036 rtw_phy_config_swing_table(rtwdev, &swing_table); 1037 1038 if (rtwdev->efuse.thermal_meter[0] == 0xff) 1039 return; 1040 1041 thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00); 1042 1043 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A); 1044 1045 if (dm_info->pwr_trk_init_trigger) 1046 dm_info->pwr_trk_init_trigger = false; 1047 else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value, 1048 RF_PATH_A)) 1049 goto iqk; 1050 1051 delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A); 1052 1053 delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1); 1054 1055 dm_info->delta_power_index[RF_PATH_A] = 1056 rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table, RF_PATH_A, 1057 RF_PATH_A, delta); 1058 if (dm_info->delta_power_index[RF_PATH_A] == 1059 dm_info->delta_power_index_last[RF_PATH_A]) 1060 goto iqk; 1061 else 1062 dm_info->delta_power_index_last[RF_PATH_A] = 1063 dm_info->delta_power_index[RF_PATH_A]; 1064 rtw8821c_pwrtrack_set(rtwdev); 1065 1066iqk: 1067 if (rtw_phy_pwrtrack_need_iqk(rtwdev)) 1068 rtw8821c_do_iqk(rtwdev); 1069} 1070 1071static void rtw8821c_pwr_track(struct rtw_dev *rtwdev) 1072{ 1073 struct rtw_efuse *efuse = &rtwdev->efuse; 1074 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1075 1076 if (efuse->power_track_type != 0) 1077 return; 1078 1079 if (!dm_info->pwr_trk_triggered) { 1080 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, 1081 GENMASK(17, 16), 0x03); 1082 dm_info->pwr_trk_triggered = true; 1083 return; 1084 } 1085 1086 rtw8821c_phy_pwrtrack(rtwdev); 1087 dm_info->pwr_trk_triggered = false; 1088} 1089 1090static void rtw8821c_bf_config_bfee_su(struct rtw_dev *rtwdev, 1091 struct rtw_vif *vif, 1092 struct rtw_bfee *bfee, bool enable) 1093{ 1094 if (enable) 1095 rtw_bf_enable_bfee_su(rtwdev, vif, bfee); 1096 else 1097 rtw_bf_remove_bfee_su(rtwdev, bfee); 1098} 1099 1100static void rtw8821c_bf_config_bfee_mu(struct rtw_dev *rtwdev, 1101 struct rtw_vif *vif, 1102 struct rtw_bfee *bfee, bool enable) 1103{ 1104 if (enable) 1105 rtw_bf_enable_bfee_mu(rtwdev, vif, bfee); 1106 else 1107 rtw_bf_remove_bfee_mu(rtwdev, bfee); 1108} 1109 1110static void rtw8821c_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif, 1111 struct rtw_bfee *bfee, bool enable) 1112{ 1113 if (bfee->role == RTW_BFEE_SU) 1114 rtw8821c_bf_config_bfee_su(rtwdev, vif, bfee, enable); 1115 else if (bfee->role == RTW_BFEE_MU) 1116 rtw8821c_bf_config_bfee_mu(rtwdev, vif, bfee, enable); 1117 else 1118 rtw_warn(rtwdev, "wrong bfee role\n"); 1119} 1120 1121static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl) 1122{ 1123 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1124 u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13}; 1125 u8 cck_n_rx; 1126 1127 rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n", 1128 dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl); 1129 1130 if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl) 1131 return; 1132 1133 cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) && 1134 rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1; 1135 rtw_dbg(rtwdev, RTW_DBG_PHY, 1136 "is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n", 1137 rtw_is_assoc(rtwdev), new_lvl, cck_n_rx, 1138 dm_info->cck_pd_default + new_lvl * 2, 1139 pd[new_lvl], dm_info->cck_fa_avg); 1140 1141 dm_info->cck_fa_avg = CCK_FA_AVG_RESET; 1142 1143 dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl; 1144 rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]); 1145 rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000, 1146 dm_info->cck_pd_default + new_lvl * 2); 1147} 1148 1149static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = { 1150 {0x0086, 1151 RTW_PWR_CUT_ALL_MSK, 1152 RTW_PWR_INTF_SDIO_MSK, 1153 RTW_PWR_ADDR_SDIO, 1154 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1155 {0x0086, 1156 RTW_PWR_CUT_ALL_MSK, 1157 RTW_PWR_INTF_SDIO_MSK, 1158 RTW_PWR_ADDR_SDIO, 1159 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)}, 1160 {0x004A, 1161 RTW_PWR_CUT_ALL_MSK, 1162 RTW_PWR_INTF_USB_MSK, 1163 RTW_PWR_ADDR_MAC, 1164 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1165 {0x0005, 1166 RTW_PWR_CUT_ALL_MSK, 1167 RTW_PWR_INTF_ALL_MSK, 1168 RTW_PWR_ADDR_MAC, 1169 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0}, 1170 {0x0300, 1171 RTW_PWR_CUT_ALL_MSK, 1172 RTW_PWR_INTF_PCI_MSK, 1173 RTW_PWR_ADDR_MAC, 1174 RTW_PWR_CMD_WRITE, 0xFF, 0}, 1175 {0x0301, 1176 RTW_PWR_CUT_ALL_MSK, 1177 RTW_PWR_INTF_PCI_MSK, 1178 RTW_PWR_ADDR_MAC, 1179 RTW_PWR_CMD_WRITE, 0xFF, 0}, 1180 {0xFFFF, 1181 RTW_PWR_CUT_ALL_MSK, 1182 RTW_PWR_INTF_ALL_MSK, 1183 0, 1184 RTW_PWR_CMD_END, 0, 0}, 1185}; 1186 1187static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = { 1188 {0x0020, 1189 RTW_PWR_CUT_ALL_MSK, 1190 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1191 RTW_PWR_ADDR_MAC, 1192 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1193 {0x0001, 1194 RTW_PWR_CUT_ALL_MSK, 1195 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1196 RTW_PWR_ADDR_MAC, 1197 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS}, 1198 {0x0000, 1199 RTW_PWR_CUT_ALL_MSK, 1200 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1201 RTW_PWR_ADDR_MAC, 1202 RTW_PWR_CMD_WRITE, BIT(5), 0}, 1203 {0x0005, 1204 RTW_PWR_CUT_ALL_MSK, 1205 RTW_PWR_INTF_ALL_MSK, 1206 RTW_PWR_ADDR_MAC, 1207 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0}, 1208 {0x0075, 1209 RTW_PWR_CUT_ALL_MSK, 1210 RTW_PWR_INTF_PCI_MSK, 1211 RTW_PWR_ADDR_MAC, 1212 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1213 {0x0006, 1214 RTW_PWR_CUT_ALL_MSK, 1215 RTW_PWR_INTF_ALL_MSK, 1216 RTW_PWR_ADDR_MAC, 1217 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)}, 1218 {0x0075, 1219 RTW_PWR_CUT_ALL_MSK, 1220 RTW_PWR_INTF_PCI_MSK, 1221 RTW_PWR_ADDR_MAC, 1222 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1223 {0x0006, 1224 RTW_PWR_CUT_ALL_MSK, 1225 RTW_PWR_INTF_ALL_MSK, 1226 RTW_PWR_ADDR_MAC, 1227 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1228 {0x0005, 1229 RTW_PWR_CUT_ALL_MSK, 1230 RTW_PWR_INTF_ALL_MSK, 1231 RTW_PWR_ADDR_MAC, 1232 RTW_PWR_CMD_WRITE, BIT(7), 0}, 1233 {0x0005, 1234 RTW_PWR_CUT_ALL_MSK, 1235 RTW_PWR_INTF_ALL_MSK, 1236 RTW_PWR_ADDR_MAC, 1237 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0}, 1238 {0x10C3, 1239 RTW_PWR_CUT_ALL_MSK, 1240 RTW_PWR_INTF_USB_MSK, 1241 RTW_PWR_ADDR_MAC, 1242 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1243 {0x0005, 1244 RTW_PWR_CUT_ALL_MSK, 1245 RTW_PWR_INTF_ALL_MSK, 1246 RTW_PWR_ADDR_MAC, 1247 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1248 {0x0005, 1249 RTW_PWR_CUT_ALL_MSK, 1250 RTW_PWR_INTF_ALL_MSK, 1251 RTW_PWR_ADDR_MAC, 1252 RTW_PWR_CMD_POLLING, BIT(0), 0}, 1253 {0x0020, 1254 RTW_PWR_CUT_ALL_MSK, 1255 RTW_PWR_INTF_ALL_MSK, 1256 RTW_PWR_ADDR_MAC, 1257 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)}, 1258 {0x0074, 1259 RTW_PWR_CUT_ALL_MSK, 1260 RTW_PWR_INTF_PCI_MSK, 1261 RTW_PWR_ADDR_MAC, 1262 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 1263 {0x0022, 1264 RTW_PWR_CUT_ALL_MSK, 1265 RTW_PWR_INTF_PCI_MSK, 1266 RTW_PWR_ADDR_MAC, 1267 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1268 {0x0062, 1269 RTW_PWR_CUT_ALL_MSK, 1270 RTW_PWR_INTF_PCI_MSK, 1271 RTW_PWR_ADDR_MAC, 1272 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)), 1273 (BIT(7) | BIT(6) | BIT(5))}, 1274 {0x0061, 1275 RTW_PWR_CUT_ALL_MSK, 1276 RTW_PWR_INTF_PCI_MSK, 1277 RTW_PWR_ADDR_MAC, 1278 RTW_PWR_CMD_WRITE, (BIT(7) | BIT(6) | BIT(5)), 0}, 1279 {0x007C, 1280 RTW_PWR_CUT_ALL_MSK, 1281 RTW_PWR_INTF_ALL_MSK, 1282 RTW_PWR_ADDR_MAC, 1283 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1284 {0xFFFF, 1285 RTW_PWR_CUT_ALL_MSK, 1286 RTW_PWR_INTF_ALL_MSK, 1287 0, 1288 RTW_PWR_CMD_END, 0, 0}, 1289}; 1290 1291static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = { 1292 {0x0093, 1293 RTW_PWR_CUT_ALL_MSK, 1294 RTW_PWR_INTF_ALL_MSK, 1295 RTW_PWR_ADDR_MAC, 1296 RTW_PWR_CMD_WRITE, BIT(3), 0}, 1297 {0x001F, 1298 RTW_PWR_CUT_ALL_MSK, 1299 RTW_PWR_INTF_ALL_MSK, 1300 RTW_PWR_ADDR_MAC, 1301 RTW_PWR_CMD_WRITE, 0xFF, 0}, 1302 {0x0049, 1303 RTW_PWR_CUT_ALL_MSK, 1304 RTW_PWR_INTF_ALL_MSK, 1305 RTW_PWR_ADDR_MAC, 1306 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1307 {0x0006, 1308 RTW_PWR_CUT_ALL_MSK, 1309 RTW_PWR_INTF_ALL_MSK, 1310 RTW_PWR_ADDR_MAC, 1311 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1312 {0x0002, 1313 RTW_PWR_CUT_ALL_MSK, 1314 RTW_PWR_INTF_ALL_MSK, 1315 RTW_PWR_ADDR_MAC, 1316 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1317 {0x10C3, 1318 RTW_PWR_CUT_ALL_MSK, 1319 RTW_PWR_INTF_USB_MSK, 1320 RTW_PWR_ADDR_MAC, 1321 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1322 {0x0005, 1323 RTW_PWR_CUT_ALL_MSK, 1324 RTW_PWR_INTF_ALL_MSK, 1325 RTW_PWR_ADDR_MAC, 1326 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 1327 {0x0005, 1328 RTW_PWR_CUT_ALL_MSK, 1329 RTW_PWR_INTF_ALL_MSK, 1330 RTW_PWR_ADDR_MAC, 1331 RTW_PWR_CMD_POLLING, BIT(1), 0}, 1332 {0x0020, 1333 RTW_PWR_CUT_ALL_MSK, 1334 RTW_PWR_INTF_ALL_MSK, 1335 RTW_PWR_ADDR_MAC, 1336 RTW_PWR_CMD_WRITE, BIT(3), 0}, 1337 {0x0000, 1338 RTW_PWR_CUT_ALL_MSK, 1339 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1340 RTW_PWR_ADDR_MAC, 1341 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 1342 {0xFFFF, 1343 RTW_PWR_CUT_ALL_MSK, 1344 RTW_PWR_INTF_ALL_MSK, 1345 0, 1346 RTW_PWR_CMD_END, 0, 0}, 1347}; 1348 1349static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = { 1350 {0x0007, 1351 RTW_PWR_CUT_ALL_MSK, 1352 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1353 RTW_PWR_ADDR_MAC, 1354 RTW_PWR_CMD_WRITE, 0xFF, 0x20}, 1355 {0x0067, 1356 RTW_PWR_CUT_ALL_MSK, 1357 RTW_PWR_INTF_ALL_MSK, 1358 RTW_PWR_ADDR_MAC, 1359 RTW_PWR_CMD_WRITE, BIT(5), 0}, 1360 {0x0005, 1361 RTW_PWR_CUT_ALL_MSK, 1362 RTW_PWR_INTF_PCI_MSK, 1363 RTW_PWR_ADDR_MAC, 1364 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)}, 1365 {0x004A, 1366 RTW_PWR_CUT_ALL_MSK, 1367 RTW_PWR_INTF_USB_MSK, 1368 RTW_PWR_ADDR_MAC, 1369 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1370 {0x0067, 1371 RTW_PWR_CUT_ALL_MSK, 1372 RTW_PWR_INTF_SDIO_MSK, 1373 RTW_PWR_ADDR_MAC, 1374 RTW_PWR_CMD_WRITE, BIT(5), 0}, 1375 {0x0067, 1376 RTW_PWR_CUT_ALL_MSK, 1377 RTW_PWR_INTF_SDIO_MSK, 1378 RTW_PWR_ADDR_MAC, 1379 RTW_PWR_CMD_WRITE, BIT(4), 0}, 1380 {0x004F, 1381 RTW_PWR_CUT_ALL_MSK, 1382 RTW_PWR_INTF_SDIO_MSK, 1383 RTW_PWR_ADDR_MAC, 1384 RTW_PWR_CMD_WRITE, BIT(0), 0}, 1385 {0x0067, 1386 RTW_PWR_CUT_ALL_MSK, 1387 RTW_PWR_INTF_SDIO_MSK, 1388 RTW_PWR_ADDR_MAC, 1389 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1390 {0x0046, 1391 RTW_PWR_CUT_ALL_MSK, 1392 RTW_PWR_INTF_SDIO_MSK, 1393 RTW_PWR_ADDR_MAC, 1394 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)}, 1395 {0x0067, 1396 RTW_PWR_CUT_ALL_MSK, 1397 RTW_PWR_INTF_SDIO_MSK, 1398 RTW_PWR_ADDR_MAC, 1399 RTW_PWR_CMD_WRITE, BIT(2), 0}, 1400 {0x0046, 1401 RTW_PWR_CUT_ALL_MSK, 1402 RTW_PWR_INTF_SDIO_MSK, 1403 RTW_PWR_ADDR_MAC, 1404 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)}, 1405 {0x0062, 1406 RTW_PWR_CUT_ALL_MSK, 1407 RTW_PWR_INTF_SDIO_MSK, 1408 RTW_PWR_ADDR_MAC, 1409 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)}, 1410 {0x0081, 1411 RTW_PWR_CUT_ALL_MSK, 1412 RTW_PWR_INTF_ALL_MSK, 1413 RTW_PWR_ADDR_MAC, 1414 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0}, 1415 {0x0005, 1416 RTW_PWR_CUT_ALL_MSK, 1417 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 1418 RTW_PWR_ADDR_MAC, 1419 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, 1420 {0x0086, 1421 RTW_PWR_CUT_ALL_MSK, 1422 RTW_PWR_INTF_SDIO_MSK, 1423 RTW_PWR_ADDR_SDIO, 1424 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 1425 {0x0086, 1426 RTW_PWR_CUT_ALL_MSK, 1427 RTW_PWR_INTF_SDIO_MSK, 1428 RTW_PWR_ADDR_SDIO, 1429 RTW_PWR_CMD_POLLING, BIT(1), 0}, 1430 {0x0090, 1431 RTW_PWR_CUT_ALL_MSK, 1432 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK, 1433 RTW_PWR_ADDR_MAC, 1434 RTW_PWR_CMD_WRITE, BIT(1), 0}, 1435 {0x0044, 1436 RTW_PWR_CUT_ALL_MSK, 1437 RTW_PWR_INTF_SDIO_MSK, 1438 RTW_PWR_ADDR_SDIO, 1439 RTW_PWR_CMD_WRITE, 0xFF, 0}, 1440 {0x0040, 1441 RTW_PWR_CUT_ALL_MSK, 1442 RTW_PWR_INTF_SDIO_MSK, 1443 RTW_PWR_ADDR_SDIO, 1444 RTW_PWR_CMD_WRITE, 0xFF, 0x90}, 1445 {0x0041, 1446 RTW_PWR_CUT_ALL_MSK, 1447 RTW_PWR_INTF_SDIO_MSK, 1448 RTW_PWR_ADDR_SDIO, 1449 RTW_PWR_CMD_WRITE, 0xFF, 0x00}, 1450 {0x0042, 1451 RTW_PWR_CUT_ALL_MSK, 1452 RTW_PWR_INTF_SDIO_MSK, 1453 RTW_PWR_ADDR_SDIO, 1454 RTW_PWR_CMD_WRITE, 0xFF, 0x04}, 1455 {0xFFFF, 1456 RTW_PWR_CUT_ALL_MSK, 1457 RTW_PWR_INTF_ALL_MSK, 1458 0, 1459 RTW_PWR_CMD_END, 0, 0}, 1460}; 1461 1462static const struct rtw_pwr_seq_cmd *card_enable_flow_8821c[] = { 1463 trans_carddis_to_cardemu_8821c, 1464 trans_cardemu_to_act_8821c, 1465 NULL 1466}; 1467 1468static const struct rtw_pwr_seq_cmd *card_disable_flow_8821c[] = { 1469 trans_act_to_cardemu_8821c, 1470 trans_cardemu_to_carddis_8821c, 1471 NULL 1472}; 1473 1474static const struct rtw_intf_phy_para usb2_param_8821c[] = { 1475 {0xFFFF, 0x00, 1476 RTW_IP_SEL_PHY, 1477 RTW_INTF_PHY_CUT_ALL, 1478 RTW_INTF_PHY_PLATFORM_ALL}, 1479}; 1480 1481static const struct rtw_intf_phy_para usb3_param_8821c[] = { 1482 {0xFFFF, 0x0000, 1483 RTW_IP_SEL_PHY, 1484 RTW_INTF_PHY_CUT_ALL, 1485 RTW_INTF_PHY_PLATFORM_ALL}, 1486}; 1487 1488static const struct rtw_intf_phy_para pcie_gen1_param_8821c[] = { 1489 {0x0009, 0x6380, 1490 RTW_IP_SEL_PHY, 1491 RTW_INTF_PHY_CUT_ALL, 1492 RTW_INTF_PHY_PLATFORM_ALL}, 1493 {0xFFFF, 0x0000, 1494 RTW_IP_SEL_PHY, 1495 RTW_INTF_PHY_CUT_ALL, 1496 RTW_INTF_PHY_PLATFORM_ALL}, 1497}; 1498 1499static const struct rtw_intf_phy_para pcie_gen2_param_8821c[] = { 1500 {0xFFFF, 0x0000, 1501 RTW_IP_SEL_PHY, 1502 RTW_INTF_PHY_CUT_ALL, 1503 RTW_INTF_PHY_PLATFORM_ALL}, 1504}; 1505 1506static const struct rtw_intf_phy_para_table phy_para_table_8821c = { 1507 .usb2_para = usb2_param_8821c, 1508 .usb3_para = usb3_param_8821c, 1509 .gen1_para = pcie_gen1_param_8821c, 1510 .gen2_para = pcie_gen2_param_8821c, 1511 .n_usb2_para = ARRAY_SIZE(usb2_param_8821c), 1512 .n_usb3_para = ARRAY_SIZE(usb2_param_8821c), 1513 .n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8821c), 1514 .n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8821c), 1515}; 1516 1517static const struct rtw_rfe_def rtw8821c_rfe_defs[] = { 1518 [0] = RTW_DEF_RFE(8821c, 0, 0), 1519 [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), 1520 [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2), 1521 [6] = RTW_DEF_RFE(8821c, 0, 0), 1522}; 1523 1524static struct rtw_hw_reg rtw8821c_dig[] = { 1525 [0] = { .addr = 0xc50, .mask = 0x7f }, 1526}; 1527 1528static const struct rtw_ltecoex_addr rtw8821c_ltecoex_addr = { 1529 .ctrl = LTECOEX_ACCESS_CTRL, 1530 .wdata = LTECOEX_WRITE_DATA, 1531 .rdata = LTECOEX_READ_DATA, 1532}; 1533 1534static struct rtw_page_table page_table_8821c[] = { 1535 /* not sure what [0] stands for */ 1536 {16, 16, 16, 14, 1}, 1537 {16, 16, 16, 14, 1}, 1538 {16, 16, 0, 0, 1}, 1539 {16, 16, 16, 0, 1}, 1540 {16, 16, 16, 14, 1}, 1541}; 1542 1543static struct rtw_rqpn rqpn_table_8821c[] = { 1544 /* not sure what [0] stands for */ 1545 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 1546 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 1547 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 1548 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 1549 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 1550 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 1551 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 1552 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH, 1553 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 1554 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 1555 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 1556 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 1557 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 1558 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 1559 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 1560}; 1561 1562static struct rtw_prioq_addrs prioq_addrs_8821c = { 1563 .prio[RTW_DMA_MAPPING_EXTRA] = { 1564 .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2, 1565 }, 1566 .prio[RTW_DMA_MAPPING_LOW] = { 1567 .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2, 1568 }, 1569 .prio[RTW_DMA_MAPPING_NORMAL] = { 1570 .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2, 1571 }, 1572 .prio[RTW_DMA_MAPPING_HIGH] = { 1573 .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2, 1574 }, 1575 .wsize = true, 1576}; 1577 1578static struct rtw_chip_ops rtw8821c_ops = { 1579 .phy_set_param = rtw8821c_phy_set_param, 1580 .read_efuse = rtw8821c_read_efuse, 1581 .query_rx_desc = rtw8821c_query_rx_desc, 1582 .set_channel = rtw8821c_set_channel, 1583 .mac_init = rtw8821c_mac_init, 1584 .read_rf = rtw_phy_read_rf, 1585 .write_rf = rtw_phy_write_rf_reg_sipi, 1586 .set_antenna = NULL, 1587 .set_tx_power_index = rtw8821c_set_tx_power_index, 1588 .cfg_ldo25 = rtw8821c_cfg_ldo25, 1589 .false_alarm_statistics = rtw8821c_false_alarm_statistics, 1590 .phy_calibration = rtw8821c_phy_calibration, 1591 .cck_pd_set = rtw8821c_phy_cck_pd_set, 1592 .pwr_track = rtw8821c_pwr_track, 1593 .config_bfee = rtw8821c_bf_config_bfee, 1594 .set_gid_table = rtw_bf_set_gid_table, 1595 .cfg_csi_rate = rtw_bf_cfg_csi_rate, 1596 1597 .coex_set_init = rtw8821c_coex_cfg_init, 1598 .coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch, 1599 .coex_set_gnt_fix = rtw8821c_coex_cfg_gnt_fix, 1600 .coex_set_gnt_debug = rtw8821c_coex_cfg_gnt_debug, 1601 .coex_set_rfe_type = rtw8821c_coex_cfg_rfe_type, 1602 .coex_set_wl_tx_power = rtw8821c_coex_cfg_wl_tx_power, 1603 .coex_set_wl_rx_gain = rtw8821c_coex_cfg_wl_rx_gain, 1604}; 1605 1606/* rssi in percentage % (dbm = % - 100) */ 1607static const u8 wl_rssi_step_8821c[] = {101, 45, 101, 40}; 1608static const u8 bt_rssi_step_8821c[] = {101, 101, 101, 101}; 1609 1610/* Shared-Antenna Coex Table */ 1611static const struct coex_table_para table_sant_8821c[] = { 1612 {0x55555555, 0x55555555}, /* case-0 */ 1613 {0x55555555, 0x55555555}, 1614 {0x66555555, 0x66555555}, 1615 {0xaaaaaaaa, 0xaaaaaaaa}, 1616 {0x5a5a5a5a, 0x5a5a5a5a}, 1617 {0xfafafafa, 0xfafafafa}, /* case-5 */ 1618 {0x6a5a5555, 0xaaaaaaaa}, 1619 {0x6a5a56aa, 0x6a5a56aa}, 1620 {0x6a5a5a5a, 0x6a5a5a5a}, 1621 {0x66555555, 0x5a5a5a5a}, 1622 {0x66555555, 0x6a5a5a5a}, /* case-10 */ 1623 {0x66555555, 0xaaaaaaaa}, 1624 {0x66555555, 0x6a5a5aaa}, 1625 {0x66555555, 0x6aaa6aaa}, 1626 {0x66555555, 0x6a5a5aaa}, 1627 {0x66555555, 0xaaaaaaaa}, /* case-15 */ 1628 {0xffff55ff, 0xfafafafa}, 1629 {0xffff55ff, 0x6afa5afa}, 1630 {0xaaffffaa, 0xfafafafa}, 1631 {0xaa5555aa, 0x5a5a5a5a}, 1632 {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */ 1633 {0xaa5555aa, 0xaaaaaaaa}, 1634 {0xffffffff, 0x55555555}, 1635 {0xffffffff, 0x5a5a5a5a}, 1636 {0xffffffff, 0x5a5a5a5a}, 1637 {0xffffffff, 0x5a5a5aaa}, /* case-25 */ 1638 {0x55555555, 0x5a5a5a5a}, 1639 {0x55555555, 0xaaaaaaaa}, 1640 {0x66555555, 0x6a5a6a5a}, 1641 {0x66556655, 0x66556655}, 1642 {0x66556aaa, 0x6a5a6aaa}, /* case-30 */ 1643 {0xffffffff, 0x5aaa5aaa}, 1644 {0x56555555, 0x5a5a5aaa} 1645}; 1646 1647/* Non-Shared-Antenna Coex Table */ 1648static const struct coex_table_para table_nsant_8821c[] = { 1649 {0xffffffff, 0xffffffff}, /* case-100 */ 1650 {0xffff55ff, 0xfafafafa}, 1651 {0x66555555, 0x66555555}, 1652 {0xaaaaaaaa, 0xaaaaaaaa}, 1653 {0x5a5a5a5a, 0x5a5a5a5a}, 1654 {0xffffffff, 0xffffffff}, /* case-105 */ 1655 {0x5afa5afa, 0x5afa5afa}, 1656 {0x55555555, 0xfafafafa}, 1657 {0x66555555, 0xfafafafa}, 1658 {0x66555555, 0x5a5a5a5a}, 1659 {0x66555555, 0x6a5a5a5a}, /* case-110 */ 1660 {0x66555555, 0xaaaaaaaa}, 1661 {0xffff55ff, 0xfafafafa}, 1662 {0xffff55ff, 0x5afa5afa}, 1663 {0xffff55ff, 0xaaaaaaaa}, 1664 {0xffff55ff, 0xffff55ff}, /* case-115 */ 1665 {0xaaffffaa, 0x5afa5afa}, 1666 {0xaaffffaa, 0xaaaaaaaa}, 1667 {0xffffffff, 0xfafafafa}, 1668 {0xffff55ff, 0xfafafafa}, 1669 {0xffffffff, 0xaaaaaaaa}, /* case-120 */ 1670 {0xffff55ff, 0x5afa5afa}, 1671 {0xffff55ff, 0x5afa5afa}, 1672 {0x55ff55ff, 0x55ff55ff} 1673}; 1674 1675/* Shared-Antenna TDMA */ 1676static const struct coex_tdma_para tdma_sant_8821c[] = { 1677 { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */ 1678 { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */ 1679 { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 1680 { {0x61, 0x35, 0x03, 0x11, 0x11} }, 1681 { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1682 { {0x61, 0x3a, 0x03, 0x11, 0x11} }, /* case-5 */ 1683 { {0x61, 0x45, 0x03, 0x11, 0x10} }, 1684 { {0x61, 0x35, 0x03, 0x11, 0x10} }, 1685 { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1686 { {0x61, 0x20, 0x03, 0x11, 0x10} }, 1687 { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */ 1688 { {0x61, 0x08, 0x03, 0x11, 0x15} }, 1689 { {0x61, 0x08, 0x03, 0x10, 0x14} }, 1690 { {0x51, 0x08, 0x03, 0x10, 0x54} }, 1691 { {0x51, 0x08, 0x03, 0x10, 0x55} }, 1692 { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */ 1693 { {0x51, 0x45, 0x03, 0x10, 0x50} }, 1694 { {0x51, 0x3a, 0x03, 0x11, 0x50} }, 1695 { {0x51, 0x30, 0x03, 0x10, 0x50} }, 1696 { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1697 { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */ 1698 { {0x51, 0x4a, 0x03, 0x10, 0x50} }, 1699 { {0x51, 0x08, 0x03, 0x30, 0x54} }, 1700 { {0x55, 0x08, 0x03, 0x10, 0x54} }, 1701 { {0x65, 0x10, 0x03, 0x11, 0x10} }, 1702 { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */ 1703 { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1704 { {0x61, 0x08, 0x03, 0x11, 0x11} } 1705}; 1706 1707/* Non-Shared-Antenna TDMA */ 1708static const struct coex_tdma_para tdma_nsant_8821c[] = { 1709 { {0x00, 0x00, 0x00, 0x40, 0x00} }, /* case-100 */ 1710 { {0x61, 0x45, 0x03, 0x11, 0x11} }, 1711 { {0x61, 0x25, 0x03, 0x11, 0x11} }, 1712 { {0x61, 0x35, 0x03, 0x11, 0x11} }, 1713 { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1714 { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */ 1715 { {0x61, 0x45, 0x03, 0x11, 0x10} }, 1716 { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1717 { {0x61, 0x30, 0x03, 0x11, 0x10} }, 1718 { {0x61, 0x20, 0x03, 0x11, 0x10} }, 1719 { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */ 1720 { {0x61, 0x10, 0x03, 0x11, 0x11} }, 1721 { {0x61, 0x08, 0x03, 0x10, 0x14} }, 1722 { {0x51, 0x08, 0x03, 0x10, 0x54} }, 1723 { {0x51, 0x08, 0x03, 0x10, 0x55} }, 1724 { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */ 1725 { {0x51, 0x45, 0x03, 0x10, 0x50} }, 1726 { {0x51, 0x3a, 0x03, 0x10, 0x50} }, 1727 { {0x51, 0x30, 0x03, 0x10, 0x50} }, 1728 { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1729 { {0x51, 0x21, 0x03, 0x10, 0x50} }, /* case-120 */ 1730 { {0x51, 0x10, 0x03, 0x10, 0x50} } 1731}; 1732 1733static const struct coex_5g_afh_map afh_5g_8821c[] = { {0, 0, 0} }; 1734 1735/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */ 1736static const struct coex_rf_para rf_para_tx_8821c[] = { 1737 {0, 0, false, 7}, /* for normal */ 1738 {0, 20, false, 7}, /* for WL-CPT */ 1739 {8, 17, true, 4}, 1740 {7, 18, true, 4}, 1741 {6, 19, true, 4}, 1742 {5, 20, true, 4} 1743}; 1744 1745static const struct coex_rf_para rf_para_rx_8821c[] = { 1746 {0, 0, false, 7}, /* for normal */ 1747 {0, 20, false, 7}, /* for WL-CPT */ 1748 {3, 24, true, 5}, 1749 {2, 26, true, 5}, 1750 {1, 27, true, 5}, 1751 {0, 28, true, 5} 1752}; 1753 1754static_assert(ARRAY_SIZE(rf_para_tx_8821c) == ARRAY_SIZE(rf_para_rx_8821c)); 1755 1756static const u8 rtw8821c_pwrtrk_5gb_n[][RTW_PWR_TRK_TBL_SZ] = { 1757 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10, 1758 11, 11, 12, 12, 12, 12, 12}, 1759 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 1760 11, 12, 12, 12, 12, 12, 12, 12}, 1761 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 1762 11, 12, 12, 12, 12, 12, 12}, 1763}; 1764 1765static const u8 rtw8821c_pwrtrk_5gb_p[][RTW_PWR_TRK_TBL_SZ] = { 1766 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 1767 12, 12, 12, 12, 12, 12, 12}, 1768 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 1769 12, 12, 12, 12, 12, 12, 12, 12}, 1770 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 1771 11, 12, 12, 12, 12, 12, 12, 12}, 1772}; 1773 1774static const u8 rtw8821c_pwrtrk_5ga_n[][RTW_PWR_TRK_TBL_SZ] = { 1775 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10, 1776 11, 11, 12, 12, 12, 12, 12}, 1777 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 1778 11, 12, 12, 12, 12, 12, 12, 12}, 1779 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 1780 11, 12, 12, 12, 12, 12, 12}, 1781}; 1782 1783static const u8 rtw8821c_pwrtrk_5ga_p[][RTW_PWR_TRK_TBL_SZ] = { 1784 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 1785 12, 12, 12, 12, 12, 12, 12}, 1786 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 1787 12, 12, 12, 12, 12, 12, 12, 12}, 1788 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 1789 11, 12, 12, 12, 12, 12, 12, 12}, 1790}; 1791 1792static const u8 rtw8821c_pwrtrk_2gb_n[] = { 1793 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1794 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9 1795}; 1796 1797static const u8 rtw8821c_pwrtrk_2gb_p[] = { 1798 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 1799 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9 1800}; 1801 1802static const u8 rtw8821c_pwrtrk_2ga_n[] = { 1803 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1804 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9 1805}; 1806 1807static const u8 rtw8821c_pwrtrk_2ga_p[] = { 1808 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 1809 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9 1810}; 1811 1812static const u8 rtw8821c_pwrtrk_2g_cck_b_n[] = { 1813 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 1814 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9 1815}; 1816 1817static const u8 rtw8821c_pwrtrk_2g_cck_b_p[] = { 1818 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 1819 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9 1820}; 1821 1822static const u8 rtw8821c_pwrtrk_2g_cck_a_n[] = { 1823 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 1824 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9 1825}; 1826 1827static const u8 rtw8821c_pwrtrk_2g_cck_a_p[] = { 1828 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 1829 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9 1830}; 1831 1832static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = { 1833 .pwrtrk_5gb_n[0] = rtw8821c_pwrtrk_5gb_n[0], 1834 .pwrtrk_5gb_n[1] = rtw8821c_pwrtrk_5gb_n[1], 1835 .pwrtrk_5gb_n[2] = rtw8821c_pwrtrk_5gb_n[2], 1836 .pwrtrk_5gb_p[0] = rtw8821c_pwrtrk_5gb_p[0], 1837 .pwrtrk_5gb_p[1] = rtw8821c_pwrtrk_5gb_p[1], 1838 .pwrtrk_5gb_p[2] = rtw8821c_pwrtrk_5gb_p[2], 1839 .pwrtrk_5ga_n[0] = rtw8821c_pwrtrk_5ga_n[0], 1840 .pwrtrk_5ga_n[1] = rtw8821c_pwrtrk_5ga_n[1], 1841 .pwrtrk_5ga_n[2] = rtw8821c_pwrtrk_5ga_n[2], 1842 .pwrtrk_5ga_p[0] = rtw8821c_pwrtrk_5ga_p[0], 1843 .pwrtrk_5ga_p[1] = rtw8821c_pwrtrk_5ga_p[1], 1844 .pwrtrk_5ga_p[2] = rtw8821c_pwrtrk_5ga_p[2], 1845 .pwrtrk_2gb_n = rtw8821c_pwrtrk_2gb_n, 1846 .pwrtrk_2gb_p = rtw8821c_pwrtrk_2gb_p, 1847 .pwrtrk_2ga_n = rtw8821c_pwrtrk_2ga_n, 1848 .pwrtrk_2ga_p = rtw8821c_pwrtrk_2ga_p, 1849 .pwrtrk_2g_cckb_n = rtw8821c_pwrtrk_2g_cck_b_n, 1850 .pwrtrk_2g_cckb_p = rtw8821c_pwrtrk_2g_cck_b_p, 1851 .pwrtrk_2g_ccka_n = rtw8821c_pwrtrk_2g_cck_a_n, 1852 .pwrtrk_2g_ccka_p = rtw8821c_pwrtrk_2g_cck_a_p, 1853}; 1854 1855static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = { 1856 {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1857 {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1858 {0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1859 {0, 0, RTW_REG_DOMAIN_NL}, 1860 {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1861 {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1862 {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1863 {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1864 {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8}, 1865 {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1866 {0, 0, RTW_REG_DOMAIN_NL}, 1867 {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32}, 1868 {0x64, BIT(0), RTW_REG_DOMAIN_MAC8}, 1869 {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8}, 1870 {0x40, BIT(5), RTW_REG_DOMAIN_MAC8}, 1871 {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A}, 1872 {0, 0, RTW_REG_DOMAIN_NL}, 1873 {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1874 {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1875 {0x953, BIT(1), RTW_REG_DOMAIN_MAC8}, 1876 {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1877 {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1878}; 1879 1880struct rtw_chip_info rtw8821c_hw_spec = { 1881 .ops = &rtw8821c_ops, 1882 .id = RTW_CHIP_TYPE_8821C, 1883 .fw_name = "rtw88/rtw8821c_fw.bin", 1884 .wlan_cpu = RTW_WCPU_11AC, 1885 .tx_pkt_desc_sz = 48, 1886 .tx_buf_desc_sz = 16, 1887 .rx_pkt_desc_sz = 24, 1888 .rx_buf_desc_sz = 8, 1889 .phy_efuse_size = 512, 1890 .log_efuse_size = 512, 1891 .ptct_efuse_size = 96, 1892 .txff_size = 65536, 1893 .rxff_size = 16384, 1894 .txgi_factor = 1, 1895 .is_pwr_by_rate_dec = true, 1896 .max_power_index = 0x3f, 1897 .csi_buf_pg_num = 0, 1898 .band = RTW_BAND_2G | RTW_BAND_5G, 1899 .page_size = 128, 1900 .dig_min = 0x1c, 1901 .ht_supported = true, 1902 .vht_supported = true, 1903 .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK), 1904 .sys_func_en = 0xD8, 1905 .pwr_on_seq = card_enable_flow_8821c, 1906 .pwr_off_seq = card_disable_flow_8821c, 1907 .page_table = page_table_8821c, 1908 .rqpn_table = rqpn_table_8821c, 1909 .prioq_addrs = &prioq_addrs_8821c, 1910 .intf_table = &phy_para_table_8821c, 1911 .dig = rtw8821c_dig, 1912 .rf_base_addr = {0x2800, 0x2c00}, 1913 .rf_sipi_addr = {0xc90, 0xe90}, 1914 .ltecoex_addr = &rtw8821c_ltecoex_addr, 1915 .mac_tbl = &rtw8821c_mac_tbl, 1916 .agc_tbl = &rtw8821c_agc_tbl, 1917 .bb_tbl = &rtw8821c_bb_tbl, 1918 .rf_tbl = {&rtw8821c_rf_a_tbl}, 1919 .rfe_defs = rtw8821c_rfe_defs, 1920 .rfe_defs_size = ARRAY_SIZE(rtw8821c_rfe_defs), 1921 .rx_ldpc = false, 1922 .pwr_track_tbl = &rtw8821c_rtw_pwr_track_tbl, 1923 .iqk_threshold = 8, 1924 .bfer_su_max_num = 2, 1925 .bfer_mu_max_num = 1, 1926 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2, 1927 1928 .coex_para_ver = 0x19092746, 1929 .bt_desired_ver = 0x46, 1930 .scbd_support = true, 1931 .new_scbd10_def = false, 1932 .ble_hid_profile_support = false, 1933 .wl_mimo_ps_support = false, 1934 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 1935 .bt_rssi_type = COEX_BTRSSI_RATIO, 1936 .ant_isolation = 15, 1937 .rssi_tolerance = 2, 1938 .wl_rssi_step = wl_rssi_step_8821c, 1939 .bt_rssi_step = bt_rssi_step_8821c, 1940 .table_sant_num = ARRAY_SIZE(table_sant_8821c), 1941 .table_sant = table_sant_8821c, 1942 .table_nsant_num = ARRAY_SIZE(table_nsant_8821c), 1943 .table_nsant = table_nsant_8821c, 1944 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8821c), 1945 .tdma_sant = tdma_sant_8821c, 1946 .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821c), 1947 .tdma_nsant = tdma_nsant_8821c, 1948 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821c), 1949 .wl_rf_para_tx = rf_para_tx_8821c, 1950 .wl_rf_para_rx = rf_para_rx_8821c, 1951 .bt_afh_span_bw20 = 0x24, 1952 .bt_afh_span_bw40 = 0x36, 1953 .afh_5g_num = ARRAY_SIZE(afh_5g_8821c), 1954 .afh_5g = afh_5g_8821c, 1955 1956 .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821c), 1957 .coex_info_hw_regs = coex_info_hw_regs_8821c, 1958}; 1959EXPORT_SYMBOL(rtw8821c_hw_spec); 1960 1961MODULE_FIRMWARE("rtw88/rtw8821c_fw.bin"); 1962 1963MODULE_AUTHOR("Realtek Corporation"); 1964MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821c driver"); 1965MODULE_LICENSE("Dual BSD/GPL");