Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
0002 /* Copyright(c) 2018-2019  Realtek Corporation
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         /* unsupported now */
0061         return -ENOTSUPP;
0062     }
0063 
0064     return 0;
0065 }
0066 
0067 static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
0068 {
0069     /* chip top mux */
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     /* from s0 or s1 */
0075     rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
0076     rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
0077 
0078     /* input or output */
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     /* Grouping bitmap parameters */
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     /* power on BB/RF domain */
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     /* pre init before header files config */
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     /* post init after header files config */
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 /* unit : 32us */
0176 #define WLAN_VI_TXOP_LIMIT  0x3BC /* unit : 32us */
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 /* unit : 32us */
0182 #define WLAN_TBTT_HOLD_TIME 0x064 /* unit : 32us */
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     /* protocol configuration */
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     /* EDCA configuration */
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     /* Set beacon cotnrol - enable TSF and other related functions */
0250     rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
0251     /* Set send beacon related registers */
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     /* WMAC configuration */
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         /* 2TX or 2RX */
0290         rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
0291     } else if (hal->antenna_rx == hal->antenna_tx) {
0292         /* TXA+RXA or TXB+RXB */
0293         rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
0294     } else {
0295         /* TXB+RXA or TXA+RXB */
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         /* signal source */
0306         rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774);
0307         rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
0308     } else {
0309         /* signal source */
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             /* 2TX or 2RX */
0320             rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
0321         } else if (hal->antenna_rx == hal->antenna_tx) {
0322             /* TXA+RXA or TXB+RXB */
0323             rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
0324         } else {
0325             /* TXB+RXA or TXA+RXB */
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}, /*Reg82C*/
0349     {0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
0350     {0x87765541, 0x87746341, 0x87765541, 0x87746341}, /*Reg838*/
0351 };
0352 
0353 static const struct cca_ccut cca_efem_ccut = {
0354     {0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010}, /*Reg82C*/
0355     {0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa}, /*Reg830*/
0356     {0x87766451, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
0357 };
0358 
0359 static const struct cca_ccut cca_ifem_ccut_ext = {
0360     {0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010}, /*Reg82C*/
0361     {0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
0362     {0x87765541, 0x86666341, 0x87765561, 0x86666361}, /*Reg838*/
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, &reg82c, &reg830, &reg838);
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     /* need to set 0xdf[18]=1 before writing RF18 when channel 144 */
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         /* RX DFIR for BW40 */
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         /* RX DFIR for BW80 */
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         /* RX DFIR for BW20, BW10 and BW5*/
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     /* 8822B uses only 1 antenna to RX CCK rates */
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     /* drv_info_sz is in unit of 8-bytes */
0943     pkt_stat->drv_info_sz *= 8;
0944 
0945     /* c2h cmd pkt's rx/phy status is not interested */
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, &para);
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     /* enable TBTT nterrupt */
1122     rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1123 
1124     /* BT report packet sample rate */
1125     /* 0x790[5:0]=0x5 */
1126     rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
1127 
1128     /* enable BT counter statistics */
1129     rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1130 
1131     /* enable PTA (3-wire function form BT side) */
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     /* enable PTA (tx/rx signal form WiFi side) */
1136     rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1137     /* wl tx signal to PTA not case EDCCA */
1138     rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
1139     /* GNT_BT=1 while select both */
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         /* 0x4c[23] = 0 */
1167         rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1168         /* 0x4c[24] = 1 */
1169         rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1170         /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
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         /* 0x4c[23] = 0 */
1189         rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1190         /* 0x4c[24] = 1 */
1191         rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
1192         /* PTA,  DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
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         /* 0x4c[23] = 0 */
1200         rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1201         /* 0x4c[24] = 1 */
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         /* 0x4c[23] = 1 */
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         /* 0x4c[23] = 0 */
1214         rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1215         /* 0x4c[24] = 1 */
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         /* 0x4c[23] = 0 */
1220         rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
1221         /* 0x4c[24] = 0 */
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     /* Ext switch buffer mux */
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     /* Disable LTE Coex Function in WiFi side */
1279     rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0);
1280 
1281     /* BTC_CTT_WL_VS_LTE */
1282     rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1283 
1284     /* BTC_CTT_BT_VS_LTE */
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     /* WL Rx Low gain on */
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     /* WL Rx Low gain off */
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         /* set Rx filter corner RCK offset */
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         /* set Rx filter corner RCK offset */
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     /* 8822B only has one thermal meter at PATH A */
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     /* if delta of power indexes are the same, just skip */
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     /* mac edcca state setting */
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     /* edcca decision opt */
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 /* Shared-Antenna Coex Table */
2177 static const struct coex_table_para table_sant_8822b[] = {
2178     {0xffffffff, 0xffffffff}, /* case-0 */
2179     {0x55555555, 0x55555555},
2180     {0x66555555, 0x66555555},
2181     {0xaaaaaaaa, 0xaaaaaaaa},
2182     {0x5a5a5a5a, 0x5a5a5a5a},
2183     {0xfafafafa, 0xfafafafa}, /* case-5 */
2184     {0x6a5a5555, 0xaaaaaaaa},
2185     {0x6a5a56aa, 0x6a5a56aa},
2186     {0x6a5a5a5a, 0x6a5a5a5a},
2187     {0x66555555, 0x5a5a5a5a},
2188     {0x66555555, 0x6a5a5a5a}, /* case-10 */
2189     {0x66555555, 0xfafafafa},
2190     {0x66555555, 0x5a5a5aaa},
2191     {0x66555555, 0x6aaa5aaa},
2192     {0x66555555, 0xaaaa5aaa},
2193     {0x66555555, 0xaaaaaaaa}, /* case-15 */
2194     {0xffff55ff, 0xfafafafa},
2195     {0xffff55ff, 0x6afa5afa},
2196     {0xaaffffaa, 0xfafafafa},
2197     {0xaa5555aa, 0x5a5a5a5a},
2198     {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
2199     {0xaa5555aa, 0xaaaaaaaa},
2200     {0xffffffff, 0x5a5a5a5a},
2201     {0xffffffff, 0x5a5a5a5a},
2202     {0xffffffff, 0x55555555},
2203     {0xffffffff, 0x6a5a5aaa}, /* case-25 */
2204     {0x55555555, 0x5a5a5a5a},
2205     {0x55555555, 0xaaaaaaaa},
2206     {0x55555555, 0x6a5a6a5a},
2207     {0x66556655, 0x66556655},
2208     {0x66556aaa, 0x6a5a6aaa}, /* case-30 */
2209     {0xffffffff, 0x5aaa5aaa},
2210     {0x56555555, 0x5a5a5aaa},
2211 };
2212 
2213 /* Non-Shared-Antenna Coex Table */
2214 static const struct coex_table_para table_nsant_8822b[] = {
2215     {0xffffffff, 0xffffffff}, /* case-100 */
2216     {0x55555555, 0x55555555},
2217     {0x66555555, 0x66555555},
2218     {0xaaaaaaaa, 0xaaaaaaaa},
2219     {0x5a5a5a5a, 0x5a5a5a5a},
2220     {0xfafafafa, 0xfafafafa}, /* case-105 */
2221     {0x5afa5afa, 0x5afa5afa},
2222     {0x55555555, 0xfafafafa},
2223     {0x66555555, 0xfafafafa},
2224     {0x66555555, 0x5a5a5a5a},
2225     {0x66555555, 0x6a5a5a5a}, /* case-110 */
2226     {0x66555555, 0xaaaaaaaa},
2227     {0xffff55ff, 0xfafafafa},
2228     {0xffff55ff, 0x5afa5afa},
2229     {0xffff55ff, 0xaaaaaaaa},
2230     {0xffff55ff, 0xffff55ff}, /* case-115 */
2231     {0xaaffffaa, 0x5afa5afa},
2232     {0xaaffffaa, 0xaaaaaaaa},
2233     {0xffffffff, 0xfafafafa},
2234     {0xffffffff, 0x5afa5afa},
2235     {0xffffffff, 0xaaaaaaaa}, /* case-120 */
2236     {0x55ff55ff, 0x5afa5afa},
2237     {0x55ff55ff, 0xaaaaaaaa},
2238     {0x55ff55ff, 0x55ff55ff}
2239 };
2240 
2241 /* Shared-Antenna TDMA */
2242 static const struct coex_tdma_para tdma_sant_8822b[] = {
2243     { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
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} }, /* case-5 */
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} }, /* case-10 */
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} }, /* case-15 */
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} }, /* case-20 */
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} }, /* case-25 */
2269     { {0x51, 0x08, 0x03, 0x10, 0x50} },
2270     { {0x61, 0x08, 0x03, 0x11, 0x11} }
2271 };
2272 
2273 /* Non-Shared-Antenna TDMA */
2274 static const struct coex_tdma_para tdma_nsant_8822b[] = {
2275     { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
2276     { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
2277     { {0x61, 0x3a, 0x03, 0x11, 0x11} },
2278     { {0x61, 0x30, 0x03, 0x11, 0x11} },
2279     { {0x61, 0x20, 0x03, 0x11, 0x11} },
2280     { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
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} }, /* case-110 */
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} }, /* case-115 */
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} }, /* case-120 */
2296     { {0x51, 0x08, 0x03, 0x10, 0x50} }
2297 };
2298 
2299 /* rssi in percentage % (dbm = % - 100) */
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 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
2304 static const struct coex_rf_para rf_para_tx_8822b[] = {
2305     {0, 0, false, 7},  /* for normal */
2306     {0, 16, false, 7}, /* for WL-CPT */
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},  /* for normal */
2315     {0, 16, false, 7}, /* for WL-CPT */
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");