Linux Audio

Check our new training course

Open-source upstreaming

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