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