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 19 static const s8 lna_gain_table_0[8] = {22, 8, -6, -22, -31, -40, -46, -52}; 20 static 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 23 static 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 29 enum rtw8821ce_rf_set { 30 SWITCH_TO_BTG, 31 SWITCH_TO_WLG, 32 SWITCH_TO_WLA, 33 SWITCH_TO_BT, 34 }; 35 36 static 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 79 static 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 86 static 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 101 static 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 119 static 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 126 static void rtw8821c_phy_set_param(struct rtw_dev *rtwdev) 127 { 128 struct rtw_hal *hal = &rtwdev->hal; 129 u8 crystal_cap, val; 130 131 /* power on BB/RF domain */ 132 val = rtw_read8(rtwdev, REG_SYS_FUNC_EN); 133 val |= BIT_FEN_PCIEA; 134 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 135 136 /* toggle BB reset */ 137 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST; 138 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 139 val &= ~(BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST); 140 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 141 val |= BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST; 142 rtw_write8(rtwdev, REG_SYS_FUNC_EN, val); 143 144 rtw_write8(rtwdev, REG_RF_CTRL, 145 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 146 usleep_range(10, 11); 147 rtw_write8(rtwdev, REG_WLRF1 + 3, 148 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 149 usleep_range(10, 11); 150 151 /* pre init before header files config */ 152 rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 153 154 rtw_phy_load_tables(rtwdev); 155 156 crystal_cap = rtwdev->efuse.crystal_cap & 0x3F; 157 rtw_write32_mask(rtwdev, REG_AFE_XTAL_CTRL, 0x7e000000, crystal_cap); 158 rtw_write32_mask(rtwdev, REG_AFE_PLL_CTRL, 0x7e, crystal_cap); 159 rtw_write32_mask(rtwdev, REG_CCK0_FAREPORT, BIT(18) | BIT(22), 0); 160 161 /* post init after header files config */ 162 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 163 hal->ch_param[0] = rtw_read32_mask(rtwdev, REG_TXSF2, MASKDWORD); 164 hal->ch_param[1] = rtw_read32_mask(rtwdev, REG_TXSF6, MASKDWORD); 165 hal->ch_param[2] = rtw_read32_mask(rtwdev, REG_TXFILTER, MASKDWORD); 166 167 rtw_phy_init(rtwdev); 168 rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f; 169 170 rtw8821c_pwrtrack_init(rtwdev); 171 172 rtw8821c_phy_bf_init(rtwdev); 173 } 174 175 static int rtw8821c_mac_init(struct rtw_dev *rtwdev) 176 { 177 u32 value32; 178 u16 pre_txcnt; 179 180 /* protocol configuration */ 181 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME); 182 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1); 183 pre_txcnt = WLAN_PRE_TXCNT_TIME_TH | BIT_EN_PRECNT; 184 rtw_write8(rtwdev, REG_PRECNT_CTRL, (u8)(pre_txcnt & 0xFF)); 185 rtw_write8(rtwdev, REG_PRECNT_CTRL + 1, (u8)(pre_txcnt >> 8)); 186 value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) | 187 (WLAN_MAX_AGG_PKT_LIMIT << 16) | 188 (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24); 189 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32); 190 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2, 191 WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8); 192 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH); 193 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH); 194 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH); 195 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH); 196 rtw_write8_set(rtwdev, REG_INIRTS_RATE_SEL, BIT(5)); 197 198 /* EDCA configuration */ 199 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0); 200 rtw_write16(rtwdev, REG_TXPAUSE, 0); 201 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME); 202 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME); 203 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG); 204 rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT); 205 rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT); 206 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG); 207 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG); 208 209 /* Set beacon cotnrol - enable TSF and other related functions */ 210 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 211 212 /* Set send beacon related registers */ 213 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME); 214 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT); 215 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME); 216 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8); 217 218 /* WMAC configuration */ 219 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0); 220 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2); 221 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG); 222 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512); 223 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2); 224 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1); 225 rtw_write8(rtwdev, REG_ACKTO_CCK, 0x40); 226 rtw_write8_set(rtwdev, REG_WMAC_TRXPTCL_CTL_H, BIT(1)); 227 rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL, 228 BIT_DIS_CHK_VHTSIGB_CRC); 229 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2); 230 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1); 231 232 return 0; 233 } 234 235 static void rtw8821c_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) 236 { 237 u8 ldo_pwr; 238 239 ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3); 240 ldo_pwr = enable ? ldo_pwr | BIT(7) : ldo_pwr & ~BIT(7); 241 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr); 242 } 243 244 static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set) 245 { 246 u32 reg; 247 248 rtw_write32_set(rtwdev, REG_DMEM_CTRL, BIT_WL_RST); 249 rtw_write32_set(rtwdev, REG_SYS_CTRL, BIT_FEN_EN); 250 251 reg = rtw_read32(rtwdev, REG_RFECTL); 252 switch (rf_set) { 253 case SWITCH_TO_BTG: 254 reg |= B_BTG_SWITCH; 255 reg &= ~(B_CTRL_SWITCH | B_WL_SWITCH | B_WLG_SWITCH | 256 B_WLA_SWITCH); 257 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, BTG_CCA); 258 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, BTG_LNA); 259 break; 260 case SWITCH_TO_WLG: 261 reg |= B_WL_SWITCH | B_WLG_SWITCH; 262 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLA_SWITCH); 263 rtw_write32_mask(rtwdev, REG_ENRXCCA, MASKBYTE2, WLG_CCA); 264 rtw_write32_mask(rtwdev, REG_ENTXCCK, MASKLWORD, WLG_LNA); 265 break; 266 case SWITCH_TO_WLA: 267 reg |= B_WL_SWITCH | B_WLA_SWITCH; 268 reg &= ~(B_BTG_SWITCH | B_CTRL_SWITCH | B_WLG_SWITCH); 269 break; 270 case SWITCH_TO_BT: 271 default: 272 break; 273 } 274 275 rtw_write32(rtwdev, REG_RFECTL, reg); 276 } 277 278 static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) 279 { 280 u32 rf_reg18; 281 282 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); 283 284 rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK | 285 RF18_BW_MASK); 286 287 rf_reg18 |= (channel <= 14 ? RF18_BAND_2G : RF18_BAND_5G); 288 rf_reg18 |= (channel & RF18_CHANNEL_MASK); 289 290 if (channel >= 100 && channel <= 140) 291 rf_reg18 |= RF18_RFSI_GE; 292 else if (channel > 140) 293 rf_reg18 |= RF18_RFSI_GT; 294 295 switch (bw) { 296 case RTW_CHANNEL_WIDTH_5: 297 case RTW_CHANNEL_WIDTH_10: 298 case RTW_CHANNEL_WIDTH_20: 299 default: 300 rf_reg18 |= RF18_BW_20M; 301 break; 302 case RTW_CHANNEL_WIDTH_40: 303 rf_reg18 |= RF18_BW_40M; 304 break; 305 case RTW_CHANNEL_WIDTH_80: 306 rf_reg18 |= RF18_BW_80M; 307 break; 308 } 309 310 if (channel <= 14) { 311 if (rtwdev->efuse.rfe_option == 0) 312 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLG); 313 else if (rtwdev->efuse.rfe_option == 2 || 314 rtwdev->efuse.rfe_option == 4) 315 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_BTG); 316 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1); 317 rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf); 318 } else { 319 rtw8821c_switch_rf_set(rtwdev, SWITCH_TO_WLA); 320 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x0); 321 } 322 323 rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18); 324 325 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0); 326 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1); 327 } 328 329 static void rtw8821c_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw) 330 { 331 if (bw == RTW_CHANNEL_WIDTH_40) { 332 /* RX DFIR for BW40 */ 333 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 334 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2); 335 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 336 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0); 337 } else if (bw == RTW_CHANNEL_WIDTH_80) { 338 /* RX DFIR for BW80 */ 339 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 340 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1); 341 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 342 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x1); 343 } else { 344 /* RX DFIR for BW20, BW10 and BW5 */ 345 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 346 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2); 347 rtw_write32_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1); 348 rtw_write32_mask(rtwdev, REG_CHFIR, BIT(31), 0x0); 349 } 350 } 351 352 static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, 353 u8 primary_ch_idx) 354 { 355 struct rtw_hal *hal = &rtwdev->hal; 356 u32 val32; 357 358 if (channel <= 14) { 359 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1); 360 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0); 361 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0); 362 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15); 363 364 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x0); 365 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a); 366 if (channel == 14) { 367 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c); 368 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000); 369 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667); 370 } else { 371 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 372 hal->ch_param[0]); 373 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 374 hal->ch_param[1] & MASKLWORD); 375 rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 376 hal->ch_param[2]); 377 } 378 } else if (channel > 35) { 379 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1); 380 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1); 381 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0); 382 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15); 383 384 if (channel >= 36 && channel <= 64) 385 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x1); 386 else if (channel >= 100 && channel <= 144) 387 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x2); 388 else if (channel >= 149) 389 rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x3); 390 391 if (channel >= 36 && channel <= 48) 392 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494); 393 else if (channel >= 52 && channel <= 64) 394 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453); 395 else if (channel >= 100 && channel <= 116) 396 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452); 397 else if (channel >= 118 && channel <= 177) 398 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412); 399 } 400 401 switch (bw) { 402 case RTW_CHANNEL_WIDTH_20: 403 default: 404 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 405 val32 &= 0xffcffc00; 406 val32 |= 0x10010000; 407 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 408 409 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 410 break; 411 case RTW_CHANNEL_WIDTH_40: 412 if (primary_ch_idx == 1) 413 rtw_write32_set(rtwdev, REG_RXSB, BIT(4)); 414 else 415 rtw_write32_clr(rtwdev, REG_RXSB, BIT(4)); 416 417 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 418 val32 &= 0xff3ff300; 419 val32 |= 0x20020000 | ((primary_ch_idx & 0xf) << 2) | 420 RTW_CHANNEL_WIDTH_40; 421 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 422 423 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 424 break; 425 case RTW_CHANNEL_WIDTH_80: 426 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 427 val32 &= 0xfcffcf00; 428 val32 |= 0x40040000 | ((primary_ch_idx & 0xf) << 2) | 429 RTW_CHANNEL_WIDTH_80; 430 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 431 432 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 433 break; 434 case RTW_CHANNEL_WIDTH_5: 435 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 436 val32 &= 0xefcefc00; 437 val32 |= 0x200240; 438 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 439 440 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 441 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 442 break; 443 case RTW_CHANNEL_WIDTH_10: 444 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 445 val32 &= 0xefcefc00; 446 val32 |= 0x300380; 447 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 448 449 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 450 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 451 break; 452 } 453 } 454 455 static u32 rtw8821c_get_bb_swing(struct rtw_dev *rtwdev, u8 channel) 456 { 457 struct rtw_efuse efuse = rtwdev->efuse; 458 u8 tx_bb_swing; 459 u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6}; 460 461 tx_bb_swing = channel <= 14 ? efuse.tx_bb_swing_setting_2g : 462 efuse.tx_bb_swing_setting_5g; 463 if (tx_bb_swing > 9) 464 tx_bb_swing = 0; 465 466 return swing2setting[(tx_bb_swing / 3)]; 467 } 468 469 static void rtw8821c_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 channel, 470 u8 bw, u8 primary_ch_idx) 471 { 472 rtw_write32_mask(rtwdev, REG_TXSCALE_A, GENMASK(31, 21), 473 rtw8821c_get_bb_swing(rtwdev, channel)); 474 rtw8821c_pwrtrack_init(rtwdev); 475 } 476 477 static void rtw8821c_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw, 478 u8 primary_chan_idx) 479 { 480 rtw8821c_set_channel_bb(rtwdev, channel, bw, primary_chan_idx); 481 rtw8821c_set_channel_bb_swing(rtwdev, channel, bw, primary_chan_idx); 482 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx); 483 rtw8821c_set_channel_rf(rtwdev, channel, bw); 484 rtw8821c_set_channel_rxdfir(rtwdev, bw); 485 } 486 487 static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx) 488 { 489 struct rtw_efuse *efuse = &rtwdev->efuse; 490 const s8 *lna_gain_table; 491 int lna_gain_table_size; 492 s8 rx_pwr_all = 0; 493 s8 lna_gain = 0; 494 495 if (efuse->rfe_option == 0) { 496 lna_gain_table = lna_gain_table_0; 497 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_0); 498 } else { 499 lna_gain_table = lna_gain_table_1; 500 lna_gain_table_size = ARRAY_SIZE(lna_gain_table_1); 501 } 502 503 if (lna_idx >= lna_gain_table_size) { 504 rtw_warn(rtwdev, "incorrect lna index (%d)\n", lna_idx); 505 return -120; 506 } 507 508 lna_gain = lna_gain_table[lna_idx]; 509 rx_pwr_all = lna_gain - 2 * vga_idx; 510 511 return rx_pwr_all; 512 } 513 514 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status, 515 struct rtw_rx_pkt_stat *pkt_stat) 516 { 517 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 518 s8 rx_power; 519 u8 lna_idx = 0; 520 u8 vga_idx = 0; 521 522 vga_idx = GET_PHY_STAT_P0_VGA(phy_status); 523 lna_idx = FIELD_PREP(BIT_LNA_H_MASK, GET_PHY_STAT_P0_LNA_H(phy_status)) | 524 FIELD_PREP(BIT_LNA_L_MASK, GET_PHY_STAT_P0_LNA_L(phy_status)); 525 rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx); 526 527 pkt_stat->rx_power[RF_PATH_A] = rx_power; 528 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 529 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 530 pkt_stat->bw = RTW_CHANNEL_WIDTH_20; 531 pkt_stat->signal_power = rx_power; 532 } 533 534 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status, 535 struct rtw_rx_pkt_stat *pkt_stat) 536 { 537 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 538 u8 rxsc, bw; 539 s8 min_rx_power = -120; 540 541 if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0) 542 rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status); 543 else 544 rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status); 545 546 if (rxsc >= 1 && rxsc <= 8) 547 bw = RTW_CHANNEL_WIDTH_20; 548 else if (rxsc >= 9 && rxsc <= 12) 549 bw = RTW_CHANNEL_WIDTH_40; 550 else if (rxsc >= 13) 551 bw = RTW_CHANNEL_WIDTH_80; 552 else 553 bw = GET_PHY_STAT_P1_RF_MODE(phy_status); 554 555 pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110; 556 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 557 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 558 pkt_stat->bw = bw; 559 pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A], 560 min_rx_power); 561 } 562 563 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 564 struct rtw_rx_pkt_stat *pkt_stat) 565 { 566 u8 page; 567 568 page = *phy_status & 0xf; 569 570 switch (page) { 571 case 0: 572 query_phy_status_page0(rtwdev, phy_status, pkt_stat); 573 break; 574 case 1: 575 query_phy_status_page1(rtwdev, phy_status, pkt_stat); 576 break; 577 default: 578 rtw_warn(rtwdev, "unused phy status page (%d)\n", page); 579 return; 580 } 581 } 582 583 static void rtw8821c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, 584 struct rtw_rx_pkt_stat *pkt_stat, 585 struct ieee80211_rx_status *rx_status) 586 { 587 struct ieee80211_hdr *hdr; 588 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz; 589 u8 *phy_status = NULL; 590 591 memset(pkt_stat, 0, sizeof(*pkt_stat)); 592 593 pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc); 594 pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc); 595 pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc); 596 pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) && 597 GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE; 598 pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc); 599 pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc); 600 pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc); 601 pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc); 602 pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc); 603 pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc); 604 pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc); 605 pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc); 606 607 /* drv_info_sz is in unit of 8-bytes */ 608 pkt_stat->drv_info_sz *= 8; 609 610 /* c2h cmd pkt's rx/phy status is not interested */ 611 if (pkt_stat->is_c2h) 612 return; 613 614 hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift + 615 pkt_stat->drv_info_sz); 616 if (pkt_stat->phy_status) { 617 phy_status = rx_desc + desc_sz + pkt_stat->shift; 618 query_phy_status(rtwdev, phy_status, pkt_stat); 619 } 620 621 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status); 622 } 623 624 static void 625 rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) 626 { 627 struct rtw_hal *hal = &rtwdev->hal; 628 static const u32 offset_txagc[2] = {0x1d00, 0x1d80}; 629 static u32 phy_pwr_idx; 630 u8 rate, rate_idx, pwr_index, shift; 631 int j; 632 633 for (j = 0; j < rtw_rate_size[rs]; j++) { 634 rate = rtw_rate_section[rs][j]; 635 pwr_index = hal->tx_pwr_tbl[path][rate]; 636 shift = rate & 0x3; 637 phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); 638 if (shift == 0x3 || rate == DESC_RATEVHT1SS_MCS9) { 639 rate_idx = rate & 0xfc; 640 rtw_write32(rtwdev, offset_txagc[path] + rate_idx, 641 phy_pwr_idx); 642 phy_pwr_idx = 0; 643 } 644 } 645 } 646 647 static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev) 648 { 649 struct rtw_hal *hal = &rtwdev->hal; 650 int rs, path; 651 652 for (path = 0; path < hal->rf_path_num; path++) { 653 for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) { 654 if (rs == RTW_RATE_SECTION_HT_2S || 655 rs == RTW_RATE_SECTION_VHT_2S) 656 continue; 657 rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs); 658 } 659 } 660 } 661 662 static void rtw8821c_false_alarm_statistics(struct rtw_dev *rtwdev) 663 { 664 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 665 u32 cck_enable; 666 u32 cck_fa_cnt; 667 u32 ofdm_fa_cnt; 668 u32 crc32_cnt; 669 u32 cca32_cnt; 670 671 cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28); 672 cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK); 673 ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM); 674 675 dm_info->cck_fa_cnt = cck_fa_cnt; 676 dm_info->ofdm_fa_cnt = ofdm_fa_cnt; 677 if (cck_enable) 678 dm_info->total_fa_cnt += cck_fa_cnt; 679 dm_info->total_fa_cnt = ofdm_fa_cnt; 680 681 crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK); 682 dm_info->cck_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 683 dm_info->cck_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 684 685 crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM); 686 dm_info->ofdm_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 687 dm_info->ofdm_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 688 689 crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT); 690 dm_info->ht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 691 dm_info->ht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 692 693 crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT); 694 dm_info->vht_ok_cnt = FIELD_GET(GENMASK(15, 0), crc32_cnt); 695 dm_info->vht_err_cnt = FIELD_GET(GENMASK(31, 16), crc32_cnt); 696 697 cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM); 698 dm_info->ofdm_cca_cnt = FIELD_GET(GENMASK(31, 16), cca32_cnt); 699 dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt; 700 if (cck_enable) { 701 cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK); 702 dm_info->cck_cca_cnt = FIELD_GET(GENMASK(15, 0), cca32_cnt); 703 dm_info->total_cca_cnt += dm_info->cck_cca_cnt; 704 } 705 706 rtw_write32_set(rtwdev, REG_FAS, BIT(17)); 707 rtw_write32_clr(rtwdev, REG_FAS, BIT(17)); 708 rtw_write32_clr(rtwdev, REG_RXDESC, BIT(15)); 709 rtw_write32_set(rtwdev, REG_RXDESC, BIT(15)); 710 rtw_write32_set(rtwdev, REG_CNTRST, BIT(0)); 711 rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0)); 712 } 713 714 static void rtw8821c_do_iqk(struct rtw_dev *rtwdev) 715 { 716 static int do_iqk_cnt; 717 struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0}; 718 u32 rf_reg, iqk_fail_mask; 719 int counter; 720 bool reload; 721 722 if (rtw_is_assoc(rtwdev)) 723 para.segment_iqk = 1; 724 725 rtw_fw_do_iqk(rtwdev, ¶); 726 727 for (counter = 0; counter < 300; counter++) { 728 rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK); 729 if (rf_reg == 0xabcde) 730 break; 731 msleep(20); 732 } 733 rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0); 734 735 reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16)); 736 iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0)); 737 rtw_dbg(rtwdev, RTW_DBG_PHY, 738 "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n", 739 counter, reload, ++do_iqk_cnt, iqk_fail_mask); 740 } 741 742 static void rtw8821c_phy_calibration(struct rtw_dev *rtwdev) 743 { 744 rtw8821c_do_iqk(rtwdev); 745 } 746 747 /* for coex */ 748 static void rtw8821c_coex_cfg_init(struct rtw_dev *rtwdev) 749 { 750 /* enable TBTT nterrupt */ 751 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 752 753 /* BT report packet sample rate */ 754 rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5); 755 756 /* enable BT counter statistics */ 757 rtw_write8(rtwdev, REG_BT_STAT_CTRL, BT_CNT_ENABLE); 758 759 /* enable PTA (3-wire function form BT side) */ 760 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN); 761 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS); 762 763 /* enable PTA (tx/rx signal form WiFi side) */ 764 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN); 765 /* wl tx signal to PTA not case EDCCA */ 766 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN); 767 /* GNT_BT=1 while select both */ 768 rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY); 769 770 /* beacon queue always hi-pri */ 771 rtw_write8_mask(rtwdev, REG_BT_COEX_TABLE_H + 3, BIT_BCN_QUEUE, 772 BCN_PRI_EN); 773 } 774 775 static void rtw8821c_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, 776 u8 pos_type) 777 { 778 struct rtw_coex *coex = &rtwdev->coex; 779 struct rtw_coex_dm *coex_dm = &coex->dm; 780 struct rtw_coex_rfe *coex_rfe = &coex->rfe; 781 u32 switch_status = FIELD_PREP(CTRL_TYPE_MASK, ctrl_type) | pos_type; 782 bool polarity_inverse; 783 u8 regval = 0; 784 785 if (switch_status == coex_dm->cur_switch_status) 786 return; 787 788 if (coex_rfe->wlg_at_btg) { 789 ctrl_type = COEX_SWITCH_CTRL_BY_BBSW; 790 791 if (coex_rfe->ant_switch_polarity) 792 pos_type = COEX_SWITCH_TO_WLA; 793 else 794 pos_type = COEX_SWITCH_TO_WLG_BT; 795 } 796 797 coex_dm->cur_switch_status = switch_status; 798 799 if (coex_rfe->ant_switch_diversity && 800 ctrl_type == COEX_SWITCH_CTRL_BY_BBSW) 801 ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV; 802 803 polarity_inverse = (coex_rfe->ant_switch_polarity == 1); 804 805 switch (ctrl_type) { 806 default: 807 case COEX_SWITCH_CTRL_BY_BBSW: 808 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 809 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 810 /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 811 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 812 DPDT_CTRL_PIN); 813 814 if (pos_type == COEX_SWITCH_TO_WLG_BT) { 815 if (coex_rfe->rfe_module_type != 0x4 && 816 coex_rfe->rfe_module_type != 0x2) 817 regval = 0x3; 818 else 819 regval = (!polarity_inverse ? 0x2 : 0x1); 820 } else if (pos_type == COEX_SWITCH_TO_WLG) { 821 regval = (!polarity_inverse ? 0x2 : 0x1); 822 } else { 823 regval = (!polarity_inverse ? 0x1 : 0x2); 824 } 825 826 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15, 827 regval); 828 break; 829 case COEX_SWITCH_CTRL_BY_PTA: 830 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 831 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 832 /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 833 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 834 PTA_CTRL_PIN); 835 836 regval = (!polarity_inverse ? 0x2 : 0x1); 837 rtw_write32_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_R_RFE_SEL_15, 838 regval); 839 break; 840 case COEX_SWITCH_CTRL_BY_ANTDIV: 841 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 842 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 843 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 844 ANTDIC_CTRL_PIN); 845 break; 846 case COEX_SWITCH_CTRL_BY_MAC: 847 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 848 849 regval = (!polarity_inverse ? 0x0 : 0x1); 850 rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, 851 regval); 852 break; 853 case COEX_SWITCH_CTRL_BY_FW: 854 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 855 rtw_write32_set(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 856 break; 857 case COEX_SWITCH_CTRL_BY_BT: 858 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_SEL_EN); 859 rtw_write32_clr(rtwdev, REG_LED_CFG, BIT_DPDT_WL_SEL); 860 break; 861 } 862 863 if (ctrl_type == COEX_SWITCH_CTRL_BY_BT) { 864 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1); 865 rtw_write8_clr(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2); 866 } else { 867 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE1); 868 rtw_write8_set(rtwdev, REG_CTRL_TYPE, BIT_CTRL_TYPE2); 869 } 870 } 871 872 static void rtw8821c_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) 873 {} 874 875 static void rtw8821c_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) 876 { 877 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_SPI_EN); 878 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_BTGP_JTAG_EN); 879 rtw_write32_clr(rtwdev, REG_GPIO_MUXCFG, BIT_FSPI_EN); 880 rtw_write32_clr(rtwdev, REG_PAD_CTRL1, BIT_LED1DIS); 881 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_SDIO_INT); 882 rtw_write32_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT_DBG_GNT_WL_BT); 883 } 884 885 static void rtw8821c_coex_cfg_rfe_type(struct rtw_dev *rtwdev) 886 { 887 struct rtw_coex *coex = &rtwdev->coex; 888 struct rtw_coex_rfe *coex_rfe = &coex->rfe; 889 struct rtw_efuse *efuse = &rtwdev->efuse; 890 891 coex_rfe->rfe_module_type = efuse->rfe_option; 892 coex_rfe->ant_switch_polarity = 0; 893 coex_rfe->ant_switch_exist = true; 894 coex_rfe->wlg_at_btg = false; 895 896 switch (coex_rfe->rfe_module_type) { 897 case 0: 898 case 8: 899 case 1: 900 case 9: /* 1-Ant, Main, WLG */ 901 default: /* 2-Ant, DPDT, WLG */ 902 break; 903 case 2: 904 case 10: /* 1-Ant, Main, BTG */ 905 case 7: 906 case 15: /* 2-Ant, DPDT, BTG */ 907 coex_rfe->wlg_at_btg = true; 908 break; 909 case 3: 910 case 11: /* 1-Ant, Aux, WLG */ 911 coex_rfe->ant_switch_polarity = 1; 912 break; 913 case 4: 914 case 12: /* 1-Ant, Aux, BTG */ 915 coex_rfe->wlg_at_btg = true; 916 coex_rfe->ant_switch_polarity = 1; 917 break; 918 case 5: 919 case 13: /* 2-Ant, no switch, WLG */ 920 case 6: 921 case 14: /* 2-Ant, no antenna switch, WLG */ 922 coex_rfe->ant_switch_exist = false; 923 break; 924 } 925 } 926 927 static void rtw8821c_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 928 { 929 struct rtw_coex *coex = &rtwdev->coex; 930 struct rtw_coex_dm *coex_dm = &coex->dm; 931 struct rtw_efuse *efuse = &rtwdev->efuse; 932 bool share_ant = efuse->share_ant; 933 934 if (share_ant) 935 return; 936 937 if (wl_pwr == coex_dm->cur_wl_pwr_lvl) 938 return; 939 940 coex_dm->cur_wl_pwr_lvl = wl_pwr; 941 } 942 943 static void rtw8821c_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 944 {} 945 946 static void 947 rtw8821c_txagc_swing_offset(struct rtw_dev *rtwdev, u8 pwr_idx_offset, 948 s8 pwr_idx_offset_lower, 949 s8 *txagc_idx, u8 *swing_idx) 950 { 951 struct rtw_dm_info *dm_info = &rtwdev->dm_info; 952 s8 delta_pwr_idx = dm_info->delta_power_index[RF_PATH_A]; 953 u8 swing_upper_bound = dm_info->default_ofdm_index + 10; 954 u8 swing_lower_bound = 0; 955 u8 max_pwr_idx_offset = 0xf; 956 s8 agc_index = 0; 957 u8 swing_index = dm_info->default_ofdm_index; 958 959 pwr_idx_offset = min_t(u8, pwr_idx_offset, max_pwr_idx_offset); 960 pwr_idx_offset_lower = max_t(s8, pwr_idx_offset_lower, -15); 961 962 if (delta_pwr_idx >= 0) { 963 if (delta_pwr_idx <= pwr_idx_offset) { 964 agc_index = delta_pwr_idx; 965 swing_index = dm_info->default_ofdm_index; 966 } else if (delta_pwr_idx > pwr_idx_offset) { 967 agc_index = pwr_idx_offset; 968 swing_index = dm_info->default_ofdm_index + 969 delta_pwr_idx - pwr_idx_offset; 970 swing_index = min_t(u8, swing_index, swing_upper_bound); 971 } 972 } else if (delta_pwr_idx < 0) { 973 if (delta_pwr_idx >= pwr_idx_offset_lower) { 974 agc_index = delta_pwr_idx; 975 swing_index = dm_info->default_ofdm_index; 976 } else if (delta_pwr_idx < pwr_idx_offset_lower) { 977 if (dm_info->default_ofdm_index > 978 (pwr_idx_offset_lower - delta_pwr_idx)) 979 swing_index = dm_info->default_ofdm_index + 980 delta_pwr_idx - pwr_idx_offset_lower; 981 else 982 swing_index = swing_lower_bound; 983 984 agc_index = pwr_idx_offset_lower; 985 } 986 } 987 988 if (swing_index >= ARRAY_SIZE(rtw8821c_txscale_tbl)) { 989 rtw_warn(rtwdev, "swing index overflow\n"); 990 swing_index = ARRAY_SIZE(rtw8821c_txscale_tbl) - 1; 991 } 992 993 *txagc_idx = agc_index; 994 *swing_idx = swing_index; 995 } 996 997 static void rtw8821c_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 pwr_idx_offset, 998 s8 pwr_idx_offset_lower) 999 { 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 /* not sure what [0] stands for */ 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 /* not sure what [0] stands for */ 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 /* rssi in percentage % (dbm = % - 100) */ 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 /* Shared-Antenna Coex Table */ 1613 static const struct coex_table_para table_sant_8821c[] = { 1614 {0x55555555, 0x55555555}, /* case-0 */ 1615 {0x55555555, 0x55555555}, 1616 {0x66555555, 0x66555555}, 1617 {0xaaaaaaaa, 0xaaaaaaaa}, 1618 {0x5a5a5a5a, 0x5a5a5a5a}, 1619 {0xfafafafa, 0xfafafafa}, /* case-5 */ 1620 {0x6a5a5555, 0xaaaaaaaa}, 1621 {0x6a5a56aa, 0x6a5a56aa}, 1622 {0x6a5a5a5a, 0x6a5a5a5a}, 1623 {0x66555555, 0x5a5a5a5a}, 1624 {0x66555555, 0x6a5a5a5a}, /* case-10 */ 1625 {0x66555555, 0xaaaaaaaa}, 1626 {0x66555555, 0x6a5a5aaa}, 1627 {0x66555555, 0x6aaa6aaa}, 1628 {0x66555555, 0x6a5a5aaa}, 1629 {0x66555555, 0xaaaaaaaa}, /* case-15 */ 1630 {0xffff55ff, 0xfafafafa}, 1631 {0xffff55ff, 0x6afa5afa}, 1632 {0xaaffffaa, 0xfafafafa}, 1633 {0xaa5555aa, 0x5a5a5a5a}, 1634 {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */ 1635 {0xaa5555aa, 0xaaaaaaaa}, 1636 {0xffffffff, 0x55555555}, 1637 {0xffffffff, 0x5a5a5a5a}, 1638 {0xffffffff, 0x5a5a5a5a}, 1639 {0xffffffff, 0x5a5a5aaa}, /* case-25 */ 1640 {0x55555555, 0x5a5a5a5a}, 1641 {0x55555555, 0xaaaaaaaa}, 1642 {0x66555555, 0x6a5a6a5a}, 1643 {0x66556655, 0x66556655}, 1644 {0x66556aaa, 0x6a5a6aaa}, /* case-30 */ 1645 {0xffffffff, 0x5aaa5aaa}, 1646 {0x56555555, 0x5a5a5aaa} 1647 }; 1648 1649 /* Non-Shared-Antenna Coex Table */ 1650 static const struct coex_table_para table_nsant_8821c[] = { 1651 {0xffffffff, 0xffffffff}, /* case-100 */ 1652 {0xffff55ff, 0xfafafafa}, 1653 {0x66555555, 0x66555555}, 1654 {0xaaaaaaaa, 0xaaaaaaaa}, 1655 {0x5a5a5a5a, 0x5a5a5a5a}, 1656 {0xffffffff, 0xffffffff}, /* case-105 */ 1657 {0x5afa5afa, 0x5afa5afa}, 1658 {0x55555555, 0xfafafafa}, 1659 {0x66555555, 0xfafafafa}, 1660 {0x66555555, 0x5a5a5a5a}, 1661 {0x66555555, 0x6a5a5a5a}, /* case-110 */ 1662 {0x66555555, 0xaaaaaaaa}, 1663 {0xffff55ff, 0xfafafafa}, 1664 {0xffff55ff, 0x5afa5afa}, 1665 {0xffff55ff, 0xaaaaaaaa}, 1666 {0xffff55ff, 0xffff55ff}, /* case-115 */ 1667 {0xaaffffaa, 0x5afa5afa}, 1668 {0xaaffffaa, 0xaaaaaaaa}, 1669 {0xffffffff, 0xfafafafa}, 1670 {0xffff55ff, 0xfafafafa}, 1671 {0xffffffff, 0xaaaaaaaa}, /* case-120 */ 1672 {0xffff55ff, 0x5afa5afa}, 1673 {0xffff55ff, 0x5afa5afa}, 1674 {0x55ff55ff, 0x55ff55ff} 1675 }; 1676 1677 /* Shared-Antenna TDMA */ 1678 static const struct coex_tdma_para tdma_sant_8821c[] = { 1679 { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */ 1680 { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */ 1681 { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 1682 { {0x61, 0x35, 0x03, 0x11, 0x11} }, 1683 { {0x61, 0x20, 0x03, 0x11, 0x11} }, 1684 { {0x61, 0x3a, 0x03, 0x11, 0x11} }, /* case-5 */ 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} }, /* case-10 */ 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} }, /* case-15 */ 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} }, /* case-20 */ 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} }, /* case-25 */ 1705 { {0x51, 0x21, 0x03, 0x10, 0x50} }, 1706 { {0x61, 0x08, 0x03, 0x11, 0x11} } 1707 }; 1708 1709 /* Non-Shared-Antenna TDMA */ 1710 static const struct coex_tdma_para tdma_nsant_8821c[] = { 1711 { {0x00, 0x00, 0x00, 0x40, 0x00} }, /* case-100 */ 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} }, /* case-105 */ 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} }, /* case-110 */ 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} }, /* case-115 */ 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} }, /* case-120 */ 1732 { {0x51, 0x10, 0x03, 0x10, 0x50} } 1733 }; 1734 1735 static const struct coex_5g_afh_map afh_5g_8821c[] = { {0, 0, 0} }; 1736 1737 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */ 1738 static const struct coex_rf_para rf_para_tx_8821c[] = { 1739 {0, 0, false, 7}, /* for normal */ 1740 {0, 20, false, 7}, /* for WL-CPT */ 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}, /* for normal */ 1749 {0, 20, false, 7}, /* for WL-CPT */ 1750 {3, 24, true, 5}, 1751 {2, 26, true, 5}, 1752 {1, 27, true, 5}, 1753 {0, 28, true, 5} 1754 }; 1755 1756 #if defined(__linux__) 1757 static_assert(ARRAY_SIZE(rf_para_tx_8821c) == ARRAY_SIZE(rf_para_rx_8821c)); 1758 #elif defined(__FreeBSD__) 1759 rtw88_static_assert(ARRAY_SIZE(rf_para_tx_8821c) == ARRAY_SIZE(rf_para_rx_8821c)); 1760 #endif 1761 1762 static const u8 rtw8821c_pwrtrk_5gb_n[][RTW_PWR_TRK_TBL_SZ] = { 1763 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10, 1764 11, 11, 12, 12, 12, 12, 12}, 1765 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 1766 11, 12, 12, 12, 12, 12, 12, 12}, 1767 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 1768 11, 12, 12, 12, 12, 12, 12}, 1769 }; 1770 1771 static const u8 rtw8821c_pwrtrk_5gb_p[][RTW_PWR_TRK_TBL_SZ] = { 1772 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 1773 12, 12, 12, 12, 12, 12, 12}, 1774 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 1775 12, 12, 12, 12, 12, 12, 12, 12}, 1776 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 1777 11, 12, 12, 12, 12, 12, 12, 12}, 1778 }; 1779 1780 static const u8 rtw8821c_pwrtrk_5ga_n[][RTW_PWR_TRK_TBL_SZ] = { 1781 {0, 1, 1, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 8, 8, 8, 9, 9, 9, 10, 10, 1782 11, 11, 12, 12, 12, 12, 12}, 1783 {0, 1, 1, 1, 2, 3, 3, 4, 4, 5, 5, 5, 6, 6, 7, 8, 8, 9, 9, 10, 10, 11, 1784 11, 12, 12, 12, 12, 12, 12, 12}, 1785 {0, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9, 10, 10, 11, 1786 11, 12, 12, 12, 12, 12, 12}, 1787 }; 1788 1789 static const u8 rtw8821c_pwrtrk_5ga_p[][RTW_PWR_TRK_TBL_SZ] = { 1790 {0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 11, 11, 1791 12, 12, 12, 12, 12, 12, 12}, 1792 {0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 11, 1793 12, 12, 12, 12, 12, 12, 12, 12}, 1794 {0, 1, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 7, 7, 8, 8, 9, 10, 10, 11, 1795 11, 12, 12, 12, 12, 12, 12, 12}, 1796 }; 1797 1798 static const u8 rtw8821c_pwrtrk_2gb_n[] = { 1799 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1800 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9 1801 }; 1802 1803 static const u8 rtw8821c_pwrtrk_2gb_p[] = { 1804 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 1805 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9 1806 }; 1807 1808 static const u8 rtw8821c_pwrtrk_2ga_n[] = { 1809 0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 1810 4, 4, 5, 5, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9 1811 }; 1812 1813 static const u8 rtw8821c_pwrtrk_2ga_p[] = { 1814 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 5, 5, 1815 5, 5, 6, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9 1816 }; 1817 1818 static const u8 rtw8821c_pwrtrk_2g_cck_b_n[] = { 1819 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 1820 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9 1821 }; 1822 1823 static const u8 rtw8821c_pwrtrk_2g_cck_b_p[] = { 1824 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 1825 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9 1826 }; 1827 1828 static const u8 rtw8821c_pwrtrk_2g_cck_a_n[] = { 1829 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 1830 4, 5, 5, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 9 1831 }; 1832 1833 static const u8 rtw8821c_pwrtrk_2g_cck_a_p[] = { 1834 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 1835 5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9 1836 }; 1837 1838 static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = { 1839 .pwrtrk_5gb_n[0] = rtw8821c_pwrtrk_5gb_n[0], 1840 .pwrtrk_5gb_n[1] = rtw8821c_pwrtrk_5gb_n[1], 1841 .pwrtrk_5gb_n[2] = rtw8821c_pwrtrk_5gb_n[2], 1842 .pwrtrk_5gb_p[0] = rtw8821c_pwrtrk_5gb_p[0], 1843 .pwrtrk_5gb_p[1] = rtw8821c_pwrtrk_5gb_p[1], 1844 .pwrtrk_5gb_p[2] = rtw8821c_pwrtrk_5gb_p[2], 1845 .pwrtrk_5ga_n[0] = rtw8821c_pwrtrk_5ga_n[0], 1846 .pwrtrk_5ga_n[1] = rtw8821c_pwrtrk_5ga_n[1], 1847 .pwrtrk_5ga_n[2] = rtw8821c_pwrtrk_5ga_n[2], 1848 .pwrtrk_5ga_p[0] = rtw8821c_pwrtrk_5ga_p[0], 1849 .pwrtrk_5ga_p[1] = rtw8821c_pwrtrk_5ga_p[1], 1850 .pwrtrk_5ga_p[2] = rtw8821c_pwrtrk_5ga_p[2], 1851 .pwrtrk_2gb_n = rtw8821c_pwrtrk_2gb_n, 1852 .pwrtrk_2gb_p = rtw8821c_pwrtrk_2gb_p, 1853 .pwrtrk_2ga_n = rtw8821c_pwrtrk_2ga_n, 1854 .pwrtrk_2ga_p = rtw8821c_pwrtrk_2ga_p, 1855 .pwrtrk_2g_cckb_n = rtw8821c_pwrtrk_2g_cck_b_n, 1856 .pwrtrk_2g_cckb_p = rtw8821c_pwrtrk_2g_cck_b_p, 1857 .pwrtrk_2g_ccka_n = rtw8821c_pwrtrk_2g_cck_a_n, 1858 .pwrtrk_2g_ccka_p = rtw8821c_pwrtrk_2g_cck_a_p, 1859 }; 1860 1861 static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = { 1862 {0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1863 {0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1864 {0xCBA, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1865 {0, 0, RTW_REG_DOMAIN_NL}, 1866 {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1867 {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1868 {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1869 {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1870 {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8}, 1871 {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 1872 {0, 0, RTW_REG_DOMAIN_NL}, 1873 {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32}, 1874 {0x64, BIT(0), RTW_REG_DOMAIN_MAC8}, 1875 {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8}, 1876 {0x40, BIT(5), RTW_REG_DOMAIN_MAC8}, 1877 {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_A}, 1878 {0, 0, RTW_REG_DOMAIN_NL}, 1879 {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 1880 {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1881 {0x953, BIT(1), RTW_REG_DOMAIN_MAC8}, 1882 {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1883 {0x60A, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 1884 }; 1885 1886 const struct rtw_chip_info rtw8821c_hw_spec = { 1887 .ops = &rtw8821c_ops, 1888 .id = RTW_CHIP_TYPE_8821C, 1889 .fw_name = "rtw88/rtw8821c_fw.bin", 1890 .wlan_cpu = RTW_WCPU_11AC, 1891 .tx_pkt_desc_sz = 48, 1892 .tx_buf_desc_sz = 16, 1893 .rx_pkt_desc_sz = 24, 1894 .rx_buf_desc_sz = 8, 1895 .phy_efuse_size = 512, 1896 .log_efuse_size = 512, 1897 .ptct_efuse_size = 96, 1898 .txff_size = 65536, 1899 .rxff_size = 16384, 1900 .txgi_factor = 1, 1901 .is_pwr_by_rate_dec = true, 1902 .max_power_index = 0x3f, 1903 .csi_buf_pg_num = 0, 1904 .band = RTW_BAND_2G | RTW_BAND_5G, 1905 .page_size = 128, 1906 .dig_min = 0x1c, 1907 .ht_supported = true, 1908 .vht_supported = true, 1909 .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK), 1910 .sys_func_en = 0xD8, 1911 .pwr_on_seq = card_enable_flow_8821c, 1912 .pwr_off_seq = card_disable_flow_8821c, 1913 .page_table = page_table_8821c, 1914 .rqpn_table = rqpn_table_8821c, 1915 .prioq_addrs = &prioq_addrs_8821c, 1916 .intf_table = &phy_para_table_8821c, 1917 .dig = rtw8821c_dig, 1918 .rf_base_addr = {0x2800, 0x2c00}, 1919 .rf_sipi_addr = {0xc90, 0xe90}, 1920 .ltecoex_addr = &rtw8821c_ltecoex_addr, 1921 .mac_tbl = &rtw8821c_mac_tbl, 1922 .agc_tbl = &rtw8821c_agc_tbl, 1923 .bb_tbl = &rtw8821c_bb_tbl, 1924 .rf_tbl = {&rtw8821c_rf_a_tbl}, 1925 .rfe_defs = rtw8821c_rfe_defs, 1926 .rfe_defs_size = ARRAY_SIZE(rtw8821c_rfe_defs), 1927 .rx_ldpc = false, 1928 .pwr_track_tbl = &rtw8821c_rtw_pwr_track_tbl, 1929 .iqk_threshold = 8, 1930 .bfer_su_max_num = 2, 1931 .bfer_mu_max_num = 1, 1932 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2, 1933 1934 .coex_para_ver = 0x19092746, 1935 .bt_desired_ver = 0x46, 1936 .scbd_support = true, 1937 .new_scbd10_def = false, 1938 .ble_hid_profile_support = false, 1939 .wl_mimo_ps_support = false, 1940 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 1941 .bt_rssi_type = COEX_BTRSSI_RATIO, 1942 .ant_isolation = 15, 1943 .rssi_tolerance = 2, 1944 .wl_rssi_step = wl_rssi_step_8821c, 1945 .bt_rssi_step = bt_rssi_step_8821c, 1946 .table_sant_num = ARRAY_SIZE(table_sant_8821c), 1947 .table_sant = table_sant_8821c, 1948 .table_nsant_num = ARRAY_SIZE(table_nsant_8821c), 1949 .table_nsant = table_nsant_8821c, 1950 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8821c), 1951 .tdma_sant = tdma_sant_8821c, 1952 .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8821c), 1953 .tdma_nsant = tdma_nsant_8821c, 1954 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8821c), 1955 .wl_rf_para_tx = rf_para_tx_8821c, 1956 .wl_rf_para_rx = rf_para_rx_8821c, 1957 .bt_afh_span_bw20 = 0x24, 1958 .bt_afh_span_bw40 = 0x36, 1959 .afh_5g_num = ARRAY_SIZE(afh_5g_8821c), 1960 .afh_5g = afh_5g_8821c, 1961 1962 .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8821c), 1963 .coex_info_hw_regs = coex_info_hw_regs_8821c, 1964 }; 1965 EXPORT_SYMBOL(rtw8821c_hw_spec); 1966 1967 MODULE_FIRMWARE("rtw88/rtw8821c_fw.bin"); 1968 1969 MODULE_AUTHOR("Realtek Corporation"); 1970 MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821c driver"); 1971 MODULE_LICENSE("Dual BSD/GPL"); 1972