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