0001
0002
0003
0004
0005 #include <linux/module.h>
0006 #include "main.h"
0007 #include "coex.h"
0008 #include "fw.h"
0009 #include "tx.h"
0010 #include "rx.h"
0011 #include "phy.h"
0012 #include "rtw8822b.h"
0013 #include "rtw8822b_table.h"
0014 #include "mac.h"
0015 #include "reg.h"
0016 #include "debug.h"
0017 #include "bf.h"
0018 #include "regd.h"
0019
0020 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
0021 u8 rx_path, bool is_tx2_path);
0022
0023 static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse,
0024 struct rtw8822b_efuse *map)
0025 {
0026 ether_addr_copy(efuse->addr, map->e.mac_addr);
0027 }
0028
0029 static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
0030 {
0031 struct rtw_efuse *efuse = &rtwdev->efuse;
0032 struct rtw8822b_efuse *map;
0033 int i;
0034
0035 map = (struct rtw8822b_efuse *)log_map;
0036
0037 efuse->rfe_option = map->rfe_option;
0038 efuse->rf_board_option = map->rf_board_option;
0039 efuse->crystal_cap = map->xtal_k;
0040 efuse->pa_type_2g = map->pa_type;
0041 efuse->pa_type_5g = map->pa_type;
0042 efuse->lna_type_2g = map->lna_type_2g[0];
0043 efuse->lna_type_5g = map->lna_type_5g[0];
0044 efuse->channel_plan = map->channel_plan;
0045 efuse->country_code[0] = map->country_code[0];
0046 efuse->country_code[1] = map->country_code[1];
0047 efuse->bt_setting = map->rf_bt_setting;
0048 efuse->regd = map->rf_board_option & 0x7;
0049 efuse->thermal_meter[RF_PATH_A] = map->thermal_meter;
0050 efuse->thermal_meter_k = map->thermal_meter;
0051
0052 for (i = 0; i < 4; i++)
0053 efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
0054
0055 switch (rtw_hci_type(rtwdev)) {
0056 case RTW_HCI_TYPE_PCIE:
0057 rtw8822be_efuse_parsing(efuse, map);
0058 break;
0059 default:
0060
0061 return -ENOTSUPP;
0062 }
0063
0064 return 0;
0065 }
0066
0067 static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
0068 {
0069
0070 rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3);
0071 rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0);
0072 rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1);
0073
0074
0075 rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
0076 rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
0077
0078
0079 rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f);
0080 rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3);
0081 }
0082
0083 #define RTW_TXSCALE_SIZE 37
0084 static const u32 rtw8822b_txscale_tbl[RTW_TXSCALE_SIZE] = {
0085 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
0086 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
0087 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
0088 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
0089 };
0090
0091 static u8 rtw8822b_get_swing_index(struct rtw_dev *rtwdev)
0092 {
0093 u8 i = 0;
0094 u32 swing, table_value;
0095
0096 swing = rtw_read32_mask(rtwdev, 0xc1c, 0xffe00000);
0097 for (i = 0; i < RTW_TXSCALE_SIZE; i++) {
0098 table_value = rtw8822b_txscale_tbl[i];
0099 if (swing == table_value)
0100 break;
0101 }
0102
0103 return i;
0104 }
0105
0106 static void rtw8822b_pwrtrack_init(struct rtw_dev *rtwdev)
0107 {
0108 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0109 u8 swing_idx = rtw8822b_get_swing_index(rtwdev);
0110 u8 path;
0111
0112 if (swing_idx >= RTW_TXSCALE_SIZE)
0113 dm_info->default_ofdm_index = 24;
0114 else
0115 dm_info->default_ofdm_index = swing_idx;
0116
0117 for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
0118 ewma_thermal_init(&dm_info->avg_thermal[path]);
0119 dm_info->delta_power_index[path] = 0;
0120 }
0121 dm_info->pwr_trk_triggered = false;
0122 dm_info->pwr_trk_init_trigger = true;
0123 dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
0124 }
0125
0126 static void rtw8822b_phy_bf_init(struct rtw_dev *rtwdev)
0127 {
0128 rtw_bf_phy_init(rtwdev);
0129
0130 rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF);
0131 }
0132
0133 static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
0134 {
0135 struct rtw_hal *hal = &rtwdev->hal;
0136 u8 crystal_cap;
0137 bool is_tx2_path;
0138
0139
0140 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
0141 BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
0142 rtw_write8_set(rtwdev, REG_RF_CTRL,
0143 BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
0144 rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
0145
0146
0147 rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
0148
0149 rtw_phy_load_tables(rtwdev);
0150
0151 crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
0152 rtw_write32_mask(rtwdev, 0x24, 0x7e000000, crystal_cap);
0153 rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap);
0154
0155
0156 rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
0157
0158 is_tx2_path = false;
0159 rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
0160 is_tx2_path);
0161 rtw_phy_init(rtwdev);
0162
0163 rtw8822b_phy_rfe_init(rtwdev);
0164 rtw8822b_pwrtrack_init(rtwdev);
0165
0166 rtw8822b_phy_bf_init(rtwdev);
0167 }
0168
0169 #define WLAN_SLOT_TIME 0x09
0170 #define WLAN_PIFS_TIME 0x19
0171 #define WLAN_SIFS_CCK_CONT_TX 0xA
0172 #define WLAN_SIFS_OFDM_CONT_TX 0xE
0173 #define WLAN_SIFS_CCK_TRX 0x10
0174 #define WLAN_SIFS_OFDM_TRX 0x10
0175 #define WLAN_VO_TXOP_LIMIT 0x186
0176 #define WLAN_VI_TXOP_LIMIT 0x3BC
0177 #define WLAN_RDG_NAV 0x05
0178 #define WLAN_TXOP_NAV 0x1B
0179 #define WLAN_CCK_RX_TSF 0x30
0180 #define WLAN_OFDM_RX_TSF 0x30
0181 #define WLAN_TBTT_PROHIBIT 0x04
0182 #define WLAN_TBTT_HOLD_TIME 0x064
0183 #define WLAN_DRV_EARLY_INT 0x04
0184 #define WLAN_BCN_DMA_TIME 0x02
0185
0186 #define WLAN_RX_FILTER0 0x0FFFFFFF
0187 #define WLAN_RX_FILTER2 0xFFFF
0188 #define WLAN_RCR_CFG 0xE400220E
0189 #define WLAN_RXPKT_MAX_SZ 12288
0190 #define WLAN_RXPKT_MAX_SZ_512 (WLAN_RXPKT_MAX_SZ >> 9)
0191
0192 #define WLAN_AMPDU_MAX_TIME 0x70
0193 #define WLAN_RTS_LEN_TH 0xFF
0194 #define WLAN_RTS_TX_TIME_TH 0x08
0195 #define WLAN_MAX_AGG_PKT_LIMIT 0x20
0196 #define WLAN_RTS_MAX_AGG_PKT_LIMIT 0x20
0197 #define FAST_EDCA_VO_TH 0x06
0198 #define FAST_EDCA_VI_TH 0x06
0199 #define FAST_EDCA_BE_TH 0x06
0200 #define FAST_EDCA_BK_TH 0x06
0201 #define WLAN_BAR_RETRY_LIMIT 0x01
0202 #define WLAN_RA_TRY_RATE_AGG_LIMIT 0x08
0203
0204 #define WLAN_TX_FUNC_CFG1 0x30
0205 #define WLAN_TX_FUNC_CFG2 0x30
0206 #define WLAN_MAC_OPT_NORM_FUNC1 0x98
0207 #define WLAN_MAC_OPT_LB_FUNC1 0x80
0208 #define WLAN_MAC_OPT_FUNC2 0xb0810041
0209
0210 #define WLAN_SIFS_CFG (WLAN_SIFS_CCK_CONT_TX | \
0211 (WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
0212 (WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
0213 (WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
0214
0215 #define WLAN_TBTT_TIME (WLAN_TBTT_PROHIBIT |\
0216 (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
0217
0218 #define WLAN_NAV_CFG (WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
0219 #define WLAN_RX_TSF_CFG (WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
0220
0221 static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
0222 {
0223 u32 value32;
0224
0225
0226 rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, BIT_PRE_TX_CMD);
0227 rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
0228 rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
0229 value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
0230 (WLAN_MAX_AGG_PKT_LIMIT << 16) |
0231 (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
0232 rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
0233 rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
0234 WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
0235 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
0236 rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
0237 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
0238 rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
0239
0240 rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
0241 rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
0242 rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
0243 rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
0244 rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
0245 rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
0246 rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
0247 rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
0248 rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
0249
0250 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
0251
0252 rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
0253 rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
0254 rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
0255 rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
0256
0257 rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
0258 rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
0259 rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
0260 rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
0261 rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
0262 rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
0263 rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
0264 rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
0265 rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
0266 BIT_DIS_CHK_VHTSIGB_CRC);
0267
0268 return 0;
0269 }
0270
0271 static void rtw8822b_set_channel_rfe_efem(struct rtw_dev *rtwdev, u8 channel)
0272 {
0273 struct rtw_hal *hal = &rtwdev->hal;
0274
0275 if (IS_CH_2G_BAND(channel)) {
0276 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x705770);
0277 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
0278 rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(4), 0);
0279 } else {
0280 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x177517);
0281 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
0282 rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(5), 0);
0283 }
0284
0285 rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
0286
0287 if (hal->antenna_rx == BB_PATH_AB ||
0288 hal->antenna_tx == BB_PATH_AB) {
0289
0290 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
0291 } else if (hal->antenna_rx == hal->antenna_tx) {
0292
0293 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
0294 } else {
0295
0296 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
0297 }
0298 }
0299
0300 static void rtw8822b_set_channel_rfe_ifem(struct rtw_dev *rtwdev, u8 channel)
0301 {
0302 struct rtw_hal *hal = &rtwdev->hal;
0303
0304 if (IS_CH_2G_BAND(channel)) {
0305
0306 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774);
0307 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
0308 } else {
0309
0310 rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x477547);
0311 rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
0312 }
0313
0314 rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
0315
0316 if (IS_CH_2G_BAND(channel)) {
0317 if (hal->antenna_rx == BB_PATH_AB ||
0318 hal->antenna_tx == BB_PATH_AB) {
0319
0320 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
0321 } else if (hal->antenna_rx == hal->antenna_tx) {
0322
0323 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
0324 } else {
0325
0326 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
0327 }
0328 } else {
0329 rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa5a5);
0330 }
0331 }
0332
0333 enum {
0334 CCUT_IDX_1R_2G,
0335 CCUT_IDX_2R_2G,
0336 CCUT_IDX_1R_5G,
0337 CCUT_IDX_2R_5G,
0338 CCUT_IDX_NR,
0339 };
0340
0341 struct cca_ccut {
0342 u32 reg82c[CCUT_IDX_NR];
0343 u32 reg830[CCUT_IDX_NR];
0344 u32 reg838[CCUT_IDX_NR];
0345 };
0346
0347 static const struct cca_ccut cca_ifem_ccut = {
0348 {0x75C97010, 0x75C97010, 0x75C97010, 0x75C97010},
0349 {0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa},
0350 {0x87765541, 0x87746341, 0x87765541, 0x87746341},
0351 };
0352
0353 static const struct cca_ccut cca_efem_ccut = {
0354 {0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010},
0355 {0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa},
0356 {0x87766451, 0x87766431, 0x87766451, 0x87766431},
0357 };
0358
0359 static const struct cca_ccut cca_ifem_ccut_ext = {
0360 {0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010},
0361 {0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa},
0362 {0x87765541, 0x86666341, 0x87765561, 0x86666361},
0363 };
0364
0365 static void rtw8822b_get_cca_val(const struct cca_ccut *cca_ccut, u8 col,
0366 u32 *reg82c, u32 *reg830, u32 *reg838)
0367 {
0368 *reg82c = cca_ccut->reg82c[col];
0369 *reg830 = cca_ccut->reg830[col];
0370 *reg838 = cca_ccut->reg838[col];
0371 }
0372
0373 struct rtw8822b_rfe_info {
0374 const struct cca_ccut *cca_ccut_2g;
0375 const struct cca_ccut *cca_ccut_5g;
0376 enum rtw_rfe_fem fem;
0377 bool ifem_ext;
0378 void (*rtw_set_channel_rfe)(struct rtw_dev *rtwdev, u8 channel);
0379 };
0380
0381 #define I2GE5G_CCUT(set_ch) { \
0382 .cca_ccut_2g = &cca_ifem_ccut, \
0383 .cca_ccut_5g = &cca_efem_ccut, \
0384 .fem = RTW_RFE_IFEM2G_EFEM5G, \
0385 .ifem_ext = false, \
0386 .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \
0387 }
0388 #define IFEM_EXT_CCUT(set_ch) { \
0389 .cca_ccut_2g = &cca_ifem_ccut_ext, \
0390 .cca_ccut_5g = &cca_ifem_ccut_ext, \
0391 .fem = RTW_RFE_IFEM, \
0392 .ifem_ext = true, \
0393 .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \
0394 }
0395
0396 static const struct rtw8822b_rfe_info rtw8822b_rfe_info[] = {
0397 [2] = I2GE5G_CCUT(efem),
0398 [3] = IFEM_EXT_CCUT(ifem),
0399 [5] = IFEM_EXT_CCUT(ifem),
0400 };
0401
0402 static void rtw8822b_set_channel_cca(struct rtw_dev *rtwdev, u8 channel, u8 bw,
0403 const struct rtw8822b_rfe_info *rfe_info)
0404 {
0405 struct rtw_hal *hal = &rtwdev->hal;
0406 struct rtw_efuse *efuse = &rtwdev->efuse;
0407 const struct cca_ccut *cca_ccut;
0408 u8 col;
0409 u32 reg82c, reg830, reg838;
0410 bool is_efem_cca = false, is_ifem_cca = false, is_rfe_type = false;
0411
0412 if (IS_CH_2G_BAND(channel)) {
0413 cca_ccut = rfe_info->cca_ccut_2g;
0414
0415 if (hal->antenna_rx == BB_PATH_A ||
0416 hal->antenna_rx == BB_PATH_B)
0417 col = CCUT_IDX_1R_2G;
0418 else
0419 col = CCUT_IDX_2R_2G;
0420 } else {
0421 cca_ccut = rfe_info->cca_ccut_5g;
0422
0423 if (hal->antenna_rx == BB_PATH_A ||
0424 hal->antenna_rx == BB_PATH_B)
0425 col = CCUT_IDX_1R_5G;
0426 else
0427 col = CCUT_IDX_2R_5G;
0428 }
0429
0430 rtw8822b_get_cca_val(cca_ccut, col, ®82c, ®830, ®838);
0431
0432 switch (rfe_info->fem) {
0433 case RTW_RFE_IFEM:
0434 default:
0435 is_ifem_cca = true;
0436 if (rfe_info->ifem_ext)
0437 is_rfe_type = true;
0438 break;
0439 case RTW_RFE_EFEM:
0440 is_efem_cca = true;
0441 break;
0442 case RTW_RFE_IFEM2G_EFEM5G:
0443 if (IS_CH_2G_BAND(channel))
0444 is_ifem_cca = true;
0445 else
0446 is_efem_cca = true;
0447 break;
0448 }
0449
0450 if (is_ifem_cca) {
0451 if ((hal->cut_version == RTW_CHIP_VER_CUT_B &&
0452 (col == CCUT_IDX_2R_2G || col == CCUT_IDX_2R_5G) &&
0453 bw == RTW_CHANNEL_WIDTH_40) ||
0454 (!is_rfe_type && col == CCUT_IDX_2R_5G &&
0455 bw == RTW_CHANNEL_WIDTH_40) ||
0456 (efuse->rfe_option == 5 && col == CCUT_IDX_2R_5G))
0457 reg830 = 0x79a0ea28;
0458 }
0459
0460 rtw_write32_mask(rtwdev, REG_CCASEL, MASKDWORD, reg82c);
0461 rtw_write32_mask(rtwdev, REG_PDMFTH, MASKDWORD, reg830);
0462 rtw_write32_mask(rtwdev, REG_CCA2ND, MASKDWORD, reg838);
0463
0464 if (is_efem_cca && !(hal->cut_version == RTW_CHIP_VER_CUT_B))
0465 rtw_write32_mask(rtwdev, REG_L1WT, MASKDWORD, 0x9194b2b9);
0466
0467 if (bw == RTW_CHANNEL_WIDTH_20 && IS_CH_5G_BAND_MID(channel))
0468 rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0, 0x4);
0469 }
0470
0471 static const u8 low_band[15] = {0x7, 0x6, 0x6, 0x5, 0x0, 0x0, 0x7, 0xff, 0x6,
0472 0x5, 0x0, 0x0, 0x7, 0x6, 0x6};
0473 static const u8 middle_band[23] = {0x6, 0x5, 0x0, 0x0, 0x7, 0x6, 0x6, 0xff, 0x0,
0474 0x0, 0x7, 0x6, 0x6, 0x5, 0x0, 0xff, 0x7, 0x6,
0475 0x6, 0x5, 0x0, 0x0, 0x7};
0476 static const u8 high_band[15] = {0x5, 0x5, 0x0, 0x7, 0x7, 0x6, 0x5, 0xff, 0x0,
0477 0x7, 0x7, 0x6, 0x5, 0x5, 0x0};
0478
0479 static void rtw8822b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
0480 {
0481 #define RF18_BAND_MASK (BIT(16) | BIT(9) | BIT(8))
0482 #define RF18_BAND_2G (0)
0483 #define RF18_BAND_5G (BIT(16) | BIT(8))
0484 #define RF18_CHANNEL_MASK (MASKBYTE0)
0485 #define RF18_RFSI_MASK (BIT(18) | BIT(17))
0486 #define RF18_RFSI_GE_CH80 (BIT(17))
0487 #define RF18_RFSI_GT_CH144 (BIT(18))
0488 #define RF18_BW_MASK (BIT(11) | BIT(10))
0489 #define RF18_BW_20M (BIT(11) | BIT(10))
0490 #define RF18_BW_40M (BIT(11))
0491 #define RF18_BW_80M (BIT(10))
0492 #define RFBE_MASK (BIT(17) | BIT(16) | BIT(15))
0493
0494 struct rtw_hal *hal = &rtwdev->hal;
0495 u32 rf_reg18, rf_reg_be;
0496
0497 rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
0498
0499 rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
0500 RF18_BW_MASK);
0501
0502 rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G);
0503 rf_reg18 |= (channel & RF18_CHANNEL_MASK);
0504 if (channel > 144)
0505 rf_reg18 |= RF18_RFSI_GT_CH144;
0506 else if (channel >= 80)
0507 rf_reg18 |= RF18_RFSI_GE_CH80;
0508
0509 switch (bw) {
0510 case RTW_CHANNEL_WIDTH_5:
0511 case RTW_CHANNEL_WIDTH_10:
0512 case RTW_CHANNEL_WIDTH_20:
0513 default:
0514 rf_reg18 |= RF18_BW_20M;
0515 break;
0516 case RTW_CHANNEL_WIDTH_40:
0517 rf_reg18 |= RF18_BW_40M;
0518 break;
0519 case RTW_CHANNEL_WIDTH_80:
0520 rf_reg18 |= RF18_BW_80M;
0521 break;
0522 }
0523
0524 if (IS_CH_2G_BAND(channel))
0525 rf_reg_be = 0x0;
0526 else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
0527 rf_reg_be = low_band[(channel - 36) >> 1];
0528 else if (IS_CH_5G_BAND_3(channel))
0529 rf_reg_be = middle_band[(channel - 100) >> 1];
0530 else if (IS_CH_5G_BAND_4(channel))
0531 rf_reg_be = high_band[(channel - 149) >> 1];
0532 else
0533 goto err;
0534
0535 rtw_write_rf(rtwdev, RF_PATH_A, RF_MALSEL, RFBE_MASK, rf_reg_be);
0536
0537
0538 if (channel == 144)
0539 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x1);
0540 else
0541 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x0);
0542
0543 rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18);
0544 if (hal->rf_type > RF_1T1R)
0545 rtw_write_rf(rtwdev, RF_PATH_B, 0x18, RFREG_MASK, rf_reg18);
0546
0547 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0);
0548 rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1);
0549
0550 return;
0551
0552 err:
0553 WARN_ON(1);
0554 }
0555
0556 static void rtw8822b_toggle_igi(struct rtw_dev *rtwdev)
0557 {
0558 struct rtw_hal *hal = &rtwdev->hal;
0559 u32 igi;
0560
0561 igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f);
0562 rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi - 2);
0563 rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi);
0564 rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi - 2);
0565 rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi);
0566
0567 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 0x0);
0568 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0,
0569 hal->antenna_rx | (hal->antenna_rx << 4));
0570 }
0571
0572 static void rtw8822b_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
0573 {
0574 if (bw == RTW_CHANNEL_WIDTH_40) {
0575
0576 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x1);
0577 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x0);
0578 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
0579 } else if (bw == RTW_CHANNEL_WIDTH_80) {
0580
0581 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
0582 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1);
0583 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
0584 } else {
0585
0586 rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
0587 rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
0588 rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1);
0589 }
0590 }
0591
0592 static void rtw8822b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
0593 u8 primary_ch_idx)
0594 {
0595 struct rtw_efuse *efuse = &rtwdev->efuse;
0596 u8 rfe_option = efuse->rfe_option;
0597 u32 val32;
0598
0599 if (IS_CH_2G_BAND(channel)) {
0600 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1);
0601 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0);
0602 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0);
0603 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
0604
0605 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x0);
0606 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
0607 if (channel == 14) {
0608 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x00006577);
0609 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
0610 } else {
0611 rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x384f6577);
0612 rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x1525);
0613 }
0614
0615 rtw_write32_mask(rtwdev, REG_RFEINV, 0x300, 0x2);
0616 } else if (IS_CH_5G_BAND(channel)) {
0617 rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
0618 rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
0619 rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
0620 rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 34);
0621
0622 if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
0623 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x1);
0624 else if (IS_CH_5G_BAND_3(channel))
0625 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x2);
0626 else if (IS_CH_5G_BAND_4(channel))
0627 rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x3);
0628
0629 if (IS_CH_5G_BAND_1(channel))
0630 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
0631 else if (IS_CH_5G_BAND_2(channel))
0632 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
0633 else if (channel >= 100 && channel <= 116)
0634 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
0635 else if (channel >= 118 && channel <= 177)
0636 rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
0637
0638 rtw_write32_mask(rtwdev, 0xcbc, 0x300, 0x1);
0639 }
0640
0641 switch (bw) {
0642 case RTW_CHANNEL_WIDTH_20:
0643 default:
0644 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0645 val32 &= 0xFFCFFC00;
0646 val32 |= (RTW_CHANNEL_WIDTH_20);
0647 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0648
0649 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0650 break;
0651 case RTW_CHANNEL_WIDTH_40:
0652 if (primary_ch_idx == RTW_SC_20_UPPER)
0653 rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
0654 else
0655 rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
0656
0657 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0658 val32 &= 0xFF3FF300;
0659 val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_40);
0660 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0661
0662 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0663 break;
0664 case RTW_CHANNEL_WIDTH_80:
0665 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0666 val32 &= 0xFCEFCF00;
0667 val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_80);
0668 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0669
0670 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
0671
0672 if (rfe_option == 2 || rfe_option == 3) {
0673 rtw_write32_mask(rtwdev, REG_L1PKWT, 0x0000f000, 0x6);
0674 rtw_write32_mask(rtwdev, REG_ADC40, BIT(10), 0x1);
0675 }
0676 break;
0677 case RTW_CHANNEL_WIDTH_5:
0678 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0679 val32 &= 0xEFEEFE00;
0680 val32 |= ((BIT(6) | RTW_CHANNEL_WIDTH_20));
0681 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0682
0683 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
0684 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
0685 break;
0686 case RTW_CHANNEL_WIDTH_10:
0687 val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
0688 val32 &= 0xEFFEFF00;
0689 val32 |= ((BIT(7) | RTW_CHANNEL_WIDTH_20));
0690 rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
0691
0692 rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
0693 rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
0694 break;
0695 }
0696 }
0697
0698 static void rtw8822b_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
0699 u8 primary_chan_idx)
0700 {
0701 struct rtw_efuse *efuse = &rtwdev->efuse;
0702 const struct rtw8822b_rfe_info *rfe_info;
0703
0704 if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
0705 "rfe_option %d is out of boundary\n", efuse->rfe_option))
0706 return;
0707
0708 rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
0709
0710 rtw8822b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
0711 rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
0712 rtw8822b_set_channel_rf(rtwdev, channel, bw);
0713 rtw8822b_set_channel_rxdfir(rtwdev, bw);
0714 rtw8822b_toggle_igi(rtwdev);
0715 rtw8822b_set_channel_cca(rtwdev, channel, bw, rfe_info);
0716 (*rfe_info->rtw_set_channel_rfe)(rtwdev, channel);
0717 }
0718
0719 static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
0720 u8 rx_path, bool is_tx2_path)
0721 {
0722 struct rtw_efuse *efuse = &rtwdev->efuse;
0723 const struct rtw8822b_rfe_info *rfe_info;
0724 u8 ch = rtwdev->hal.current_channel;
0725 u8 tx_path_sel, rx_path_sel;
0726 int counter;
0727
0728 if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
0729 "rfe_option %d is out of boundary\n", efuse->rfe_option))
0730 return;
0731
0732 rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
0733
0734 if ((tx_path | rx_path) & BB_PATH_A)
0735 rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x3231);
0736 else
0737 rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x1111);
0738
0739 if ((tx_path | rx_path) & BB_PATH_B)
0740 rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x3231);
0741 else
0742 rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x1111);
0743
0744 rtw_write32_mask(rtwdev, REG_CDDTXP, (BIT(19) | BIT(18)), 0x3);
0745 rtw_write32_mask(rtwdev, REG_TXPSEL, (BIT(29) | BIT(28)), 0x1);
0746 rtw_write32_mask(rtwdev, REG_TXPSEL, BIT(30), 0x1);
0747
0748 if (tx_path & BB_PATH_A) {
0749 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x001);
0750 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x8);
0751 } else if (tx_path & BB_PATH_B) {
0752 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x002);
0753 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x4);
0754 }
0755
0756 if (tx_path == BB_PATH_A || tx_path == BB_PATH_B)
0757 rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x01);
0758 else
0759 rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x43);
0760
0761 tx_path_sel = (tx_path << 4) | tx_path;
0762 rtw_write32_mask(rtwdev, REG_TXPSEL, MASKBYTE0, tx_path_sel);
0763
0764 if (tx_path != BB_PATH_A && tx_path != BB_PATH_B) {
0765 if (is_tx2_path || rtwdev->mp_mode) {
0766 rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x043);
0767 rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0xc);
0768 }
0769 }
0770
0771 rtw_write32_mask(rtwdev, REG_RXDESC, BIT(22), 0x0);
0772 rtw_write32_mask(rtwdev, REG_RXDESC, BIT(18), 0x0);
0773
0774 if (rx_path & BB_PATH_A)
0775 rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x0);
0776 else if (rx_path & BB_PATH_B)
0777 rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x5);
0778
0779 rx_path_sel = (rx_path << 4) | rx_path;
0780 rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, rx_path_sel);
0781
0782 if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
0783 rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x0);
0784 rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x0);
0785 rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x0);
0786 } else {
0787 rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x1);
0788 rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x1);
0789 rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x1);
0790 }
0791
0792 for (counter = 100; counter > 0; counter--) {
0793 u32 rf_reg33;
0794
0795 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
0796 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
0797
0798 udelay(2);
0799 rf_reg33 = rtw_read_rf(rtwdev, RF_PATH_A, 0x33, RFREG_MASK);
0800
0801 if (rf_reg33 == 0x00001)
0802 break;
0803 }
0804
0805 if (WARN(counter <= 0, "write RF mode table fail\n"))
0806 return;
0807
0808 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
0809 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
0810 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x00034);
0811 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x4080c);
0812 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
0813 rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
0814
0815 rtw8822b_toggle_igi(rtwdev);
0816 rtw8822b_set_channel_cca(rtwdev, 1, RTW_CHANNEL_WIDTH_20, rfe_info);
0817 (*rfe_info->rtw_set_channel_rfe)(rtwdev, ch);
0818 }
0819
0820 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
0821 struct rtw_rx_pkt_stat *pkt_stat)
0822 {
0823 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0824 s8 min_rx_power = -120;
0825 u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
0826
0827
0828 pkt_stat->rx_power[RF_PATH_A] = pwdb - 110;
0829 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
0830 pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
0831 pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
0832 min_rx_power);
0833 dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
0834 }
0835
0836 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
0837 struct rtw_rx_pkt_stat *pkt_stat)
0838 {
0839 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
0840 u8 rxsc, bw;
0841 s8 min_rx_power = -120;
0842 s8 rx_evm;
0843 u8 evm_dbm = 0;
0844 u8 rssi;
0845 int path;
0846
0847 if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
0848 rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
0849 else
0850 rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
0851
0852 if (rxsc >= 1 && rxsc <= 8)
0853 bw = RTW_CHANNEL_WIDTH_20;
0854 else if (rxsc >= 9 && rxsc <= 12)
0855 bw = RTW_CHANNEL_WIDTH_40;
0856 else if (rxsc >= 13)
0857 bw = RTW_CHANNEL_WIDTH_80;
0858 else
0859 bw = GET_PHY_STAT_P1_RF_MODE(phy_status);
0860
0861 pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
0862 pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
0863 pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
0864 pkt_stat->bw = bw;
0865 pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
0866 pkt_stat->rx_power[RF_PATH_B],
0867 min_rx_power);
0868
0869 dm_info->curr_rx_rate = pkt_stat->rate;
0870
0871 pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
0872 pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status);
0873
0874 pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
0875 pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status);
0876
0877 pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
0878 pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status);
0879
0880 for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
0881 rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
0882 dm_info->rssi[path] = rssi;
0883 dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
0884 dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
0885
0886 rx_evm = pkt_stat->rx_evm[path];
0887
0888 if (rx_evm < 0) {
0889 if (rx_evm == S8_MIN)
0890 evm_dbm = 0;
0891 else
0892 evm_dbm = ((u8)-rx_evm >> 1);
0893 }
0894 dm_info->rx_evm_dbm[path] = evm_dbm;
0895 }
0896 }
0897
0898 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
0899 struct rtw_rx_pkt_stat *pkt_stat)
0900 {
0901 u8 page;
0902
0903 page = *phy_status & 0xf;
0904
0905 switch (page) {
0906 case 0:
0907 query_phy_status_page0(rtwdev, phy_status, pkt_stat);
0908 break;
0909 case 1:
0910 query_phy_status_page1(rtwdev, phy_status, pkt_stat);
0911 break;
0912 default:
0913 rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
0914 return;
0915 }
0916 }
0917
0918 static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
0919 struct rtw_rx_pkt_stat *pkt_stat,
0920 struct ieee80211_rx_status *rx_status)
0921 {
0922 struct ieee80211_hdr *hdr;
0923 u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
0924 u8 *phy_status = NULL;
0925
0926 memset(pkt_stat, 0, sizeof(*pkt_stat));
0927
0928 pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
0929 pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
0930 pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
0931 pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
0932 GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
0933 pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
0934 pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
0935 pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
0936 pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
0937 pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
0938 pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
0939 pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
0940 pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
0941
0942
0943 pkt_stat->drv_info_sz *= 8;
0944
0945
0946 if (pkt_stat->is_c2h)
0947 return;
0948
0949 hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
0950 pkt_stat->drv_info_sz);
0951 if (pkt_stat->phy_status) {
0952 phy_status = rx_desc + desc_sz + pkt_stat->shift;
0953 query_phy_status(rtwdev, phy_status, pkt_stat);
0954 }
0955
0956 rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
0957 }
0958
0959 static void
0960 rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
0961 {
0962 struct rtw_hal *hal = &rtwdev->hal;
0963 static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
0964 static u32 phy_pwr_idx;
0965 u8 rate, rate_idx, pwr_index, shift;
0966 int j;
0967
0968 for (j = 0; j < rtw_rate_size[rs]; j++) {
0969 rate = rtw_rate_section[rs][j];
0970 pwr_index = hal->tx_pwr_tbl[path][rate];
0971 shift = rate & 0x3;
0972 phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
0973 if (shift == 0x3) {
0974 rate_idx = rate & 0xfc;
0975 rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
0976 phy_pwr_idx);
0977 phy_pwr_idx = 0;
0978 }
0979 }
0980 }
0981
0982 static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
0983 {
0984 struct rtw_hal *hal = &rtwdev->hal;
0985 int rs, path;
0986
0987 for (path = 0; path < hal->rf_path_num; path++) {
0988 for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
0989 rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
0990 }
0991 }
0992
0993 static bool rtw8822b_check_rf_path(u8 antenna)
0994 {
0995 switch (antenna) {
0996 case BB_PATH_A:
0997 case BB_PATH_B:
0998 case BB_PATH_AB:
0999 return true;
1000 default:
1001 return false;
1002 }
1003 }
1004
1005 static int rtw8822b_set_antenna(struct rtw_dev *rtwdev,
1006 u32 antenna_tx,
1007 u32 antenna_rx)
1008 {
1009 struct rtw_hal *hal = &rtwdev->hal;
1010
1011 rtw_dbg(rtwdev, RTW_DBG_PHY, "config RF path, tx=0x%x rx=0x%x\n",
1012 antenna_tx, antenna_rx);
1013
1014 if (!rtw8822b_check_rf_path(antenna_tx)) {
1015 rtw_warn(rtwdev, "unsupported tx path 0x%x\n", antenna_tx);
1016 return -EINVAL;
1017 }
1018
1019 if (!rtw8822b_check_rf_path(antenna_rx)) {
1020 rtw_warn(rtwdev, "unsupported rx path 0x%x\n", antenna_rx);
1021 return -EINVAL;
1022 }
1023
1024 hal->antenna_tx = antenna_tx;
1025 hal->antenna_rx = antenna_rx;
1026
1027 rtw8822b_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
1028
1029 return 0;
1030 }
1031
1032 static void rtw8822b_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
1033 {
1034 u8 ldo_pwr;
1035
1036 ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
1037 ldo_pwr = enable ? ldo_pwr | BIT_LDO25_EN : ldo_pwr & ~BIT_LDO25_EN;
1038 rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
1039 }
1040
1041 static void rtw8822b_false_alarm_statistics(struct rtw_dev *rtwdev)
1042 {
1043 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1044 u32 cck_enable;
1045 u32 cck_fa_cnt;
1046 u32 ofdm_fa_cnt;
1047 u32 crc32_cnt;
1048 u32 cca32_cnt;
1049
1050 cck_enable = rtw_read32(rtwdev, 0x808) & BIT(28);
1051 cck_fa_cnt = rtw_read16(rtwdev, 0xa5c);
1052 ofdm_fa_cnt = rtw_read16(rtwdev, 0xf48);
1053
1054 dm_info->cck_fa_cnt = cck_fa_cnt;
1055 dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
1056 dm_info->total_fa_cnt = ofdm_fa_cnt;
1057 dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
1058
1059 crc32_cnt = rtw_read32(rtwdev, 0xf04);
1060 dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
1061 dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1062 crc32_cnt = rtw_read32(rtwdev, 0xf14);
1063 dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
1064 dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1065 crc32_cnt = rtw_read32(rtwdev, 0xf10);
1066 dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
1067 dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1068 crc32_cnt = rtw_read32(rtwdev, 0xf0c);
1069 dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
1070 dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
1071
1072 cca32_cnt = rtw_read32(rtwdev, 0xf08);
1073 dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16);
1074 dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
1075 if (cck_enable) {
1076 cca32_cnt = rtw_read32(rtwdev, 0xfcc);
1077 dm_info->cck_cca_cnt = cca32_cnt & 0xffff;
1078 dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
1079 }
1080
1081 rtw_write32_set(rtwdev, 0x9a4, BIT(17));
1082 rtw_write32_clr(rtwdev, 0x9a4, BIT(17));
1083 rtw_write32_clr(rtwdev, 0xa2c, BIT(15));
1084 rtw_write32_set(rtwdev, 0xa2c, BIT(15));
1085 rtw_write32_set(rtwdev, 0xb58, BIT(0));
1086 rtw_write32_clr(rtwdev, 0xb58, BIT(0));
1087 }
1088
1089 static void rtw8822b_do_iqk(struct rtw_dev *rtwdev)
1090 {
1091 static int do_iqk_cnt;
1092 struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
1093 u32 rf_reg, iqk_fail_mask;
1094 int counter;
1095 bool reload;
1096
1097 rtw_fw_do_iqk(rtwdev, ¶);
1098
1099 for (counter = 0; counter < 300; counter++) {
1100 rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
1101 if (rf_reg == 0xabcde)
1102 break;
1103 msleep(20);
1104 }
1105 rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
1106
1107 reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
1108 iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
1109 rtw_dbg(rtwdev, RTW_DBG_PHY,
1110 "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
1111 counter, reload, ++do_iqk_cnt, iqk_fail_mask);
1112 }
1113
1114 static void rtw8822b_phy_calibration(struct rtw_dev *rtwdev)
1115 {
1116 rtw8822b_do_iqk(rtwdev);
1117 }
1118
1119 static void rtw8822b_coex_cfg_init(struct rtw_dev *rtwdev)
1120 {
1121
1122 rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1123
1124
1125
1126 rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
1127
1128
1129 rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1130
1131
1132 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
1133 rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
1134
1135
1136 rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1137
1138 rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
1139
1140 rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
1141 }
1142
1143 static void rtw8822b_coex_cfg_ant_switch(struct rtw_dev *rtwdev,
1144 u8 ctrl_type, u8 pos_type)
1145 {
1146 struct rtw_coex *coex = &rtwdev->coex;
1147 struct rtw_coex_dm *coex_dm = &coex->dm;
1148 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1149 bool polarity_inverse;
1150 u8 regval = 0;
1151
1152 if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status)
1153 return;
1154
1155 coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type;
1156
1157 if (coex_rfe->ant_switch_diversity &&
1158 ctrl_type == COEX_SWITCH_CTRL_BY_BBSW)
1159 ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV;
1160
1161 polarity_inverse = (coex_rfe->ant_switch_polarity == 1);
1162
1163 switch (ctrl_type) {
1164 default:
1165 case COEX_SWITCH_CTRL_BY_BBSW:
1166
1167 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1168
1169 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1170
1171 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x77);
1172
1173 if (pos_type == COEX_SWITCH_TO_WLG_BT) {
1174 if (coex_rfe->rfe_module_type != 0x4 &&
1175 coex_rfe->rfe_module_type != 0x2)
1176 regval = 0x3;
1177 else
1178 regval = (!polarity_inverse ? 0x2 : 0x1);
1179 } else if (pos_type == COEX_SWITCH_TO_WLG) {
1180 regval = (!polarity_inverse ? 0x2 : 0x1);
1181 } else {
1182 regval = (!polarity_inverse ? 0x1 : 0x2);
1183 }
1184
1185 rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1186 break;
1187 case COEX_SWITCH_CTRL_BY_PTA:
1188
1189 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1190
1191 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1192
1193 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x66);
1194
1195 regval = (!polarity_inverse ? 0x2 : 0x1);
1196 rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
1197 break;
1198 case COEX_SWITCH_CTRL_BY_ANTDIV:
1199
1200 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1201
1202 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1203 rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x88);
1204 break;
1205 case COEX_SWITCH_CTRL_BY_MAC:
1206
1207 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x1);
1208
1209 regval = (!polarity_inverse ? 0x0 : 0x1);
1210 rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, regval);
1211 break;
1212 case COEX_SWITCH_CTRL_BY_FW:
1213
1214 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1215
1216 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1217 break;
1218 case COEX_SWITCH_CTRL_BY_BT:
1219
1220 rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1221
1222 rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x0);
1223 break;
1224 }
1225 }
1226
1227 static void rtw8822b_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1228 {
1229 }
1230
1231 static void rtw8822b_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1232 {
1233 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0);
1234 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0);
1235 rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0);
1236 rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0);
1237 rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0);
1238 }
1239
1240 static void rtw8822b_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1241 {
1242 struct rtw_coex *coex = &rtwdev->coex;
1243 struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1244 struct rtw_efuse *efuse = &rtwdev->efuse;
1245 bool is_ext_fem = false;
1246
1247 coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1248 coex_rfe->ant_switch_polarity = 0;
1249 coex_rfe->ant_switch_diversity = false;
1250 if (coex_rfe->rfe_module_type == 0x12 ||
1251 coex_rfe->rfe_module_type == 0x15 ||
1252 coex_rfe->rfe_module_type == 0x16)
1253 coex_rfe->ant_switch_exist = false;
1254 else
1255 coex_rfe->ant_switch_exist = true;
1256
1257 if (coex_rfe->rfe_module_type == 2 ||
1258 coex_rfe->rfe_module_type == 4) {
1259 rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, true);
1260 is_ext_fem = true;
1261 } else {
1262 rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, false);
1263 }
1264
1265 coex_rfe->wlg_at_btg = false;
1266
1267 if (efuse->share_ant &&
1268 coex_rfe->ant_switch_exist && !is_ext_fem)
1269 coex_rfe->ant_switch_with_bt = true;
1270 else
1271 coex_rfe->ant_switch_with_bt = false;
1272
1273
1274 rtw_write8(rtwdev, REG_RFE_CTRL_E, 0xff);
1275 rtw_write8_mask(rtwdev, REG_RFESEL_CTRL + 1, 0x3, 0x0);
1276 rtw_write8_mask(rtwdev, REG_RFE_INV16, BIT_RFE_BUF_EN, 0x0);
1277
1278
1279 rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0);
1280
1281
1282 rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1283
1284
1285 rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1286 }
1287
1288 static void rtw8822b_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1289 {
1290 struct rtw_coex *coex = &rtwdev->coex;
1291 struct rtw_coex_dm *coex_dm = &coex->dm;
1292 static const u16 reg_addr[] = {0xc58, 0xe58};
1293 static const u8 wl_tx_power[] = {0xd8, 0xd4, 0xd0, 0xcc, 0xc8};
1294 u8 i, pwr;
1295
1296 if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1297 return;
1298
1299 coex_dm->cur_wl_pwr_lvl = wl_pwr;
1300
1301 if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1302 coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1303
1304 pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1305
1306 for (i = 0; i < ARRAY_SIZE(reg_addr); i++)
1307 rtw_write8_mask(rtwdev, reg_addr[i], 0xff, pwr);
1308 }
1309
1310 static void rtw8822b_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1311 {
1312 struct rtw_coex *coex = &rtwdev->coex;
1313 struct rtw_coex_dm *coex_dm = &coex->dm;
1314
1315 static const u32 wl_rx_low_gain_on[] = {
1316 0xff000003, 0xbd120003, 0xbe100003, 0xbf080003, 0xbf060003,
1317 0xbf050003, 0xbc140003, 0xbb160003, 0xba180003, 0xb91a0003,
1318 0xb81c0003, 0xb71e0003, 0xb4200003, 0xb5220003, 0xb4240003,
1319 0xb3260003, 0xb2280003, 0xb12a0003, 0xb02c0003, 0xaf2e0003,
1320 0xae300003, 0xad320003, 0xac340003, 0xab360003, 0x8d380003,
1321 0x8c3a0003, 0x8b3c0003, 0x8a3e0003, 0x6e400003, 0x6d420003,
1322 0x6c440003, 0x6b460003, 0x6a480003, 0x694a0003, 0x684c0003,
1323 0x674e0003, 0x66500003, 0x65520003, 0x64540003, 0x64560003,
1324 0x007e0403
1325 };
1326
1327
1328 static const u32 wl_rx_low_gain_off[] = {
1329 0xff000003, 0xf4120003, 0xf5100003, 0xf60e0003, 0xf70c0003,
1330 0xf80a0003, 0xf3140003, 0xf2160003, 0xf1180003, 0xf01a0003,
1331 0xef1c0003, 0xee1e0003, 0xed200003, 0xec220003, 0xeb240003,
1332 0xea260003, 0xe9280003, 0xe82a0003, 0xe72c0003, 0xe62e0003,
1333 0xe5300003, 0xc8320003, 0xc7340003, 0xc6360003, 0xc5380003,
1334 0xc43a0003, 0xc33c0003, 0xc23e0003, 0xc1400003, 0xc0420003,
1335 0xa5440003, 0xa4460003, 0xa3480003, 0xa24a0003, 0xa14c0003,
1336 0x834e0003, 0x82500003, 0x81520003, 0x80540003, 0x65560003,
1337 0x007e0403
1338 };
1339 u8 i;
1340
1341 if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1342 return;
1343
1344 coex_dm->cur_wl_rx_low_gain_en = low_gain;
1345
1346 if (coex_dm->cur_wl_rx_low_gain_en) {
1347 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table On!\n");
1348 for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1349 rtw_write32(rtwdev, REG_RX_GAIN_EN, wl_rx_low_gain_on[i]);
1350
1351
1352 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x1);
1353 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x3f);
1354 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x1);
1355 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x3f);
1356 } else {
1357 rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table Off!\n");
1358 for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1359 rtw_write32(rtwdev, 0x81c, wl_rx_low_gain_off[i]);
1360
1361
1362 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x4);
1363 rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x0);
1364 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x4);
1365 rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x0);
1366 }
1367 }
1368
1369 static void rtw8822b_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path,
1370 u8 tx_pwr_idx_offset,
1371 s8 *txagc_idx, u8 *swing_idx)
1372 {
1373 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1374 s8 delta_pwr_idx = dm_info->delta_power_index[path];
1375 u8 swing_upper_bound = dm_info->default_ofdm_index + 10;
1376 u8 swing_lower_bound = 0;
1377 u8 max_tx_pwr_idx_offset = 0xf;
1378 s8 agc_index = 0;
1379 u8 swing_index = dm_info->default_ofdm_index;
1380
1381 tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset);
1382
1383 if (delta_pwr_idx >= 0) {
1384 if (delta_pwr_idx <= tx_pwr_idx_offset) {
1385 agc_index = delta_pwr_idx;
1386 swing_index = dm_info->default_ofdm_index;
1387 } else if (delta_pwr_idx > tx_pwr_idx_offset) {
1388 agc_index = tx_pwr_idx_offset;
1389 swing_index = dm_info->default_ofdm_index +
1390 delta_pwr_idx - tx_pwr_idx_offset;
1391 swing_index = min_t(u8, swing_index, swing_upper_bound);
1392 }
1393 } else {
1394 if (dm_info->default_ofdm_index > abs(delta_pwr_idx))
1395 swing_index =
1396 dm_info->default_ofdm_index + delta_pwr_idx;
1397 else
1398 swing_index = swing_lower_bound;
1399 swing_index = max_t(u8, swing_index, swing_lower_bound);
1400
1401 agc_index = 0;
1402 }
1403
1404 if (swing_index >= RTW_TXSCALE_SIZE) {
1405 rtw_warn(rtwdev, "swing index overflow\n");
1406 swing_index = RTW_TXSCALE_SIZE - 1;
1407 }
1408 *txagc_idx = agc_index;
1409 *swing_idx = swing_index;
1410 }
1411
1412 static void rtw8822b_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path,
1413 u8 pwr_idx_offset)
1414 {
1415 s8 txagc_idx;
1416 u8 swing_idx;
1417 u32 reg1, reg2;
1418
1419 if (path == RF_PATH_A) {
1420 reg1 = 0xc94;
1421 reg2 = 0xc1c;
1422 } else if (path == RF_PATH_B) {
1423 reg1 = 0xe94;
1424 reg2 = 0xe1c;
1425 } else {
1426 return;
1427 }
1428
1429 rtw8822b_txagc_swing_offset(rtwdev, path, pwr_idx_offset,
1430 &txagc_idx, &swing_idx);
1431 rtw_write32_mask(rtwdev, reg1, GENMASK(29, 25), txagc_idx);
1432 rtw_write32_mask(rtwdev, reg2, GENMASK(31, 21),
1433 rtw8822b_txscale_tbl[swing_idx]);
1434 }
1435
1436 static void rtw8822b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1437 {
1438 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1439 u8 pwr_idx_offset, tx_pwr_idx;
1440 u8 channel = rtwdev->hal.current_channel;
1441 u8 band_width = rtwdev->hal.current_band_width;
1442 u8 regd = rtw_regd_get(rtwdev);
1443 u8 tx_rate = dm_info->tx_rate;
1444 u8 max_pwr_idx = rtwdev->chip->max_power_index;
1445
1446 tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate,
1447 band_width, channel, regd);
1448
1449 tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx);
1450
1451 pwr_idx_offset = max_pwr_idx - tx_pwr_idx;
1452
1453 rtw8822b_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset);
1454 }
1455
1456 static void rtw8822b_phy_pwrtrack_path(struct rtw_dev *rtwdev,
1457 struct rtw_swing_table *swing_table,
1458 u8 path)
1459 {
1460 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1461 u8 power_idx_cur, power_idx_last;
1462 u8 delta;
1463
1464
1465 delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1466
1467 power_idx_last = dm_info->delta_power_index[path];
1468 power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table,
1469 path, RF_PATH_A, delta);
1470
1471
1472 if (power_idx_cur == power_idx_last)
1473 return;
1474
1475 dm_info->delta_power_index[path] = power_idx_cur;
1476 rtw8822b_pwrtrack_set(rtwdev, path);
1477 }
1478
1479 static void rtw8822b_phy_pwrtrack(struct rtw_dev *rtwdev)
1480 {
1481 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1482 struct rtw_swing_table swing_table;
1483 u8 thermal_value, path;
1484
1485 rtw_phy_config_swing_table(rtwdev, &swing_table);
1486
1487 if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff)
1488 return;
1489
1490 thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1491
1492 rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1493
1494 if (dm_info->pwr_trk_init_trigger)
1495 dm_info->pwr_trk_init_trigger = false;
1496 else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1497 RF_PATH_A))
1498 goto iqk;
1499
1500 for (path = 0; path < rtwdev->hal.rf_path_num; path++)
1501 rtw8822b_phy_pwrtrack_path(rtwdev, &swing_table, path);
1502
1503 iqk:
1504 if (rtw_phy_pwrtrack_need_iqk(rtwdev))
1505 rtw8822b_do_iqk(rtwdev);
1506 }
1507
1508 static void rtw8822b_pwr_track(struct rtw_dev *rtwdev)
1509 {
1510 struct rtw_efuse *efuse = &rtwdev->efuse;
1511 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1512
1513 if (efuse->power_track_type != 0)
1514 return;
1515
1516 if (!dm_info->pwr_trk_triggered) {
1517 rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1518 GENMASK(17, 16), 0x03);
1519 dm_info->pwr_trk_triggered = true;
1520 return;
1521 }
1522
1523 rtw8822b_phy_pwrtrack(rtwdev);
1524 dm_info->pwr_trk_triggered = false;
1525 }
1526
1527 static void rtw8822b_bf_config_bfee_su(struct rtw_dev *rtwdev,
1528 struct rtw_vif *vif,
1529 struct rtw_bfee *bfee, bool enable)
1530 {
1531 if (enable)
1532 rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
1533 else
1534 rtw_bf_remove_bfee_su(rtwdev, bfee);
1535 }
1536
1537 static void rtw8822b_bf_config_bfee_mu(struct rtw_dev *rtwdev,
1538 struct rtw_vif *vif,
1539 struct rtw_bfee *bfee, bool enable)
1540 {
1541 if (enable)
1542 rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
1543 else
1544 rtw_bf_remove_bfee_mu(rtwdev, bfee);
1545 }
1546
1547 static void rtw8822b_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
1548 struct rtw_bfee *bfee, bool enable)
1549 {
1550 if (bfee->role == RTW_BFEE_SU)
1551 rtw8822b_bf_config_bfee_su(rtwdev, vif, bfee, enable);
1552 else if (bfee->role == RTW_BFEE_MU)
1553 rtw8822b_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
1554 else
1555 rtw_warn(rtwdev, "wrong bfee role\n");
1556 }
1557
1558 static void rtw8822b_adaptivity_init(struct rtw_dev *rtwdev)
1559 {
1560 rtw_phy_set_edcca_th(rtwdev, RTW8822B_EDCCA_MAX, RTW8822B_EDCCA_MAX);
1561
1562
1563 rtw_write32_clr(rtwdev, REG_TX_PTCL_CTRL, BIT_DIS_EDCCA);
1564 rtw_write32_set(rtwdev, REG_RD_CTRL, BIT_EDCCA_MSK_CNTDOWN_EN);
1565 rtw_write32_mask(rtwdev, REG_EDCCA_SOURCE, BIT_SOURCE_OPTION,
1566 RTW8822B_EDCCA_SRC_DEF);
1567 rtw_write32_mask(rtwdev, REG_EDCCA_POW_MA, BIT_MA_LEVEL, 0);
1568
1569
1570 rtw_write32_set(rtwdev, REG_EDCCA_DECISION, BIT_EDCCA_OPTION);
1571 }
1572
1573 static void rtw8822b_adaptivity(struct rtw_dev *rtwdev)
1574 {
1575 struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1576 s8 l2h, h2l;
1577 u8 igi;
1578
1579 igi = dm_info->igi_history[0];
1580 if (dm_info->edcca_mode == RTW_EDCCA_NORMAL) {
1581 l2h = max_t(s8, igi + EDCCA_IGI_L2H_DIFF, EDCCA_TH_L2H_LB);
1582 h2l = l2h - EDCCA_L2H_H2L_DIFF_NORMAL;
1583 } else {
1584 l2h = min_t(s8, igi, dm_info->l2h_th_ini);
1585 h2l = l2h - EDCCA_L2H_H2L_DIFF;
1586 }
1587
1588 rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
1589 }
1590
1591 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = {
1592 {0x0086,
1593 RTW_PWR_CUT_ALL_MSK,
1594 RTW_PWR_INTF_SDIO_MSK,
1595 RTW_PWR_ADDR_SDIO,
1596 RTW_PWR_CMD_WRITE, BIT(0), 0},
1597 {0x0086,
1598 RTW_PWR_CUT_ALL_MSK,
1599 RTW_PWR_INTF_SDIO_MSK,
1600 RTW_PWR_ADDR_SDIO,
1601 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1602 {0x004A,
1603 RTW_PWR_CUT_ALL_MSK,
1604 RTW_PWR_INTF_USB_MSK,
1605 RTW_PWR_ADDR_MAC,
1606 RTW_PWR_CMD_WRITE, BIT(0), 0},
1607 {0x0005,
1608 RTW_PWR_CUT_ALL_MSK,
1609 RTW_PWR_INTF_ALL_MSK,
1610 RTW_PWR_ADDR_MAC,
1611 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
1612 {0x0300,
1613 RTW_PWR_CUT_ALL_MSK,
1614 RTW_PWR_INTF_PCI_MSK,
1615 RTW_PWR_ADDR_MAC,
1616 RTW_PWR_CMD_WRITE, 0xFF, 0},
1617 {0x0301,
1618 RTW_PWR_CUT_ALL_MSK,
1619 RTW_PWR_INTF_PCI_MSK,
1620 RTW_PWR_ADDR_MAC,
1621 RTW_PWR_CMD_WRITE, 0xFF, 0},
1622 {0xFFFF,
1623 RTW_PWR_CUT_ALL_MSK,
1624 RTW_PWR_INTF_ALL_MSK,
1625 0,
1626 RTW_PWR_CMD_END, 0, 0},
1627 };
1628
1629 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b[] = {
1630 {0x0012,
1631 RTW_PWR_CUT_ALL_MSK,
1632 RTW_PWR_INTF_ALL_MSK,
1633 RTW_PWR_ADDR_MAC,
1634 RTW_PWR_CMD_WRITE, BIT(1), 0},
1635 {0x0012,
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 {0x0020,
1641 RTW_PWR_CUT_ALL_MSK,
1642 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1643 RTW_PWR_ADDR_MAC,
1644 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1645 {0x0001,
1646 RTW_PWR_CUT_ALL_MSK,
1647 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1648 RTW_PWR_ADDR_MAC,
1649 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
1650 {0x0000,
1651 RTW_PWR_CUT_ALL_MSK,
1652 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1653 RTW_PWR_ADDR_MAC,
1654 RTW_PWR_CMD_WRITE, BIT(5), 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(4) | BIT(3) | BIT(2)), 0},
1660 {0x0075,
1661 RTW_PWR_CUT_ALL_MSK,
1662 RTW_PWR_INTF_PCI_MSK,
1663 RTW_PWR_ADDR_MAC,
1664 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1665 {0x0006,
1666 RTW_PWR_CUT_ALL_MSK,
1667 RTW_PWR_INTF_ALL_MSK,
1668 RTW_PWR_ADDR_MAC,
1669 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1670 {0x0075,
1671 RTW_PWR_CUT_ALL_MSK,
1672 RTW_PWR_INTF_PCI_MSK,
1673 RTW_PWR_ADDR_MAC,
1674 RTW_PWR_CMD_WRITE, BIT(0), 0},
1675 {0xFF1A,
1676 RTW_PWR_CUT_ALL_MSK,
1677 RTW_PWR_INTF_USB_MSK,
1678 RTW_PWR_ADDR_MAC,
1679 RTW_PWR_CMD_WRITE, 0xFF, 0},
1680 {0x0006,
1681 RTW_PWR_CUT_ALL_MSK,
1682 RTW_PWR_INTF_ALL_MSK,
1683 RTW_PWR_ADDR_MAC,
1684 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1685 {0x0005,
1686 RTW_PWR_CUT_ALL_MSK,
1687 RTW_PWR_INTF_ALL_MSK,
1688 RTW_PWR_ADDR_MAC,
1689 RTW_PWR_CMD_WRITE, BIT(7), 0},
1690 {0x0005,
1691 RTW_PWR_CUT_ALL_MSK,
1692 RTW_PWR_INTF_ALL_MSK,
1693 RTW_PWR_ADDR_MAC,
1694 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
1695 {0x10C3,
1696 RTW_PWR_CUT_ALL_MSK,
1697 RTW_PWR_INTF_USB_MSK,
1698 RTW_PWR_ADDR_MAC,
1699 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1700 {0x0005,
1701 RTW_PWR_CUT_ALL_MSK,
1702 RTW_PWR_INTF_ALL_MSK,
1703 RTW_PWR_ADDR_MAC,
1704 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1705 {0x0005,
1706 RTW_PWR_CUT_ALL_MSK,
1707 RTW_PWR_INTF_ALL_MSK,
1708 RTW_PWR_ADDR_MAC,
1709 RTW_PWR_CMD_POLLING, BIT(0), 0},
1710 {0x0020,
1711 RTW_PWR_CUT_ALL_MSK,
1712 RTW_PWR_INTF_ALL_MSK,
1713 RTW_PWR_ADDR_MAC,
1714 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
1715 {0x10A8,
1716 RTW_PWR_CUT_C_MSK,
1717 RTW_PWR_INTF_ALL_MSK,
1718 RTW_PWR_ADDR_MAC,
1719 RTW_PWR_CMD_WRITE, 0xFF, 0},
1720 {0x10A9,
1721 RTW_PWR_CUT_C_MSK,
1722 RTW_PWR_INTF_ALL_MSK,
1723 RTW_PWR_ADDR_MAC,
1724 RTW_PWR_CMD_WRITE, 0xFF, 0xef},
1725 {0x10AA,
1726 RTW_PWR_CUT_C_MSK,
1727 RTW_PWR_INTF_ALL_MSK,
1728 RTW_PWR_ADDR_MAC,
1729 RTW_PWR_CMD_WRITE, 0xFF, 0x0c},
1730 {0x0068,
1731 RTW_PWR_CUT_C_MSK,
1732 RTW_PWR_INTF_SDIO_MSK,
1733 RTW_PWR_ADDR_MAC,
1734 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1735 {0x0029,
1736 RTW_PWR_CUT_ALL_MSK,
1737 RTW_PWR_INTF_ALL_MSK,
1738 RTW_PWR_ADDR_MAC,
1739 RTW_PWR_CMD_WRITE, 0xFF, 0xF9},
1740 {0x0024,
1741 RTW_PWR_CUT_ALL_MSK,
1742 RTW_PWR_INTF_ALL_MSK,
1743 RTW_PWR_ADDR_MAC,
1744 RTW_PWR_CMD_WRITE, BIT(2), 0},
1745 {0x0074,
1746 RTW_PWR_CUT_ALL_MSK,
1747 RTW_PWR_INTF_PCI_MSK,
1748 RTW_PWR_ADDR_MAC,
1749 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1750 {0x00AF,
1751 RTW_PWR_CUT_ALL_MSK,
1752 RTW_PWR_INTF_ALL_MSK,
1753 RTW_PWR_ADDR_MAC,
1754 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1755 {0xFFFF,
1756 RTW_PWR_CUT_ALL_MSK,
1757 RTW_PWR_INTF_ALL_MSK,
1758 0,
1759 RTW_PWR_CMD_END, 0, 0},
1760 };
1761
1762 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b[] = {
1763 {0x0003,
1764 RTW_PWR_CUT_ALL_MSK,
1765 RTW_PWR_INTF_SDIO_MSK,
1766 RTW_PWR_ADDR_MAC,
1767 RTW_PWR_CMD_WRITE, BIT(2), 0},
1768 {0x0093,
1769 RTW_PWR_CUT_ALL_MSK,
1770 RTW_PWR_INTF_ALL_MSK,
1771 RTW_PWR_ADDR_MAC,
1772 RTW_PWR_CMD_WRITE, BIT(3), 0},
1773 {0x001F,
1774 RTW_PWR_CUT_ALL_MSK,
1775 RTW_PWR_INTF_ALL_MSK,
1776 RTW_PWR_ADDR_MAC,
1777 RTW_PWR_CMD_WRITE, 0xFF, 0},
1778 {0x00EF,
1779 RTW_PWR_CUT_ALL_MSK,
1780 RTW_PWR_INTF_ALL_MSK,
1781 RTW_PWR_ADDR_MAC,
1782 RTW_PWR_CMD_WRITE, 0xFF, 0},
1783 {0xFF1A,
1784 RTW_PWR_CUT_ALL_MSK,
1785 RTW_PWR_INTF_USB_MSK,
1786 RTW_PWR_ADDR_MAC,
1787 RTW_PWR_CMD_WRITE, 0xFF, 0x30},
1788 {0x0049,
1789 RTW_PWR_CUT_ALL_MSK,
1790 RTW_PWR_INTF_ALL_MSK,
1791 RTW_PWR_ADDR_MAC,
1792 RTW_PWR_CMD_WRITE, BIT(1), 0},
1793 {0x0006,
1794 RTW_PWR_CUT_ALL_MSK,
1795 RTW_PWR_INTF_ALL_MSK,
1796 RTW_PWR_ADDR_MAC,
1797 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1798 {0x0002,
1799 RTW_PWR_CUT_ALL_MSK,
1800 RTW_PWR_INTF_ALL_MSK,
1801 RTW_PWR_ADDR_MAC,
1802 RTW_PWR_CMD_WRITE, BIT(1), 0},
1803 {0x10C3,
1804 RTW_PWR_CUT_ALL_MSK,
1805 RTW_PWR_INTF_USB_MSK,
1806 RTW_PWR_ADDR_MAC,
1807 RTW_PWR_CMD_WRITE, BIT(0), 0},
1808 {0x0005,
1809 RTW_PWR_CUT_ALL_MSK,
1810 RTW_PWR_INTF_ALL_MSK,
1811 RTW_PWR_ADDR_MAC,
1812 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1813 {0x0005,
1814 RTW_PWR_CUT_ALL_MSK,
1815 RTW_PWR_INTF_ALL_MSK,
1816 RTW_PWR_ADDR_MAC,
1817 RTW_PWR_CMD_POLLING, BIT(1), 0},
1818 {0x0020,
1819 RTW_PWR_CUT_ALL_MSK,
1820 RTW_PWR_INTF_ALL_MSK,
1821 RTW_PWR_ADDR_MAC,
1822 RTW_PWR_CMD_WRITE, BIT(3), 0},
1823 {0x0000,
1824 RTW_PWR_CUT_ALL_MSK,
1825 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1826 RTW_PWR_ADDR_MAC,
1827 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1828 {0xFFFF,
1829 RTW_PWR_CUT_ALL_MSK,
1830 RTW_PWR_INTF_ALL_MSK,
1831 0,
1832 RTW_PWR_CMD_END, 0, 0},
1833 };
1834
1835 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = {
1836 {0x0005,
1837 RTW_PWR_CUT_ALL_MSK,
1838 RTW_PWR_INTF_SDIO_MSK,
1839 RTW_PWR_ADDR_MAC,
1840 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1841 {0x0007,
1842 RTW_PWR_CUT_ALL_MSK,
1843 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1844 RTW_PWR_ADDR_MAC,
1845 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
1846 {0x0067,
1847 RTW_PWR_CUT_ALL_MSK,
1848 RTW_PWR_INTF_ALL_MSK,
1849 RTW_PWR_ADDR_MAC,
1850 RTW_PWR_CMD_WRITE, BIT(5), 0},
1851 {0x0005,
1852 RTW_PWR_CUT_ALL_MSK,
1853 RTW_PWR_INTF_PCI_MSK,
1854 RTW_PWR_ADDR_MAC,
1855 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
1856 {0x004A,
1857 RTW_PWR_CUT_ALL_MSK,
1858 RTW_PWR_INTF_USB_MSK,
1859 RTW_PWR_ADDR_MAC,
1860 RTW_PWR_CMD_WRITE, BIT(0), 0},
1861 {0x0067,
1862 RTW_PWR_CUT_ALL_MSK,
1863 RTW_PWR_INTF_SDIO_MSK,
1864 RTW_PWR_ADDR_MAC,
1865 RTW_PWR_CMD_WRITE, BIT(5), 0},
1866 {0x0067,
1867 RTW_PWR_CUT_ALL_MSK,
1868 RTW_PWR_INTF_SDIO_MSK,
1869 RTW_PWR_ADDR_MAC,
1870 RTW_PWR_CMD_WRITE, BIT(4), 0},
1871 {0x004F,
1872 RTW_PWR_CUT_ALL_MSK,
1873 RTW_PWR_INTF_SDIO_MSK,
1874 RTW_PWR_ADDR_MAC,
1875 RTW_PWR_CMD_WRITE, BIT(0), 0},
1876 {0x0067,
1877 RTW_PWR_CUT_ALL_MSK,
1878 RTW_PWR_INTF_SDIO_MSK,
1879 RTW_PWR_ADDR_MAC,
1880 RTW_PWR_CMD_WRITE, BIT(1), 0},
1881 {0x0046,
1882 RTW_PWR_CUT_ALL_MSK,
1883 RTW_PWR_INTF_SDIO_MSK,
1884 RTW_PWR_ADDR_MAC,
1885 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1886 {0x0067,
1887 RTW_PWR_CUT_ALL_MSK,
1888 RTW_PWR_INTF_SDIO_MSK,
1889 RTW_PWR_ADDR_MAC,
1890 RTW_PWR_CMD_WRITE, BIT(2), 0},
1891 {0x0046,
1892 RTW_PWR_CUT_ALL_MSK,
1893 RTW_PWR_INTF_SDIO_MSK,
1894 RTW_PWR_ADDR_MAC,
1895 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
1896 {0x0062,
1897 RTW_PWR_CUT_ALL_MSK,
1898 RTW_PWR_INTF_SDIO_MSK,
1899 RTW_PWR_ADDR_MAC,
1900 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1901 {0x0081,
1902 RTW_PWR_CUT_ALL_MSK,
1903 RTW_PWR_INTF_ALL_MSK,
1904 RTW_PWR_ADDR_MAC,
1905 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
1906 {0x0005,
1907 RTW_PWR_CUT_ALL_MSK,
1908 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1909 RTW_PWR_ADDR_MAC,
1910 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
1911 {0x0086,
1912 RTW_PWR_CUT_ALL_MSK,
1913 RTW_PWR_INTF_SDIO_MSK,
1914 RTW_PWR_ADDR_SDIO,
1915 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1916 {0x0086,
1917 RTW_PWR_CUT_ALL_MSK,
1918 RTW_PWR_INTF_SDIO_MSK,
1919 RTW_PWR_ADDR_SDIO,
1920 RTW_PWR_CMD_POLLING, BIT(1), 0},
1921 {0x0090,
1922 RTW_PWR_CUT_ALL_MSK,
1923 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK,
1924 RTW_PWR_ADDR_MAC,
1925 RTW_PWR_CMD_WRITE, BIT(1), 0},
1926 {0x0044,
1927 RTW_PWR_CUT_ALL_MSK,
1928 RTW_PWR_INTF_SDIO_MSK,
1929 RTW_PWR_ADDR_SDIO,
1930 RTW_PWR_CMD_WRITE, 0xFF, 0},
1931 {0x0040,
1932 RTW_PWR_CUT_ALL_MSK,
1933 RTW_PWR_INTF_SDIO_MSK,
1934 RTW_PWR_ADDR_SDIO,
1935 RTW_PWR_CMD_WRITE, 0xFF, 0x90},
1936 {0x0041,
1937 RTW_PWR_CUT_ALL_MSK,
1938 RTW_PWR_INTF_SDIO_MSK,
1939 RTW_PWR_ADDR_SDIO,
1940 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1941 {0x0042,
1942 RTW_PWR_CUT_ALL_MSK,
1943 RTW_PWR_INTF_SDIO_MSK,
1944 RTW_PWR_ADDR_SDIO,
1945 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
1946 {0xFFFF,
1947 RTW_PWR_CUT_ALL_MSK,
1948 RTW_PWR_INTF_ALL_MSK,
1949 0,
1950 RTW_PWR_CMD_END, 0, 0},
1951 };
1952
1953 static const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
1954 trans_carddis_to_cardemu_8822b,
1955 trans_cardemu_to_act_8822b,
1956 NULL
1957 };
1958
1959 static const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
1960 trans_act_to_cardemu_8822b,
1961 trans_cardemu_to_carddis_8822b,
1962 NULL
1963 };
1964
1965 static const struct rtw_intf_phy_para usb2_param_8822b[] = {
1966 {0xFFFF, 0x00,
1967 RTW_IP_SEL_PHY,
1968 RTW_INTF_PHY_CUT_ALL,
1969 RTW_INTF_PHY_PLATFORM_ALL},
1970 };
1971
1972 static const struct rtw_intf_phy_para usb3_param_8822b[] = {
1973 {0x0001, 0xA841,
1974 RTW_IP_SEL_PHY,
1975 RTW_INTF_PHY_CUT_D,
1976 RTW_INTF_PHY_PLATFORM_ALL},
1977 {0xFFFF, 0x0000,
1978 RTW_IP_SEL_PHY,
1979 RTW_INTF_PHY_CUT_ALL,
1980 RTW_INTF_PHY_PLATFORM_ALL},
1981 };
1982
1983 static const struct rtw_intf_phy_para pcie_gen1_param_8822b[] = {
1984 {0x0001, 0xA841,
1985 RTW_IP_SEL_PHY,
1986 RTW_INTF_PHY_CUT_C,
1987 RTW_INTF_PHY_PLATFORM_ALL},
1988 {0x0002, 0x60C6,
1989 RTW_IP_SEL_PHY,
1990 RTW_INTF_PHY_CUT_C,
1991 RTW_INTF_PHY_PLATFORM_ALL},
1992 {0x0008, 0x3596,
1993 RTW_IP_SEL_PHY,
1994 RTW_INTF_PHY_CUT_C,
1995 RTW_INTF_PHY_PLATFORM_ALL},
1996 {0x0009, 0x321C,
1997 RTW_IP_SEL_PHY,
1998 RTW_INTF_PHY_CUT_C,
1999 RTW_INTF_PHY_PLATFORM_ALL},
2000 {0x000A, 0x9623,
2001 RTW_IP_SEL_PHY,
2002 RTW_INTF_PHY_CUT_C,
2003 RTW_INTF_PHY_PLATFORM_ALL},
2004 {0x0020, 0x94FF,
2005 RTW_IP_SEL_PHY,
2006 RTW_INTF_PHY_CUT_C,
2007 RTW_INTF_PHY_PLATFORM_ALL},
2008 {0x0021, 0xFFCF,
2009 RTW_IP_SEL_PHY,
2010 RTW_INTF_PHY_CUT_C,
2011 RTW_INTF_PHY_PLATFORM_ALL},
2012 {0x0026, 0xC006,
2013 RTW_IP_SEL_PHY,
2014 RTW_INTF_PHY_CUT_C,
2015 RTW_INTF_PHY_PLATFORM_ALL},
2016 {0x0029, 0xFF0E,
2017 RTW_IP_SEL_PHY,
2018 RTW_INTF_PHY_CUT_C,
2019 RTW_INTF_PHY_PLATFORM_ALL},
2020 {0x002A, 0x1840,
2021 RTW_IP_SEL_PHY,
2022 RTW_INTF_PHY_CUT_C,
2023 RTW_INTF_PHY_PLATFORM_ALL},
2024 {0xFFFF, 0x0000,
2025 RTW_IP_SEL_PHY,
2026 RTW_INTF_PHY_CUT_ALL,
2027 RTW_INTF_PHY_PLATFORM_ALL},
2028 };
2029
2030 static const struct rtw_intf_phy_para pcie_gen2_param_8822b[] = {
2031 {0x0001, 0xA841,
2032 RTW_IP_SEL_PHY,
2033 RTW_INTF_PHY_CUT_C,
2034 RTW_INTF_PHY_PLATFORM_ALL},
2035 {0x0002, 0x60C6,
2036 RTW_IP_SEL_PHY,
2037 RTW_INTF_PHY_CUT_C,
2038 RTW_INTF_PHY_PLATFORM_ALL},
2039 {0x0008, 0x3597,
2040 RTW_IP_SEL_PHY,
2041 RTW_INTF_PHY_CUT_C,
2042 RTW_INTF_PHY_PLATFORM_ALL},
2043 {0x0009, 0x321C,
2044 RTW_IP_SEL_PHY,
2045 RTW_INTF_PHY_CUT_C,
2046 RTW_INTF_PHY_PLATFORM_ALL},
2047 {0x000A, 0x9623,
2048 RTW_IP_SEL_PHY,
2049 RTW_INTF_PHY_CUT_C,
2050 RTW_INTF_PHY_PLATFORM_ALL},
2051 {0x0020, 0x94FF,
2052 RTW_IP_SEL_PHY,
2053 RTW_INTF_PHY_CUT_C,
2054 RTW_INTF_PHY_PLATFORM_ALL},
2055 {0x0021, 0xFFCF,
2056 RTW_IP_SEL_PHY,
2057 RTW_INTF_PHY_CUT_C,
2058 RTW_INTF_PHY_PLATFORM_ALL},
2059 {0x0026, 0xC006,
2060 RTW_IP_SEL_PHY,
2061 RTW_INTF_PHY_CUT_C,
2062 RTW_INTF_PHY_PLATFORM_ALL},
2063 {0x0029, 0xFF0E,
2064 RTW_IP_SEL_PHY,
2065 RTW_INTF_PHY_CUT_C,
2066 RTW_INTF_PHY_PLATFORM_ALL},
2067 {0x002A, 0x3040,
2068 RTW_IP_SEL_PHY,
2069 RTW_INTF_PHY_CUT_C,
2070 RTW_INTF_PHY_PLATFORM_ALL},
2071 {0xFFFF, 0x0000,
2072 RTW_IP_SEL_PHY,
2073 RTW_INTF_PHY_CUT_ALL,
2074 RTW_INTF_PHY_PLATFORM_ALL},
2075 };
2076
2077 static const struct rtw_intf_phy_para_table phy_para_table_8822b = {
2078 .usb2_para = usb2_param_8822b,
2079 .usb3_para = usb3_param_8822b,
2080 .gen1_para = pcie_gen1_param_8822b,
2081 .gen2_para = pcie_gen2_param_8822b,
2082 .n_usb2_para = ARRAY_SIZE(usb2_param_8822b),
2083 .n_usb3_para = ARRAY_SIZE(usb2_param_8822b),
2084 .n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8822b),
2085 .n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8822b),
2086 };
2087
2088 static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
2089 [2] = RTW_DEF_RFE(8822b, 2, 2),
2090 [3] = RTW_DEF_RFE(8822b, 3, 0),
2091 [5] = RTW_DEF_RFE(8822b, 5, 5),
2092 };
2093
2094 static const struct rtw_hw_reg rtw8822b_dig[] = {
2095 [0] = { .addr = 0xc50, .mask = 0x7f },
2096 [1] = { .addr = 0xe50, .mask = 0x7f },
2097 };
2098
2099 static const struct rtw_ltecoex_addr rtw8822b_ltecoex_addr = {
2100 .ctrl = LTECOEX_ACCESS_CTRL,
2101 .wdata = LTECOEX_WRITE_DATA,
2102 .rdata = LTECOEX_READ_DATA,
2103 };
2104
2105 static const struct rtw_page_table page_table_8822b[] = {
2106 {64, 64, 64, 64, 1},
2107 {64, 64, 64, 64, 1},
2108 {64, 64, 0, 0, 1},
2109 {64, 64, 64, 0, 1},
2110 {64, 64, 64, 64, 1},
2111 };
2112
2113 static const struct rtw_rqpn rqpn_table_8822b[] = {
2114 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2115 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2116 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2117 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2118 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2119 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2120 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2121 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
2122 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2123 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2124 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2125 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2126 {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2127 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2128 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2129 };
2130
2131 static struct rtw_prioq_addrs prioq_addrs_8822b = {
2132 .prio[RTW_DMA_MAPPING_EXTRA] = {
2133 .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
2134 },
2135 .prio[RTW_DMA_MAPPING_LOW] = {
2136 .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
2137 },
2138 .prio[RTW_DMA_MAPPING_NORMAL] = {
2139 .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
2140 },
2141 .prio[RTW_DMA_MAPPING_HIGH] = {
2142 .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
2143 },
2144 .wsize = true,
2145 };
2146
2147 static struct rtw_chip_ops rtw8822b_ops = {
2148 .phy_set_param = rtw8822b_phy_set_param,
2149 .read_efuse = rtw8822b_read_efuse,
2150 .query_rx_desc = rtw8822b_query_rx_desc,
2151 .set_channel = rtw8822b_set_channel,
2152 .mac_init = rtw8822b_mac_init,
2153 .read_rf = rtw_phy_read_rf,
2154 .write_rf = rtw_phy_write_rf_reg_sipi,
2155 .set_tx_power_index = rtw8822b_set_tx_power_index,
2156 .set_antenna = rtw8822b_set_antenna,
2157 .cfg_ldo25 = rtw8822b_cfg_ldo25,
2158 .false_alarm_statistics = rtw8822b_false_alarm_statistics,
2159 .phy_calibration = rtw8822b_phy_calibration,
2160 .pwr_track = rtw8822b_pwr_track,
2161 .config_bfee = rtw8822b_bf_config_bfee,
2162 .set_gid_table = rtw_bf_set_gid_table,
2163 .cfg_csi_rate = rtw_bf_cfg_csi_rate,
2164 .adaptivity_init = rtw8822b_adaptivity_init,
2165 .adaptivity = rtw8822b_adaptivity,
2166
2167 .coex_set_init = rtw8822b_coex_cfg_init,
2168 .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch,
2169 .coex_set_gnt_fix = rtw8822b_coex_cfg_gnt_fix,
2170 .coex_set_gnt_debug = rtw8822b_coex_cfg_gnt_debug,
2171 .coex_set_rfe_type = rtw8822b_coex_cfg_rfe_type,
2172 .coex_set_wl_tx_power = rtw8822b_coex_cfg_wl_tx_power,
2173 .coex_set_wl_rx_gain = rtw8822b_coex_cfg_wl_rx_gain,
2174 };
2175
2176
2177 static const struct coex_table_para table_sant_8822b[] = {
2178 {0xffffffff, 0xffffffff},
2179 {0x55555555, 0x55555555},
2180 {0x66555555, 0x66555555},
2181 {0xaaaaaaaa, 0xaaaaaaaa},
2182 {0x5a5a5a5a, 0x5a5a5a5a},
2183 {0xfafafafa, 0xfafafafa},
2184 {0x6a5a5555, 0xaaaaaaaa},
2185 {0x6a5a56aa, 0x6a5a56aa},
2186 {0x6a5a5a5a, 0x6a5a5a5a},
2187 {0x66555555, 0x5a5a5a5a},
2188 {0x66555555, 0x6a5a5a5a},
2189 {0x66555555, 0xfafafafa},
2190 {0x66555555, 0x5a5a5aaa},
2191 {0x66555555, 0x6aaa5aaa},
2192 {0x66555555, 0xaaaa5aaa},
2193 {0x66555555, 0xaaaaaaaa},
2194 {0xffff55ff, 0xfafafafa},
2195 {0xffff55ff, 0x6afa5afa},
2196 {0xaaffffaa, 0xfafafafa},
2197 {0xaa5555aa, 0x5a5a5a5a},
2198 {0xaa5555aa, 0x6a5a5a5a},
2199 {0xaa5555aa, 0xaaaaaaaa},
2200 {0xffffffff, 0x5a5a5a5a},
2201 {0xffffffff, 0x5a5a5a5a},
2202 {0xffffffff, 0x55555555},
2203 {0xffffffff, 0x6a5a5aaa},
2204 {0x55555555, 0x5a5a5a5a},
2205 {0x55555555, 0xaaaaaaaa},
2206 {0x55555555, 0x6a5a6a5a},
2207 {0x66556655, 0x66556655},
2208 {0x66556aaa, 0x6a5a6aaa},
2209 {0xffffffff, 0x5aaa5aaa},
2210 {0x56555555, 0x5a5a5aaa},
2211 };
2212
2213
2214 static const struct coex_table_para table_nsant_8822b[] = {
2215 {0xffffffff, 0xffffffff},
2216 {0x55555555, 0x55555555},
2217 {0x66555555, 0x66555555},
2218 {0xaaaaaaaa, 0xaaaaaaaa},
2219 {0x5a5a5a5a, 0x5a5a5a5a},
2220 {0xfafafafa, 0xfafafafa},
2221 {0x5afa5afa, 0x5afa5afa},
2222 {0x55555555, 0xfafafafa},
2223 {0x66555555, 0xfafafafa},
2224 {0x66555555, 0x5a5a5a5a},
2225 {0x66555555, 0x6a5a5a5a},
2226 {0x66555555, 0xaaaaaaaa},
2227 {0xffff55ff, 0xfafafafa},
2228 {0xffff55ff, 0x5afa5afa},
2229 {0xffff55ff, 0xaaaaaaaa},
2230 {0xffff55ff, 0xffff55ff},
2231 {0xaaffffaa, 0x5afa5afa},
2232 {0xaaffffaa, 0xaaaaaaaa},
2233 {0xffffffff, 0xfafafafa},
2234 {0xffffffff, 0x5afa5afa},
2235 {0xffffffff, 0xaaaaaaaa},
2236 {0x55ff55ff, 0x5afa5afa},
2237 {0x55ff55ff, 0xaaaaaaaa},
2238 {0x55ff55ff, 0x55ff55ff}
2239 };
2240
2241
2242 static const struct coex_tdma_para tdma_sant_8822b[] = {
2243 { {0x00, 0x00, 0x00, 0x00, 0x00} },
2244 { {0x61, 0x45, 0x03, 0x11, 0x11} },
2245 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
2246 { {0x61, 0x30, 0x03, 0x11, 0x11} },
2247 { {0x61, 0x20, 0x03, 0x11, 0x11} },
2248 { {0x61, 0x10, 0x03, 0x11, 0x11} },
2249 { {0x61, 0x45, 0x03, 0x11, 0x10} },
2250 { {0x61, 0x3a, 0x03, 0x11, 0x10} },
2251 { {0x61, 0x30, 0x03, 0x11, 0x10} },
2252 { {0x61, 0x20, 0x03, 0x11, 0x10} },
2253 { {0x61, 0x10, 0x03, 0x11, 0x10} },
2254 { {0x61, 0x08, 0x03, 0x11, 0x14} },
2255 { {0x61, 0x08, 0x03, 0x10, 0x14} },
2256 { {0x51, 0x08, 0x03, 0x10, 0x54} },
2257 { {0x51, 0x08, 0x03, 0x10, 0x55} },
2258 { {0x51, 0x08, 0x07, 0x10, 0x54} },
2259 { {0x51, 0x45, 0x03, 0x10, 0x50} },
2260 { {0x51, 0x3a, 0x03, 0x10, 0x50} },
2261 { {0x51, 0x30, 0x03, 0x10, 0x50} },
2262 { {0x51, 0x20, 0x03, 0x10, 0x50} },
2263 { {0x51, 0x10, 0x03, 0x10, 0x50} },
2264 { {0x51, 0x4a, 0x03, 0x10, 0x50} },
2265 { {0x51, 0x0c, 0x03, 0x10, 0x54} },
2266 { {0x55, 0x08, 0x03, 0x10, 0x54} },
2267 { {0x65, 0x10, 0x03, 0x11, 0x10} },
2268 { {0x51, 0x10, 0x03, 0x10, 0x51} },
2269 { {0x51, 0x08, 0x03, 0x10, 0x50} },
2270 { {0x61, 0x08, 0x03, 0x11, 0x11} }
2271 };
2272
2273
2274 static const struct coex_tdma_para tdma_nsant_8822b[] = {
2275 { {0x00, 0x00, 0x00, 0x00, 0x00} },
2276 { {0x61, 0x45, 0x03, 0x11, 0x11} },
2277 { {0x61, 0x3a, 0x03, 0x11, 0x11} },
2278 { {0x61, 0x30, 0x03, 0x11, 0x11} },
2279 { {0x61, 0x20, 0x03, 0x11, 0x11} },
2280 { {0x61, 0x10, 0x03, 0x11, 0x11} },
2281 { {0x61, 0x45, 0x03, 0x11, 0x10} },
2282 { {0x61, 0x3a, 0x03, 0x11, 0x10} },
2283 { {0x61, 0x30, 0x03, 0x11, 0x10} },
2284 { {0x61, 0x20, 0x03, 0x11, 0x10} },
2285 { {0x61, 0x10, 0x03, 0x11, 0x10} },
2286 { {0x61, 0x08, 0x03, 0x11, 0x14} },
2287 { {0x61, 0x08, 0x03, 0x10, 0x14} },
2288 { {0x51, 0x08, 0x03, 0x10, 0x54} },
2289 { {0x51, 0x08, 0x03, 0x10, 0x55} },
2290 { {0x51, 0x08, 0x07, 0x10, 0x54} },
2291 { {0x51, 0x45, 0x03, 0x10, 0x50} },
2292 { {0x51, 0x3a, 0x03, 0x10, 0x50} },
2293 { {0x51, 0x30, 0x03, 0x10, 0x50} },
2294 { {0x51, 0x20, 0x03, 0x10, 0x50} },
2295 { {0x51, 0x10, 0x03, 0x10, 0x50} },
2296 { {0x51, 0x08, 0x03, 0x10, 0x50} }
2297 };
2298
2299
2300 static const u8 wl_rssi_step_8822b[] = {60, 50, 44, 30};
2301 static const u8 bt_rssi_step_8822b[] = {30, 30, 30, 30};
2302
2303
2304 static const struct coex_rf_para rf_para_tx_8822b[] = {
2305 {0, 0, false, 7},
2306 {0, 16, false, 7},
2307 {4, 0, true, 1},
2308 {3, 6, true, 1},
2309 {2, 9, true, 1},
2310 {1, 13, true, 1}
2311 };
2312
2313 static const struct coex_rf_para rf_para_rx_8822b[] = {
2314 {0, 0, false, 7},
2315 {0, 16, false, 7},
2316 {4, 0, true, 1},
2317 {3, 6, true, 1},
2318 {2, 9, true, 1},
2319 {1, 13, true, 1}
2320 };
2321
2322 static const struct coex_5g_afh_map afh_5g_8822b[] = {
2323 {120, 2, 4},
2324 {124, 8, 8},
2325 {128, 17, 8},
2326 {132, 26, 10},
2327 {136, 34, 8},
2328 {140, 42, 10},
2329 {144, 51, 8},
2330 {149, 62, 8},
2331 {153, 71, 10},
2332 {157, 77, 4},
2333 {118, 2, 4},
2334 {126, 12, 16},
2335 {134, 29, 16},
2336 {142, 46, 16},
2337 {151, 66, 16},
2338 {159, 76, 4},
2339 {122, 10, 20},
2340 {138, 37, 34},
2341 {155, 68, 20}
2342 };
2343 static_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b));
2344
2345 static const u8
2346 rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2347 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2348 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2349 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2350 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2351 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2352 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2353 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2354 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2355 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2356 };
2357
2358 static const u8
2359 rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2360 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2361 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2362 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2363 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2364 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2365 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2366 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2367 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2368 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
2369 };
2370
2371 static const u8
2372 rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2373 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2374 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2375 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2376 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2377 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2378 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2379 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2380 8, 8, 9, 10, 11, 11, 12, 13, 14, 14,
2381 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
2382 };
2383
2384 static const u8
2385 rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
2386 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2387 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2388 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2389 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2390 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2391 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2392 { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7,
2393 8, 9, 9, 10, 11, 12, 13, 14, 14, 15,
2394 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
2395 };
2396
2397 static const u8 rtw8822b_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
2398 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2399 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2400 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2401 };
2402
2403 static const u8 rtw8822b_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
2404 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2405 5, 5, 6, 6, 6, 7, 7, 8, 8, 9,
2406 9, 10, 10, 11, 11, 12, 12, 12, 13, 13
2407 };
2408
2409 static const u8 rtw8822b_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
2410 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2411 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2412 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2413 };
2414
2415 static const u8 rtw8822b_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
2416 0, 1, 1, 2, 2, 3, 3, 4, 4, 5,
2417 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
2418 10, 11, 11, 12, 12, 13, 13, 14, 14, 15
2419 };
2420
2421 static const u8 rtw8822b_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
2422 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2423 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2424 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2425 };
2426
2427 static const u8 rtw8822b_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
2428 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
2429 5, 5, 6, 6, 6, 7, 7, 8, 8, 9,
2430 9, 10, 10, 11, 11, 12, 12, 12, 13, 13
2431 };
2432
2433 static const u8 rtw8822b_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
2434 0, 1, 1, 1, 2, 2, 3, 3, 3, 4,
2435 4, 5, 5, 5, 6, 6, 7, 7, 7, 8,
2436 8, 9, 9, 9, 10, 10, 11, 11, 11, 12
2437 };
2438
2439 static const u8 rtw8822b_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
2440 0, 1, 1, 2, 2, 3, 3, 4, 4, 5,
2441 5, 6, 6, 7, 7, 8, 8, 9, 9, 10,
2442 10, 11, 11, 12, 12, 13, 13, 14, 14, 15
2443 };
2444
2445 static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
2446 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
2447 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
2448 .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
2449 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
2450 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
2451 .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
2452 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
2453 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
2454 .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
2455 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
2456 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
2457 .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
2458 .pwrtrk_2gb_n = rtw8822b_pwrtrk_2gb_n,
2459 .pwrtrk_2gb_p = rtw8822b_pwrtrk_2gb_p,
2460 .pwrtrk_2ga_n = rtw8822b_pwrtrk_2ga_n,
2461 .pwrtrk_2ga_p = rtw8822b_pwrtrk_2ga_p,
2462 .pwrtrk_2g_cckb_n = rtw8822b_pwrtrk_2g_cck_b_n,
2463 .pwrtrk_2g_cckb_p = rtw8822b_pwrtrk_2g_cck_b_p,
2464 .pwrtrk_2g_ccka_n = rtw8822b_pwrtrk_2g_cck_a_n,
2465 .pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
2466 };
2467
2468 static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
2469 {0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2470 {0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2471 {0xcba, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2472 {0xcbd, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2473 {0xc58, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2474 {0xcbd, BIT(0), RTW_REG_DOMAIN_MAC8},
2475 {0, 0, RTW_REG_DOMAIN_NL},
2476 {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2477 {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2478 {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2479 {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2480 {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
2481 {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2482 {0, 0, RTW_REG_DOMAIN_NL},
2483 {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
2484 {0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
2485 {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
2486 {0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
2487 {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
2488 {0, 0, RTW_REG_DOMAIN_NL},
2489 {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2490 {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2491 {0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
2492 {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2493 };
2494
2495 static struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
2496 [EDCCA_TH_L2H_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE0}, .offset = 0},
2497 [EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset = 0},
2498 };
2499
2500 const struct rtw_chip_info rtw8822b_hw_spec = {
2501 .ops = &rtw8822b_ops,
2502 .id = RTW_CHIP_TYPE_8822B,
2503 .fw_name = "rtw88/rtw8822b_fw.bin",
2504 .wlan_cpu = RTW_WCPU_11AC,
2505 .tx_pkt_desc_sz = 48,
2506 .tx_buf_desc_sz = 16,
2507 .rx_pkt_desc_sz = 24,
2508 .rx_buf_desc_sz = 8,
2509 .phy_efuse_size = 1024,
2510 .log_efuse_size = 768,
2511 .ptct_efuse_size = 96,
2512 .txff_size = 262144,
2513 .rxff_size = 24576,
2514 .fw_rxff_size = 12288,
2515 .txgi_factor = 1,
2516 .is_pwr_by_rate_dec = true,
2517 .max_power_index = 0x3f,
2518 .csi_buf_pg_num = 0,
2519 .band = RTW_BAND_2G | RTW_BAND_5G,
2520 .page_size = 128,
2521 .dig_min = 0x1c,
2522 .ht_supported = true,
2523 .vht_supported = true,
2524 .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
2525 .sys_func_en = 0xDC,
2526 .pwr_on_seq = card_enable_flow_8822b,
2527 .pwr_off_seq = card_disable_flow_8822b,
2528 .page_table = page_table_8822b,
2529 .rqpn_table = rqpn_table_8822b,
2530 .prioq_addrs = &prioq_addrs_8822b,
2531 .intf_table = &phy_para_table_8822b,
2532 .dig = rtw8822b_dig,
2533 .dig_cck = NULL,
2534 .rf_base_addr = {0x2800, 0x2c00},
2535 .rf_sipi_addr = {0xc90, 0xe90},
2536 .ltecoex_addr = &rtw8822b_ltecoex_addr,
2537 .mac_tbl = &rtw8822b_mac_tbl,
2538 .agc_tbl = &rtw8822b_agc_tbl,
2539 .bb_tbl = &rtw8822b_bb_tbl,
2540 .rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
2541 .rfe_defs = rtw8822b_rfe_defs,
2542 .rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
2543 .pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl,
2544 .iqk_threshold = 8,
2545 .bfer_su_max_num = 2,
2546 .bfer_mu_max_num = 1,
2547 .rx_ldpc = true,
2548 .edcca_th = rtw8822b_edcca_th,
2549 .l2h_th_ini_cs = 10 + EDCCA_IGI_BASE,
2550 .l2h_th_ini_ad = -14 + EDCCA_IGI_BASE,
2551 .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
2552
2553 .coex_para_ver = 0x20070206,
2554 .bt_desired_ver = 0x6,
2555 .scbd_support = true,
2556 .new_scbd10_def = false,
2557 .ble_hid_profile_support = false,
2558 .wl_mimo_ps_support = false,
2559 .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2560 .bt_rssi_type = COEX_BTRSSI_RATIO,
2561 .ant_isolation = 15,
2562 .rssi_tolerance = 2,
2563 .wl_rssi_step = wl_rssi_step_8822b,
2564 .bt_rssi_step = bt_rssi_step_8822b,
2565 .table_sant_num = ARRAY_SIZE(table_sant_8822b),
2566 .table_sant = table_sant_8822b,
2567 .table_nsant_num = ARRAY_SIZE(table_nsant_8822b),
2568 .table_nsant = table_nsant_8822b,
2569 .tdma_sant_num = ARRAY_SIZE(tdma_sant_8822b),
2570 .tdma_sant = tdma_sant_8822b,
2571 .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822b),
2572 .tdma_nsant = tdma_nsant_8822b,
2573 .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822b),
2574 .wl_rf_para_tx = rf_para_tx_8822b,
2575 .wl_rf_para_rx = rf_para_rx_8822b,
2576 .bt_afh_span_bw20 = 0x24,
2577 .bt_afh_span_bw40 = 0x36,
2578 .afh_5g_num = ARRAY_SIZE(afh_5g_8822b),
2579 .afh_5g = afh_5g_8822b,
2580
2581 .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822b),
2582 .coex_info_hw_regs = coex_info_hw_regs_8822b,
2583
2584 .fw_fifo_addr = {0x780, 0x700, 0x780, 0x660, 0x650, 0x680},
2585 };
2586 EXPORT_SYMBOL(rtw8822b_hw_spec);
2587
2588 MODULE_FIRMWARE("rtw88/rtw8822b_fw.bin");
2589
2590 MODULE_AUTHOR("Realtek Corporation");
2591 MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822b driver");
2592 MODULE_LICENSE("Dual BSD/GPL");