1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019 Realtek Corporation
12 #include "rtw8822b_table.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
;
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
);
65 static void rtw8822b_phy_rfe_init(struct rtw_dev
*rtwdev
)
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);
73 rtw_write32_mask(rtwdev
, 0x1990, 0x3f, 0x30);
74 rtw_write32_mask(rtwdev
, 0x1990, (BIT(11) | BIT(10)), 0x3);
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
)
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
)
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
);
110 if (swing_idx
>= RTW_TXSCALE_SIZE
)
111 dm_info
->default_ofdm_index
= 24;
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
;
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
);
157 rtw8822b_config_trx_mode(rtwdev
, hal
->antenna_tx
, hal
->antenna_rx
,
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
)
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
);
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);
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
) {
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);
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
)) {
302 rtw_write32s_mask(rtwdev
, REG_RFESEL0
, 0xffffff, 0x745774);
303 rtw_write32s_mask(rtwdev
, REG_RFESEL8
, MASKBYTE1
, 0x57);
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
) {
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);
321 /* TXB+RXA or TXA+RXB */
322 rtw_write32s_mask(rtwdev
, REG_TRSW
, MASKLWORD
, 0xa005);
325 rtw_write32s_mask(rtwdev
, REG_TRSW
, MASKLWORD
, 0xa5a5);
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
;
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, \
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, \
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
;
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
;
415 col
= CCUT_IDX_2R_2G
;
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
;
423 col
= CCUT_IDX_2R_5G
;
426 rtw8822b_get_cca_val(cca_ccut
, col
, ®82c
, ®830
, ®838
);
428 switch (rfe_info
->fem
) {
432 if (rfe_info
->ifem_ext
)
438 case RTW_RFE_IFEM2G_EFEM5G
:
439 if (IS_CH_2G_BAND(channel
))
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
))
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
|
498 rf_reg18
|= (IS_CH_2G_BAND(channel
) ? RF18_BAND_2G
: RF18_BAND_5G
);
499 rf_reg18
|= (channel
& RF18_CHANNEL_MASK
);
501 rf_reg18
|= RF18_RFSI_GT_CH144
;
502 else if (channel
>= 80)
503 rf_reg18
|= RF18_RFSI_GE_CH80
;
506 case RTW_CHANNEL_WIDTH_5
:
507 case RTW_CHANNEL_WIDTH_10
:
508 case RTW_CHANNEL_WIDTH_20
:
510 rf_reg18
|= RF18_BW_20M
;
512 case RTW_CHANNEL_WIDTH_40
:
513 rf_reg18
|= RF18_BW_40M
;
515 case RTW_CHANNEL_WIDTH_80
:
516 rf_reg18
|= RF18_BW_80M
;
520 if (IS_CH_2G_BAND(channel
))
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];
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 */
535 rtw_write_rf(rtwdev
, RF_PATH_A
, RF_LUTDBG
, BIT(18), 0x1);
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);
552 static void rtw8822b_toggle_igi(struct rtw_dev
*rtwdev
)
554 struct rtw_hal
*hal
= &rtwdev
->hal
;
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);
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
,
591 struct rtw_efuse
*efuse
= &rtwdev
->efuse
;
592 u8 rfe_option
= efuse
->rfe_option
;
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);
604 rtw_write32_mask(rtwdev
, REG_TXSF2
, MASKDWORD
, 0x00006577);
605 rtw_write32_mask(rtwdev
, REG_TXSF6
, MASKLWORD
, 0x0000);
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);
638 case RTW_CHANNEL_WIDTH_20
:
640 val32
= rtw_read32_mask(rtwdev
, REG_ADCCLK
, MASKDWORD
);
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);
647 case RTW_CHANNEL_WIDTH_40
:
648 if (primary_ch_idx
== 1)
649 rtw_write32_set(rtwdev
, REG_RXSB
, BIT(4));
651 rtw_write32_clr(rtwdev
, REG_RXSB
, BIT(4));
653 val32
= rtw_read32_mask(rtwdev
, REG_ADCCLK
, MASKDWORD
);
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);
660 case RTW_CHANNEL_WIDTH_80
:
661 val32
= rtw_read32_mask(rtwdev
, REG_ADCCLK
, MASKDWORD
);
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);
673 case RTW_CHANNEL_WIDTH_5
:
674 val32
= rtw_read32_mask(rtwdev
, REG_ADCCLK
, MASKDWORD
);
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);
682 case RTW_CHANNEL_WIDTH_10
:
683 val32
= rtw_read32_mask(rtwdev
, REG_ADCCLK
, MASKDWORD
);
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);
694 static void rtw8822b_set_channel(struct rtw_dev
*rtwdev
, u8 channel
, u8 bw
,
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
))
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
;
724 if (WARN(efuse
->rfe_option
>= ARRAY_SIZE(rtw8822b_rfe_info
),
725 "rfe_option %d is out of boundary\n", efuse
->rfe_option
))
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);
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);
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);
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);
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
--) {
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);
795 rf_reg33
= rtw_read_rf(rtwdev
, RF_PATH_A
, 0x33, RFREG_MASK
);
797 if (rf_reg33
== 0x00001)
801 if (WARN(counter
<= 0, "write RF mode table fail\n"))
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
],
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
;
837 s8 min_rx_power
= -120;
843 if (pkt_stat
->rate
> DESC_RATE11M
&& pkt_stat
->rate
< DESC_RATEMCS0
)
844 rxsc
= GET_PHY_STAT_P1_L_RXSC(phy_status
);
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
;
853 bw
= RTW_CHANNEL_WIDTH_80
;
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);
861 pkt_stat
->signal_power
= max3(pkt_stat
->rx_power
[RF_PATH_A
],
862 pkt_stat
->rx_power
[RF_PATH_B
],
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
];
885 if (rx_evm
== S8_MIN
)
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
)
899 page
= *phy_status
& 0xf;
903 query_phy_status_page0(rtwdev
, phy_status
, pkt_stat
);
906 query_phy_status_page1(rtwdev
, phy_status
, pkt_stat
);
909 rtw_warn(rtwdev
, "unused phy status page (%d)\n", page
);
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
)
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
);
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
;
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
];
968 phy_pwr_idx
|= ((u32
)pwr_index
<< (shift
* 8));
970 rate_idx
= rate
& 0xfc;
971 rtw_write32(rtwdev
, offset_txagc
[path
] + rate_idx
,
978 static void rtw8822b_set_tx_power_index(struct rtw_dev
*rtwdev
)
980 struct rtw_hal
*hal
= &rtwdev
->hal
;
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
)
1001 static void rtw8822b_set_antenna(struct rtw_dev
*rtwdev
, u8 antenna_tx
,
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
)
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
;
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
;
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
;
1087 rtw_fw_do_iqk(rtwdev
, ¶
);
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)
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
;
1142 if (((ctrl_type
<< 8) + pos_type
) == coex_dm
->cur_switch_status
)
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
) {
1155 case COEX_SWITCH_CTRL_BY_BBSW
:
1157 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 2, BIT_DPDT_SEL_EN
>> 16, 0x0);
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)
1168 regval
= (!polarity_inverse
? 0x2 : 0x1);
1169 } else if (pos_type
== COEX_SWITCH_TO_WLG
) {
1170 regval
= (!polarity_inverse
? 0x2 : 0x1);
1172 regval
= (!polarity_inverse
? 0x1 : 0x2);
1175 rtw_write8_mask(rtwdev
, REG_RFE_INV8
, BIT_MASK_RFE_INV89
, regval
);
1177 case COEX_SWITCH_CTRL_BY_PTA
:
1179 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 2, BIT_DPDT_SEL_EN
>> 16, 0x0);
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
);
1188 case COEX_SWITCH_CTRL_BY_ANTDIV
:
1190 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 2, BIT_DPDT_SEL_EN
>> 16, 0x0);
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);
1195 case COEX_SWITCH_CTRL_BY_MAC
:
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
);
1202 case COEX_SWITCH_CTRL_BY_FW
:
1204 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 2, BIT_DPDT_SEL_EN
>> 16, 0x0);
1206 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 3, BIT_DPDT_WL_SEL
>> 24, 0x1);
1208 case COEX_SWITCH_CTRL_BY_BT
:
1210 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 2, BIT_DPDT_SEL_EN
>> 16, 0x0);
1212 rtw_write8_mask(rtwdev
, REG_LED_CFG
+ 3, BIT_DPDT_WL_SEL
>> 24, 0x0);
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;
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);
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;
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};
1286 if (wl_pwr
== coex_dm
->cur_wl_pwr_lvl
)
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,
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,
1331 if (low_gain
== coex_dm
->cur_wl_rx_low_gain_en
)
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);
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;
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
);
1382 if (dm_info
->default_ofdm_index
> abs(delta_pwr_idx
))
1384 dm_info
->default_ofdm_index
+ delta_pwr_idx
;
1386 swing_index
= swing_lower_bound
;
1387 swing_index
= max_t(u8
, swing_index
, swing_lower_bound
);
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
,
1407 if (path
== RF_PATH_A
) {
1410 } else if (path
== RF_PATH_B
) {
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
,
1448 struct rtw_dm_info
*dm_info
= &rtwdev
->dm_info
;
1449 u8 power_idx_cur
, power_idx_last
;
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
)
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)
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
,
1488 for (path
= 0; path
< rtwdev
->hal
.rf_path_num
; path
++)
1489 rtw8822b_phy_pwrtrack_path(rtwdev
, &swing_table
, path
);
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)
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;
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
)
1520 rtw_bf_enable_bfee_su(rtwdev
, vif
, bfee
);
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
)
1530 rtw_bf_enable_bfee_mu(rtwdev
, vif
, bfee
);
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
);
1543 rtw_warn(rtwdev
, "wrong bfee role\n");
1546 static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b
[] = {
1548 RTW_PWR_CUT_ALL_MSK
,
1549 RTW_PWR_INTF_SDIO_MSK
,
1551 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1553 RTW_PWR_CUT_ALL_MSK
,
1554 RTW_PWR_INTF_SDIO_MSK
,
1556 RTW_PWR_CMD_POLLING
, BIT(1), BIT(1)},
1558 RTW_PWR_CUT_ALL_MSK
,
1559 RTW_PWR_INTF_USB_MSK
,
1561 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1563 RTW_PWR_CUT_ALL_MSK
,
1564 RTW_PWR_INTF_ALL_MSK
,
1566 RTW_PWR_CMD_WRITE
, BIT(3) | BIT(4) | BIT(7), 0},
1568 RTW_PWR_CUT_ALL_MSK
,
1569 RTW_PWR_INTF_PCI_MSK
,
1571 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1573 RTW_PWR_CUT_ALL_MSK
,
1574 RTW_PWR_INTF_PCI_MSK
,
1576 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1578 RTW_PWR_CUT_ALL_MSK
,
1579 RTW_PWR_INTF_ALL_MSK
,
1581 RTW_PWR_CMD_END
, 0, 0},
1584 static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b
[] = {
1586 RTW_PWR_CUT_ALL_MSK
,
1587 RTW_PWR_INTF_ALL_MSK
,
1589 RTW_PWR_CMD_WRITE
, BIT(1), 0},
1591 RTW_PWR_CUT_ALL_MSK
,
1592 RTW_PWR_INTF_ALL_MSK
,
1594 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1596 RTW_PWR_CUT_ALL_MSK
,
1597 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1599 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1601 RTW_PWR_CUT_ALL_MSK
,
1602 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1604 RTW_PWR_CMD_DELAY
, 1, RTW_PWR_DELAY_MS
},
1606 RTW_PWR_CUT_ALL_MSK
,
1607 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1609 RTW_PWR_CMD_WRITE
, BIT(5), 0},
1611 RTW_PWR_CUT_ALL_MSK
,
1612 RTW_PWR_INTF_ALL_MSK
,
1614 RTW_PWR_CMD_WRITE
, (BIT(4) | BIT(3) | BIT(2)), 0},
1616 RTW_PWR_CUT_ALL_MSK
,
1617 RTW_PWR_INTF_PCI_MSK
,
1619 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1621 RTW_PWR_CUT_ALL_MSK
,
1622 RTW_PWR_INTF_ALL_MSK
,
1624 RTW_PWR_CMD_POLLING
, BIT(1), BIT(1)},
1626 RTW_PWR_CUT_ALL_MSK
,
1627 RTW_PWR_INTF_PCI_MSK
,
1629 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1631 RTW_PWR_CUT_ALL_MSK
,
1632 RTW_PWR_INTF_USB_MSK
,
1634 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1636 RTW_PWR_CUT_ALL_MSK
,
1637 RTW_PWR_INTF_ALL_MSK
,
1639 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1641 RTW_PWR_CUT_ALL_MSK
,
1642 RTW_PWR_INTF_ALL_MSK
,
1644 RTW_PWR_CMD_WRITE
, BIT(7), 0},
1646 RTW_PWR_CUT_ALL_MSK
,
1647 RTW_PWR_INTF_ALL_MSK
,
1649 RTW_PWR_CMD_WRITE
, (BIT(4) | BIT(3)), 0},
1651 RTW_PWR_CUT_ALL_MSK
,
1652 RTW_PWR_INTF_USB_MSK
,
1654 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1656 RTW_PWR_CUT_ALL_MSK
,
1657 RTW_PWR_INTF_ALL_MSK
,
1659 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1661 RTW_PWR_CUT_ALL_MSK
,
1662 RTW_PWR_INTF_ALL_MSK
,
1664 RTW_PWR_CMD_POLLING
, BIT(0), 0},
1666 RTW_PWR_CUT_ALL_MSK
,
1667 RTW_PWR_INTF_ALL_MSK
,
1669 RTW_PWR_CMD_WRITE
, BIT(3), BIT(3)},
1672 RTW_PWR_INTF_ALL_MSK
,
1674 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1677 RTW_PWR_INTF_ALL_MSK
,
1679 RTW_PWR_CMD_WRITE
, 0xFF, 0xef},
1682 RTW_PWR_INTF_ALL_MSK
,
1684 RTW_PWR_CMD_WRITE
, 0xFF, 0x0c},
1687 RTW_PWR_INTF_SDIO_MSK
,
1689 RTW_PWR_CMD_WRITE
, BIT(4), BIT(4)},
1691 RTW_PWR_CUT_ALL_MSK
,
1692 RTW_PWR_INTF_ALL_MSK
,
1694 RTW_PWR_CMD_WRITE
, 0xFF, 0xF9},
1696 RTW_PWR_CUT_ALL_MSK
,
1697 RTW_PWR_INTF_ALL_MSK
,
1699 RTW_PWR_CMD_WRITE
, BIT(2), 0},
1701 RTW_PWR_CUT_ALL_MSK
,
1702 RTW_PWR_INTF_PCI_MSK
,
1704 RTW_PWR_CMD_WRITE
, BIT(5), BIT(5)},
1706 RTW_PWR_CUT_ALL_MSK
,
1707 RTW_PWR_INTF_ALL_MSK
,
1709 RTW_PWR_CMD_WRITE
, BIT(5), BIT(5)},
1711 RTW_PWR_CUT_ALL_MSK
,
1712 RTW_PWR_INTF_ALL_MSK
,
1714 RTW_PWR_CMD_END
, 0, 0},
1717 static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b
[] = {
1719 RTW_PWR_CUT_ALL_MSK
,
1720 RTW_PWR_INTF_SDIO_MSK
,
1722 RTW_PWR_CMD_WRITE
, BIT(2), 0},
1724 RTW_PWR_CUT_ALL_MSK
,
1725 RTW_PWR_INTF_ALL_MSK
,
1727 RTW_PWR_CMD_WRITE
, BIT(3), 0},
1729 RTW_PWR_CUT_ALL_MSK
,
1730 RTW_PWR_INTF_ALL_MSK
,
1732 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1734 RTW_PWR_CUT_ALL_MSK
,
1735 RTW_PWR_INTF_ALL_MSK
,
1737 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1739 RTW_PWR_CUT_ALL_MSK
,
1740 RTW_PWR_INTF_USB_MSK
,
1742 RTW_PWR_CMD_WRITE
, 0xFF, 0x30},
1744 RTW_PWR_CUT_ALL_MSK
,
1745 RTW_PWR_INTF_ALL_MSK
,
1747 RTW_PWR_CMD_WRITE
, BIT(1), 0},
1749 RTW_PWR_CUT_ALL_MSK
,
1750 RTW_PWR_INTF_ALL_MSK
,
1752 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1754 RTW_PWR_CUT_ALL_MSK
,
1755 RTW_PWR_INTF_ALL_MSK
,
1757 RTW_PWR_CMD_WRITE
, BIT(1), 0},
1759 RTW_PWR_CUT_ALL_MSK
,
1760 RTW_PWR_INTF_USB_MSK
,
1762 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1764 RTW_PWR_CUT_ALL_MSK
,
1765 RTW_PWR_INTF_ALL_MSK
,
1767 RTW_PWR_CMD_WRITE
, BIT(1), BIT(1)},
1769 RTW_PWR_CUT_ALL_MSK
,
1770 RTW_PWR_INTF_ALL_MSK
,
1772 RTW_PWR_CMD_POLLING
, BIT(1), 0},
1774 RTW_PWR_CUT_ALL_MSK
,
1775 RTW_PWR_INTF_ALL_MSK
,
1777 RTW_PWR_CMD_WRITE
, BIT(3), 0},
1779 RTW_PWR_CUT_ALL_MSK
,
1780 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1782 RTW_PWR_CMD_WRITE
, BIT(5), BIT(5)},
1784 RTW_PWR_CUT_ALL_MSK
,
1785 RTW_PWR_INTF_ALL_MSK
,
1787 RTW_PWR_CMD_END
, 0, 0},
1790 static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b
[] = {
1792 RTW_PWR_CUT_ALL_MSK
,
1793 RTW_PWR_INTF_SDIO_MSK
,
1795 RTW_PWR_CMD_WRITE
, BIT(7), BIT(7)},
1797 RTW_PWR_CUT_ALL_MSK
,
1798 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1800 RTW_PWR_CMD_WRITE
, 0xFF, 0x20},
1802 RTW_PWR_CUT_ALL_MSK
,
1803 RTW_PWR_INTF_ALL_MSK
,
1805 RTW_PWR_CMD_WRITE
, BIT(5), 0},
1807 RTW_PWR_CUT_ALL_MSK
,
1808 RTW_PWR_INTF_PCI_MSK
,
1810 RTW_PWR_CMD_WRITE
, BIT(2), BIT(2)},
1812 RTW_PWR_CUT_ALL_MSK
,
1813 RTW_PWR_INTF_USB_MSK
,
1815 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1817 RTW_PWR_CUT_ALL_MSK
,
1818 RTW_PWR_INTF_SDIO_MSK
,
1820 RTW_PWR_CMD_WRITE
, BIT(5), 0},
1822 RTW_PWR_CUT_ALL_MSK
,
1823 RTW_PWR_INTF_SDIO_MSK
,
1825 RTW_PWR_CMD_WRITE
, BIT(4), 0},
1827 RTW_PWR_CUT_ALL_MSK
,
1828 RTW_PWR_INTF_SDIO_MSK
,
1830 RTW_PWR_CMD_WRITE
, BIT(0), 0},
1832 RTW_PWR_CUT_ALL_MSK
,
1833 RTW_PWR_INTF_SDIO_MSK
,
1835 RTW_PWR_CMD_WRITE
, BIT(1), 0},
1837 RTW_PWR_CUT_ALL_MSK
,
1838 RTW_PWR_INTF_SDIO_MSK
,
1840 RTW_PWR_CMD_WRITE
, BIT(6), BIT(6)},
1842 RTW_PWR_CUT_ALL_MSK
,
1843 RTW_PWR_INTF_SDIO_MSK
,
1845 RTW_PWR_CMD_WRITE
, BIT(2), 0},
1847 RTW_PWR_CUT_ALL_MSK
,
1848 RTW_PWR_INTF_SDIO_MSK
,
1850 RTW_PWR_CMD_WRITE
, BIT(7), BIT(7)},
1852 RTW_PWR_CUT_ALL_MSK
,
1853 RTW_PWR_INTF_SDIO_MSK
,
1855 RTW_PWR_CMD_WRITE
, BIT(4), BIT(4)},
1857 RTW_PWR_CUT_ALL_MSK
,
1858 RTW_PWR_INTF_ALL_MSK
,
1860 RTW_PWR_CMD_WRITE
, BIT(7) | BIT(6), 0},
1862 RTW_PWR_CUT_ALL_MSK
,
1863 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_SDIO_MSK
,
1865 RTW_PWR_CMD_WRITE
, BIT(3) | BIT(4), BIT(3)},
1867 RTW_PWR_CUT_ALL_MSK
,
1868 RTW_PWR_INTF_SDIO_MSK
,
1870 RTW_PWR_CMD_WRITE
, BIT(0), BIT(0)},
1872 RTW_PWR_CUT_ALL_MSK
,
1873 RTW_PWR_INTF_SDIO_MSK
,
1875 RTW_PWR_CMD_POLLING
, BIT(1), 0},
1877 RTW_PWR_CUT_ALL_MSK
,
1878 RTW_PWR_INTF_USB_MSK
| RTW_PWR_INTF_PCI_MSK
,
1880 RTW_PWR_CMD_WRITE
, BIT(1), 0},
1882 RTW_PWR_CUT_ALL_MSK
,
1883 RTW_PWR_INTF_SDIO_MSK
,
1885 RTW_PWR_CMD_WRITE
, 0xFF, 0},
1887 RTW_PWR_CUT_ALL_MSK
,
1888 RTW_PWR_INTF_SDIO_MSK
,
1890 RTW_PWR_CMD_WRITE
, 0xFF, 0x90},
1892 RTW_PWR_CUT_ALL_MSK
,
1893 RTW_PWR_INTF_SDIO_MSK
,
1895 RTW_PWR_CMD_WRITE
, 0xFF, 0x00},
1897 RTW_PWR_CUT_ALL_MSK
,
1898 RTW_PWR_INTF_SDIO_MSK
,
1900 RTW_PWR_CMD_WRITE
, 0xFF, 0x04},
1902 RTW_PWR_CUT_ALL_MSK
,
1903 RTW_PWR_INTF_ALL_MSK
,
1905 RTW_PWR_CMD_END
, 0, 0},
1908 static struct rtw_pwr_seq_cmd
*card_enable_flow_8822b
[] = {
1909 trans_carddis_to_cardemu_8822b
,
1910 trans_cardemu_to_act_8822b
,
1914 static struct rtw_pwr_seq_cmd
*card_disable_flow_8822b
[] = {
1915 trans_act_to_cardemu_8822b
,
1916 trans_cardemu_to_carddis_8822b
,
1920 static struct rtw_intf_phy_para usb2_param_8822b
[] = {
1923 RTW_INTF_PHY_CUT_ALL
,
1924 RTW_INTF_PHY_PLATFORM_ALL
},
1927 static struct rtw_intf_phy_para usb3_param_8822b
[] = {
1931 RTW_INTF_PHY_PLATFORM_ALL
},
1934 RTW_INTF_PHY_CUT_ALL
,
1935 RTW_INTF_PHY_PLATFORM_ALL
},
1938 static struct rtw_intf_phy_para pcie_gen1_param_8822b
[] = {
1942 RTW_INTF_PHY_PLATFORM_ALL
},
1946 RTW_INTF_PHY_PLATFORM_ALL
},
1950 RTW_INTF_PHY_PLATFORM_ALL
},
1954 RTW_INTF_PHY_PLATFORM_ALL
},
1958 RTW_INTF_PHY_PLATFORM_ALL
},
1962 RTW_INTF_PHY_PLATFORM_ALL
},
1966 RTW_INTF_PHY_PLATFORM_ALL
},
1970 RTW_INTF_PHY_PLATFORM_ALL
},
1974 RTW_INTF_PHY_PLATFORM_ALL
},
1978 RTW_INTF_PHY_PLATFORM_ALL
},
1981 RTW_INTF_PHY_CUT_ALL
,
1982 RTW_INTF_PHY_PLATFORM_ALL
},
1985 static struct rtw_intf_phy_para pcie_gen2_param_8822b
[] = {
1989 RTW_INTF_PHY_PLATFORM_ALL
},
1993 RTW_INTF_PHY_PLATFORM_ALL
},
1997 RTW_INTF_PHY_PLATFORM_ALL
},
2001 RTW_INTF_PHY_PLATFORM_ALL
},
2005 RTW_INTF_PHY_PLATFORM_ALL
},
2009 RTW_INTF_PHY_PLATFORM_ALL
},
2013 RTW_INTF_PHY_PLATFORM_ALL
},
2017 RTW_INTF_PHY_PLATFORM_ALL
},
2021 RTW_INTF_PHY_PLATFORM_ALL
},
2025 RTW_INTF_PHY_PLATFORM_ALL
},
2028 RTW_INTF_PHY_CUT_ALL
,
2029 RTW_INTF_PHY_PLATFORM_ALL
},
2032 static 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 struct rtw_hw_reg rtw8822b_dig
[] = {
2050 [0] = { .addr
= 0xc50, .mask
= 0x7f },
2051 [1] = { .addr
= 0xe50, .mask
= 0x7f },
2054 static struct rtw_page_table page_table_8822b
[] = {
2055 {64, 64, 64, 64, 1},
2056 {64, 64, 64, 64, 1},
2059 {64, 64, 64, 64, 1},
2062 static 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 */
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 */
2249 static_assert(ARRAY_SIZE(rf_para_tx_8822b
) == ARRAY_SIZE(rf_para_rx_8822b
));
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 },
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 },
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 },
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 struct rtw_chip_info rtw8822b_hw_spec
= {
2375 .ops
= &rtw8822b_ops
,
2376 .id
= RTW_CHIP_TYPE_8822B
,
2377 .fw_name
= "rtw88/rtw8822b_fw.bin",
2378 .tx_pkt_desc_sz
= 48,
2379 .tx_buf_desc_sz
= 16,
2380 .rx_pkt_desc_sz
= 24,
2381 .rx_buf_desc_sz
= 8,
2382 .phy_efuse_size
= 1024,
2383 .log_efuse_size
= 768,
2384 .ptct_efuse_size
= 96,
2385 .txff_size
= 262144,
2388 .is_pwr_by_rate_dec
= true,
2389 .max_power_index
= 0x3f,
2390 .csi_buf_pg_num
= 0,
2391 .band
= RTW_BAND_2G
| RTW_BAND_5G
,
2394 .ht_supported
= true,
2395 .vht_supported
= true,
2396 .lps_deep_mode_supported
= BIT(LPS_DEEP_MODE_LCLK
),
2397 .sys_func_en
= 0xDC,
2398 .pwr_on_seq
= card_enable_flow_8822b
,
2399 .pwr_off_seq
= card_disable_flow_8822b
,
2400 .page_table
= page_table_8822b
,
2401 .rqpn_table
= rqpn_table_8822b
,
2402 .intf_table
= &phy_para_table_8822b
,
2403 .dig
= rtw8822b_dig
,
2404 .rf_base_addr
= {0x2800, 0x2c00},
2405 .rf_sipi_addr
= {0xc90, 0xe90},
2406 .mac_tbl
= &rtw8822b_mac_tbl
,
2407 .agc_tbl
= &rtw8822b_agc_tbl
,
2408 .bb_tbl
= &rtw8822b_bb_tbl
,
2409 .rf_tbl
= {&rtw8822b_rf_a_tbl
, &rtw8822b_rf_b_tbl
},
2410 .rfe_defs
= rtw8822b_rfe_defs
,
2411 .rfe_defs_size
= ARRAY_SIZE(rtw8822b_rfe_defs
),
2412 .pwr_track_tbl
= &rtw8822b_rtw_pwr_track_tbl
,
2414 .bfer_su_max_num
= 2,
2415 .bfer_mu_max_num
= 1,
2417 .coex_para_ver
= 0x19062706,
2418 .bt_desired_ver
= 0x6,
2419 .scbd_support
= true,
2420 .new_scbd10_def
= false,
2421 .pstdma_type
= COEX_PSTDMA_FORCE_LPSOFF
,
2422 .bt_rssi_type
= COEX_BTRSSI_RATIO
,
2423 .ant_isolation
= 15,
2424 .rssi_tolerance
= 2,
2425 .wl_rssi_step
= wl_rssi_step_8822b
,
2426 .bt_rssi_step
= bt_rssi_step_8822b
,
2427 .table_sant_num
= ARRAY_SIZE(table_sant_8822b
),
2428 .table_sant
= table_sant_8822b
,
2429 .table_nsant_num
= ARRAY_SIZE(table_nsant_8822b
),
2430 .table_nsant
= table_nsant_8822b
,
2431 .tdma_sant_num
= ARRAY_SIZE(tdma_sant_8822b
),
2432 .tdma_sant
= tdma_sant_8822b
,
2433 .tdma_nsant_num
= ARRAY_SIZE(tdma_nsant_8822b
),
2434 .tdma_nsant
= tdma_nsant_8822b
,
2435 .wl_rf_para_num
= ARRAY_SIZE(rf_para_tx_8822b
),
2436 .wl_rf_para_tx
= rf_para_tx_8822b
,
2437 .wl_rf_para_rx
= rf_para_rx_8822b
,
2438 .bt_afh_span_bw20
= 0x24,
2439 .bt_afh_span_bw40
= 0x36,
2440 .afh_5g_num
= ARRAY_SIZE(afh_5g_8822b
),
2441 .afh_5g
= afh_5g_8822b
,
2443 EXPORT_SYMBOL(rtw8822b_hw_spec
);
2445 MODULE_FIRMWARE("rtw88/rtw8822b_fw.bin");