gpio: rcar: Fix runtime PM imbalance on error
[linux/fpc-iii.git] / drivers / net / wireless / realtek / rtw88 / rtw8822b.c
blob4dd7d4143b045522001632795c5ed298aa619abf
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
3 */
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 "rtw8822b.h"
12 #include "rtw8822b_table.h"
13 #include "mac.h"
14 #include "reg.h"
15 #include "debug.h"
16 #include "bf.h"
18 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
19 u8 rx_path, bool is_tx2_path);
21 static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse,
22 struct rtw8822b_efuse *map)
24 ether_addr_copy(efuse->addr, map->e.mac_addr);
27 static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
29 struct rtw_efuse *efuse = &rtwdev->efuse;
30 struct rtw8822b_efuse *map;
31 int i;
33 map = (struct rtw8822b_efuse *)log_map;
35 efuse->rfe_option = map->rfe_option;
36 efuse->rf_board_option = map->rf_board_option;
37 efuse->crystal_cap = map->xtal_k;
38 efuse->pa_type_2g = map->pa_type;
39 efuse->pa_type_5g = map->pa_type;
40 efuse->lna_type_2g = map->lna_type_2g[0];
41 efuse->lna_type_5g = map->lna_type_5g[0];
42 efuse->channel_plan = map->channel_plan;
43 efuse->country_code[0] = map->country_code[0];
44 efuse->country_code[1] = map->country_code[1];
45 efuse->bt_setting = map->rf_bt_setting;
46 efuse->regd = map->rf_board_option & 0x7;
47 efuse->thermal_meter[RF_PATH_A] = map->thermal_meter;
48 efuse->thermal_meter_k = map->thermal_meter;
50 for (i = 0; i < 4; i++)
51 efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
53 switch (rtw_hci_type(rtwdev)) {
54 case RTW_HCI_TYPE_PCIE:
55 rtw8822be_efuse_parsing(efuse, map);
56 break;
57 default:
58 /* unsupported now */
59 return -ENOTSUPP;
62 return 0;
65 static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
67 /* chip top mux */
68 rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3);
69 rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0);
70 rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1);
72 /* from s0 or s1 */
73 rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
74 rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
76 /* input or output */
77 rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f);
78 rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3);
81 #define RTW_TXSCALE_SIZE 37
82 static const u32 rtw8822b_txscale_tbl[RTW_TXSCALE_SIZE] = {
83 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
84 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
85 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
86 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
89 static const u8 rtw8822b_get_swing_index(struct rtw_dev *rtwdev)
91 u8 i = 0;
92 u32 swing, table_value;
94 swing = rtw_read32_mask(rtwdev, 0xc1c, 0xffe00000);
95 for (i = 0; i < RTW_TXSCALE_SIZE; i++) {
96 table_value = rtw8822b_txscale_tbl[i];
97 if (swing == table_value)
98 break;
101 return i;
104 static void rtw8822b_pwrtrack_init(struct rtw_dev *rtwdev)
106 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
107 u8 swing_idx = rtw8822b_get_swing_index(rtwdev);
108 u8 path;
110 if (swing_idx >= RTW_TXSCALE_SIZE)
111 dm_info->default_ofdm_index = 24;
112 else
113 dm_info->default_ofdm_index = swing_idx;
115 for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
116 ewma_thermal_init(&dm_info->avg_thermal[path]);
117 dm_info->delta_power_index[path] = 0;
119 dm_info->pwr_trk_triggered = false;
120 dm_info->pwr_trk_init_trigger = true;
121 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
124 static void rtw8822b_phy_bf_init(struct rtw_dev *rtwdev)
126 rtw_bf_phy_init(rtwdev);
127 /* Grouping bitmap parameters */
128 rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF);
131 static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
133 struct rtw_hal *hal = &rtwdev->hal;
134 u8 crystal_cap;
135 bool is_tx2_path;
137 /* power on BB/RF domain */
138 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
139 BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
140 rtw_write8_set(rtwdev, REG_RF_CTRL,
141 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
142 rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
144 /* pre init before header files config */
145 rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
147 rtw_phy_load_tables(rtwdev);
149 crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
150 rtw_write32_mask(rtwdev, 0x24, 0x7e000000, crystal_cap);
151 rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap);
153 /* post init after header files config */
154 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
156 is_tx2_path = false;
157 rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
158 is_tx2_path);
159 rtw_phy_init(rtwdev);
161 rtw8822b_phy_rfe_init(rtwdev);
162 rtw8822b_pwrtrack_init(rtwdev);
164 rtw8822b_phy_bf_init(rtwdev);
167 #define WLAN_SLOT_TIME 0x09
168 #define WLAN_PIFS_TIME 0x19
169 #define WLAN_SIFS_CCK_CONT_TX 0xA
170 #define WLAN_SIFS_OFDM_CONT_TX 0xE
171 #define WLAN_SIFS_CCK_TRX 0x10
172 #define WLAN_SIFS_OFDM_TRX 0x10
173 #define WLAN_VO_TXOP_LIMIT 0x186 /* unit : 32us */
174 #define WLAN_VI_TXOP_LIMIT 0x3BC /* unit : 32us */
175 #define WLAN_RDG_NAV 0x05
176 #define WLAN_TXOP_NAV 0x1B
177 #define WLAN_CCK_RX_TSF 0x30
178 #define WLAN_OFDM_RX_TSF 0x30
179 #define WLAN_TBTT_PROHIBIT 0x04 /* unit : 32us */
180 #define WLAN_TBTT_HOLD_TIME 0x064 /* unit : 32us */
181 #define WLAN_DRV_EARLY_INT 0x04
182 #define WLAN_BCN_DMA_TIME 0x02
184 #define WLAN_RX_FILTER0 0x0FFFFFFF
185 #define WLAN_RX_FILTER2 0xFFFF
186 #define WLAN_RCR_CFG 0xE400220E
187 #define WLAN_RXPKT_MAX_SZ 12288
188 #define WLAN_RXPKT_MAX_SZ_512 (WLAN_RXPKT_MAX_SZ >> 9)
190 #define WLAN_AMPDU_MAX_TIME 0x70
191 #define WLAN_RTS_LEN_TH 0xFF
192 #define WLAN_RTS_TX_TIME_TH 0x08
193 #define WLAN_MAX_AGG_PKT_LIMIT 0x20
194 #define WLAN_RTS_MAX_AGG_PKT_LIMIT 0x20
195 #define FAST_EDCA_VO_TH 0x06
196 #define FAST_EDCA_VI_TH 0x06
197 #define FAST_EDCA_BE_TH 0x06
198 #define FAST_EDCA_BK_TH 0x06
199 #define WLAN_BAR_RETRY_LIMIT 0x01
200 #define WLAN_RA_TRY_RATE_AGG_LIMIT 0x08
202 #define WLAN_TX_FUNC_CFG1 0x30
203 #define WLAN_TX_FUNC_CFG2 0x30
204 #define WLAN_MAC_OPT_NORM_FUNC1 0x98
205 #define WLAN_MAC_OPT_LB_FUNC1 0x80
206 #define WLAN_MAC_OPT_FUNC2 0x30810041
208 #define WLAN_SIFS_CFG (WLAN_SIFS_CCK_CONT_TX | \
209 (WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
210 (WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
211 (WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
213 #define WLAN_TBTT_TIME (WLAN_TBTT_PROHIBIT |\
214 (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
216 #define WLAN_NAV_CFG (WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
217 #define WLAN_RX_TSF_CFG (WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
219 static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
221 u32 value32;
223 /* protocol configuration */
224 rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, BIT_PRE_TX_CMD);
225 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
226 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
227 value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
228 (WLAN_MAX_AGG_PKT_LIMIT << 16) |
229 (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
230 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
231 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
232 WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
233 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
234 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
235 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
236 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
237 /* EDCA configuration */
238 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
239 rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
240 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
241 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
242 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
243 rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
244 rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
245 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
246 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
247 /* Set beacon cotnrol - enable TSF and other related functions */
248 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
249 /* Set send beacon related registers */
250 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
251 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
252 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
253 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
254 /* WMAC configuration */
255 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
256 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
257 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
258 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
259 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
260 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
261 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
262 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
264 return 0;
267 static void rtw8822b_set_channel_rfe_efem(struct rtw_dev *rtwdev, u8 channel)
269 struct rtw_hal *hal = &rtwdev->hal;
271 if (IS_CH_2G_BAND(channel)) {
272 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x705770);
273 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
274 rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(4), 0);
275 } else {
276 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x177517);
277 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
278 rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(5), 0);
281 rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
283 if (hal->antenna_rx == BB_PATH_AB ||
284 hal->antenna_tx == BB_PATH_AB) {
285 /* 2TX or 2RX */
286 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
287 } else if (hal->antenna_rx == hal->antenna_tx) {
288 /* TXA+RXA or TXB+RXB */
289 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
290 } else {
291 /* TXB+RXA or TXA+RXB */
292 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
296 static void rtw8822b_set_channel_rfe_ifem(struct rtw_dev *rtwdev, u8 channel)
298 struct rtw_hal *hal = &rtwdev->hal;
300 if (IS_CH_2G_BAND(channel)) {
301 /* signal source */
302 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774);
303 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
304 } else {
305 /* signal source */
306 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x477547);
307 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
310 rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
312 if (IS_CH_2G_BAND(channel)) {
313 if (hal->antenna_rx == BB_PATH_AB ||
314 hal->antenna_tx == BB_PATH_AB) {
315 /* 2TX or 2RX */
316 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
317 } else if (hal->antenna_rx == hal->antenna_tx) {
318 /* TXA+RXA or TXB+RXB */
319 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
320 } else {
321 /* TXB+RXA or TXA+RXB */
322 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
324 } else {
325 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa5a5);
329 enum {
330 CCUT_IDX_1R_2G,
331 CCUT_IDX_2R_2G,
332 CCUT_IDX_1R_5G,
333 CCUT_IDX_2R_5G,
334 CCUT_IDX_NR,
337 struct cca_ccut {
338 u32 reg82c[CCUT_IDX_NR];
339 u32 reg830[CCUT_IDX_NR];
340 u32 reg838[CCUT_IDX_NR];
343 static const struct cca_ccut cca_ifem_ccut = {
344 {0x75C97010, 0x75C97010, 0x75C97010, 0x75C97010}, /*Reg82C*/
345 {0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
346 {0x87765541, 0x87746341, 0x87765541, 0x87746341}, /*Reg838*/
349 static const struct cca_ccut cca_efem_ccut = {
350 {0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010}, /*Reg82C*/
351 {0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa}, /*Reg830*/
352 {0x87766451, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
355 static const struct cca_ccut cca_ifem_ccut_ext = {
356 {0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010}, /*Reg82C*/
357 {0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
358 {0x87765541, 0x86666341, 0x87765561, 0x86666361}, /*Reg838*/
361 static void rtw8822b_get_cca_val(const struct cca_ccut *cca_ccut, u8 col,
362 u32 *reg82c, u32 *reg830, u32 *reg838)
364 *reg82c = cca_ccut->reg82c[col];
365 *reg830 = cca_ccut->reg830[col];
366 *reg838 = cca_ccut->reg838[col];
369 struct rtw8822b_rfe_info {
370 const struct cca_ccut *cca_ccut_2g;
371 const struct cca_ccut *cca_ccut_5g;
372 enum rtw_rfe_fem fem;
373 bool ifem_ext;
374 void (*rtw_set_channel_rfe)(struct rtw_dev *rtwdev, u8 channel);
377 #define I2GE5G_CCUT(set_ch) { \
378 .cca_ccut_2g = &cca_ifem_ccut, \
379 .cca_ccut_5g = &cca_efem_ccut, \
380 .fem = RTW_RFE_IFEM2G_EFEM5G, \
381 .ifem_ext = false, \
382 .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \
384 #define IFEM_EXT_CCUT(set_ch) { \
385 .cca_ccut_2g = &cca_ifem_ccut_ext, \
386 .cca_ccut_5g = &cca_ifem_ccut_ext, \
387 .fem = RTW_RFE_IFEM, \
388 .ifem_ext = true, \
389 .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \
392 static const struct rtw8822b_rfe_info rtw8822b_rfe_info[] = {
393 [2] = I2GE5G_CCUT(efem),
394 [3] = IFEM_EXT_CCUT(ifem),
395 [5] = IFEM_EXT_CCUT(ifem),
398 static void rtw8822b_set_channel_cca(struct rtw_dev *rtwdev, u8 channel, u8 bw,
399 const struct rtw8822b_rfe_info *rfe_info)
401 struct rtw_hal *hal = &rtwdev->hal;
402 struct rtw_efuse *efuse = &rtwdev->efuse;
403 const struct cca_ccut *cca_ccut;
404 u8 col;
405 u32 reg82c, reg830, reg838;
406 bool is_efem_cca = false, is_ifem_cca = false, is_rfe_type = false;
408 if (IS_CH_2G_BAND(channel)) {
409 cca_ccut = rfe_info->cca_ccut_2g;
411 if (hal->antenna_rx == BB_PATH_A ||
412 hal->antenna_rx == BB_PATH_B)
413 col = CCUT_IDX_1R_2G;
414 else
415 col = CCUT_IDX_2R_2G;
416 } else {
417 cca_ccut = rfe_info->cca_ccut_5g;
419 if (hal->antenna_rx == BB_PATH_A ||
420 hal->antenna_rx == BB_PATH_B)
421 col = CCUT_IDX_1R_5G;
422 else
423 col = CCUT_IDX_2R_5G;
426 rtw8822b_get_cca_val(cca_ccut, col, &reg82c, &reg830, &reg838);
428 switch (rfe_info->fem) {
429 case RTW_RFE_IFEM:
430 default:
431 is_ifem_cca = true;
432 if (rfe_info->ifem_ext)
433 is_rfe_type = true;
434 break;
435 case RTW_RFE_EFEM:
436 is_efem_cca = true;
437 break;
438 case RTW_RFE_IFEM2G_EFEM5G:
439 if (IS_CH_2G_BAND(channel))
440 is_ifem_cca = true;
441 else
442 is_efem_cca = true;
443 break;
446 if (is_ifem_cca) {
447 if ((hal->cut_version == RTW_CHIP_VER_CUT_B &&
448 (col == CCUT_IDX_2R_2G || col == CCUT_IDX_2R_5G) &&
449 bw == RTW_CHANNEL_WIDTH_40) ||
450 (!is_rfe_type && col == CCUT_IDX_2R_5G &&
451 bw == RTW_CHANNEL_WIDTH_40) ||
452 (efuse->rfe_option == 5 && col == CCUT_IDX_2R_5G))
453 reg830 = 0x79a0ea28;
456 rtw_write32_mask(rtwdev, REG_CCASEL, MASKDWORD, reg82c);
457 rtw_write32_mask(rtwdev, REG_PDMFTH, MASKDWORD, reg830);
458 rtw_write32_mask(rtwdev, REG_CCA2ND, MASKDWORD, reg838);
460 if (is_efem_cca && !(hal->cut_version == RTW_CHIP_VER_CUT_B))
461 rtw_write32_mask(rtwdev, REG_L1WT, MASKDWORD, 0x9194b2b9);
463 if (bw == RTW_CHANNEL_WIDTH_20 && IS_CH_5G_BAND_MID(channel))
464 rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0, 0x4);
467 static const u8 low_band[15] = {0x7, 0x6, 0x6, 0x5, 0x0, 0x0, 0x7, 0xff, 0x6,
468 0x5, 0x0, 0x0, 0x7, 0x6, 0x6};
469 static const u8 middle_band[23] = {0x6, 0x5, 0x0, 0x0, 0x7, 0x6, 0x6, 0xff, 0x0,
470 0x0, 0x7, 0x6, 0x6, 0x5, 0x0, 0xff, 0x7, 0x6,
471 0x6, 0x5, 0x0, 0x0, 0x7};
472 static const u8 high_band[15] = {0x5, 0x5, 0x0, 0x7, 0x7, 0x6, 0x5, 0xff, 0x0,
473 0x7, 0x7, 0x6, 0x5, 0x5, 0x0};
475 static void rtw8822b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
477 #define RF18_BAND_MASK (BIT(16) | BIT(9) | BIT(8))
478 #define RF18_BAND_2G (0)
479 #define RF18_BAND_5G (BIT(16) | BIT(8))
480 #define RF18_CHANNEL_MASK (MASKBYTE0)
481 #define RF18_RFSI_MASK (BIT(18) | BIT(17))
482 #define RF18_RFSI_GE_CH80 (BIT(17))
483 #define RF18_RFSI_GT_CH144 (BIT(18))
484 #define RF18_BW_MASK (BIT(11) | BIT(10))
485 #define RF18_BW_20M (BIT(11) | BIT(10))
486 #define RF18_BW_40M (BIT(11))
487 #define RF18_BW_80M (BIT(10))
488 #define RFBE_MASK (BIT(17) | BIT(16) | BIT(15))
490 struct rtw_hal *hal = &rtwdev->hal;
491 u32 rf_reg18, rf_reg_be;
493 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
495 rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
496 RF18_BW_MASK);
498 rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G);
499 rf_reg18 |= (channel & RF18_CHANNEL_MASK);
500 if (channel > 144)
501 rf_reg18 |= RF18_RFSI_GT_CH144;
502 else if (channel >= 80)
503 rf_reg18 |= RF18_RFSI_GE_CH80;
505 switch (bw) {
506 case RTW_CHANNEL_WIDTH_5:
507 case RTW_CHANNEL_WIDTH_10:
508 case RTW_CHANNEL_WIDTH_20:
509 default:
510 rf_reg18 |= RF18_BW_20M;
511 break;
512 case RTW_CHANNEL_WIDTH_40:
513 rf_reg18 |= RF18_BW_40M;
514 break;
515 case RTW_CHANNEL_WIDTH_80:
516 rf_reg18 |= RF18_BW_80M;
517 break;
520 if (IS_CH_2G_BAND(channel))
521 rf_reg_be = 0x0;
522 else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
523 rf_reg_be = low_band[(channel - 36) >> 1];
524 else if (IS_CH_5G_BAND_3(channel))
525 rf_reg_be = middle_band[(channel - 100) >> 1];
526 else if (IS_CH_5G_BAND_4(channel))
527 rf_reg_be = high_band[(channel - 149) >> 1];
528 else
529 goto err;
531 rtw_write_rf(rtwdev, RF_PATH_A, RF_MALSEL, RFBE_MASK, rf_reg_be);
533 /* need to set 0xdf[18]=1 before writing RF18 when channel 144 */
534 if (channel == 144)
535 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x1);
536 else
537 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x0);
539 rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18);
540 if (hal->rf_type > RF_1T1R)
541 rtw_write_rf(rtwdev, RF_PATH_B, 0x18, RFREG_MASK, rf_reg18);
543 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0);
544 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1);
546 return;
548 err:
549 WARN_ON(1);
552 static void rtw8822b_toggle_igi(struct rtw_dev *rtwdev)
554 struct rtw_hal *hal = &rtwdev->hal;
555 u32 igi;
557 igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f);
558 rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi - 2);
559 rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi);
560 rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi - 2);
561 rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi);
563 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 0x0);
564 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0,
565 hal->antenna_rx | (hal->antenna_rx << 4));
568 static void rtw8822b_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
570 if (bw == RTW_CHANNEL_WIDTH_40) {
571 /* RX DFIR for BW40 */
572 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x1);
573 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x0);
574 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
575 } else if (bw == RTW_CHANNEL_WIDTH_80) {
576 /* RX DFIR for BW80 */
577 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
578 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1);
579 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
580 } else {
581 /* RX DFIR for BW20, BW10 and BW5*/
582 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
583 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
584 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1);
588 static void rtw8822b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
589 u8 primary_ch_idx)
591 struct rtw_efuse *efuse = &rtwdev->efuse;
592 u8 rfe_option = efuse->rfe_option;
593 u32 val32;
595 if (IS_CH_2G_BAND(channel)) {
596 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1);
597 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0);
598 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0);
599 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
601 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x0);
602 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
603 if (channel == 14) {
604 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x00006577);
605 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
606 } else {
607 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x384f6577);
608 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x1525);
611 rtw_write32_mask(rtwdev, REG_RFEINV, 0x300, 0x2);
612 } else if (IS_CH_5G_BAND(channel)) {
613 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
614 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
615 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
616 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 34);
618 if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
619 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x1);
620 else if (IS_CH_5G_BAND_3(channel))
621 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x2);
622 else if (IS_CH_5G_BAND_4(channel))
623 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x3);
625 if (IS_CH_5G_BAND_1(channel))
626 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
627 else if (IS_CH_5G_BAND_2(channel))
628 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
629 else if (channel >= 100 && channel <= 116)
630 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
631 else if (channel >= 118 && channel <= 177)
632 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
634 rtw_write32_mask(rtwdev, 0xcbc, 0x300, 0x1);
637 switch (bw) {
638 case RTW_CHANNEL_WIDTH_20:
639 default:
640 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
641 val32 &= 0xFFCFFC00;
642 val32 |= (RTW_CHANNEL_WIDTH_20);
643 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
645 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
646 break;
647 case RTW_CHANNEL_WIDTH_40:
648 if (primary_ch_idx == RTW_SC_20_UPPER)
649 rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
650 else
651 rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
653 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
654 val32 &= 0xFF3FF300;
655 val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_40);
656 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
658 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
659 break;
660 case RTW_CHANNEL_WIDTH_80:
661 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
662 val32 &= 0xFCEFCF00;
663 val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_80);
664 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
666 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
668 if (rfe_option == 2 || rfe_option == 3) {
669 rtw_write32_mask(rtwdev, REG_L1PKWT, 0x0000f000, 0x6);
670 rtw_write32_mask(rtwdev, REG_ADC40, BIT(10), 0x1);
672 break;
673 case RTW_CHANNEL_WIDTH_5:
674 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
675 val32 &= 0xEFEEFE00;
676 val32 |= ((BIT(6) | RTW_CHANNEL_WIDTH_20));
677 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
679 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
680 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
681 break;
682 case RTW_CHANNEL_WIDTH_10:
683 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
684 val32 &= 0xEFFEFF00;
685 val32 |= ((BIT(7) | RTW_CHANNEL_WIDTH_20));
686 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
688 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
689 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
690 break;
694 static void rtw8822b_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
695 u8 primary_chan_idx)
697 struct rtw_efuse *efuse = &rtwdev->efuse;
698 const struct rtw8822b_rfe_info *rfe_info;
700 if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
701 "rfe_option %d is out of boundary\n", efuse->rfe_option))
702 return;
704 rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
706 rtw8822b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
707 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
708 rtw8822b_set_channel_rf(rtwdev, channel, bw);
709 rtw8822b_set_channel_rxdfir(rtwdev, bw);
710 rtw8822b_toggle_igi(rtwdev);
711 rtw8822b_set_channel_cca(rtwdev, channel, bw, rfe_info);
712 (*rfe_info->rtw_set_channel_rfe)(rtwdev, channel);
715 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
716 u8 rx_path, bool is_tx2_path)
718 struct rtw_efuse *efuse = &rtwdev->efuse;
719 const struct rtw8822b_rfe_info *rfe_info;
720 u8 ch = rtwdev->hal.current_channel;
721 u8 tx_path_sel, rx_path_sel;
722 int counter;
724 if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
725 "rfe_option %d is out of boundary\n", efuse->rfe_option))
726 return;
728 rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
730 if ((tx_path | rx_path) & BB_PATH_A)
731 rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x3231);
732 else
733 rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x1111);
735 if ((tx_path | rx_path) & BB_PATH_B)
736 rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x3231);
737 else
738 rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x1111);
740 rtw_write32_mask(rtwdev, REG_CDDTXP, (BIT(19) | BIT(18)), 0x3);
741 rtw_write32_mask(rtwdev, REG_TXPSEL, (BIT(29) | BIT(28)), 0x1);
742 rtw_write32_mask(rtwdev, REG_TXPSEL, BIT(30), 0x1);
744 if (tx_path & BB_PATH_A) {
745 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x001);
746 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x8);
747 } else if (tx_path & BB_PATH_B) {
748 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x002);
749 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x4);
752 if (tx_path == BB_PATH_A || tx_path == BB_PATH_B)
753 rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x01);
754 else
755 rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x43);
757 tx_path_sel = (tx_path << 4) | tx_path;
758 rtw_write32_mask(rtwdev, REG_TXPSEL, MASKBYTE0, tx_path_sel);
760 if (tx_path != BB_PATH_A && tx_path != BB_PATH_B) {
761 if (is_tx2_path || rtwdev->mp_mode) {
762 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x043);
763 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0xc);
767 rtw_write32_mask(rtwdev, REG_RXDESC, BIT(22), 0x0);
768 rtw_write32_mask(rtwdev, REG_RXDESC, BIT(18), 0x0);
770 if (rx_path & BB_PATH_A)
771 rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x0);
772 else if (rx_path & BB_PATH_B)
773 rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x5);
775 rx_path_sel = (rx_path << 4) | rx_path;
776 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, rx_path_sel);
778 if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
779 rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x0);
780 rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x0);
781 rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x0);
782 } else {
783 rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x1);
784 rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x1);
785 rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x1);
788 for (counter = 100; counter > 0; counter--) {
789 u32 rf_reg33;
791 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
792 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
794 udelay(2);
795 rf_reg33 = rtw_read_rf(rtwdev, RF_PATH_A, 0x33, RFREG_MASK);
797 if (rf_reg33 == 0x00001)
798 break;
801 if (WARN(counter <= 0, "write RF mode table fail\n"))
802 return;
804 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
805 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
806 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x00034);
807 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x4080c);
808 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
809 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
811 rtw8822b_toggle_igi(rtwdev);
812 rtw8822b_set_channel_cca(rtwdev, 1, RTW_CHANNEL_WIDTH_20, rfe_info);
813 (*rfe_info->rtw_set_channel_rfe)(rtwdev, ch);
816 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
817 struct rtw_rx_pkt_stat *pkt_stat)
819 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
820 s8 min_rx_power = -120;
821 u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
823 /* 8822B uses only 1 antenna to RX CCK rates */
824 pkt_stat->rx_power[RF_PATH_A] = pwdb - 110;
825 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
826 pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
827 pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
828 min_rx_power);
829 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
832 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
833 struct rtw_rx_pkt_stat *pkt_stat)
835 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
836 u8 rxsc, bw;
837 s8 min_rx_power = -120;
838 s8 rx_evm;
839 u8 evm_dbm = 0;
840 u8 rssi;
841 int path;
843 if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
844 rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
845 else
846 rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
848 if (rxsc >= 1 && rxsc <= 8)
849 bw = RTW_CHANNEL_WIDTH_20;
850 else if (rxsc >= 9 && rxsc <= 12)
851 bw = RTW_CHANNEL_WIDTH_40;
852 else if (rxsc >= 13)
853 bw = RTW_CHANNEL_WIDTH_80;
854 else
855 bw = GET_PHY_STAT_P1_RF_MODE(phy_status);
857 pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
858 pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
859 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
860 pkt_stat->bw = bw;
861 pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
862 pkt_stat->rx_power[RF_PATH_B],
863 min_rx_power);
865 dm_info->curr_rx_rate = pkt_stat->rate;
867 pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
868 pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status);
870 pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
871 pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status);
873 pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
874 pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status);
876 for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
877 rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
878 dm_info->rssi[path] = rssi;
879 dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
880 dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
882 rx_evm = pkt_stat->rx_evm[path];
884 if (rx_evm < 0) {
885 if (rx_evm == S8_MIN)
886 evm_dbm = 0;
887 else
888 evm_dbm = ((u8)-rx_evm >> 1);
890 dm_info->rx_evm_dbm[path] = evm_dbm;
894 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
895 struct rtw_rx_pkt_stat *pkt_stat)
897 u8 page;
899 page = *phy_status & 0xf;
901 switch (page) {
902 case 0:
903 query_phy_status_page0(rtwdev, phy_status, pkt_stat);
904 break;
905 case 1:
906 query_phy_status_page1(rtwdev, phy_status, pkt_stat);
907 break;
908 default:
909 rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
910 return;
914 static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
915 struct rtw_rx_pkt_stat *pkt_stat,
916 struct ieee80211_rx_status *rx_status)
918 struct ieee80211_hdr *hdr;
919 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
920 u8 *phy_status = NULL;
922 memset(pkt_stat, 0, sizeof(*pkt_stat));
924 pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
925 pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
926 pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
927 pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
928 GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
929 pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
930 pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
931 pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
932 pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
933 pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
934 pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
935 pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
936 pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
938 /* drv_info_sz is in unit of 8-bytes */
939 pkt_stat->drv_info_sz *= 8;
941 /* c2h cmd pkt's rx/phy status is not interested */
942 if (pkt_stat->is_c2h)
943 return;
945 hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
946 pkt_stat->drv_info_sz);
947 if (pkt_stat->phy_status) {
948 phy_status = rx_desc + desc_sz + pkt_stat->shift;
949 query_phy_status(rtwdev, phy_status, pkt_stat);
952 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
955 static void
956 rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
958 struct rtw_hal *hal = &rtwdev->hal;
959 static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
960 static u32 phy_pwr_idx;
961 u8 rate, rate_idx, pwr_index, shift;
962 int j;
964 for (j = 0; j < rtw_rate_size[rs]; j++) {
965 rate = rtw_rate_section[rs][j];
966 pwr_index = hal->tx_pwr_tbl[path][rate];
967 shift = rate & 0x3;
968 phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
969 if (shift == 0x3) {
970 rate_idx = rate & 0xfc;
971 rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
972 phy_pwr_idx);
973 phy_pwr_idx = 0;
978 static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
980 struct rtw_hal *hal = &rtwdev->hal;
981 int rs, path;
983 for (path = 0; path < hal->rf_path_num; path++) {
984 for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
985 rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
989 static bool rtw8822b_check_rf_path(u8 antenna)
991 switch (antenna) {
992 case BB_PATH_A:
993 case BB_PATH_B:
994 case BB_PATH_AB:
995 return true;
996 default:
997 return false;
1001 static void rtw8822b_set_antenna(struct rtw_dev *rtwdev, u8 antenna_tx,
1002 u8 antenna_rx)
1004 struct rtw_hal *hal = &rtwdev->hal;
1006 rtw_dbg(rtwdev, RTW_DBG_PHY, "config RF path, tx=0x%x rx=0x%x\n",
1007 antenna_tx, antenna_rx);
1009 if (!rtw8822b_check_rf_path(antenna_tx)) {
1010 rtw_info(rtwdev, "unsupport tx path, set to default path ab\n");
1011 antenna_tx = BB_PATH_AB;
1013 if (!rtw8822b_check_rf_path(antenna_rx)) {
1014 rtw_info(rtwdev, "unsupport rx path, set to default path ab\n");
1015 antenna_rx = BB_PATH_AB;
1017 hal->antenna_tx = antenna_tx;
1018 hal->antenna_rx = antenna_rx;
1019 rtw8822b_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
1022 static void rtw8822b_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
1024 u8 ldo_pwr;
1026 ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
1027 ldo_pwr = enable ? ldo_pwr | BIT(7) : ldo_pwr & ~BIT(7);
1028 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
1031 static void rtw8822b_false_alarm_statistics(struct rtw_dev *rtwdev)
1033 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1034 u32 cck_enable;
1035 u32 cck_fa_cnt;
1036 u32 ofdm_fa_cnt;
1037 u32 crc32_cnt;
1038 u32 cca32_cnt;
1040 cck_enable = rtw_read32(rtwdev, 0x808) & BIT(28);
1041 cck_fa_cnt = rtw_read16(rtwdev, 0xa5c);
1042 ofdm_fa_cnt = rtw_read16(rtwdev, 0xf48);
1044 dm_info->cck_fa_cnt = cck_fa_cnt;
1045 dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
1046 dm_info->total_fa_cnt = ofdm_fa_cnt;
1047 dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
1049 crc32_cnt = rtw_read32(rtwdev, 0xf04);
1050 dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
1051 dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1052 crc32_cnt = rtw_read32(rtwdev, 0xf14);
1053 dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
1054 dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1055 crc32_cnt = rtw_read32(rtwdev, 0xf10);
1056 dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
1057 dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1058 crc32_cnt = rtw_read32(rtwdev, 0xf0c);
1059 dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
1060 dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1062 cca32_cnt = rtw_read32(rtwdev, 0xf08);
1063 dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16);
1064 dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
1065 if (cck_enable) {
1066 cca32_cnt = rtw_read32(rtwdev, 0xfcc);
1067 dm_info->cck_cca_cnt = cca32_cnt & 0xffff;
1068 dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
1071 rtw_write32_set(rtwdev, 0x9a4, BIT(17));
1072 rtw_write32_clr(rtwdev, 0x9a4, BIT(17));
1073 rtw_write32_clr(rtwdev, 0xa2c, BIT(15));
1074 rtw_write32_set(rtwdev, 0xa2c, BIT(15));
1075 rtw_write32_set(rtwdev, 0xb58, BIT(0));
1076 rtw_write32_clr(rtwdev, 0xb58, BIT(0));
1079 static void rtw8822b_do_iqk(struct rtw_dev *rtwdev)
1081 static int do_iqk_cnt;
1082 struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
1083 u32 rf_reg, iqk_fail_mask;
1084 int counter;
1085 bool reload;
1087 rtw_fw_do_iqk(rtwdev, &para);
1089 for (counter = 0; counter < 300; counter++) {
1090 rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
1091 if (rf_reg == 0xabcde)
1092 break;
1093 msleep(20);
1095 rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
1097 reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
1098 iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
1099 rtw_dbg(rtwdev, RTW_DBG_PHY,
1100 "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
1101 counter, reload, ++do_iqk_cnt, iqk_fail_mask);
1104 static void rtw8822b_phy_calibration(struct rtw_dev *rtwdev)
1106 rtw8822b_do_iqk(rtwdev);
1109 static void rtw8822b_coex_cfg_init(struct rtw_dev *rtwdev)
1111 /* enable TBTT nterrupt */
1112 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1114 /* BT report packet sample rate */
1115 /* 0x790[5:0]=0x5 */
1116 rtw_write8_set(rtwdev, REG_BT_TDMA_TIME, 0x05);
1118 /* enable BT counter statistics */
1119 rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1121 /* enable PTA (3-wire function form BT side) */
1122 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
1123 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_AOD_GPIO3);
1125 /* enable PTA (tx/rx signal form WiFi side) */
1126 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1127 /* wl tx signal to PTA not case EDCCA */
1128 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
1129 /* GNT_BT=1 while select both */
1130 rtw_write8_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
1133 static void rtw8822b_coex_cfg_ant_switch(struct rtw_dev *rtwdev,
1134 u8 ctrl_type, u8 pos_type)
1136 struct rtw_coex *coex = &rtwdev->coex;
1137 struct rtw_coex_dm *coex_dm = &coex->dm;
1138 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1139 bool polarity_inverse;
1140 u8 regval = 0;
1142 if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status)
1143 return;
1145 coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type;
1147 if (coex_rfe->ant_switch_diversity &&
1148 ctrl_type == COEX_SWITCH_CTRL_BY_BBSW)
1149 ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV;
1151 polarity_inverse = (coex_rfe->ant_switch_polarity == 1);
1153 switch (ctrl_type) {
1154 default:
1155 case COEX_SWITCH_CTRL_BY_BBSW:
1156 /* 0x4c[23] = 0 */
1157 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1158 /* 0x4c[24] = 1 */
1159 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1160 /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
1161 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x77);
1163 if (pos_type == COEX_SWITCH_TO_WLG_BT) {
1164 if (coex_rfe->rfe_module_type != 0x4 &&
1165 coex_rfe->rfe_module_type != 0x2)
1166 regval = 0x3;
1167 else
1168 regval = (!polarity_inverse ? 0x2 : 0x1);
1169 } else if (pos_type == COEX_SWITCH_TO_WLG) {
1170 regval = (!polarity_inverse ? 0x2 : 0x1);
1171 } else {
1172 regval = (!polarity_inverse ? 0x1 : 0x2);
1175 rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1176 break;
1177 case COEX_SWITCH_CTRL_BY_PTA:
1178 /* 0x4c[23] = 0 */
1179 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1180 /* 0x4c[24] = 1 */
1181 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1182 /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
1183 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x66);
1185 regval = (!polarity_inverse ? 0x2 : 0x1);
1186 rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1187 break;
1188 case COEX_SWITCH_CTRL_BY_ANTDIV:
1189 /* 0x4c[23] = 0 */
1190 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1191 /* 0x4c[24] = 1 */
1192 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1193 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x88);
1194 break;
1195 case COEX_SWITCH_CTRL_BY_MAC:
1196 /* 0x4c[23] = 1 */
1197 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x1);
1199 regval = (!polarity_inverse ? 0x0 : 0x1);
1200 rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, regval);
1201 break;
1202 case COEX_SWITCH_CTRL_BY_FW:
1203 /* 0x4c[23] = 0 */
1204 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1205 /* 0x4c[24] = 1 */
1206 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1207 break;
1208 case COEX_SWITCH_CTRL_BY_BT:
1209 /* 0x4c[23] = 0 */
1210 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1211 /* 0x4c[24] = 0 */
1212 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x0);
1213 break;
1217 static void rtw8822b_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1221 static void rtw8822b_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1223 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0);
1224 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0);
1225 rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0);
1226 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0);
1227 rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0);
1230 static void rtw8822b_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1232 struct rtw_coex *coex = &rtwdev->coex;
1233 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1234 struct rtw_efuse *efuse = &rtwdev->efuse;
1235 bool is_ext_fem = false;
1237 coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1238 coex_rfe->ant_switch_polarity = 0;
1239 coex_rfe->ant_switch_diversity = false;
1240 if (coex_rfe->rfe_module_type == 0x12 ||
1241 coex_rfe->rfe_module_type == 0x15 ||
1242 coex_rfe->rfe_module_type == 0x16)
1243 coex_rfe->ant_switch_exist = false;
1244 else
1245 coex_rfe->ant_switch_exist = true;
1247 if (coex_rfe->rfe_module_type == 2 ||
1248 coex_rfe->rfe_module_type == 4) {
1249 rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, true);
1250 is_ext_fem = true;
1251 } else {
1252 rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, false);
1255 coex_rfe->wlg_at_btg = false;
1257 if (efuse->share_ant &&
1258 coex_rfe->ant_switch_exist && !is_ext_fem)
1259 coex_rfe->ant_switch_with_bt = true;
1260 else
1261 coex_rfe->ant_switch_with_bt = false;
1263 /* Ext switch buffer mux */
1264 rtw_write8(rtwdev, REG_RFE_CTRL_E, 0xff);
1265 rtw_write8_mask(rtwdev, REG_RFESEL_CTRL + 1, 0x3, 0x0);
1266 rtw_write8_mask(rtwdev, REG_RFE_INV16, BIT_RFE_BUF_EN, 0x0);
1268 /* Disable LTE Coex Function in WiFi side */
1269 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0);
1271 /* BTC_CTT_WL_VS_LTE */
1272 rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1274 /* BTC_CTT_BT_VS_LTE */
1275 rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1278 static void rtw8822b_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1280 struct rtw_coex *coex = &rtwdev->coex;
1281 struct rtw_coex_dm *coex_dm = &coex->dm;
1282 static const u16 reg_addr[] = {0xc58, 0xe58};
1283 static const u8 wl_tx_power[] = {0xd8, 0xd4, 0xd0, 0xcc, 0xc8};
1284 u8 i, pwr;
1286 if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1287 return;
1289 coex_dm->cur_wl_pwr_lvl = wl_pwr;
1291 if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1292 coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1294 pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1296 for (i = 0; i < ARRAY_SIZE(reg_addr); i++)
1297 rtw_write8_mask(rtwdev, reg_addr[i], 0xff, pwr);
1300 static void rtw8822b_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1302 struct rtw_coex *coex = &rtwdev->coex;
1303 struct rtw_coex_dm *coex_dm = &coex->dm;
1304 /* WL Rx Low gain on */
1305 static const u32 wl_rx_low_gain_on[] = {
1306 0xff000003, 0xbd120003, 0xbe100003, 0xbf080003, 0xbf060003,
1307 0xbf050003, 0xbc140003, 0xbb160003, 0xba180003, 0xb91a0003,
1308 0xb81c0003, 0xb71e0003, 0xb4200003, 0xb5220003, 0xb4240003,
1309 0xb3260003, 0xb2280003, 0xb12a0003, 0xb02c0003, 0xaf2e0003,
1310 0xae300003, 0xad320003, 0xac340003, 0xab360003, 0x8d380003,
1311 0x8c3a0003, 0x8b3c0003, 0x8a3e0003, 0x6e400003, 0x6d420003,
1312 0x6c440003, 0x6b460003, 0x6a480003, 0x694a0003, 0x684c0003,
1313 0x674e0003, 0x66500003, 0x65520003, 0x64540003, 0x64560003,
1314 0x007e0403
1317 /* WL Rx Low gain off */
1318 static const u32 wl_rx_low_gain_off[] = {
1319 0xff000003, 0xf4120003, 0xf5100003, 0xf60e0003, 0xf70c0003,
1320 0xf80a0003, 0xf3140003, 0xf2160003, 0xf1180003, 0xf01a0003,
1321 0xef1c0003, 0xee1e0003, 0xed200003, 0xec220003, 0xeb240003,
1322 0xea260003, 0xe9280003, 0xe82a0003, 0xe72c0003, 0xe62e0003,
1323 0xe5300003, 0xc8320003, 0xc7340003, 0xc6360003, 0xc5380003,
1324 0xc43a0003, 0xc33c0003, 0xc23e0003, 0xc1400003, 0xc0420003,
1325 0xa5440003, 0xa4460003, 0xa3480003, 0xa24a0003, 0xa14c0003,
1326 0x834e0003, 0x82500003, 0x81520003, 0x80540003, 0x65560003,
1327 0x007e0403
1329 u8 i;
1331 if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1332 return;
1334 coex_dm->cur_wl_rx_low_gain_en = low_gain;
1336 if (coex_dm->cur_wl_rx_low_gain_en) {
1337 for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1338 rtw_write32(rtwdev, REG_RX_GAIN_EN, wl_rx_low_gain_on[i]);
1340 /* set Rx filter corner RCK offset */
1341 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x1);
1342 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x3f);
1343 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x1);
1344 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x3f);
1345 } else {
1346 for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1347 rtw_write32(rtwdev, 0x81c, wl_rx_low_gain_off[i]);
1349 /* set Rx filter corner RCK offset */
1350 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x4);
1351 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x0);
1352 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x4);
1353 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x0);
1357 static void rtw8822b_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path,
1358 u8 tx_pwr_idx_offset,
1359 s8 *txagc_idx, u8 *swing_idx)
1361 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1362 s8 delta_pwr_idx = dm_info->delta_power_index[path];
1363 u8 swing_upper_bound = dm_info->default_ofdm_index + 10;
1364 u8 swing_lower_bound = 0;
1365 u8 max_tx_pwr_idx_offset = 0xf;
1366 s8 agc_index = 0;
1367 u8 swing_index = dm_info->default_ofdm_index;
1369 tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset);
1371 if (delta_pwr_idx >= 0) {
1372 if (delta_pwr_idx <= tx_pwr_idx_offset) {
1373 agc_index = delta_pwr_idx;
1374 swing_index = dm_info->default_ofdm_index;
1375 } else if (delta_pwr_idx > tx_pwr_idx_offset) {
1376 agc_index = tx_pwr_idx_offset;
1377 swing_index = dm_info->default_ofdm_index +
1378 delta_pwr_idx - tx_pwr_idx_offset;
1379 swing_index = min_t(u8, swing_index, swing_upper_bound);
1381 } else {
1382 if (dm_info->default_ofdm_index > abs(delta_pwr_idx))
1383 swing_index =
1384 dm_info->default_ofdm_index + delta_pwr_idx;
1385 else
1386 swing_index = swing_lower_bound;
1387 swing_index = max_t(u8, swing_index, swing_lower_bound);
1389 agc_index = 0;
1392 if (swing_index >= RTW_TXSCALE_SIZE) {
1393 rtw_warn(rtwdev, "swing index overflow\n");
1394 swing_index = RTW_TXSCALE_SIZE - 1;
1396 *txagc_idx = agc_index;
1397 *swing_idx = swing_index;
1400 static void rtw8822b_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path,
1401 u8 pwr_idx_offset)
1403 s8 txagc_idx;
1404 u8 swing_idx;
1405 u32 reg1, reg2;
1407 if (path == RF_PATH_A) {
1408 reg1 = 0xc94;
1409 reg2 = 0xc1c;
1410 } else if (path == RF_PATH_B) {
1411 reg1 = 0xe94;
1412 reg2 = 0xe1c;
1413 } else {
1414 return;
1417 rtw8822b_txagc_swing_offset(rtwdev, path, pwr_idx_offset,
1418 &txagc_idx, &swing_idx);
1419 rtw_write32_mask(rtwdev, reg1, GENMASK(29, 25), txagc_idx);
1420 rtw_write32_mask(rtwdev, reg2, GENMASK(31, 21),
1421 rtw8822b_txscale_tbl[swing_idx]);
1424 static void rtw8822b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1426 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1427 u8 pwr_idx_offset, tx_pwr_idx;
1428 u8 channel = rtwdev->hal.current_channel;
1429 u8 band_width = rtwdev->hal.current_band_width;
1430 u8 regd = rtwdev->regd.txpwr_regd;
1431 u8 tx_rate = dm_info->tx_rate;
1432 u8 max_pwr_idx = rtwdev->chip->max_power_index;
1434 tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate,
1435 band_width, channel, regd);
1437 tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx);
1439 pwr_idx_offset = max_pwr_idx - tx_pwr_idx;
1441 rtw8822b_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset);
1444 static void rtw8822b_phy_pwrtrack_path(struct rtw_dev *rtwdev,
1445 struct rtw_swing_table *swing_table,
1446 u8 path)
1448 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1449 u8 power_idx_cur, power_idx_last;
1450 u8 delta;
1452 /* 8822B only has one thermal meter at PATH A */
1453 delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1455 power_idx_last = dm_info->delta_power_index[path];
1456 power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table,
1457 path, RF_PATH_A, delta);
1459 /* if delta of power indexes are the same, just skip */
1460 if (power_idx_cur == power_idx_last)
1461 return;
1463 dm_info->delta_power_index[path] = power_idx_cur;
1464 rtw8822b_pwrtrack_set(rtwdev, path);
1467 static void rtw8822b_phy_pwrtrack(struct rtw_dev *rtwdev)
1469 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1470 struct rtw_swing_table swing_table;
1471 u8 thermal_value, path;
1473 rtw_phy_config_swing_table(rtwdev, &swing_table);
1475 if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff)
1476 return;
1478 thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1480 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1482 if (dm_info->pwr_trk_init_trigger)
1483 dm_info->pwr_trk_init_trigger = false;
1484 else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1485 RF_PATH_A))
1486 goto iqk;
1488 for (path = 0; path < rtwdev->hal.rf_path_num; path++)
1489 rtw8822b_phy_pwrtrack_path(rtwdev, &swing_table, path);
1491 iqk:
1492 if (rtw_phy_pwrtrack_need_iqk(rtwdev))
1493 rtw8822b_do_iqk(rtwdev);
1496 static void rtw8822b_pwr_track(struct rtw_dev *rtwdev)
1498 struct rtw_efuse *efuse = &rtwdev->efuse;
1499 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1501 if (efuse->power_track_type != 0)
1502 return;
1504 if (!dm_info->pwr_trk_triggered) {
1505 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1506 GENMASK(17, 16), 0x03);
1507 dm_info->pwr_trk_triggered = true;
1508 return;
1511 rtw8822b_phy_pwrtrack(rtwdev);
1512 dm_info->pwr_trk_triggered = false;
1515 static void rtw8822b_bf_config_bfee_su(struct rtw_dev *rtwdev,
1516 struct rtw_vif *vif,
1517 struct rtw_bfee *bfee, bool enable)
1519 if (enable)
1520 rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
1521 else
1522 rtw_bf_remove_bfee_su(rtwdev, bfee);
1525 static void rtw8822b_bf_config_bfee_mu(struct rtw_dev *rtwdev,
1526 struct rtw_vif *vif,
1527 struct rtw_bfee *bfee, bool enable)
1529 if (enable)
1530 rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
1531 else
1532 rtw_bf_remove_bfee_mu(rtwdev, bfee);
1535 static void rtw8822b_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
1536 struct rtw_bfee *bfee, bool enable)
1538 if (bfee->role == RTW_BFEE_SU)
1539 rtw8822b_bf_config_bfee_su(rtwdev, vif, bfee, enable);
1540 else if (bfee->role == RTW_BFEE_MU)
1541 rtw8822b_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
1542 else
1543 rtw_warn(rtwdev, "wrong bfee role\n");
1546 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = {
1547 {0x0086,
1548 RTW_PWR_CUT_ALL_MSK,
1549 RTW_PWR_INTF_SDIO_MSK,
1550 RTW_PWR_ADDR_SDIO,
1551 RTW_PWR_CMD_WRITE, BIT(0), 0},
1552 {0x0086,
1553 RTW_PWR_CUT_ALL_MSK,
1554 RTW_PWR_INTF_SDIO_MSK,
1555 RTW_PWR_ADDR_SDIO,
1556 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1557 {0x004A,
1558 RTW_PWR_CUT_ALL_MSK,
1559 RTW_PWR_INTF_USB_MSK,
1560 RTW_PWR_ADDR_MAC,
1561 RTW_PWR_CMD_WRITE, BIT(0), 0},
1562 {0x0005,
1563 RTW_PWR_CUT_ALL_MSK,
1564 RTW_PWR_INTF_ALL_MSK,
1565 RTW_PWR_ADDR_MAC,
1566 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
1567 {0x0300,
1568 RTW_PWR_CUT_ALL_MSK,
1569 RTW_PWR_INTF_PCI_MSK,
1570 RTW_PWR_ADDR_MAC,
1571 RTW_PWR_CMD_WRITE, 0xFF, 0},
1572 {0x0301,
1573 RTW_PWR_CUT_ALL_MSK,
1574 RTW_PWR_INTF_PCI_MSK,
1575 RTW_PWR_ADDR_MAC,
1576 RTW_PWR_CMD_WRITE, 0xFF, 0},
1577 {0xFFFF,
1578 RTW_PWR_CUT_ALL_MSK,
1579 RTW_PWR_INTF_ALL_MSK,
1581 RTW_PWR_CMD_END, 0, 0},
1584 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b[] = {
1585 {0x0012,
1586 RTW_PWR_CUT_ALL_MSK,
1587 RTW_PWR_INTF_ALL_MSK,
1588 RTW_PWR_ADDR_MAC,
1589 RTW_PWR_CMD_WRITE, BIT(1), 0},
1590 {0x0012,
1591 RTW_PWR_CUT_ALL_MSK,
1592 RTW_PWR_INTF_ALL_MSK,
1593 RTW_PWR_ADDR_MAC,
1594 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1595 {0x0020,
1596 RTW_PWR_CUT_ALL_MSK,
1597 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1598 RTW_PWR_ADDR_MAC,
1599 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1600 {0x0001,
1601 RTW_PWR_CUT_ALL_MSK,
1602 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1603 RTW_PWR_ADDR_MAC,
1604 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
1605 {0x0000,
1606 RTW_PWR_CUT_ALL_MSK,
1607 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1608 RTW_PWR_ADDR_MAC,
1609 RTW_PWR_CMD_WRITE, BIT(5), 0},
1610 {0x0005,
1611 RTW_PWR_CUT_ALL_MSK,
1612 RTW_PWR_INTF_ALL_MSK,
1613 RTW_PWR_ADDR_MAC,
1614 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
1615 {0x0075,
1616 RTW_PWR_CUT_ALL_MSK,
1617 RTW_PWR_INTF_PCI_MSK,
1618 RTW_PWR_ADDR_MAC,
1619 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1620 {0x0006,
1621 RTW_PWR_CUT_ALL_MSK,
1622 RTW_PWR_INTF_ALL_MSK,
1623 RTW_PWR_ADDR_MAC,
1624 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1625 {0x0075,
1626 RTW_PWR_CUT_ALL_MSK,
1627 RTW_PWR_INTF_PCI_MSK,
1628 RTW_PWR_ADDR_MAC,
1629 RTW_PWR_CMD_WRITE, BIT(0), 0},
1630 {0xFF1A,
1631 RTW_PWR_CUT_ALL_MSK,
1632 RTW_PWR_INTF_USB_MSK,
1633 RTW_PWR_ADDR_MAC,
1634 RTW_PWR_CMD_WRITE, 0xFF, 0},
1635 {0x0006,
1636 RTW_PWR_CUT_ALL_MSK,
1637 RTW_PWR_INTF_ALL_MSK,
1638 RTW_PWR_ADDR_MAC,
1639 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1640 {0x0005,
1641 RTW_PWR_CUT_ALL_MSK,
1642 RTW_PWR_INTF_ALL_MSK,
1643 RTW_PWR_ADDR_MAC,
1644 RTW_PWR_CMD_WRITE, BIT(7), 0},
1645 {0x0005,
1646 RTW_PWR_CUT_ALL_MSK,
1647 RTW_PWR_INTF_ALL_MSK,
1648 RTW_PWR_ADDR_MAC,
1649 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
1650 {0x10C3,
1651 RTW_PWR_CUT_ALL_MSK,
1652 RTW_PWR_INTF_USB_MSK,
1653 RTW_PWR_ADDR_MAC,
1654 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1655 {0x0005,
1656 RTW_PWR_CUT_ALL_MSK,
1657 RTW_PWR_INTF_ALL_MSK,
1658 RTW_PWR_ADDR_MAC,
1659 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1660 {0x0005,
1661 RTW_PWR_CUT_ALL_MSK,
1662 RTW_PWR_INTF_ALL_MSK,
1663 RTW_PWR_ADDR_MAC,
1664 RTW_PWR_CMD_POLLING, BIT(0), 0},
1665 {0x0020,
1666 RTW_PWR_CUT_ALL_MSK,
1667 RTW_PWR_INTF_ALL_MSK,
1668 RTW_PWR_ADDR_MAC,
1669 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
1670 {0x10A8,
1671 RTW_PWR_CUT_C_MSK,
1672 RTW_PWR_INTF_ALL_MSK,
1673 RTW_PWR_ADDR_MAC,
1674 RTW_PWR_CMD_WRITE, 0xFF, 0},
1675 {0x10A9,
1676 RTW_PWR_CUT_C_MSK,
1677 RTW_PWR_INTF_ALL_MSK,
1678 RTW_PWR_ADDR_MAC,
1679 RTW_PWR_CMD_WRITE, 0xFF, 0xef},
1680 {0x10AA,
1681 RTW_PWR_CUT_C_MSK,
1682 RTW_PWR_INTF_ALL_MSK,
1683 RTW_PWR_ADDR_MAC,
1684 RTW_PWR_CMD_WRITE, 0xFF, 0x0c},
1685 {0x0068,
1686 RTW_PWR_CUT_C_MSK,
1687 RTW_PWR_INTF_SDIO_MSK,
1688 RTW_PWR_ADDR_MAC,
1689 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1690 {0x0029,
1691 RTW_PWR_CUT_ALL_MSK,
1692 RTW_PWR_INTF_ALL_MSK,
1693 RTW_PWR_ADDR_MAC,
1694 RTW_PWR_CMD_WRITE, 0xFF, 0xF9},
1695 {0x0024,
1696 RTW_PWR_CUT_ALL_MSK,
1697 RTW_PWR_INTF_ALL_MSK,
1698 RTW_PWR_ADDR_MAC,
1699 RTW_PWR_CMD_WRITE, BIT(2), 0},
1700 {0x0074,
1701 RTW_PWR_CUT_ALL_MSK,
1702 RTW_PWR_INTF_PCI_MSK,
1703 RTW_PWR_ADDR_MAC,
1704 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1705 {0x00AF,
1706 RTW_PWR_CUT_ALL_MSK,
1707 RTW_PWR_INTF_ALL_MSK,
1708 RTW_PWR_ADDR_MAC,
1709 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1710 {0xFFFF,
1711 RTW_PWR_CUT_ALL_MSK,
1712 RTW_PWR_INTF_ALL_MSK,
1714 RTW_PWR_CMD_END, 0, 0},
1717 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b[] = {
1718 {0x0003,
1719 RTW_PWR_CUT_ALL_MSK,
1720 RTW_PWR_INTF_SDIO_MSK,
1721 RTW_PWR_ADDR_MAC,
1722 RTW_PWR_CMD_WRITE, BIT(2), 0},
1723 {0x0093,
1724 RTW_PWR_CUT_ALL_MSK,
1725 RTW_PWR_INTF_ALL_MSK,
1726 RTW_PWR_ADDR_MAC,
1727 RTW_PWR_CMD_WRITE, BIT(3), 0},
1728 {0x001F,
1729 RTW_PWR_CUT_ALL_MSK,
1730 RTW_PWR_INTF_ALL_MSK,
1731 RTW_PWR_ADDR_MAC,
1732 RTW_PWR_CMD_WRITE, 0xFF, 0},
1733 {0x00EF,
1734 RTW_PWR_CUT_ALL_MSK,
1735 RTW_PWR_INTF_ALL_MSK,
1736 RTW_PWR_ADDR_MAC,
1737 RTW_PWR_CMD_WRITE, 0xFF, 0},
1738 {0xFF1A,
1739 RTW_PWR_CUT_ALL_MSK,
1740 RTW_PWR_INTF_USB_MSK,
1741 RTW_PWR_ADDR_MAC,
1742 RTW_PWR_CMD_WRITE, 0xFF, 0x30},
1743 {0x0049,
1744 RTW_PWR_CUT_ALL_MSK,
1745 RTW_PWR_INTF_ALL_MSK,
1746 RTW_PWR_ADDR_MAC,
1747 RTW_PWR_CMD_WRITE, BIT(1), 0},
1748 {0x0006,
1749 RTW_PWR_CUT_ALL_MSK,
1750 RTW_PWR_INTF_ALL_MSK,
1751 RTW_PWR_ADDR_MAC,
1752 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1753 {0x0002,
1754 RTW_PWR_CUT_ALL_MSK,
1755 RTW_PWR_INTF_ALL_MSK,
1756 RTW_PWR_ADDR_MAC,
1757 RTW_PWR_CMD_WRITE, BIT(1), 0},
1758 {0x10C3,
1759 RTW_PWR_CUT_ALL_MSK,
1760 RTW_PWR_INTF_USB_MSK,
1761 RTW_PWR_ADDR_MAC,
1762 RTW_PWR_CMD_WRITE, BIT(0), 0},
1763 {0x0005,
1764 RTW_PWR_CUT_ALL_MSK,
1765 RTW_PWR_INTF_ALL_MSK,
1766 RTW_PWR_ADDR_MAC,
1767 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1768 {0x0005,
1769 RTW_PWR_CUT_ALL_MSK,
1770 RTW_PWR_INTF_ALL_MSK,
1771 RTW_PWR_ADDR_MAC,
1772 RTW_PWR_CMD_POLLING, BIT(1), 0},
1773 {0x0020,
1774 RTW_PWR_CUT_ALL_MSK,
1775 RTW_PWR_INTF_ALL_MSK,
1776 RTW_PWR_ADDR_MAC,
1777 RTW_PWR_CMD_WRITE, BIT(3), 0},
1778 {0x0000,
1779 RTW_PWR_CUT_ALL_MSK,
1780 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1781 RTW_PWR_ADDR_MAC,
1782 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1783 {0xFFFF,
1784 RTW_PWR_CUT_ALL_MSK,
1785 RTW_PWR_INTF_ALL_MSK,
1787 RTW_PWR_CMD_END, 0, 0},
1790 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = {
1791 {0x0005,
1792 RTW_PWR_CUT_ALL_MSK,
1793 RTW_PWR_INTF_SDIO_MSK,
1794 RTW_PWR_ADDR_MAC,
1795 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1796 {0x0007,
1797 RTW_PWR_CUT_ALL_MSK,
1798 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1799 RTW_PWR_ADDR_MAC,
1800 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
1801 {0x0067,
1802 RTW_PWR_CUT_ALL_MSK,
1803 RTW_PWR_INTF_ALL_MSK,
1804 RTW_PWR_ADDR_MAC,
1805 RTW_PWR_CMD_WRITE, BIT(5), 0},
1806 {0x0005,
1807 RTW_PWR_CUT_ALL_MSK,
1808 RTW_PWR_INTF_PCI_MSK,
1809 RTW_PWR_ADDR_MAC,
1810 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
1811 {0x004A,
1812 RTW_PWR_CUT_ALL_MSK,
1813 RTW_PWR_INTF_USB_MSK,
1814 RTW_PWR_ADDR_MAC,
1815 RTW_PWR_CMD_WRITE, BIT(0), 0},
1816 {0x0067,
1817 RTW_PWR_CUT_ALL_MSK,
1818 RTW_PWR_INTF_SDIO_MSK,
1819 RTW_PWR_ADDR_MAC,
1820 RTW_PWR_CMD_WRITE, BIT(5), 0},
1821 {0x0067,
1822 RTW_PWR_CUT_ALL_MSK,
1823 RTW_PWR_INTF_SDIO_MSK,
1824 RTW_PWR_ADDR_MAC,
1825 RTW_PWR_CMD_WRITE, BIT(4), 0},
1826 {0x004F,
1827 RTW_PWR_CUT_ALL_MSK,
1828 RTW_PWR_INTF_SDIO_MSK,
1829 RTW_PWR_ADDR_MAC,
1830 RTW_PWR_CMD_WRITE, BIT(0), 0},
1831 {0x0067,
1832 RTW_PWR_CUT_ALL_MSK,
1833 RTW_PWR_INTF_SDIO_MSK,
1834 RTW_PWR_ADDR_MAC,
1835 RTW_PWR_CMD_WRITE, BIT(1), 0},
1836 {0x0046,
1837 RTW_PWR_CUT_ALL_MSK,
1838 RTW_PWR_INTF_SDIO_MSK,
1839 RTW_PWR_ADDR_MAC,
1840 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1841 {0x0067,
1842 RTW_PWR_CUT_ALL_MSK,
1843 RTW_PWR_INTF_SDIO_MSK,
1844 RTW_PWR_ADDR_MAC,
1845 RTW_PWR_CMD_WRITE, BIT(2), 0},
1846 {0x0046,
1847 RTW_PWR_CUT_ALL_MSK,
1848 RTW_PWR_INTF_SDIO_MSK,
1849 RTW_PWR_ADDR_MAC,
1850 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1851 {0x0062,
1852 RTW_PWR_CUT_ALL_MSK,
1853 RTW_PWR_INTF_SDIO_MSK,
1854 RTW_PWR_ADDR_MAC,
1855 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1856 {0x0081,
1857 RTW_PWR_CUT_ALL_MSK,
1858 RTW_PWR_INTF_ALL_MSK,
1859 RTW_PWR_ADDR_MAC,
1860 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
1861 {0x0005,
1862 RTW_PWR_CUT_ALL_MSK,
1863 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1864 RTW_PWR_ADDR_MAC,
1865 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
1866 {0x0086,
1867 RTW_PWR_CUT_ALL_MSK,
1868 RTW_PWR_INTF_SDIO_MSK,
1869 RTW_PWR_ADDR_SDIO,
1870 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1871 {0x0086,
1872 RTW_PWR_CUT_ALL_MSK,
1873 RTW_PWR_INTF_SDIO_MSK,
1874 RTW_PWR_ADDR_SDIO,
1875 RTW_PWR_CMD_POLLING, BIT(1), 0},
1876 {0x0090,
1877 RTW_PWR_CUT_ALL_MSK,
1878 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK,
1879 RTW_PWR_ADDR_MAC,
1880 RTW_PWR_CMD_WRITE, BIT(1), 0},
1881 {0x0044,
1882 RTW_PWR_CUT_ALL_MSK,
1883 RTW_PWR_INTF_SDIO_MSK,
1884 RTW_PWR_ADDR_SDIO,
1885 RTW_PWR_CMD_WRITE, 0xFF, 0},
1886 {0x0040,
1887 RTW_PWR_CUT_ALL_MSK,
1888 RTW_PWR_INTF_SDIO_MSK,
1889 RTW_PWR_ADDR_SDIO,
1890 RTW_PWR_CMD_WRITE, 0xFF, 0x90},
1891 {0x0041,
1892 RTW_PWR_CUT_ALL_MSK,
1893 RTW_PWR_INTF_SDIO_MSK,
1894 RTW_PWR_ADDR_SDIO,
1895 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1896 {0x0042,
1897 RTW_PWR_CUT_ALL_MSK,
1898 RTW_PWR_INTF_SDIO_MSK,
1899 RTW_PWR_ADDR_SDIO,
1900 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
1901 {0xFFFF,
1902 RTW_PWR_CUT_ALL_MSK,
1903 RTW_PWR_INTF_ALL_MSK,
1905 RTW_PWR_CMD_END, 0, 0},
1908 static const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
1909 trans_carddis_to_cardemu_8822b,
1910 trans_cardemu_to_act_8822b,
1911 NULL
1914 static const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
1915 trans_act_to_cardemu_8822b,
1916 trans_cardemu_to_carddis_8822b,
1917 NULL
1920 static const struct rtw_intf_phy_para usb2_param_8822b[] = {
1921 {0xFFFF, 0x00,
1922 RTW_IP_SEL_PHY,
1923 RTW_INTF_PHY_CUT_ALL,
1924 RTW_INTF_PHY_PLATFORM_ALL},
1927 static const struct rtw_intf_phy_para usb3_param_8822b[] = {
1928 {0x0001, 0xA841,
1929 RTW_IP_SEL_PHY,
1930 RTW_INTF_PHY_CUT_D,
1931 RTW_INTF_PHY_PLATFORM_ALL},
1932 {0xFFFF, 0x0000,
1933 RTW_IP_SEL_PHY,
1934 RTW_INTF_PHY_CUT_ALL,
1935 RTW_INTF_PHY_PLATFORM_ALL},
1938 static const struct rtw_intf_phy_para pcie_gen1_param_8822b[] = {
1939 {0x0001, 0xA841,
1940 RTW_IP_SEL_PHY,
1941 RTW_INTF_PHY_CUT_C,
1942 RTW_INTF_PHY_PLATFORM_ALL},
1943 {0x0002, 0x60C6,
1944 RTW_IP_SEL_PHY,
1945 RTW_INTF_PHY_CUT_C,
1946 RTW_INTF_PHY_PLATFORM_ALL},
1947 {0x0008, 0x3596,
1948 RTW_IP_SEL_PHY,
1949 RTW_INTF_PHY_CUT_C,
1950 RTW_INTF_PHY_PLATFORM_ALL},
1951 {0x0009, 0x321C,
1952 RTW_IP_SEL_PHY,
1953 RTW_INTF_PHY_CUT_C,
1954 RTW_INTF_PHY_PLATFORM_ALL},
1955 {0x000A, 0x9623,
1956 RTW_IP_SEL_PHY,
1957 RTW_INTF_PHY_CUT_C,
1958 RTW_INTF_PHY_PLATFORM_ALL},
1959 {0x0020, 0x94FF,
1960 RTW_IP_SEL_PHY,
1961 RTW_INTF_PHY_CUT_C,
1962 RTW_INTF_PHY_PLATFORM_ALL},
1963 {0x0021, 0xFFCF,
1964 RTW_IP_SEL_PHY,
1965 RTW_INTF_PHY_CUT_C,
1966 RTW_INTF_PHY_PLATFORM_ALL},
1967 {0x0026, 0xC006,
1968 RTW_IP_SEL_PHY,
1969 RTW_INTF_PHY_CUT_C,
1970 RTW_INTF_PHY_PLATFORM_ALL},
1971 {0x0029, 0xFF0E,
1972 RTW_IP_SEL_PHY,
1973 RTW_INTF_PHY_CUT_C,
1974 RTW_INTF_PHY_PLATFORM_ALL},
1975 {0x002A, 0x1840,
1976 RTW_IP_SEL_PHY,
1977 RTW_INTF_PHY_CUT_C,
1978 RTW_INTF_PHY_PLATFORM_ALL},
1979 {0xFFFF, 0x0000,
1980 RTW_IP_SEL_PHY,
1981 RTW_INTF_PHY_CUT_ALL,
1982 RTW_INTF_PHY_PLATFORM_ALL},
1985 static const struct rtw_intf_phy_para pcie_gen2_param_8822b[] = {
1986 {0x0001, 0xA841,
1987 RTW_IP_SEL_PHY,
1988 RTW_INTF_PHY_CUT_C,
1989 RTW_INTF_PHY_PLATFORM_ALL},
1990 {0x0002, 0x60C6,
1991 RTW_IP_SEL_PHY,
1992 RTW_INTF_PHY_CUT_C,
1993 RTW_INTF_PHY_PLATFORM_ALL},
1994 {0x0008, 0x3597,
1995 RTW_IP_SEL_PHY,
1996 RTW_INTF_PHY_CUT_C,
1997 RTW_INTF_PHY_PLATFORM_ALL},
1998 {0x0009, 0x321C,
1999 RTW_IP_SEL_PHY,
2000 RTW_INTF_PHY_CUT_C,
2001 RTW_INTF_PHY_PLATFORM_ALL},
2002 {0x000A, 0x9623,
2003 RTW_IP_SEL_PHY,
2004 RTW_INTF_PHY_CUT_C,
2005 RTW_INTF_PHY_PLATFORM_ALL},
2006 {0x0020, 0x94FF,
2007 RTW_IP_SEL_PHY,
2008 RTW_INTF_PHY_CUT_C,
2009 RTW_INTF_PHY_PLATFORM_ALL},
2010 {0x0021, 0xFFCF,
2011 RTW_IP_SEL_PHY,
2012 RTW_INTF_PHY_CUT_C,
2013 RTW_INTF_PHY_PLATFORM_ALL},
2014 {0x0026, 0xC006,
2015 RTW_IP_SEL_PHY,
2016 RTW_INTF_PHY_CUT_C,
2017 RTW_INTF_PHY_PLATFORM_ALL},
2018 {0x0029, 0xFF0E,
2019 RTW_IP_SEL_PHY,
2020 RTW_INTF_PHY_CUT_C,
2021 RTW_INTF_PHY_PLATFORM_ALL},
2022 {0x002A, 0x3040,
2023 RTW_IP_SEL_PHY,
2024 RTW_INTF_PHY_CUT_C,
2025 RTW_INTF_PHY_PLATFORM_ALL},
2026 {0xFFFF, 0x0000,
2027 RTW_IP_SEL_PHY,
2028 RTW_INTF_PHY_CUT_ALL,
2029 RTW_INTF_PHY_PLATFORM_ALL},
2032 static const struct rtw_intf_phy_para_table phy_para_table_8822b = {
2033 .usb2_para = usb2_param_8822b,
2034 .usb3_para = usb3_param_8822b,
2035 .gen1_para = pcie_gen1_param_8822b,
2036 .gen2_para = pcie_gen2_param_8822b,
2037 .n_usb2_para = ARRAY_SIZE(usb2_param_8822b),
2038 .n_usb3_para = ARRAY_SIZE(usb2_param_8822b),
2039 .n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8822b),
2040 .n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8822b),
2043 static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
2044 [2] = RTW_DEF_RFE(8822b, 2, 2),
2045 [3] = RTW_DEF_RFE(8822b, 3, 0),
2046 [5] = RTW_DEF_RFE(8822b, 5, 5),
2049 static const struct rtw_hw_reg rtw8822b_dig[] = {
2050 [0] = { .addr = 0xc50, .mask = 0x7f },
2051 [1] = { .addr = 0xe50, .mask = 0x7f },
2054 static const struct rtw_page_table page_table_8822b[] = {
2055 {64, 64, 64, 64, 1},
2056 {64, 64, 64, 64, 1},
2057 {64, 64, 0, 0, 1},
2058 {64, 64, 64, 0, 1},
2059 {64, 64, 64, 64, 1},
2062 static const struct rtw_rqpn rqpn_table_8822b[] = {
2063 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2064 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2065 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2066 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2067 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2068 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2069 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2070 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
2071 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2072 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2073 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2074 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2075 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2076 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2077 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2080 static struct rtw_chip_ops rtw8822b_ops = {
2081 .phy_set_param = rtw8822b_phy_set_param,
2082 .read_efuse = rtw8822b_read_efuse,
2083 .query_rx_desc = rtw8822b_query_rx_desc,
2084 .set_channel = rtw8822b_set_channel,
2085 .mac_init = rtw8822b_mac_init,
2086 .read_rf = rtw_phy_read_rf,
2087 .write_rf = rtw_phy_write_rf_reg_sipi,
2088 .set_tx_power_index = rtw8822b_set_tx_power_index,
2089 .set_antenna = rtw8822b_set_antenna,
2090 .cfg_ldo25 = rtw8822b_cfg_ldo25,
2091 .false_alarm_statistics = rtw8822b_false_alarm_statistics,
2092 .phy_calibration = rtw8822b_phy_calibration,
2093 .pwr_track = rtw8822b_pwr_track,
2094 .config_bfee = rtw8822b_bf_config_bfee,
2095 .set_gid_table = rtw_bf_set_gid_table,
2096 .cfg_csi_rate = rtw_bf_cfg_csi_rate,
2098 .coex_set_init = rtw8822b_coex_cfg_init,
2099 .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch,
2100 .coex_set_gnt_fix = rtw8822b_coex_cfg_gnt_fix,
2101 .coex_set_gnt_debug = rtw8822b_coex_cfg_gnt_debug,
2102 .coex_set_rfe_type = rtw8822b_coex_cfg_rfe_type,
2103 .coex_set_wl_tx_power = rtw8822b_coex_cfg_wl_tx_power,
2104 .coex_set_wl_rx_gain = rtw8822b_coex_cfg_wl_rx_gain,
2107 /* Shared-Antenna Coex Table */
2108 static const struct coex_table_para table_sant_8822b[] = {
2109 {0xffffffff, 0xffffffff}, /* case-0 */
2110 {0x55555555, 0x55555555},
2111 {0x66555555, 0x66555555},
2112 {0xaaaaaaaa, 0xaaaaaaaa},
2113 {0x5a5a5a5a, 0x5a5a5a5a},
2114 {0xfafafafa, 0xfafafafa}, /* case-5 */
2115 {0x6a5a6a5a, 0xaaaaaaaa},
2116 {0x6a5a56aa, 0x6a5a56aa},
2117 {0x6a5a5a5a, 0x6a5a5a5a},
2118 {0x66555555, 0x5a5a5a5a},
2119 {0x66555555, 0x6a5a5a5a}, /* case-10 */
2120 {0x66555555, 0xfafafafa},
2121 {0x66555555, 0x6a5a5aaa},
2122 {0x66555555, 0x5aaa5aaa},
2123 {0x66555555, 0xaaaa5aaa},
2124 {0x66555555, 0xaaaaaaaa}, /* case-15 */
2125 {0xffff55ff, 0xfafafafa},
2126 {0xffff55ff, 0x6afa5afa},
2127 {0xaaffffaa, 0xfafafafa},
2128 {0xaa5555aa, 0x5a5a5a5a},
2129 {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
2130 {0xaa5555aa, 0xaaaaaaaa},
2131 {0xffffffff, 0x5a5a5a5a},
2132 {0xffffffff, 0x6a5a5a5a},
2133 {0xffffffff, 0x55555555},
2134 {0xffffffff, 0x6a5a5aaa}, /* case-25 */
2135 {0x55555555, 0x5a5a5a5a},
2136 {0x55555555, 0xaaaaaaaa},
2137 {0x55555555, 0x6a5a6a5a},
2138 {0x66556655, 0x66556655}
2141 /* Non-Shared-Antenna Coex Table */
2142 static const struct coex_table_para table_nsant_8822b[] = {
2143 {0xffffffff, 0xffffffff}, /* case-100 */
2144 {0x55555555, 0x55555555},
2145 {0x66555555, 0x66555555},
2146 {0xaaaaaaaa, 0xaaaaaaaa},
2147 {0x5a5a5a5a, 0x5a5a5a5a},
2148 {0xfafafafa, 0xfafafafa}, /* case-105 */
2149 {0x5afa5afa, 0x5afa5afa},
2150 {0x55555555, 0xfafafafa},
2151 {0x66555555, 0xfafafafa},
2152 {0x66555555, 0x5a5a5a5a},
2153 {0x66555555, 0x6a5a5a5a}, /* case-110 */
2154 {0x66555555, 0xaaaaaaaa},
2155 {0xffff55ff, 0xfafafafa},
2156 {0xffff55ff, 0x5afa5afa},
2157 {0xffff55ff, 0xaaaaaaaa},
2158 {0xaaffffaa, 0xfafafafa}, /* case-115 */
2159 {0xaaffffaa, 0x5afa5afa},
2160 {0xaaffffaa, 0xaaaaaaaa},
2161 {0xffffffff, 0xfafafafa},
2162 {0xffffffff, 0x5afa5afa},
2163 {0xffffffff, 0xaaaaaaaa}, /* case-120 */
2164 {0x55ff55ff, 0x5afa5afa},
2165 {0x55ff55ff, 0xaaaaaaaa},
2166 {0x55ff55ff, 0x55ff55ff}
2169 /* Shared-Antenna TDMA */
2170 static const struct coex_tdma_para tdma_sant_8822b[] = {
2171 { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
2172 { {0x61, 0x45, 0x03, 0x11, 0x11} },
2173 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
2174 { {0x61, 0x30, 0x03, 0x11, 0x11} },
2175 { {0x61, 0x20, 0x03, 0x11, 0x11} },
2176 { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
2177 { {0x61, 0x45, 0x03, 0x11, 0x10} },
2178 { {0x61, 0x3a, 0x03, 0x11, 0x10} },
2179 { {0x61, 0x30, 0x03, 0x11, 0x10} },
2180 { {0x61, 0x20, 0x03, 0x11, 0x10} },
2181 { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
2182 { {0x61, 0x08, 0x03, 0x11, 0x14} },
2183 { {0x61, 0x08, 0x03, 0x10, 0x14} },
2184 { {0x51, 0x08, 0x03, 0x10, 0x54} },
2185 { {0x51, 0x08, 0x03, 0x10, 0x55} },
2186 { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
2187 { {0x51, 0x45, 0x03, 0x10, 0x10} },
2188 { {0x51, 0x3a, 0x03, 0x10, 0x50} },
2189 { {0x51, 0x30, 0x03, 0x10, 0x50} },
2190 { {0x51, 0x20, 0x03, 0x10, 0x50} },
2191 { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
2192 { {0x51, 0x4a, 0x03, 0x10, 0x50} },
2193 { {0x51, 0x0c, 0x03, 0x10, 0x54} },
2194 { {0x55, 0x08, 0x03, 0x10, 0x54} },
2195 { {0x65, 0x10, 0x03, 0x11, 0x11} },
2196 { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
2197 { {0x51, 0x08, 0x03, 0x10, 0x50} }
2200 /* Non-Shared-Antenna TDMA */
2201 static const struct coex_tdma_para tdma_nsant_8822b[] = {
2202 { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
2203 { {0x61, 0x45, 0x03, 0x11, 0x11} },
2204 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
2205 { {0x61, 0x30, 0x03, 0x11, 0x11} },
2206 { {0x61, 0x20, 0x03, 0x11, 0x11} },
2207 { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
2208 { {0x61, 0x45, 0x03, 0x11, 0x10} },
2209 { {0x61, 0x3a, 0x03, 0x11, 0x10} },
2210 { {0x61, 0x30, 0x03, 0x11, 0x10} },
2211 { {0x61, 0x20, 0x03, 0x11, 0x10} },
2212 { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
2213 { {0x61, 0x08, 0x03, 0x11, 0x14} },
2214 { {0x61, 0x08, 0x03, 0x10, 0x14} },
2215 { {0x51, 0x08, 0x03, 0x10, 0x54} },
2216 { {0x51, 0x08, 0x03, 0x10, 0x55} },
2217 { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
2218 { {0x51, 0x45, 0x03, 0x10, 0x50} },
2219 { {0x51, 0x3a, 0x03, 0x10, 0x50} },
2220 { {0x51, 0x30, 0x03, 0x10, 0x50} },
2221 { {0x51, 0x20, 0x03, 0x10, 0x50} },
2222 { {0x51, 0x10, 0x03, 0x10, 0x50} } /* case-120 */
2225 /* rssi in percentage % (dbm = % - 100) */
2226 static const u8 wl_rssi_step_8822b[] = {60, 50, 44, 30};
2227 static const u8 bt_rssi_step_8822b[] = {30, 30, 30, 30};
2228 static const struct coex_5g_afh_map afh_5g_8822b[] = { {0, 0, 0} };
2230 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
2231 static const struct coex_rf_para rf_para_tx_8822b[] = {
2232 {0, 0, false, 7}, /* for normal */
2233 {0, 16, false, 7}, /* for WL-CPT */
2234 {4, 0, true, 1},
2235 {3, 6, true, 1},
2236 {2, 9, true, 1},
2237 {1, 13, true, 1}
2240 static const struct coex_rf_para rf_para_rx_8822b[] = {
2241 {0, 0, false, 7}, /* for normal */
2242 {0, 16, false, 7}, /* for WL-CPT */
2243 {4, 0, true, 1},
2244 {3, 6, true, 1},
2245 {2, 9, true, 1},
2246 {1, 13, true, 1}
2249 static_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b));
2251 static const u8
2252 rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2253 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2254 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2255 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2256 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2257 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2258 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2259 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2260 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2261 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2264 static const u8
2265 rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2266 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2267 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2268 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2269 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2270 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2271 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2272 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2273 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2274 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2277 static const u8
2278 rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2279 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2280 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2281 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2282 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2283 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2284 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2285 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2286 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2287 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2290 static const u8
2291 rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2292 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2293 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2294 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2295 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2296 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2297 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2298 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2299 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2300 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2303 static const u8 rtw8822b_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
2304 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2305 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2306 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2309 static const u8 rtw8822b_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
2310 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2311 5, 5, 6, 6, 6, 7, 7, 8, 8, 9,
2312 9, 10, 10, 11, 11, 12, 12, 12, 13, 13
2315 static const u8 rtw8822b_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
2316 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2317 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2318 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2321 static const u8 rtw8822b_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
2322 0, 1, 1, 2, 2, 3, 3, 4, 4, 5,
2323 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
2324 10, 11, 11, 12, 12, 13, 13, 14, 14, 15
2327 static const u8 rtw8822b_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
2328 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2329 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2330 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2333 static const u8 rtw8822b_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
2334 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2335 5, 5, 6, 6, 6, 7, 7, 8, 8, 9,
2336 9, 10, 10, 11, 11, 12, 12, 12, 13, 13
2339 static const u8 rtw8822b_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
2340 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2341 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2342 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2345 static const u8 rtw8822b_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
2346 0, 1, 1, 2, 2, 3, 3, 4, 4, 5,
2347 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
2348 10, 11, 11, 12, 12, 13, 13, 14, 14, 15
2351 static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
2352 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
2353 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
2354 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
2355 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
2356 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
2357 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
2358 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
2359 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
2360 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
2361 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
2362 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
2363 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
2364 .pwrtrk_2gb_n = rtw8822b_pwrtrk_2gb_n,
2365 .pwrtrk_2gb_p = rtw8822b_pwrtrk_2gb_p,
2366 .pwrtrk_2ga_n = rtw8822b_pwrtrk_2ga_n,
2367 .pwrtrk_2ga_p = rtw8822b_pwrtrk_2ga_p,
2368 .pwrtrk_2g_cckb_n = rtw8822b_pwrtrk_2g_cck_b_n,
2369 .pwrtrk_2g_cckb_p = rtw8822b_pwrtrk_2g_cck_b_p,
2370 .pwrtrk_2g_ccka_n = rtw8822b_pwrtrk_2g_cck_a_n,
2371 .pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
2374 static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
2375 {0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2376 {0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2377 {0xcba, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2378 {0xcbd, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2379 {0xc58, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2380 {0xcbd, BIT(0), RTW_REG_DOMAIN_MAC8},
2381 {0, 0, RTW_REG_DOMAIN_NL},
2382 {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2383 {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2384 {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2385 {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2386 {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
2387 {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2388 {0, 0, RTW_REG_DOMAIN_NL},
2389 {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
2390 {0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
2391 {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
2392 {0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
2393 {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
2394 {0, 0, RTW_REG_DOMAIN_NL},
2395 {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2396 {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2397 {0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
2398 {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2401 struct rtw_chip_info rtw8822b_hw_spec = {
2402 .ops = &rtw8822b_ops,
2403 .id = RTW_CHIP_TYPE_8822B,
2404 .fw_name = "rtw88/rtw8822b_fw.bin",
2405 .tx_pkt_desc_sz = 48,
2406 .tx_buf_desc_sz = 16,
2407 .rx_pkt_desc_sz = 24,
2408 .rx_buf_desc_sz = 8,
2409 .phy_efuse_size = 1024,
2410 .log_efuse_size = 768,
2411 .ptct_efuse_size = 96,
2412 .txff_size = 262144,
2413 .rxff_size = 24576,
2414 .txgi_factor = 1,
2415 .is_pwr_by_rate_dec = true,
2416 .max_power_index = 0x3f,
2417 .csi_buf_pg_num = 0,
2418 .band = RTW_BAND_2G | RTW_BAND_5G,
2419 .page_size = 128,
2420 .dig_min = 0x1c,
2421 .ht_supported = true,
2422 .vht_supported = true,
2423 .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
2424 .sys_func_en = 0xDC,
2425 .pwr_on_seq = card_enable_flow_8822b,
2426 .pwr_off_seq = card_disable_flow_8822b,
2427 .page_table = page_table_8822b,
2428 .rqpn_table = rqpn_table_8822b,
2429 .intf_table = &phy_para_table_8822b,
2430 .dig = rtw8822b_dig,
2431 .rf_base_addr = {0x2800, 0x2c00},
2432 .rf_sipi_addr = {0xc90, 0xe90},
2433 .mac_tbl = &rtw8822b_mac_tbl,
2434 .agc_tbl = &rtw8822b_agc_tbl,
2435 .bb_tbl = &rtw8822b_bb_tbl,
2436 .rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
2437 .rfe_defs = rtw8822b_rfe_defs,
2438 .rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
2439 .pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl,
2440 .iqk_threshold = 8,
2441 .bfer_su_max_num = 2,
2442 .bfer_mu_max_num = 1,
2444 .coex_para_ver = 0x19062706,
2445 .bt_desired_ver = 0x6,
2446 .scbd_support = true,
2447 .new_scbd10_def = false,
2448 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2449 .bt_rssi_type = COEX_BTRSSI_RATIO,
2450 .ant_isolation = 15,
2451 .rssi_tolerance = 2,
2452 .wl_rssi_step = wl_rssi_step_8822b,
2453 .bt_rssi_step = bt_rssi_step_8822b,
2454 .table_sant_num = ARRAY_SIZE(table_sant_8822b),
2455 .table_sant = table_sant_8822b,
2456 .table_nsant_num = ARRAY_SIZE(table_nsant_8822b),
2457 .table_nsant = table_nsant_8822b,
2458 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8822b),
2459 .tdma_sant = tdma_sant_8822b,
2460 .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822b),
2461 .tdma_nsant = tdma_nsant_8822b,
2462 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822b),
2463 .wl_rf_para_tx = rf_para_tx_8822b,
2464 .wl_rf_para_rx = rf_para_rx_8822b,
2465 .bt_afh_span_bw20 = 0x24,
2466 .bt_afh_span_bw40 = 0x36,
2467 .afh_5g_num = ARRAY_SIZE(afh_5g_8822b),
2468 .afh_5g = afh_5g_8822b,
2470 .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822b),
2471 .coex_info_hw_regs = coex_info_hw_regs_8822b,
2473 EXPORT_SYMBOL(rtw8822b_hw_spec);
2475 MODULE_FIRMWARE("rtw88/rtw8822b_fw.bin");