xref: /freebsd/sys/contrib/dev/rtw88/rtw8822b.c (revision 11c53278a8a3e86e14377f09bbaa7bad193d3713)
12774f206SBjoern A. Zeeb // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
22774f206SBjoern A. Zeeb /* Copyright(c) 2018-2019  Realtek Corporation
32774f206SBjoern A. Zeeb  */
42774f206SBjoern A. Zeeb 
52774f206SBjoern A. Zeeb #include <linux/module.h>
62774f206SBjoern A. Zeeb #include "main.h"
72774f206SBjoern A. Zeeb #include "coex.h"
82774f206SBjoern A. Zeeb #include "fw.h"
92774f206SBjoern A. Zeeb #include "tx.h"
102774f206SBjoern A. Zeeb #include "rx.h"
112774f206SBjoern A. Zeeb #include "phy.h"
122774f206SBjoern A. Zeeb #include "rtw8822b.h"
132774f206SBjoern A. Zeeb #include "rtw8822b_table.h"
142774f206SBjoern A. Zeeb #include "mac.h"
152774f206SBjoern A. Zeeb #include "reg.h"
162774f206SBjoern A. Zeeb #include "debug.h"
172774f206SBjoern A. Zeeb #include "bf.h"
182774f206SBjoern A. Zeeb #include "regd.h"
192774f206SBjoern A. Zeeb 
202774f206SBjoern A. Zeeb static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
212774f206SBjoern A. Zeeb 				     u8 rx_path, bool is_tx2_path);
222774f206SBjoern A. Zeeb 
232774f206SBjoern A. Zeeb static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse,
242774f206SBjoern A. Zeeb 				    struct rtw8822b_efuse *map)
252774f206SBjoern A. Zeeb {
262774f206SBjoern A. Zeeb 	ether_addr_copy(efuse->addr, map->e.mac_addr);
272774f206SBjoern A. Zeeb }
282774f206SBjoern A. Zeeb 
2990aac0d8SBjoern A. Zeeb static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse,
3090aac0d8SBjoern A. Zeeb 				    struct rtw8822b_efuse *map)
3190aac0d8SBjoern A. Zeeb {
3290aac0d8SBjoern A. Zeeb 	ether_addr_copy(efuse->addr, map->u.mac_addr);
3390aac0d8SBjoern A. Zeeb }
3490aac0d8SBjoern A. Zeeb 
3590aac0d8SBjoern A. Zeeb static void rtw8822bs_efuse_parsing(struct rtw_efuse *efuse,
3690aac0d8SBjoern A. Zeeb 				    struct rtw8822b_efuse *map)
3790aac0d8SBjoern A. Zeeb {
3890aac0d8SBjoern A. Zeeb 	ether_addr_copy(efuse->addr, map->s.mac_addr);
3990aac0d8SBjoern A. Zeeb }
4090aac0d8SBjoern A. Zeeb 
412774f206SBjoern A. Zeeb static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
422774f206SBjoern A. Zeeb {
432774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
442774f206SBjoern A. Zeeb 	struct rtw8822b_efuse *map;
452774f206SBjoern A. Zeeb 	int i;
462774f206SBjoern A. Zeeb 
472774f206SBjoern A. Zeeb 	map = (struct rtw8822b_efuse *)log_map;
482774f206SBjoern A. Zeeb 
492774f206SBjoern A. Zeeb 	efuse->rfe_option = map->rfe_option;
502774f206SBjoern A. Zeeb 	efuse->rf_board_option = map->rf_board_option;
512774f206SBjoern A. Zeeb 	efuse->crystal_cap = map->xtal_k;
522774f206SBjoern A. Zeeb 	efuse->pa_type_2g = map->pa_type;
532774f206SBjoern A. Zeeb 	efuse->pa_type_5g = map->pa_type;
542774f206SBjoern A. Zeeb 	efuse->lna_type_2g = map->lna_type_2g[0];
552774f206SBjoern A. Zeeb 	efuse->lna_type_5g = map->lna_type_5g[0];
562774f206SBjoern A. Zeeb 	efuse->channel_plan = map->channel_plan;
572774f206SBjoern A. Zeeb 	efuse->country_code[0] = map->country_code[0];
582774f206SBjoern A. Zeeb 	efuse->country_code[1] = map->country_code[1];
592774f206SBjoern A. Zeeb 	efuse->bt_setting = map->rf_bt_setting;
602774f206SBjoern A. Zeeb 	efuse->regd = map->rf_board_option & 0x7;
612774f206SBjoern A. Zeeb 	efuse->thermal_meter[RF_PATH_A] = map->thermal_meter;
622774f206SBjoern A. Zeeb 	efuse->thermal_meter_k = map->thermal_meter;
632774f206SBjoern A. Zeeb 
642774f206SBjoern A. Zeeb 	for (i = 0; i < 4; i++)
652774f206SBjoern A. Zeeb 		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
662774f206SBjoern A. Zeeb 
672774f206SBjoern A. Zeeb 	switch (rtw_hci_type(rtwdev)) {
682774f206SBjoern A. Zeeb 	case RTW_HCI_TYPE_PCIE:
692774f206SBjoern A. Zeeb 		rtw8822be_efuse_parsing(efuse, map);
702774f206SBjoern A. Zeeb 		break;
7190aac0d8SBjoern A. Zeeb 	case RTW_HCI_TYPE_USB:
7290aac0d8SBjoern A. Zeeb 		rtw8822bu_efuse_parsing(efuse, map);
7390aac0d8SBjoern A. Zeeb 		break;
7490aac0d8SBjoern A. Zeeb 	case RTW_HCI_TYPE_SDIO:
7590aac0d8SBjoern A. Zeeb 		rtw8822bs_efuse_parsing(efuse, map);
7690aac0d8SBjoern A. Zeeb 		break;
772774f206SBjoern A. Zeeb 	default:
782774f206SBjoern A. Zeeb 		/* unsupported now */
792774f206SBjoern A. Zeeb 		return -ENOTSUPP;
802774f206SBjoern A. Zeeb 	}
812774f206SBjoern A. Zeeb 
822774f206SBjoern A. Zeeb 	return 0;
832774f206SBjoern A. Zeeb }
842774f206SBjoern A. Zeeb 
852774f206SBjoern A. Zeeb static void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev)
862774f206SBjoern A. Zeeb {
872774f206SBjoern A. Zeeb 	/* chip top mux */
882774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3);
892774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0);
902774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1);
912774f206SBjoern A. Zeeb 
922774f206SBjoern A. Zeeb 	/* from s0 or s1 */
932774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30);
942774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3);
952774f206SBjoern A. Zeeb 
962774f206SBjoern A. Zeeb 	/* input or output */
972774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f);
982774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3);
992774f206SBjoern A. Zeeb }
1002774f206SBjoern A. Zeeb 
1012774f206SBjoern A. Zeeb #define RTW_TXSCALE_SIZE 37
1022774f206SBjoern A. Zeeb static const u32 rtw8822b_txscale_tbl[RTW_TXSCALE_SIZE] = {
1032774f206SBjoern A. Zeeb 	0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8,
1042774f206SBjoern A. Zeeb 	0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180,
1052774f206SBjoern A. Zeeb 	0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab,
1062774f206SBjoern A. Zeeb 	0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe
1072774f206SBjoern A. Zeeb };
1082774f206SBjoern A. Zeeb 
1092774f206SBjoern A. Zeeb static u8 rtw8822b_get_swing_index(struct rtw_dev *rtwdev)
1102774f206SBjoern A. Zeeb {
1112774f206SBjoern A. Zeeb 	u8 i = 0;
1122774f206SBjoern A. Zeeb 	u32 swing, table_value;
1132774f206SBjoern A. Zeeb 
1142774f206SBjoern A. Zeeb 	swing = rtw_read32_mask(rtwdev, 0xc1c, 0xffe00000);
1152774f206SBjoern A. Zeeb 	for (i = 0; i < RTW_TXSCALE_SIZE; i++) {
1162774f206SBjoern A. Zeeb 		table_value = rtw8822b_txscale_tbl[i];
1172774f206SBjoern A. Zeeb 		if (swing == table_value)
1182774f206SBjoern A. Zeeb 			break;
1192774f206SBjoern A. Zeeb 	}
1202774f206SBjoern A. Zeeb 
1212774f206SBjoern A. Zeeb 	return i;
1222774f206SBjoern A. Zeeb }
1232774f206SBjoern A. Zeeb 
1242774f206SBjoern A. Zeeb static void rtw8822b_pwrtrack_init(struct rtw_dev *rtwdev)
1252774f206SBjoern A. Zeeb {
1262774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1272774f206SBjoern A. Zeeb 	u8 swing_idx = rtw8822b_get_swing_index(rtwdev);
1282774f206SBjoern A. Zeeb 	u8 path;
1292774f206SBjoern A. Zeeb 
1302774f206SBjoern A. Zeeb 	if (swing_idx >= RTW_TXSCALE_SIZE)
1312774f206SBjoern A. Zeeb 		dm_info->default_ofdm_index = 24;
1322774f206SBjoern A. Zeeb 	else
1332774f206SBjoern A. Zeeb 		dm_info->default_ofdm_index = swing_idx;
1342774f206SBjoern A. Zeeb 
1352774f206SBjoern A. Zeeb 	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
1362774f206SBjoern A. Zeeb 		ewma_thermal_init(&dm_info->avg_thermal[path]);
1372774f206SBjoern A. Zeeb 		dm_info->delta_power_index[path] = 0;
1382774f206SBjoern A. Zeeb 	}
1392774f206SBjoern A. Zeeb 	dm_info->pwr_trk_triggered = false;
1402774f206SBjoern A. Zeeb 	dm_info->pwr_trk_init_trigger = true;
1412774f206SBjoern A. Zeeb 	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
1422774f206SBjoern A. Zeeb }
1432774f206SBjoern A. Zeeb 
1442774f206SBjoern A. Zeeb static void rtw8822b_phy_bf_init(struct rtw_dev *rtwdev)
1452774f206SBjoern A. Zeeb {
1462774f206SBjoern A. Zeeb 	rtw_bf_phy_init(rtwdev);
1472774f206SBjoern A. Zeeb 	/* Grouping bitmap parameters */
1482774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF);
1492774f206SBjoern A. Zeeb }
1502774f206SBjoern A. Zeeb 
1512774f206SBjoern A. Zeeb static void rtw8822b_phy_set_param(struct rtw_dev *rtwdev)
1522774f206SBjoern A. Zeeb {
1532774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
1542774f206SBjoern A. Zeeb 	u8 crystal_cap;
1552774f206SBjoern A. Zeeb 	bool is_tx2_path;
1562774f206SBjoern A. Zeeb 
1572774f206SBjoern A. Zeeb 	/* power on BB/RF domain */
1582774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_SYS_FUNC_EN,
1592774f206SBjoern A. Zeeb 		       BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST);
1602774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_RF_CTRL,
1612774f206SBjoern A. Zeeb 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
1622774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN);
1632774f206SBjoern A. Zeeb 
1642774f206SBjoern A. Zeeb 	/* pre init before header files config */
1652774f206SBjoern A. Zeeb 	rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
1662774f206SBjoern A. Zeeb 
1672774f206SBjoern A. Zeeb 	rtw_phy_load_tables(rtwdev);
1682774f206SBjoern A. Zeeb 
1692774f206SBjoern A. Zeeb 	crystal_cap = rtwdev->efuse.crystal_cap & 0x3F;
1702774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x24, 0x7e000000, crystal_cap);
1712774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap);
1722774f206SBjoern A. Zeeb 
1732774f206SBjoern A. Zeeb 	/* post init after header files config */
1742774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST);
1752774f206SBjoern A. Zeeb 
1762774f206SBjoern A. Zeeb 	is_tx2_path = false;
1772774f206SBjoern A. Zeeb 	rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx,
1782774f206SBjoern A. Zeeb 				 is_tx2_path);
1792774f206SBjoern A. Zeeb 	rtw_phy_init(rtwdev);
1802774f206SBjoern A. Zeeb 
1812774f206SBjoern A. Zeeb 	rtw8822b_phy_rfe_init(rtwdev);
1822774f206SBjoern A. Zeeb 	rtw8822b_pwrtrack_init(rtwdev);
1832774f206SBjoern A. Zeeb 
1842774f206SBjoern A. Zeeb 	rtw8822b_phy_bf_init(rtwdev);
1852774f206SBjoern A. Zeeb }
1862774f206SBjoern A. Zeeb 
1872774f206SBjoern A. Zeeb #define WLAN_SLOT_TIME		0x09
1882774f206SBjoern A. Zeeb #define WLAN_PIFS_TIME		0x19
1892774f206SBjoern A. Zeeb #define WLAN_SIFS_CCK_CONT_TX	0xA
1902774f206SBjoern A. Zeeb #define WLAN_SIFS_OFDM_CONT_TX	0xE
1912774f206SBjoern A. Zeeb #define WLAN_SIFS_CCK_TRX	0x10
1922774f206SBjoern A. Zeeb #define WLAN_SIFS_OFDM_TRX	0x10
1932774f206SBjoern A. Zeeb #define WLAN_VO_TXOP_LIMIT	0x186 /* unit : 32us */
1942774f206SBjoern A. Zeeb #define WLAN_VI_TXOP_LIMIT	0x3BC /* unit : 32us */
1952774f206SBjoern A. Zeeb #define WLAN_RDG_NAV		0x05
1962774f206SBjoern A. Zeeb #define WLAN_TXOP_NAV		0x1B
1972774f206SBjoern A. Zeeb #define WLAN_CCK_RX_TSF		0x30
1982774f206SBjoern A. Zeeb #define WLAN_OFDM_RX_TSF	0x30
1992774f206SBjoern A. Zeeb #define WLAN_TBTT_PROHIBIT	0x04 /* unit : 32us */
2002774f206SBjoern A. Zeeb #define WLAN_TBTT_HOLD_TIME	0x064 /* unit : 32us */
2012774f206SBjoern A. Zeeb #define WLAN_DRV_EARLY_INT	0x04
2022774f206SBjoern A. Zeeb #define WLAN_BCN_DMA_TIME	0x02
2032774f206SBjoern A. Zeeb 
2042774f206SBjoern A. Zeeb #define WLAN_RX_FILTER0		0x0FFFFFFF
2052774f206SBjoern A. Zeeb #define WLAN_RX_FILTER2		0xFFFF
2062774f206SBjoern A. Zeeb #define WLAN_RCR_CFG		0xE400220E
2072774f206SBjoern A. Zeeb #define WLAN_RXPKT_MAX_SZ	12288
2082774f206SBjoern A. Zeeb #define WLAN_RXPKT_MAX_SZ_512	(WLAN_RXPKT_MAX_SZ >> 9)
2092774f206SBjoern A. Zeeb 
2102774f206SBjoern A. Zeeb #define WLAN_AMPDU_MAX_TIME		0x70
2112774f206SBjoern A. Zeeb #define WLAN_RTS_LEN_TH			0xFF
2122774f206SBjoern A. Zeeb #define WLAN_RTS_TX_TIME_TH		0x08
2132774f206SBjoern A. Zeeb #define WLAN_MAX_AGG_PKT_LIMIT		0x20
2142774f206SBjoern A. Zeeb #define WLAN_RTS_MAX_AGG_PKT_LIMIT	0x20
2152774f206SBjoern A. Zeeb #define FAST_EDCA_VO_TH		0x06
2162774f206SBjoern A. Zeeb #define FAST_EDCA_VI_TH		0x06
2172774f206SBjoern A. Zeeb #define FAST_EDCA_BE_TH		0x06
2182774f206SBjoern A. Zeeb #define FAST_EDCA_BK_TH		0x06
2192774f206SBjoern A. Zeeb #define WLAN_BAR_RETRY_LIMIT		0x01
2202774f206SBjoern A. Zeeb #define WLAN_RA_TRY_RATE_AGG_LIMIT	0x08
2212774f206SBjoern A. Zeeb 
2222774f206SBjoern A. Zeeb #define WLAN_TX_FUNC_CFG1		0x30
2232774f206SBjoern A. Zeeb #define WLAN_TX_FUNC_CFG2		0x30
2242774f206SBjoern A. Zeeb #define WLAN_MAC_OPT_NORM_FUNC1		0x98
2252774f206SBjoern A. Zeeb #define WLAN_MAC_OPT_LB_FUNC1		0x80
2262774f206SBjoern A. Zeeb #define WLAN_MAC_OPT_FUNC2		0xb0810041
2272774f206SBjoern A. Zeeb 
2282774f206SBjoern A. Zeeb #define WLAN_SIFS_CFG	(WLAN_SIFS_CCK_CONT_TX | \
2292774f206SBjoern A. Zeeb 			(WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \
2302774f206SBjoern A. Zeeb 			(WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \
2312774f206SBjoern A. Zeeb 			(WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX))
2322774f206SBjoern A. Zeeb 
2332774f206SBjoern A. Zeeb #define WLAN_TBTT_TIME	(WLAN_TBTT_PROHIBIT |\
2342774f206SBjoern A. Zeeb 			(WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP))
2352774f206SBjoern A. Zeeb 
2362774f206SBjoern A. Zeeb #define WLAN_NAV_CFG		(WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16))
2372774f206SBjoern A. Zeeb #define WLAN_RX_TSF_CFG		(WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8)
2382774f206SBjoern A. Zeeb 
2392774f206SBjoern A. Zeeb static int rtw8822b_mac_init(struct rtw_dev *rtwdev)
2402774f206SBjoern A. Zeeb {
2412774f206SBjoern A. Zeeb 	u32 value32;
2422774f206SBjoern A. Zeeb 
2432774f206SBjoern A. Zeeb 	/* protocol configuration */
2442774f206SBjoern A. Zeeb 	rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, BIT_PRE_TX_CMD);
2452774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME);
2462774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1);
2472774f206SBjoern A. Zeeb 	value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) |
2482774f206SBjoern A. Zeeb 		  (WLAN_MAX_AGG_PKT_LIMIT << 16) |
2492774f206SBjoern A. Zeeb 		  (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24);
2502774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32);
2512774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2,
2522774f206SBjoern A. Zeeb 		    WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8);
2532774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH);
2542774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH);
2552774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH);
2562774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH);
2572774f206SBjoern A. Zeeb 	/* EDCA configuration */
2582774f206SBjoern A. Zeeb 	rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0);
2592774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_TXPAUSE, 0x0000);
2602774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
2612774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME);
2622774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG);
2632774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT);
2642774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT);
2652774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG);
2662774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG);
2672774f206SBjoern A. Zeeb 	/* Set beacon cotnrol - enable TSF and other related functions */
2682774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
2692774f206SBjoern A. Zeeb 	/* Set send beacon related registers */
2702774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME);
2712774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT);
2722774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME);
2732774f206SBjoern A. Zeeb 	rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8);
2742774f206SBjoern A. Zeeb 	/* WMAC configuration */
2752774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
2762774f206SBjoern A. Zeeb 	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
2772774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
2782774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512);
2792774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2);
2802774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1);
2812774f206SBjoern A. Zeeb 	rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2);
2822774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1);
2832774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL,
2842774f206SBjoern A. Zeeb 		       BIT_DIS_CHK_VHTSIGB_CRC);
2852774f206SBjoern A. Zeeb 
2862774f206SBjoern A. Zeeb 	return 0;
2872774f206SBjoern A. Zeeb }
2882774f206SBjoern A. Zeeb 
2892774f206SBjoern A. Zeeb static void rtw8822b_set_channel_rfe_efem(struct rtw_dev *rtwdev, u8 channel)
2902774f206SBjoern A. Zeeb {
2912774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
2922774f206SBjoern A. Zeeb 
2932774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel)) {
2942774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x705770);
2952774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
2962774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(4), 0);
2972774f206SBjoern A. Zeeb 	} else {
2982774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x177517);
2992774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
3002774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(5), 0);
3012774f206SBjoern A. Zeeb 	}
3022774f206SBjoern A. Zeeb 
3032774f206SBjoern A. Zeeb 	rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
3042774f206SBjoern A. Zeeb 
3052774f206SBjoern A. Zeeb 	if (hal->antenna_rx == BB_PATH_AB ||
3062774f206SBjoern A. Zeeb 	    hal->antenna_tx == BB_PATH_AB) {
3072774f206SBjoern A. Zeeb 		/* 2TX or 2RX */
3082774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
3092774f206SBjoern A. Zeeb 	} else if (hal->antenna_rx == hal->antenna_tx) {
3102774f206SBjoern A. Zeeb 		/* TXA+RXA or TXB+RXB */
3112774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
3122774f206SBjoern A. Zeeb 	} else {
3132774f206SBjoern A. Zeeb 		/* TXB+RXA or TXA+RXB */
3142774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
3152774f206SBjoern A. Zeeb 	}
3162774f206SBjoern A. Zeeb }
3172774f206SBjoern A. Zeeb 
3182774f206SBjoern A. Zeeb static void rtw8822b_set_channel_rfe_ifem(struct rtw_dev *rtwdev, u8 channel)
3192774f206SBjoern A. Zeeb {
3202774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
3212774f206SBjoern A. Zeeb 
3222774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel)) {
3232774f206SBjoern A. Zeeb 		/* signal source */
3242774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774);
3252774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57);
3262774f206SBjoern A. Zeeb 	} else {
3272774f206SBjoern A. Zeeb 		/* signal source */
3282774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x477547);
3292774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75);
3302774f206SBjoern A. Zeeb 	}
3312774f206SBjoern A. Zeeb 
3322774f206SBjoern A. Zeeb 	rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0);
3332774f206SBjoern A. Zeeb 
3342774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel)) {
3352774f206SBjoern A. Zeeb 		if (hal->antenna_rx == BB_PATH_AB ||
3362774f206SBjoern A. Zeeb 		    hal->antenna_tx == BB_PATH_AB) {
3372774f206SBjoern A. Zeeb 			/* 2TX or 2RX */
3382774f206SBjoern A. Zeeb 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501);
3392774f206SBjoern A. Zeeb 		} else if (hal->antenna_rx == hal->antenna_tx) {
3402774f206SBjoern A. Zeeb 			/* TXA+RXA or TXB+RXB */
3412774f206SBjoern A. Zeeb 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500);
3422774f206SBjoern A. Zeeb 		} else {
3432774f206SBjoern A. Zeeb 			/* TXB+RXA or TXA+RXB */
3442774f206SBjoern A. Zeeb 			rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005);
3452774f206SBjoern A. Zeeb 		}
3462774f206SBjoern A. Zeeb 	} else {
3472774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa5a5);
3482774f206SBjoern A. Zeeb 	}
3492774f206SBjoern A. Zeeb }
3502774f206SBjoern A. Zeeb 
3512774f206SBjoern A. Zeeb enum {
3522774f206SBjoern A. Zeeb 	CCUT_IDX_1R_2G,
3532774f206SBjoern A. Zeeb 	CCUT_IDX_2R_2G,
3542774f206SBjoern A. Zeeb 	CCUT_IDX_1R_5G,
3552774f206SBjoern A. Zeeb 	CCUT_IDX_2R_5G,
3562774f206SBjoern A. Zeeb 	CCUT_IDX_NR,
3572774f206SBjoern A. Zeeb };
3582774f206SBjoern A. Zeeb 
3592774f206SBjoern A. Zeeb struct cca_ccut {
3602774f206SBjoern A. Zeeb 	u32 reg82c[CCUT_IDX_NR];
3612774f206SBjoern A. Zeeb 	u32 reg830[CCUT_IDX_NR];
3622774f206SBjoern A. Zeeb 	u32 reg838[CCUT_IDX_NR];
3632774f206SBjoern A. Zeeb };
3642774f206SBjoern A. Zeeb 
3652774f206SBjoern A. Zeeb static const struct cca_ccut cca_ifem_ccut = {
3662774f206SBjoern A. Zeeb 	{0x75C97010, 0x75C97010, 0x75C97010, 0x75C97010}, /*Reg82C*/
3672774f206SBjoern A. Zeeb 	{0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
3682774f206SBjoern A. Zeeb 	{0x87765541, 0x87746341, 0x87765541, 0x87746341}, /*Reg838*/
3692774f206SBjoern A. Zeeb };
3702774f206SBjoern A. Zeeb 
3712774f206SBjoern A. Zeeb static const struct cca_ccut cca_efem_ccut = {
3722774f206SBjoern A. Zeeb 	{0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010}, /*Reg82C*/
3732774f206SBjoern A. Zeeb 	{0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa}, /*Reg830*/
3742774f206SBjoern A. Zeeb 	{0x87766451, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/
3752774f206SBjoern A. Zeeb };
3762774f206SBjoern A. Zeeb 
3772774f206SBjoern A. Zeeb static const struct cca_ccut cca_ifem_ccut_ext = {
3782774f206SBjoern A. Zeeb 	{0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010}, /*Reg82C*/
3792774f206SBjoern A. Zeeb 	{0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/
3802774f206SBjoern A. Zeeb 	{0x87765541, 0x86666341, 0x87765561, 0x86666361}, /*Reg838*/
3812774f206SBjoern A. Zeeb };
3822774f206SBjoern A. Zeeb 
3832774f206SBjoern A. Zeeb static void rtw8822b_get_cca_val(const struct cca_ccut *cca_ccut, u8 col,
3842774f206SBjoern A. Zeeb 				 u32 *reg82c, u32 *reg830, u32 *reg838)
3852774f206SBjoern A. Zeeb {
3862774f206SBjoern A. Zeeb 	*reg82c = cca_ccut->reg82c[col];
3872774f206SBjoern A. Zeeb 	*reg830 = cca_ccut->reg830[col];
3882774f206SBjoern A. Zeeb 	*reg838 = cca_ccut->reg838[col];
3892774f206SBjoern A. Zeeb }
3902774f206SBjoern A. Zeeb 
3912774f206SBjoern A. Zeeb struct rtw8822b_rfe_info {
3922774f206SBjoern A. Zeeb 	const struct cca_ccut *cca_ccut_2g;
3932774f206SBjoern A. Zeeb 	const struct cca_ccut *cca_ccut_5g;
3942774f206SBjoern A. Zeeb 	enum rtw_rfe_fem fem;
3952774f206SBjoern A. Zeeb 	bool ifem_ext;
3962774f206SBjoern A. Zeeb 	void (*rtw_set_channel_rfe)(struct rtw_dev *rtwdev, u8 channel);
3972774f206SBjoern A. Zeeb };
3982774f206SBjoern A. Zeeb 
3992774f206SBjoern A. Zeeb #define I2GE5G_CCUT(set_ch) {						\
4002774f206SBjoern A. Zeeb 	.cca_ccut_2g = &cca_ifem_ccut,					\
4012774f206SBjoern A. Zeeb 	.cca_ccut_5g = &cca_efem_ccut,					\
4022774f206SBjoern A. Zeeb 	.fem = RTW_RFE_IFEM2G_EFEM5G,					\
4032774f206SBjoern A. Zeeb 	.ifem_ext = false,						\
4042774f206SBjoern A. Zeeb 	.rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch,	\
4052774f206SBjoern A. Zeeb 	}
4062774f206SBjoern A. Zeeb #define IFEM_EXT_CCUT(set_ch) {						\
4072774f206SBjoern A. Zeeb 	.cca_ccut_2g = &cca_ifem_ccut_ext,				\
4082774f206SBjoern A. Zeeb 	.cca_ccut_5g = &cca_ifem_ccut_ext,				\
4092774f206SBjoern A. Zeeb 	.fem = RTW_RFE_IFEM,						\
4102774f206SBjoern A. Zeeb 	.ifem_ext = true,						\
4112774f206SBjoern A. Zeeb 	.rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch,	\
4122774f206SBjoern A. Zeeb 	}
4132774f206SBjoern A. Zeeb 
4142774f206SBjoern A. Zeeb static const struct rtw8822b_rfe_info rtw8822b_rfe_info[] = {
4152774f206SBjoern A. Zeeb 	[2] = I2GE5G_CCUT(efem),
4162774f206SBjoern A. Zeeb 	[3] = IFEM_EXT_CCUT(ifem),
4172774f206SBjoern A. Zeeb 	[5] = IFEM_EXT_CCUT(ifem),
4182774f206SBjoern A. Zeeb };
4192774f206SBjoern A. Zeeb 
4202774f206SBjoern A. Zeeb static void rtw8822b_set_channel_cca(struct rtw_dev *rtwdev, u8 channel, u8 bw,
4212774f206SBjoern A. Zeeb 				     const struct rtw8822b_rfe_info *rfe_info)
4222774f206SBjoern A. Zeeb {
4232774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
4242774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
4252774f206SBjoern A. Zeeb 	const struct cca_ccut *cca_ccut;
4262774f206SBjoern A. Zeeb 	u8 col;
4272774f206SBjoern A. Zeeb 	u32 reg82c, reg830, reg838;
4282774f206SBjoern A. Zeeb 	bool is_efem_cca = false, is_ifem_cca = false, is_rfe_type = false;
4292774f206SBjoern A. Zeeb 
4302774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel)) {
4312774f206SBjoern A. Zeeb 		cca_ccut = rfe_info->cca_ccut_2g;
4322774f206SBjoern A. Zeeb 
4332774f206SBjoern A. Zeeb 		if (hal->antenna_rx == BB_PATH_A ||
4342774f206SBjoern A. Zeeb 		    hal->antenna_rx == BB_PATH_B)
4352774f206SBjoern A. Zeeb 			col = CCUT_IDX_1R_2G;
4362774f206SBjoern A. Zeeb 		else
4372774f206SBjoern A. Zeeb 			col = CCUT_IDX_2R_2G;
4382774f206SBjoern A. Zeeb 	} else {
4392774f206SBjoern A. Zeeb 		cca_ccut = rfe_info->cca_ccut_5g;
4402774f206SBjoern A. Zeeb 
4412774f206SBjoern A. Zeeb 		if (hal->antenna_rx == BB_PATH_A ||
4422774f206SBjoern A. Zeeb 		    hal->antenna_rx == BB_PATH_B)
4432774f206SBjoern A. Zeeb 			col = CCUT_IDX_1R_5G;
4442774f206SBjoern A. Zeeb 		else
4452774f206SBjoern A. Zeeb 			col = CCUT_IDX_2R_5G;
4462774f206SBjoern A. Zeeb 	}
4472774f206SBjoern A. Zeeb 
4482774f206SBjoern A. Zeeb 	rtw8822b_get_cca_val(cca_ccut, col, &reg82c, &reg830, &reg838);
4492774f206SBjoern A. Zeeb 
4502774f206SBjoern A. Zeeb 	switch (rfe_info->fem) {
4512774f206SBjoern A. Zeeb 	case RTW_RFE_IFEM:
4522774f206SBjoern A. Zeeb 	default:
4532774f206SBjoern A. Zeeb 		is_ifem_cca = true;
4542774f206SBjoern A. Zeeb 		if (rfe_info->ifem_ext)
4552774f206SBjoern A. Zeeb 			is_rfe_type = true;
4562774f206SBjoern A. Zeeb 		break;
4572774f206SBjoern A. Zeeb 	case RTW_RFE_EFEM:
4582774f206SBjoern A. Zeeb 		is_efem_cca = true;
4592774f206SBjoern A. Zeeb 		break;
4602774f206SBjoern A. Zeeb 	case RTW_RFE_IFEM2G_EFEM5G:
4612774f206SBjoern A. Zeeb 		if (IS_CH_2G_BAND(channel))
4622774f206SBjoern A. Zeeb 			is_ifem_cca = true;
4632774f206SBjoern A. Zeeb 		else
4642774f206SBjoern A. Zeeb 			is_efem_cca = true;
4652774f206SBjoern A. Zeeb 		break;
4662774f206SBjoern A. Zeeb 	}
4672774f206SBjoern A. Zeeb 
4682774f206SBjoern A. Zeeb 	if (is_ifem_cca) {
4692774f206SBjoern A. Zeeb 		if ((hal->cut_version == RTW_CHIP_VER_CUT_B &&
4702774f206SBjoern A. Zeeb 		     (col == CCUT_IDX_2R_2G || col == CCUT_IDX_2R_5G) &&
4712774f206SBjoern A. Zeeb 		     bw == RTW_CHANNEL_WIDTH_40) ||
4722774f206SBjoern A. Zeeb 		    (!is_rfe_type && col == CCUT_IDX_2R_5G &&
4732774f206SBjoern A. Zeeb 		     bw == RTW_CHANNEL_WIDTH_40) ||
4742774f206SBjoern A. Zeeb 		    (efuse->rfe_option == 5 && col == CCUT_IDX_2R_5G))
4752774f206SBjoern A. Zeeb 			reg830 = 0x79a0ea28;
4762774f206SBjoern A. Zeeb 	}
4772774f206SBjoern A. Zeeb 
4782774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_CCASEL, MASKDWORD, reg82c);
4792774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_PDMFTH, MASKDWORD, reg830);
4802774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_CCA2ND, MASKDWORD, reg838);
4812774f206SBjoern A. Zeeb 
4822774f206SBjoern A. Zeeb 	if (is_efem_cca && !(hal->cut_version == RTW_CHIP_VER_CUT_B))
4832774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_L1WT, MASKDWORD, 0x9194b2b9);
4842774f206SBjoern A. Zeeb 
4852774f206SBjoern A. Zeeb 	if (bw == RTW_CHANNEL_WIDTH_20 && IS_CH_5G_BAND_MID(channel))
4862774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0, 0x4);
4872774f206SBjoern A. Zeeb }
4882774f206SBjoern A. Zeeb 
4892774f206SBjoern A. Zeeb static const u8 low_band[15] = {0x7, 0x6, 0x6, 0x5, 0x0, 0x0, 0x7, 0xff, 0x6,
4902774f206SBjoern A. Zeeb 				0x5, 0x0, 0x0, 0x7, 0x6, 0x6};
4912774f206SBjoern A. Zeeb static const u8 middle_band[23] = {0x6, 0x5, 0x0, 0x0, 0x7, 0x6, 0x6, 0xff, 0x0,
4922774f206SBjoern A. Zeeb 				   0x0, 0x7, 0x6, 0x6, 0x5, 0x0, 0xff, 0x7, 0x6,
4932774f206SBjoern A. Zeeb 				   0x6, 0x5, 0x0, 0x0, 0x7};
4942774f206SBjoern A. Zeeb static const u8 high_band[15] = {0x5, 0x5, 0x0, 0x7, 0x7, 0x6, 0x5, 0xff, 0x0,
4952774f206SBjoern A. Zeeb 				 0x7, 0x7, 0x6, 0x5, 0x5, 0x0};
4962774f206SBjoern A. Zeeb 
4972774f206SBjoern A. Zeeb static void rtw8822b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
4982774f206SBjoern A. Zeeb {
4992774f206SBjoern A. Zeeb #define RF18_BAND_MASK		(BIT(16) | BIT(9) | BIT(8))
5002774f206SBjoern A. Zeeb #define RF18_BAND_2G		(0)
5012774f206SBjoern A. Zeeb #define RF18_BAND_5G		(BIT(16) | BIT(8))
5022774f206SBjoern A. Zeeb #define RF18_CHANNEL_MASK	(MASKBYTE0)
5032774f206SBjoern A. Zeeb #define RF18_RFSI_MASK		(BIT(18) | BIT(17))
5042774f206SBjoern A. Zeeb #define RF18_RFSI_GE_CH80	(BIT(17))
5052774f206SBjoern A. Zeeb #define RF18_RFSI_GT_CH144	(BIT(18))
5062774f206SBjoern A. Zeeb #define RF18_BW_MASK		(BIT(11) | BIT(10))
5072774f206SBjoern A. Zeeb #define RF18_BW_20M		(BIT(11) | BIT(10))
5082774f206SBjoern A. Zeeb #define RF18_BW_40M		(BIT(11))
5092774f206SBjoern A. Zeeb #define RF18_BW_80M		(BIT(10))
5102774f206SBjoern A. Zeeb #define RFBE_MASK		(BIT(17) | BIT(16) | BIT(15))
5112774f206SBjoern A. Zeeb 
5122774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
5132774f206SBjoern A. Zeeb 	u32 rf_reg18, rf_reg_be;
5142774f206SBjoern A. Zeeb 
5152774f206SBjoern A. Zeeb 	rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK);
5162774f206SBjoern A. Zeeb 
5172774f206SBjoern A. Zeeb 	rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK |
5182774f206SBjoern A. Zeeb 		      RF18_BW_MASK);
5192774f206SBjoern A. Zeeb 
5202774f206SBjoern A. Zeeb 	rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G);
5212774f206SBjoern A. Zeeb 	rf_reg18 |= (channel & RF18_CHANNEL_MASK);
5222774f206SBjoern A. Zeeb 	if (channel > 144)
5232774f206SBjoern A. Zeeb 		rf_reg18 |= RF18_RFSI_GT_CH144;
5242774f206SBjoern A. Zeeb 	else if (channel >= 80)
5252774f206SBjoern A. Zeeb 		rf_reg18 |= RF18_RFSI_GE_CH80;
5262774f206SBjoern A. Zeeb 
5272774f206SBjoern A. Zeeb 	switch (bw) {
5282774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_5:
5292774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_10:
5302774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_20:
5312774f206SBjoern A. Zeeb 	default:
5322774f206SBjoern A. Zeeb 		rf_reg18 |= RF18_BW_20M;
5332774f206SBjoern A. Zeeb 		break;
5342774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_40:
5352774f206SBjoern A. Zeeb 		rf_reg18 |= RF18_BW_40M;
5362774f206SBjoern A. Zeeb 		break;
5372774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_80:
5382774f206SBjoern A. Zeeb 		rf_reg18 |= RF18_BW_80M;
5392774f206SBjoern A. Zeeb 		break;
5402774f206SBjoern A. Zeeb 	}
5412774f206SBjoern A. Zeeb 
5422774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel))
5432774f206SBjoern A. Zeeb 		rf_reg_be = 0x0;
5442774f206SBjoern A. Zeeb 	else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
5452774f206SBjoern A. Zeeb 		rf_reg_be = low_band[(channel - 36) >> 1];
5462774f206SBjoern A. Zeeb 	else if (IS_CH_5G_BAND_3(channel))
5472774f206SBjoern A. Zeeb 		rf_reg_be = middle_band[(channel - 100) >> 1];
5482774f206SBjoern A. Zeeb 	else if (IS_CH_5G_BAND_4(channel))
5492774f206SBjoern A. Zeeb 		rf_reg_be = high_band[(channel - 149) >> 1];
5502774f206SBjoern A. Zeeb 	else
5512774f206SBjoern A. Zeeb 		goto err;
5522774f206SBjoern A. Zeeb 
5532774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_MALSEL, RFBE_MASK, rf_reg_be);
5542774f206SBjoern A. Zeeb 
5552774f206SBjoern A. Zeeb 	/* need to set 0xdf[18]=1 before writing RF18 when channel 144 */
5562774f206SBjoern A. Zeeb 	if (channel == 144)
5572774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x1);
5582774f206SBjoern A. Zeeb 	else
5592774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x0);
5602774f206SBjoern A. Zeeb 
5612774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18);
5622774f206SBjoern A. Zeeb 	if (hal->rf_type > RF_1T1R)
5632774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_B, 0x18, RFREG_MASK, rf_reg18);
5642774f206SBjoern A. Zeeb 
5652774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0);
5662774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1);
5672774f206SBjoern A. Zeeb 
5682774f206SBjoern A. Zeeb 	return;
5692774f206SBjoern A. Zeeb 
5702774f206SBjoern A. Zeeb err:
5712774f206SBjoern A. Zeeb 	WARN_ON(1);
5722774f206SBjoern A. Zeeb }
5732774f206SBjoern A. Zeeb 
5742774f206SBjoern A. Zeeb static void rtw8822b_toggle_igi(struct rtw_dev *rtwdev)
5752774f206SBjoern A. Zeeb {
5762774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
5772774f206SBjoern A. Zeeb 	u32 igi;
5782774f206SBjoern A. Zeeb 
5792774f206SBjoern A. Zeeb 	igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f);
5802774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi - 2);
5812774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi);
5822774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi - 2);
5832774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi);
5842774f206SBjoern A. Zeeb 
5852774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 0x0);
5862774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0,
5872774f206SBjoern A. Zeeb 			 hal->antenna_rx | (hal->antenna_rx << 4));
5882774f206SBjoern A. Zeeb }
5892774f206SBjoern A. Zeeb 
5902774f206SBjoern A. Zeeb static void rtw8822b_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
5912774f206SBjoern A. Zeeb {
5922774f206SBjoern A. Zeeb 	if (bw == RTW_CHANNEL_WIDTH_40) {
5932774f206SBjoern A. Zeeb 		/* RX DFIR for BW40 */
5942774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x1);
5952774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x0);
5962774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
5972774f206SBjoern A. Zeeb 	} else if (bw == RTW_CHANNEL_WIDTH_80) {
5982774f206SBjoern A. Zeeb 		/* RX DFIR for BW80 */
5992774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
6002774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1);
6012774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0);
6022774f206SBjoern A. Zeeb 	} else {
6032774f206SBjoern A. Zeeb 		/* RX DFIR for BW20, BW10 and BW5*/
6042774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2);
6052774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2);
6062774f206SBjoern A. Zeeb 		rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1);
6072774f206SBjoern A. Zeeb 	}
6082774f206SBjoern A. Zeeb }
6092774f206SBjoern A. Zeeb 
6102774f206SBjoern A. Zeeb static void rtw8822b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
6112774f206SBjoern A. Zeeb 				    u8 primary_ch_idx)
6122774f206SBjoern A. Zeeb {
6132774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
6142774f206SBjoern A. Zeeb 	u8 rfe_option = efuse->rfe_option;
6152774f206SBjoern A. Zeeb 	u32 val32;
6162774f206SBjoern A. Zeeb 
6172774f206SBjoern A. Zeeb 	if (IS_CH_2G_BAND(channel)) {
6182774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1);
6192774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0);
6202774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0);
6212774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15);
6222774f206SBjoern A. Zeeb 
6232774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x0);
6242774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
6252774f206SBjoern A. Zeeb 		if (channel == 14) {
6262774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x00006577);
6272774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
6282774f206SBjoern A. Zeeb 		} else {
6292774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x384f6577);
6302774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x1525);
6312774f206SBjoern A. Zeeb 		}
6322774f206SBjoern A. Zeeb 
6332774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_RFEINV, 0x300, 0x2);
6342774f206SBjoern A. Zeeb 	} else if (IS_CH_5G_BAND(channel)) {
6352774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1);
6362774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1);
6372774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0);
6382774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 34);
6392774f206SBjoern A. Zeeb 
6402774f206SBjoern A. Zeeb 		if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel))
6412774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x1);
6422774f206SBjoern A. Zeeb 		else if (IS_CH_5G_BAND_3(channel))
6432774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x2);
6442774f206SBjoern A. Zeeb 		else if (IS_CH_5G_BAND_4(channel))
6452774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x3);
6462774f206SBjoern A. Zeeb 
6472774f206SBjoern A. Zeeb 		if (IS_CH_5G_BAND_1(channel))
6482774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494);
6492774f206SBjoern A. Zeeb 		else if (IS_CH_5G_BAND_2(channel))
6502774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453);
6512774f206SBjoern A. Zeeb 		else if (channel >= 100 && channel <= 116)
6522774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452);
6532774f206SBjoern A. Zeeb 		else if (channel >= 118 && channel <= 177)
6542774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
6552774f206SBjoern A. Zeeb 
6562774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, 0xcbc, 0x300, 0x1);
6572774f206SBjoern A. Zeeb 	}
6582774f206SBjoern A. Zeeb 
6592774f206SBjoern A. Zeeb 	switch (bw) {
6602774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_20:
6612774f206SBjoern A. Zeeb 	default:
6622774f206SBjoern A. Zeeb 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
6632774f206SBjoern A. Zeeb 		val32 &= 0xFFCFFC00;
6642774f206SBjoern A. Zeeb 		val32 |= (RTW_CHANNEL_WIDTH_20);
6652774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
6662774f206SBjoern A. Zeeb 
6672774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
6682774f206SBjoern A. Zeeb 		break;
6692774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_40:
6702774f206SBjoern A. Zeeb 		if (primary_ch_idx == RTW_SC_20_UPPER)
6712774f206SBjoern A. Zeeb 			rtw_write32_set(rtwdev, REG_RXSB, BIT(4));
6722774f206SBjoern A. Zeeb 		else
6732774f206SBjoern A. Zeeb 			rtw_write32_clr(rtwdev, REG_RXSB, BIT(4));
6742774f206SBjoern A. Zeeb 
6752774f206SBjoern A. Zeeb 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
6762774f206SBjoern A. Zeeb 		val32 &= 0xFF3FF300;
6772774f206SBjoern A. Zeeb 		val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_40);
6782774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
6792774f206SBjoern A. Zeeb 
6802774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
6812774f206SBjoern A. Zeeb 		break;
6822774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_80:
6832774f206SBjoern A. Zeeb 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
6842774f206SBjoern A. Zeeb 		val32 &= 0xFCEFCF00;
6852774f206SBjoern A. Zeeb 		val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_80);
6862774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
6872774f206SBjoern A. Zeeb 
6882774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1);
6892774f206SBjoern A. Zeeb 
6902774f206SBjoern A. Zeeb 		if (rfe_option == 2 || rfe_option == 3) {
6912774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_L1PKWT, 0x0000f000, 0x6);
6922774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_ADC40, BIT(10), 0x1);
6932774f206SBjoern A. Zeeb 		}
6942774f206SBjoern A. Zeeb 		break;
6952774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_5:
6962774f206SBjoern A. Zeeb 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
6972774f206SBjoern A. Zeeb 		val32 &= 0xEFEEFE00;
6982774f206SBjoern A. Zeeb 		val32 |= ((BIT(6) | RTW_CHANNEL_WIDTH_20));
6992774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
7002774f206SBjoern A. Zeeb 
7012774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
7022774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
7032774f206SBjoern A. Zeeb 		break;
7042774f206SBjoern A. Zeeb 	case RTW_CHANNEL_WIDTH_10:
7052774f206SBjoern A. Zeeb 		val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD);
7062774f206SBjoern A. Zeeb 		val32 &= 0xEFFEFF00;
7072774f206SBjoern A. Zeeb 		val32 |= ((BIT(7) | RTW_CHANNEL_WIDTH_20));
7082774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32);
7092774f206SBjoern A. Zeeb 
7102774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0);
7112774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1);
7122774f206SBjoern A. Zeeb 		break;
7132774f206SBjoern A. Zeeb 	}
7142774f206SBjoern A. Zeeb }
7152774f206SBjoern A. Zeeb 
7162774f206SBjoern A. Zeeb static void rtw8822b_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
7172774f206SBjoern A. Zeeb 				 u8 primary_chan_idx)
7182774f206SBjoern A. Zeeb {
7192774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
7202774f206SBjoern A. Zeeb 	const struct rtw8822b_rfe_info *rfe_info;
7212774f206SBjoern A. Zeeb 
7222774f206SBjoern A. Zeeb 	if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
7232774f206SBjoern A. Zeeb 		 "rfe_option %d is out of boundary\n", efuse->rfe_option))
7242774f206SBjoern A. Zeeb 		return;
7252774f206SBjoern A. Zeeb 
7262774f206SBjoern A. Zeeb 	rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
7272774f206SBjoern A. Zeeb 
7282774f206SBjoern A. Zeeb 	rtw8822b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
7292774f206SBjoern A. Zeeb 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
7302774f206SBjoern A. Zeeb 	rtw8822b_set_channel_rf(rtwdev, channel, bw);
7312774f206SBjoern A. Zeeb 	rtw8822b_set_channel_rxdfir(rtwdev, bw);
7322774f206SBjoern A. Zeeb 	rtw8822b_toggle_igi(rtwdev);
7332774f206SBjoern A. Zeeb 	rtw8822b_set_channel_cca(rtwdev, channel, bw, rfe_info);
7342774f206SBjoern A. Zeeb 	(*rfe_info->rtw_set_channel_rfe)(rtwdev, channel);
7352774f206SBjoern A. Zeeb }
7362774f206SBjoern A. Zeeb 
7372774f206SBjoern A. Zeeb static void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path,
7382774f206SBjoern A. Zeeb 				     u8 rx_path, bool is_tx2_path)
7392774f206SBjoern A. Zeeb {
7402774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
7412774f206SBjoern A. Zeeb 	const struct rtw8822b_rfe_info *rfe_info;
7422774f206SBjoern A. Zeeb 	u8 ch = rtwdev->hal.current_channel;
7432774f206SBjoern A. Zeeb 	u8 tx_path_sel, rx_path_sel;
7442774f206SBjoern A. Zeeb 	int counter;
7452774f206SBjoern A. Zeeb 
7462774f206SBjoern A. Zeeb 	if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info),
7472774f206SBjoern A. Zeeb 		 "rfe_option %d is out of boundary\n", efuse->rfe_option))
7482774f206SBjoern A. Zeeb 		return;
7492774f206SBjoern A. Zeeb 
7502774f206SBjoern A. Zeeb 	rfe_info = &rtw8822b_rfe_info[efuse->rfe_option];
7512774f206SBjoern A. Zeeb 
7522774f206SBjoern A. Zeeb 	if ((tx_path | rx_path) & BB_PATH_A)
7532774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x3231);
7542774f206SBjoern A. Zeeb 	else
7552774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x1111);
7562774f206SBjoern A. Zeeb 
7572774f206SBjoern A. Zeeb 	if ((tx_path | rx_path) & BB_PATH_B)
7582774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x3231);
7592774f206SBjoern A. Zeeb 	else
7602774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x1111);
7612774f206SBjoern A. Zeeb 
7622774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_CDDTXP, (BIT(19) | BIT(18)), 0x3);
7632774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_TXPSEL, (BIT(29) | BIT(28)), 0x1);
7642774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_TXPSEL, BIT(30), 0x1);
7652774f206SBjoern A. Zeeb 
7662774f206SBjoern A. Zeeb 	if (tx_path & BB_PATH_A) {
7672774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x001);
7682774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x8);
7692774f206SBjoern A. Zeeb 	} else if (tx_path & BB_PATH_B) {
7702774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x002);
7712774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x4);
7722774f206SBjoern A. Zeeb 	}
7732774f206SBjoern A. Zeeb 
7742774f206SBjoern A. Zeeb 	if (tx_path == BB_PATH_A || tx_path == BB_PATH_B)
7752774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x01);
7762774f206SBjoern A. Zeeb 	else
7772774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x43);
7782774f206SBjoern A. Zeeb 
7792774f206SBjoern A. Zeeb 	tx_path_sel = (tx_path << 4) | tx_path;
7802774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_TXPSEL, MASKBYTE0, tx_path_sel);
7812774f206SBjoern A. Zeeb 
7822774f206SBjoern A. Zeeb 	if (tx_path != BB_PATH_A && tx_path != BB_PATH_B) {
7832774f206SBjoern A. Zeeb 		if (is_tx2_path || rtwdev->mp_mode) {
7842774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x043);
7852774f206SBjoern A. Zeeb 			rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0xc);
7862774f206SBjoern A. Zeeb 		}
7872774f206SBjoern A. Zeeb 	}
7882774f206SBjoern A. Zeeb 
7892774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXDESC, BIT(22), 0x0);
7902774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXDESC, BIT(18), 0x0);
7912774f206SBjoern A. Zeeb 
7922774f206SBjoern A. Zeeb 	if (rx_path & BB_PATH_A)
7932774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x0);
7942774f206SBjoern A. Zeeb 	else if (rx_path & BB_PATH_B)
7952774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x5);
7962774f206SBjoern A. Zeeb 
7972774f206SBjoern A. Zeeb 	rx_path_sel = (rx_path << 4) | rx_path;
7982774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, rx_path_sel);
7992774f206SBjoern A. Zeeb 
8002774f206SBjoern A. Zeeb 	if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) {
8012774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x0);
8022774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x0);
8032774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x0);
8042774f206SBjoern A. Zeeb 	} else {
8052774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x1);
8062774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x1);
8072774f206SBjoern A. Zeeb 		rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x1);
8082774f206SBjoern A. Zeeb 	}
8092774f206SBjoern A. Zeeb 
8102774f206SBjoern A. Zeeb 	for (counter = 100; counter > 0; counter--) {
8112774f206SBjoern A. Zeeb 		u32 rf_reg33;
8122774f206SBjoern A. Zeeb 
8132774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
8142774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
8152774f206SBjoern A. Zeeb 
8162774f206SBjoern A. Zeeb 		udelay(2);
8172774f206SBjoern A. Zeeb 		rf_reg33 = rtw_read_rf(rtwdev, RF_PATH_A, 0x33, RFREG_MASK);
8182774f206SBjoern A. Zeeb 
8192774f206SBjoern A. Zeeb 		if (rf_reg33 == 0x00001)
8202774f206SBjoern A. Zeeb 			break;
8212774f206SBjoern A. Zeeb 	}
8222774f206SBjoern A. Zeeb 
8232774f206SBjoern A. Zeeb 	if (WARN(counter <= 0, "write RF mode table fail\n"))
8242774f206SBjoern A. Zeeb 		return;
8252774f206SBjoern A. Zeeb 
8262774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000);
8272774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001);
8282774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x00034);
8292774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x4080c);
8302774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
8312774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000);
8322774f206SBjoern A. Zeeb 
8332774f206SBjoern A. Zeeb 	rtw8822b_toggle_igi(rtwdev);
8342774f206SBjoern A. Zeeb 	rtw8822b_set_channel_cca(rtwdev, 1, RTW_CHANNEL_WIDTH_20, rfe_info);
8352774f206SBjoern A. Zeeb 	(*rfe_info->rtw_set_channel_rfe)(rtwdev, ch);
8362774f206SBjoern A. Zeeb }
8372774f206SBjoern A. Zeeb 
8382774f206SBjoern A. Zeeb static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
8392774f206SBjoern A. Zeeb 				   struct rtw_rx_pkt_stat *pkt_stat)
8402774f206SBjoern A. Zeeb {
8412774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
8422774f206SBjoern A. Zeeb 	s8 min_rx_power = -120;
8432774f206SBjoern A. Zeeb 	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
8442774f206SBjoern A. Zeeb 
8452774f206SBjoern A. Zeeb 	/* 8822B uses only 1 antenna to RX CCK rates */
8462774f206SBjoern A. Zeeb 	pkt_stat->rx_power[RF_PATH_A] = pwdb - 110;
8472774f206SBjoern A. Zeeb 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
8482774f206SBjoern A. Zeeb 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
8492774f206SBjoern A. Zeeb 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
8502774f206SBjoern A. Zeeb 				     min_rx_power);
8512774f206SBjoern A. Zeeb 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
8522774f206SBjoern A. Zeeb }
8532774f206SBjoern A. Zeeb 
8542774f206SBjoern A. Zeeb static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
8552774f206SBjoern A. Zeeb 				   struct rtw_rx_pkt_stat *pkt_stat)
8562774f206SBjoern A. Zeeb {
8572774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
8582774f206SBjoern A. Zeeb 	u8 rxsc, bw;
8592774f206SBjoern A. Zeeb 	s8 min_rx_power = -120;
8602774f206SBjoern A. Zeeb 	s8 rx_evm;
8612774f206SBjoern A. Zeeb 	u8 evm_dbm = 0;
8622774f206SBjoern A. Zeeb 	u8 rssi;
8632774f206SBjoern A. Zeeb 	int path;
8642774f206SBjoern A. Zeeb 
8652774f206SBjoern A. Zeeb 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
8662774f206SBjoern A. Zeeb 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
8672774f206SBjoern A. Zeeb 	else
8682774f206SBjoern A. Zeeb 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
8692774f206SBjoern A. Zeeb 
8702774f206SBjoern A. Zeeb 	if (rxsc >= 1 && rxsc <= 8)
8712774f206SBjoern A. Zeeb 		bw = RTW_CHANNEL_WIDTH_20;
8722774f206SBjoern A. Zeeb 	else if (rxsc >= 9 && rxsc <= 12)
8732774f206SBjoern A. Zeeb 		bw = RTW_CHANNEL_WIDTH_40;
8742774f206SBjoern A. Zeeb 	else if (rxsc >= 13)
8752774f206SBjoern A. Zeeb 		bw = RTW_CHANNEL_WIDTH_80;
8762774f206SBjoern A. Zeeb 	else
8772774f206SBjoern A. Zeeb 		bw = GET_PHY_STAT_P1_RF_MODE(phy_status);
8782774f206SBjoern A. Zeeb 
8792774f206SBjoern A. Zeeb 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
8802774f206SBjoern A. Zeeb 	pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110;
8812774f206SBjoern A. Zeeb 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2);
8822774f206SBjoern A. Zeeb 	pkt_stat->bw = bw;
8832774f206SBjoern A. Zeeb 	pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A],
8842774f206SBjoern A. Zeeb 				      pkt_stat->rx_power[RF_PATH_B],
8852774f206SBjoern A. Zeeb 				      min_rx_power);
8862774f206SBjoern A. Zeeb 
8872774f206SBjoern A. Zeeb 	dm_info->curr_rx_rate = pkt_stat->rate;
8882774f206SBjoern A. Zeeb 
8892774f206SBjoern A. Zeeb 	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
8902774f206SBjoern A. Zeeb 	pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status);
8912774f206SBjoern A. Zeeb 
8922774f206SBjoern A. Zeeb 	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
8932774f206SBjoern A. Zeeb 	pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status);
8942774f206SBjoern A. Zeeb 
8952774f206SBjoern A. Zeeb 	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
8962774f206SBjoern A. Zeeb 	pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status);
8972774f206SBjoern A. Zeeb 
8982774f206SBjoern A. Zeeb 	for (path = 0; path <= rtwdev->hal.rf_path_num; path++) {
8992774f206SBjoern A. Zeeb 		rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1);
9002774f206SBjoern A. Zeeb 		dm_info->rssi[path] = rssi;
9012774f206SBjoern A. Zeeb 		dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1;
9022774f206SBjoern A. Zeeb 		dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1;
9032774f206SBjoern A. Zeeb 
9042774f206SBjoern A. Zeeb 		rx_evm = pkt_stat->rx_evm[path];
9052774f206SBjoern A. Zeeb 
9062774f206SBjoern A. Zeeb 		if (rx_evm < 0) {
9072774f206SBjoern A. Zeeb 			if (rx_evm == S8_MIN)
9082774f206SBjoern A. Zeeb 				evm_dbm = 0;
9092774f206SBjoern A. Zeeb 			else
9102774f206SBjoern A. Zeeb 				evm_dbm = ((u8)-rx_evm >> 1);
9112774f206SBjoern A. Zeeb 		}
9122774f206SBjoern A. Zeeb 		dm_info->rx_evm_dbm[path] = evm_dbm;
9132774f206SBjoern A. Zeeb 	}
9142774f206SBjoern A. Zeeb }
9152774f206SBjoern A. Zeeb 
9162774f206SBjoern A. Zeeb static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
9172774f206SBjoern A. Zeeb 			     struct rtw_rx_pkt_stat *pkt_stat)
9182774f206SBjoern A. Zeeb {
9192774f206SBjoern A. Zeeb 	u8 page;
9202774f206SBjoern A. Zeeb 
9212774f206SBjoern A. Zeeb 	page = *phy_status & 0xf;
9222774f206SBjoern A. Zeeb 
9232774f206SBjoern A. Zeeb 	switch (page) {
9242774f206SBjoern A. Zeeb 	case 0:
9252774f206SBjoern A. Zeeb 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
9262774f206SBjoern A. Zeeb 		break;
9272774f206SBjoern A. Zeeb 	case 1:
9282774f206SBjoern A. Zeeb 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
9292774f206SBjoern A. Zeeb 		break;
9302774f206SBjoern A. Zeeb 	default:
9312774f206SBjoern A. Zeeb 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
9322774f206SBjoern A. Zeeb 		return;
9332774f206SBjoern A. Zeeb 	}
9342774f206SBjoern A. Zeeb }
9352774f206SBjoern A. Zeeb 
9362774f206SBjoern A. Zeeb static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
9372774f206SBjoern A. Zeeb 				   struct rtw_rx_pkt_stat *pkt_stat,
9382774f206SBjoern A. Zeeb 				   struct ieee80211_rx_status *rx_status)
9392774f206SBjoern A. Zeeb {
9402774f206SBjoern A. Zeeb 	struct ieee80211_hdr *hdr;
9412774f206SBjoern A. Zeeb 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
9422774f206SBjoern A. Zeeb 	u8 *phy_status = NULL;
9432774f206SBjoern A. Zeeb 
9442774f206SBjoern A. Zeeb 	memset(pkt_stat, 0, sizeof(*pkt_stat));
9452774f206SBjoern A. Zeeb 
9462774f206SBjoern A. Zeeb 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
9472774f206SBjoern A. Zeeb 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
9482774f206SBjoern A. Zeeb 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
9492774f206SBjoern A. Zeeb 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
9502774f206SBjoern A. Zeeb 			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
9512774f206SBjoern A. Zeeb 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
9522774f206SBjoern A. Zeeb 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
9532774f206SBjoern A. Zeeb 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
9542774f206SBjoern A. Zeeb 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
9552774f206SBjoern A. Zeeb 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
9562774f206SBjoern A. Zeeb 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
9572774f206SBjoern A. Zeeb 	pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
9582774f206SBjoern A. Zeeb 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
9592774f206SBjoern A. Zeeb 
9602774f206SBjoern A. Zeeb 	/* drv_info_sz is in unit of 8-bytes */
9612774f206SBjoern A. Zeeb 	pkt_stat->drv_info_sz *= 8;
9622774f206SBjoern A. Zeeb 
9632774f206SBjoern A. Zeeb 	/* c2h cmd pkt's rx/phy status is not interested */
9642774f206SBjoern A. Zeeb 	if (pkt_stat->is_c2h)
9652774f206SBjoern A. Zeeb 		return;
9662774f206SBjoern A. Zeeb 
9672774f206SBjoern A. Zeeb 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
9682774f206SBjoern A. Zeeb 				       pkt_stat->drv_info_sz);
9692774f206SBjoern A. Zeeb 	if (pkt_stat->phy_status) {
9702774f206SBjoern A. Zeeb 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
9712774f206SBjoern A. Zeeb 		query_phy_status(rtwdev, phy_status, pkt_stat);
9722774f206SBjoern A. Zeeb 	}
9732774f206SBjoern A. Zeeb 
9742774f206SBjoern A. Zeeb 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
9752774f206SBjoern A. Zeeb }
9762774f206SBjoern A. Zeeb 
9772774f206SBjoern A. Zeeb static void
9782774f206SBjoern A. Zeeb rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
9792774f206SBjoern A. Zeeb {
9802774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
9812774f206SBjoern A. Zeeb 	static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
9822774f206SBjoern A. Zeeb 	static u32 phy_pwr_idx;
9832774f206SBjoern A. Zeeb 	u8 rate, rate_idx, pwr_index, shift;
9842774f206SBjoern A. Zeeb 	int j;
9852774f206SBjoern A. Zeeb 
9862774f206SBjoern A. Zeeb 	for (j = 0; j < rtw_rate_size[rs]; j++) {
9872774f206SBjoern A. Zeeb 		rate = rtw_rate_section[rs][j];
9882774f206SBjoern A. Zeeb 		pwr_index = hal->tx_pwr_tbl[path][rate];
9892774f206SBjoern A. Zeeb 		shift = rate & 0x3;
9902774f206SBjoern A. Zeeb 		phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
9912774f206SBjoern A. Zeeb 		if (shift == 0x3) {
9922774f206SBjoern A. Zeeb 			rate_idx = rate & 0xfc;
9932774f206SBjoern A. Zeeb 			rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
9942774f206SBjoern A. Zeeb 				    phy_pwr_idx);
9952774f206SBjoern A. Zeeb 			phy_pwr_idx = 0;
9962774f206SBjoern A. Zeeb 		}
9972774f206SBjoern A. Zeeb 	}
9982774f206SBjoern A. Zeeb }
9992774f206SBjoern A. Zeeb 
10002774f206SBjoern A. Zeeb static void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev)
10012774f206SBjoern A. Zeeb {
10022774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
10032774f206SBjoern A. Zeeb 	int rs, path;
10042774f206SBjoern A. Zeeb 
10052774f206SBjoern A. Zeeb 	for (path = 0; path < hal->rf_path_num; path++) {
10062774f206SBjoern A. Zeeb 		for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++)
10072774f206SBjoern A. Zeeb 			rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs);
10082774f206SBjoern A. Zeeb 	}
10092774f206SBjoern A. Zeeb }
10102774f206SBjoern A. Zeeb 
10112774f206SBjoern A. Zeeb static bool rtw8822b_check_rf_path(u8 antenna)
10122774f206SBjoern A. Zeeb {
10132774f206SBjoern A. Zeeb 	switch (antenna) {
10142774f206SBjoern A. Zeeb 	case BB_PATH_A:
10152774f206SBjoern A. Zeeb 	case BB_PATH_B:
10162774f206SBjoern A. Zeeb 	case BB_PATH_AB:
10172774f206SBjoern A. Zeeb 		return true;
10182774f206SBjoern A. Zeeb 	default:
10192774f206SBjoern A. Zeeb 		return false;
10202774f206SBjoern A. Zeeb 	}
10212774f206SBjoern A. Zeeb }
10222774f206SBjoern A. Zeeb 
10232774f206SBjoern A. Zeeb static int rtw8822b_set_antenna(struct rtw_dev *rtwdev,
10242774f206SBjoern A. Zeeb 				u32 antenna_tx,
10252774f206SBjoern A. Zeeb 				u32 antenna_rx)
10262774f206SBjoern A. Zeeb {
10272774f206SBjoern A. Zeeb 	struct rtw_hal *hal = &rtwdev->hal;
10282774f206SBjoern A. Zeeb 
10292774f206SBjoern A. Zeeb 	rtw_dbg(rtwdev, RTW_DBG_PHY, "config RF path, tx=0x%x rx=0x%x\n",
10302774f206SBjoern A. Zeeb 		antenna_tx, antenna_rx);
10312774f206SBjoern A. Zeeb 
10322774f206SBjoern A. Zeeb 	if (!rtw8822b_check_rf_path(antenna_tx)) {
10339c951734SBjoern A. Zeeb 		rtw_warn(rtwdev, "unsupported tx path 0x%x\n", antenna_tx);
10342774f206SBjoern A. Zeeb 		return -EINVAL;
10352774f206SBjoern A. Zeeb 	}
10362774f206SBjoern A. Zeeb 
10372774f206SBjoern A. Zeeb 	if (!rtw8822b_check_rf_path(antenna_rx)) {
10389c951734SBjoern A. Zeeb 		rtw_warn(rtwdev, "unsupported rx path 0x%x\n", antenna_rx);
10392774f206SBjoern A. Zeeb 		return -EINVAL;
10402774f206SBjoern A. Zeeb 	}
10412774f206SBjoern A. Zeeb 
10422774f206SBjoern A. Zeeb 	hal->antenna_tx = antenna_tx;
10432774f206SBjoern A. Zeeb 	hal->antenna_rx = antenna_rx;
10442774f206SBjoern A. Zeeb 
10452774f206SBjoern A. Zeeb 	rtw8822b_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false);
10462774f206SBjoern A. Zeeb 
10472774f206SBjoern A. Zeeb 	return 0;
10482774f206SBjoern A. Zeeb }
10492774f206SBjoern A. Zeeb 
10502774f206SBjoern A. Zeeb static void rtw8822b_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
10512774f206SBjoern A. Zeeb {
10522774f206SBjoern A. Zeeb 	u8 ldo_pwr;
10532774f206SBjoern A. Zeeb 
10542774f206SBjoern A. Zeeb 	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
10552774f206SBjoern A. Zeeb 	ldo_pwr = enable ? ldo_pwr | BIT_LDO25_EN : ldo_pwr & ~BIT_LDO25_EN;
10562774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
10572774f206SBjoern A. Zeeb }
10582774f206SBjoern A. Zeeb 
10592774f206SBjoern A. Zeeb static void rtw8822b_false_alarm_statistics(struct rtw_dev *rtwdev)
10602774f206SBjoern A. Zeeb {
10612774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
10622774f206SBjoern A. Zeeb 	u32 cck_enable;
10632774f206SBjoern A. Zeeb 	u32 cck_fa_cnt;
10642774f206SBjoern A. Zeeb 	u32 ofdm_fa_cnt;
10652774f206SBjoern A. Zeeb 	u32 crc32_cnt;
10662774f206SBjoern A. Zeeb 	u32 cca32_cnt;
10672774f206SBjoern A. Zeeb 
10682774f206SBjoern A. Zeeb 	cck_enable = rtw_read32(rtwdev, 0x808) & BIT(28);
10692774f206SBjoern A. Zeeb 	cck_fa_cnt = rtw_read16(rtwdev, 0xa5c);
10702774f206SBjoern A. Zeeb 	ofdm_fa_cnt = rtw_read16(rtwdev, 0xf48);
10712774f206SBjoern A. Zeeb 
10722774f206SBjoern A. Zeeb 	dm_info->cck_fa_cnt = cck_fa_cnt;
10732774f206SBjoern A. Zeeb 	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
10742774f206SBjoern A. Zeeb 	dm_info->total_fa_cnt = ofdm_fa_cnt;
10752774f206SBjoern A. Zeeb 	dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0;
10762774f206SBjoern A. Zeeb 
10772774f206SBjoern A. Zeeb 	crc32_cnt = rtw_read32(rtwdev, 0xf04);
10782774f206SBjoern A. Zeeb 	dm_info->cck_ok_cnt = crc32_cnt & 0xffff;
10792774f206SBjoern A. Zeeb 	dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
10802774f206SBjoern A. Zeeb 	crc32_cnt = rtw_read32(rtwdev, 0xf14);
10812774f206SBjoern A. Zeeb 	dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff;
10822774f206SBjoern A. Zeeb 	dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
10832774f206SBjoern A. Zeeb 	crc32_cnt = rtw_read32(rtwdev, 0xf10);
10842774f206SBjoern A. Zeeb 	dm_info->ht_ok_cnt = crc32_cnt & 0xffff;
10852774f206SBjoern A. Zeeb 	dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
10862774f206SBjoern A. Zeeb 	crc32_cnt = rtw_read32(rtwdev, 0xf0c);
10872774f206SBjoern A. Zeeb 	dm_info->vht_ok_cnt = crc32_cnt & 0xffff;
10882774f206SBjoern A. Zeeb 	dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16;
10892774f206SBjoern A. Zeeb 
10902774f206SBjoern A. Zeeb 	cca32_cnt = rtw_read32(rtwdev, 0xf08);
10912774f206SBjoern A. Zeeb 	dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16);
10922774f206SBjoern A. Zeeb 	dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt;
10932774f206SBjoern A. Zeeb 	if (cck_enable) {
10942774f206SBjoern A. Zeeb 		cca32_cnt = rtw_read32(rtwdev, 0xfcc);
10952774f206SBjoern A. Zeeb 		dm_info->cck_cca_cnt = cca32_cnt & 0xffff;
10962774f206SBjoern A. Zeeb 		dm_info->total_cca_cnt += dm_info->cck_cca_cnt;
10972774f206SBjoern A. Zeeb 	}
10982774f206SBjoern A. Zeeb 
10992774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, 0x9a4, BIT(17));
11002774f206SBjoern A. Zeeb 	rtw_write32_clr(rtwdev, 0x9a4, BIT(17));
11012774f206SBjoern A. Zeeb 	rtw_write32_clr(rtwdev, 0xa2c, BIT(15));
11022774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, 0xa2c, BIT(15));
11032774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, 0xb58, BIT(0));
11042774f206SBjoern A. Zeeb 	rtw_write32_clr(rtwdev, 0xb58, BIT(0));
11052774f206SBjoern A. Zeeb }
11062774f206SBjoern A. Zeeb 
11072774f206SBjoern A. Zeeb static void rtw8822b_do_iqk(struct rtw_dev *rtwdev)
11082774f206SBjoern A. Zeeb {
11092774f206SBjoern A. Zeeb 	static int do_iqk_cnt;
11102774f206SBjoern A. Zeeb 	struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0};
11112774f206SBjoern A. Zeeb 	u32 rf_reg, iqk_fail_mask;
11122774f206SBjoern A. Zeeb 	int counter;
11132774f206SBjoern A. Zeeb 	bool reload;
11142774f206SBjoern A. Zeeb 
11152774f206SBjoern A. Zeeb 	rtw_fw_do_iqk(rtwdev, &para);
11162774f206SBjoern A. Zeeb 
11172774f206SBjoern A. Zeeb 	for (counter = 0; counter < 300; counter++) {
11182774f206SBjoern A. Zeeb 		rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK);
11192774f206SBjoern A. Zeeb 		if (rf_reg == 0xabcde)
11202774f206SBjoern A. Zeeb 			break;
11212774f206SBjoern A. Zeeb 		msleep(20);
11222774f206SBjoern A. Zeeb 	}
11232774f206SBjoern A. Zeeb 	rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0);
11242774f206SBjoern A. Zeeb 
11252774f206SBjoern A. Zeeb 	reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16));
11262774f206SBjoern A. Zeeb 	iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0));
11272774f206SBjoern A. Zeeb 	rtw_dbg(rtwdev, RTW_DBG_PHY,
11282774f206SBjoern A. Zeeb 		"iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n",
11292774f206SBjoern A. Zeeb 		counter, reload, ++do_iqk_cnt, iqk_fail_mask);
11302774f206SBjoern A. Zeeb }
11312774f206SBjoern A. Zeeb 
11322774f206SBjoern A. Zeeb static void rtw8822b_phy_calibration(struct rtw_dev *rtwdev)
11332774f206SBjoern A. Zeeb {
11342774f206SBjoern A. Zeeb 	rtw8822b_do_iqk(rtwdev);
11352774f206SBjoern A. Zeeb }
11362774f206SBjoern A. Zeeb 
11372774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_init(struct rtw_dev *rtwdev)
11382774f206SBjoern A. Zeeb {
11392774f206SBjoern A. Zeeb 	/* enable TBTT nterrupt */
11402774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
11412774f206SBjoern A. Zeeb 
11422774f206SBjoern A. Zeeb 	/* BT report packet sample rate */
11432774f206SBjoern A. Zeeb 	/* 0x790[5:0]=0x5 */
11442774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
11452774f206SBjoern A. Zeeb 
11462774f206SBjoern A. Zeeb 	/* enable BT counter statistics */
11472774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
11482774f206SBjoern A. Zeeb 
11492774f206SBjoern A. Zeeb 	/* enable PTA (3-wire function form BT side) */
11502774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
11512774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
11522774f206SBjoern A. Zeeb 
11532774f206SBjoern A. Zeeb 	/* enable PTA (tx/rx signal form WiFi side) */
11542774f206SBjoern A. Zeeb 	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
11552774f206SBjoern A. Zeeb 	/* wl tx signal to PTA not case EDCCA */
11562774f206SBjoern A. Zeeb 	rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN);
11572774f206SBjoern A. Zeeb 	/* GNT_BT=1 while select both */
11582774f206SBjoern A. Zeeb 	rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY);
11592774f206SBjoern A. Zeeb }
11602774f206SBjoern A. Zeeb 
11612774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_ant_switch(struct rtw_dev *rtwdev,
11622774f206SBjoern A. Zeeb 					 u8 ctrl_type, u8 pos_type)
11632774f206SBjoern A. Zeeb {
11642774f206SBjoern A. Zeeb 	struct rtw_coex *coex = &rtwdev->coex;
11652774f206SBjoern A. Zeeb 	struct rtw_coex_dm *coex_dm = &coex->dm;
11662774f206SBjoern A. Zeeb 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
11672774f206SBjoern A. Zeeb 	bool polarity_inverse;
11682774f206SBjoern A. Zeeb 	u8 regval = 0;
11692774f206SBjoern A. Zeeb 
11702774f206SBjoern A. Zeeb 	if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status)
11712774f206SBjoern A. Zeeb 		return;
11722774f206SBjoern A. Zeeb 
11732774f206SBjoern A. Zeeb 	coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type;
11742774f206SBjoern A. Zeeb 
11752774f206SBjoern A. Zeeb 	if (coex_rfe->ant_switch_diversity &&
11762774f206SBjoern A. Zeeb 	    ctrl_type == COEX_SWITCH_CTRL_BY_BBSW)
11772774f206SBjoern A. Zeeb 		ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV;
11782774f206SBjoern A. Zeeb 
11792774f206SBjoern A. Zeeb 	polarity_inverse = (coex_rfe->ant_switch_polarity == 1);
11802774f206SBjoern A. Zeeb 
11812774f206SBjoern A. Zeeb 	switch (ctrl_type) {
11822774f206SBjoern A. Zeeb 	default:
11832774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_BBSW:
11842774f206SBjoern A. Zeeb 		/* 0x4c[23] = 0 */
11852774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
11862774f206SBjoern A. Zeeb 		/* 0x4c[24] = 1 */
11872774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
11882774f206SBjoern A. Zeeb 		/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
11892774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x77);
11902774f206SBjoern A. Zeeb 
11912774f206SBjoern A. Zeeb 		if (pos_type == COEX_SWITCH_TO_WLG_BT) {
11922774f206SBjoern A. Zeeb 			if (coex_rfe->rfe_module_type != 0x4 &&
11932774f206SBjoern A. Zeeb 			    coex_rfe->rfe_module_type != 0x2)
11942774f206SBjoern A. Zeeb 				regval = 0x3;
11952774f206SBjoern A. Zeeb 			else
11962774f206SBjoern A. Zeeb 				regval = (!polarity_inverse ? 0x2 : 0x1);
11972774f206SBjoern A. Zeeb 		} else if (pos_type == COEX_SWITCH_TO_WLG) {
11982774f206SBjoern A. Zeeb 			regval = (!polarity_inverse ? 0x2 : 0x1);
11992774f206SBjoern A. Zeeb 		} else {
12002774f206SBjoern A. Zeeb 			regval = (!polarity_inverse ? 0x1 : 0x2);
12012774f206SBjoern A. Zeeb 		}
12022774f206SBjoern A. Zeeb 
12032774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
12042774f206SBjoern A. Zeeb 		break;
12052774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_PTA:
12062774f206SBjoern A. Zeeb 		/* 0x4c[23] = 0 */
12072774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
12082774f206SBjoern A. Zeeb 		/* 0x4c[24] = 1 */
12092774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
12102774f206SBjoern A. Zeeb 		/* PTA,  DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */
12112774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x66);
12122774f206SBjoern A. Zeeb 
12132774f206SBjoern A. Zeeb 		regval = (!polarity_inverse ? 0x2 : 0x1);
12142774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval);
12152774f206SBjoern A. Zeeb 		break;
12162774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_ANTDIV:
12172774f206SBjoern A. Zeeb 		/* 0x4c[23] = 0 */
12182774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
12192774f206SBjoern A. Zeeb 		/* 0x4c[24] = 1 */
12202774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
12212774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x88);
12222774f206SBjoern A. Zeeb 		break;
12232774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_MAC:
12242774f206SBjoern A. Zeeb 		/* 0x4c[23] = 1 */
12252774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x1);
12262774f206SBjoern A. Zeeb 
12272774f206SBjoern A. Zeeb 		regval = (!polarity_inverse ? 0x0 : 0x1);
12282774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, regval);
12292774f206SBjoern A. Zeeb 		break;
12302774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_FW:
12312774f206SBjoern A. Zeeb 		/* 0x4c[23] = 0 */
12322774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
12332774f206SBjoern A. Zeeb 		/* 0x4c[24] = 1 */
12342774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1);
12352774f206SBjoern A. Zeeb 		break;
12362774f206SBjoern A. Zeeb 	case COEX_SWITCH_CTRL_BY_BT:
12372774f206SBjoern A. Zeeb 		/* 0x4c[23] = 0 */
12382774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0);
12392774f206SBjoern A. Zeeb 		/* 0x4c[24] = 0 */
12402774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x0);
12412774f206SBjoern A. Zeeb 		break;
12422774f206SBjoern A. Zeeb 	}
12432774f206SBjoern A. Zeeb }
12442774f206SBjoern A. Zeeb 
12452774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
12462774f206SBjoern A. Zeeb {
12472774f206SBjoern A. Zeeb }
12482774f206SBjoern A. Zeeb 
12492774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
12502774f206SBjoern A. Zeeb {
12512774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0);
12522774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0);
12532774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0);
12542774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0);
12552774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0);
12562774f206SBjoern A. Zeeb }
12572774f206SBjoern A. Zeeb 
12582774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
12592774f206SBjoern A. Zeeb {
12602774f206SBjoern A. Zeeb 	struct rtw_coex *coex = &rtwdev->coex;
12612774f206SBjoern A. Zeeb 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
12622774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
12632774f206SBjoern A. Zeeb 	bool is_ext_fem = false;
12642774f206SBjoern A. Zeeb 
12652774f206SBjoern A. Zeeb 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
12662774f206SBjoern A. Zeeb 	coex_rfe->ant_switch_polarity = 0;
12672774f206SBjoern A. Zeeb 	coex_rfe->ant_switch_diversity = false;
12682774f206SBjoern A. Zeeb 	if (coex_rfe->rfe_module_type == 0x12 ||
12692774f206SBjoern A. Zeeb 	    coex_rfe->rfe_module_type == 0x15 ||
12702774f206SBjoern A. Zeeb 	    coex_rfe->rfe_module_type == 0x16)
12712774f206SBjoern A. Zeeb 		coex_rfe->ant_switch_exist = false;
12722774f206SBjoern A. Zeeb 	else
12732774f206SBjoern A. Zeeb 		coex_rfe->ant_switch_exist = true;
12742774f206SBjoern A. Zeeb 
12752774f206SBjoern A. Zeeb 	if (coex_rfe->rfe_module_type == 2 ||
12762774f206SBjoern A. Zeeb 	    coex_rfe->rfe_module_type == 4) {
12772774f206SBjoern A. Zeeb 		rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, true);
12782774f206SBjoern A. Zeeb 		is_ext_fem = true;
12792774f206SBjoern A. Zeeb 	} else {
12802774f206SBjoern A. Zeeb 		rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, false);
12812774f206SBjoern A. Zeeb 	}
12822774f206SBjoern A. Zeeb 
12832774f206SBjoern A. Zeeb 	coex_rfe->wlg_at_btg = false;
12842774f206SBjoern A. Zeeb 
12852774f206SBjoern A. Zeeb 	if (efuse->share_ant &&
12862774f206SBjoern A. Zeeb 	    coex_rfe->ant_switch_exist && !is_ext_fem)
12872774f206SBjoern A. Zeeb 		coex_rfe->ant_switch_with_bt = true;
12882774f206SBjoern A. Zeeb 	else
12892774f206SBjoern A. Zeeb 		coex_rfe->ant_switch_with_bt = false;
12902774f206SBjoern A. Zeeb 
12912774f206SBjoern A. Zeeb 	/* Ext switch buffer mux */
12922774f206SBjoern A. Zeeb 	rtw_write8(rtwdev, REG_RFE_CTRL_E, 0xff);
12932774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_RFESEL_CTRL + 1, 0x3, 0x0);
12942774f206SBjoern A. Zeeb 	rtw_write8_mask(rtwdev, REG_RFE_INV16, BIT_RFE_BUF_EN, 0x0);
12952774f206SBjoern A. Zeeb 
12962774f206SBjoern A. Zeeb 	/* Disable LTE Coex Function in WiFi side */
12972774f206SBjoern A. Zeeb 	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0);
12982774f206SBjoern A. Zeeb 
12992774f206SBjoern A. Zeeb 	/* BTC_CTT_WL_VS_LTE */
13002774f206SBjoern A. Zeeb 	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
13012774f206SBjoern A. Zeeb 
13022774f206SBjoern A. Zeeb 	/* BTC_CTT_BT_VS_LTE */
13032774f206SBjoern A. Zeeb 	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
13042774f206SBjoern A. Zeeb }
13052774f206SBjoern A. Zeeb 
13062774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
13072774f206SBjoern A. Zeeb {
13082774f206SBjoern A. Zeeb 	struct rtw_coex *coex = &rtwdev->coex;
13092774f206SBjoern A. Zeeb 	struct rtw_coex_dm *coex_dm = &coex->dm;
13102774f206SBjoern A. Zeeb 	static const u16 reg_addr[] = {0xc58, 0xe58};
13112774f206SBjoern A. Zeeb 	static const u8	wl_tx_power[] = {0xd8, 0xd4, 0xd0, 0xcc, 0xc8};
13122774f206SBjoern A. Zeeb 	u8 i, pwr;
13132774f206SBjoern A. Zeeb 
13142774f206SBjoern A. Zeeb 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
13152774f206SBjoern A. Zeeb 		return;
13162774f206SBjoern A. Zeeb 
13172774f206SBjoern A. Zeeb 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
13182774f206SBjoern A. Zeeb 
13192774f206SBjoern A. Zeeb 	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
13202774f206SBjoern A. Zeeb 		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
13212774f206SBjoern A. Zeeb 
13222774f206SBjoern A. Zeeb 	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
13232774f206SBjoern A. Zeeb 
13242774f206SBjoern A. Zeeb 	for (i = 0; i < ARRAY_SIZE(reg_addr); i++)
13252774f206SBjoern A. Zeeb 		rtw_write8_mask(rtwdev, reg_addr[i], 0xff, pwr);
13262774f206SBjoern A. Zeeb }
13272774f206SBjoern A. Zeeb 
13282774f206SBjoern A. Zeeb static void rtw8822b_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
13292774f206SBjoern A. Zeeb {
13302774f206SBjoern A. Zeeb 	struct rtw_coex *coex = &rtwdev->coex;
13312774f206SBjoern A. Zeeb 	struct rtw_coex_dm *coex_dm = &coex->dm;
13322774f206SBjoern A. Zeeb 	/* WL Rx Low gain on */
13332774f206SBjoern A. Zeeb 	static const u32 wl_rx_low_gain_on[] = {
13342774f206SBjoern A. Zeeb 		0xff000003, 0xbd120003, 0xbe100003, 0xbf080003, 0xbf060003,
13352774f206SBjoern A. Zeeb 		0xbf050003, 0xbc140003, 0xbb160003, 0xba180003, 0xb91a0003,
13362774f206SBjoern A. Zeeb 		0xb81c0003, 0xb71e0003, 0xb4200003, 0xb5220003, 0xb4240003,
13372774f206SBjoern A. Zeeb 		0xb3260003, 0xb2280003, 0xb12a0003, 0xb02c0003, 0xaf2e0003,
13382774f206SBjoern A. Zeeb 		0xae300003, 0xad320003, 0xac340003, 0xab360003, 0x8d380003,
13392774f206SBjoern A. Zeeb 		0x8c3a0003, 0x8b3c0003, 0x8a3e0003, 0x6e400003, 0x6d420003,
13402774f206SBjoern A. Zeeb 		0x6c440003, 0x6b460003, 0x6a480003, 0x694a0003, 0x684c0003,
13412774f206SBjoern A. Zeeb 		0x674e0003, 0x66500003, 0x65520003, 0x64540003, 0x64560003,
13422774f206SBjoern A. Zeeb 		0x007e0403
13432774f206SBjoern A. Zeeb 	};
13442774f206SBjoern A. Zeeb 
13452774f206SBjoern A. Zeeb 	/* WL Rx Low gain off */
13462774f206SBjoern A. Zeeb 	static const u32 wl_rx_low_gain_off[] = {
13472774f206SBjoern A. Zeeb 		0xff000003, 0xf4120003, 0xf5100003, 0xf60e0003, 0xf70c0003,
13482774f206SBjoern A. Zeeb 		0xf80a0003, 0xf3140003, 0xf2160003, 0xf1180003, 0xf01a0003,
13492774f206SBjoern A. Zeeb 		0xef1c0003, 0xee1e0003, 0xed200003, 0xec220003, 0xeb240003,
13502774f206SBjoern A. Zeeb 		0xea260003, 0xe9280003, 0xe82a0003, 0xe72c0003, 0xe62e0003,
13512774f206SBjoern A. Zeeb 		0xe5300003, 0xc8320003, 0xc7340003, 0xc6360003, 0xc5380003,
13522774f206SBjoern A. Zeeb 		0xc43a0003, 0xc33c0003, 0xc23e0003, 0xc1400003, 0xc0420003,
13532774f206SBjoern A. Zeeb 		0xa5440003, 0xa4460003, 0xa3480003, 0xa24a0003, 0xa14c0003,
13542774f206SBjoern A. Zeeb 		0x834e0003, 0x82500003, 0x81520003, 0x80540003, 0x65560003,
13552774f206SBjoern A. Zeeb 		0x007e0403
13562774f206SBjoern A. Zeeb 	};
13572774f206SBjoern A. Zeeb 	u8 i;
13582774f206SBjoern A. Zeeb 
13592774f206SBjoern A. Zeeb 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
13602774f206SBjoern A. Zeeb 		return;
13612774f206SBjoern A. Zeeb 
13622774f206SBjoern A. Zeeb 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
13632774f206SBjoern A. Zeeb 
13642774f206SBjoern A. Zeeb 	if (coex_dm->cur_wl_rx_low_gain_en) {
13652774f206SBjoern A. Zeeb 		rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table On!\n");
13662774f206SBjoern A. Zeeb 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
13672774f206SBjoern A. Zeeb 			rtw_write32(rtwdev, REG_RX_GAIN_EN, wl_rx_low_gain_on[i]);
13682774f206SBjoern A. Zeeb 
13692774f206SBjoern A. Zeeb 		/* set Rx filter corner RCK offset */
13702774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x1);
13712774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x3f);
13722774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x1);
13732774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x3f);
13742774f206SBjoern A. Zeeb 	} else {
13752774f206SBjoern A. Zeeb 		rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table Off!\n");
13762774f206SBjoern A. Zeeb 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
13772774f206SBjoern A. Zeeb 			rtw_write32(rtwdev, 0x81c, wl_rx_low_gain_off[i]);
13782774f206SBjoern A. Zeeb 
13792774f206SBjoern A. Zeeb 		/* set Rx filter corner RCK offset */
13802774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x4);
13812774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x0);
13822774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x4);
13832774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x0);
13842774f206SBjoern A. Zeeb 	}
13852774f206SBjoern A. Zeeb }
13862774f206SBjoern A. Zeeb 
13872774f206SBjoern A. Zeeb static void rtw8822b_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path,
13882774f206SBjoern A. Zeeb 					u8 tx_pwr_idx_offset,
13892774f206SBjoern A. Zeeb 					s8 *txagc_idx, u8 *swing_idx)
13902774f206SBjoern A. Zeeb {
13912774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
13922774f206SBjoern A. Zeeb 	s8 delta_pwr_idx = dm_info->delta_power_index[path];
13932774f206SBjoern A. Zeeb 	u8 swing_upper_bound = dm_info->default_ofdm_index + 10;
13942774f206SBjoern A. Zeeb 	u8 swing_lower_bound = 0;
13952774f206SBjoern A. Zeeb 	u8 max_tx_pwr_idx_offset = 0xf;
13962774f206SBjoern A. Zeeb 	s8 agc_index = 0;
13972774f206SBjoern A. Zeeb 	u8 swing_index = dm_info->default_ofdm_index;
13982774f206SBjoern A. Zeeb 
13992774f206SBjoern A. Zeeb 	tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset);
14002774f206SBjoern A. Zeeb 
14012774f206SBjoern A. Zeeb 	if (delta_pwr_idx >= 0) {
14022774f206SBjoern A. Zeeb 		if (delta_pwr_idx <= tx_pwr_idx_offset) {
14032774f206SBjoern A. Zeeb 			agc_index = delta_pwr_idx;
14042774f206SBjoern A. Zeeb 			swing_index = dm_info->default_ofdm_index;
14052774f206SBjoern A. Zeeb 		} else if (delta_pwr_idx > tx_pwr_idx_offset) {
14062774f206SBjoern A. Zeeb 			agc_index = tx_pwr_idx_offset;
14072774f206SBjoern A. Zeeb 			swing_index = dm_info->default_ofdm_index +
14082774f206SBjoern A. Zeeb 					delta_pwr_idx - tx_pwr_idx_offset;
14092774f206SBjoern A. Zeeb 			swing_index = min_t(u8, swing_index, swing_upper_bound);
14102774f206SBjoern A. Zeeb 		}
14112774f206SBjoern A. Zeeb 	} else {
14122774f206SBjoern A. Zeeb 		if (dm_info->default_ofdm_index > abs(delta_pwr_idx))
14132774f206SBjoern A. Zeeb 			swing_index =
14142774f206SBjoern A. Zeeb 				dm_info->default_ofdm_index + delta_pwr_idx;
14152774f206SBjoern A. Zeeb 		else
14162774f206SBjoern A. Zeeb 			swing_index = swing_lower_bound;
14172774f206SBjoern A. Zeeb 		swing_index = max_t(u8, swing_index, swing_lower_bound);
14182774f206SBjoern A. Zeeb 
14192774f206SBjoern A. Zeeb 		agc_index = 0;
14202774f206SBjoern A. Zeeb 	}
14212774f206SBjoern A. Zeeb 
14222774f206SBjoern A. Zeeb 	if (swing_index >= RTW_TXSCALE_SIZE) {
14232774f206SBjoern A. Zeeb 		rtw_warn(rtwdev, "swing index overflow\n");
14242774f206SBjoern A. Zeeb 		swing_index = RTW_TXSCALE_SIZE - 1;
14252774f206SBjoern A. Zeeb 	}
14262774f206SBjoern A. Zeeb 	*txagc_idx = agc_index;
14272774f206SBjoern A. Zeeb 	*swing_idx = swing_index;
14282774f206SBjoern A. Zeeb }
14292774f206SBjoern A. Zeeb 
14302774f206SBjoern A. Zeeb static void rtw8822b_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path,
14312774f206SBjoern A. Zeeb 				      u8 pwr_idx_offset)
14322774f206SBjoern A. Zeeb {
14332774f206SBjoern A. Zeeb 	s8 txagc_idx;
14342774f206SBjoern A. Zeeb 	u8 swing_idx;
14352774f206SBjoern A. Zeeb 	u32 reg1, reg2;
14362774f206SBjoern A. Zeeb 
14372774f206SBjoern A. Zeeb 	if (path == RF_PATH_A) {
14382774f206SBjoern A. Zeeb 		reg1 = 0xc94;
14392774f206SBjoern A. Zeeb 		reg2 = 0xc1c;
14402774f206SBjoern A. Zeeb 	} else if (path == RF_PATH_B) {
14412774f206SBjoern A. Zeeb 		reg1 = 0xe94;
14422774f206SBjoern A. Zeeb 		reg2 = 0xe1c;
14432774f206SBjoern A. Zeeb 	} else {
14442774f206SBjoern A. Zeeb 		return;
14452774f206SBjoern A. Zeeb 	}
14462774f206SBjoern A. Zeeb 
14472774f206SBjoern A. Zeeb 	rtw8822b_txagc_swing_offset(rtwdev, path, pwr_idx_offset,
14482774f206SBjoern A. Zeeb 				    &txagc_idx, &swing_idx);
14492774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, reg1, GENMASK(29, 25), txagc_idx);
14502774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, reg2, GENMASK(31, 21),
14512774f206SBjoern A. Zeeb 			 rtw8822b_txscale_tbl[swing_idx]);
14522774f206SBjoern A. Zeeb }
14532774f206SBjoern A. Zeeb 
14542774f206SBjoern A. Zeeb static void rtw8822b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
14552774f206SBjoern A. Zeeb {
14562774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
14572774f206SBjoern A. Zeeb 	u8 pwr_idx_offset, tx_pwr_idx;
14582774f206SBjoern A. Zeeb 	u8 channel = rtwdev->hal.current_channel;
14592774f206SBjoern A. Zeeb 	u8 band_width = rtwdev->hal.current_band_width;
14602774f206SBjoern A. Zeeb 	u8 regd = rtw_regd_get(rtwdev);
14612774f206SBjoern A. Zeeb 	u8 tx_rate = dm_info->tx_rate;
14622774f206SBjoern A. Zeeb 	u8 max_pwr_idx = rtwdev->chip->max_power_index;
14632774f206SBjoern A. Zeeb 
14642774f206SBjoern A. Zeeb 	tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate,
14652774f206SBjoern A. Zeeb 						band_width, channel, regd);
14662774f206SBjoern A. Zeeb 
14672774f206SBjoern A. Zeeb 	tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx);
14682774f206SBjoern A. Zeeb 
14692774f206SBjoern A. Zeeb 	pwr_idx_offset = max_pwr_idx - tx_pwr_idx;
14702774f206SBjoern A. Zeeb 
14712774f206SBjoern A. Zeeb 	rtw8822b_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset);
14722774f206SBjoern A. Zeeb }
14732774f206SBjoern A. Zeeb 
14742774f206SBjoern A. Zeeb static void rtw8822b_phy_pwrtrack_path(struct rtw_dev *rtwdev,
14752774f206SBjoern A. Zeeb 				       struct rtw_swing_table *swing_table,
14762774f206SBjoern A. Zeeb 				       u8 path)
14772774f206SBjoern A. Zeeb {
14782774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
14792774f206SBjoern A. Zeeb 	u8 power_idx_cur, power_idx_last;
14802774f206SBjoern A. Zeeb 	u8 delta;
14812774f206SBjoern A. Zeeb 
14822774f206SBjoern A. Zeeb 	/* 8822B only has one thermal meter at PATH A */
14832774f206SBjoern A. Zeeb 	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
14842774f206SBjoern A. Zeeb 
14852774f206SBjoern A. Zeeb 	power_idx_last = dm_info->delta_power_index[path];
14862774f206SBjoern A. Zeeb 	power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table,
14872774f206SBjoern A. Zeeb 						    path, RF_PATH_A, delta);
14882774f206SBjoern A. Zeeb 
14892774f206SBjoern A. Zeeb 	/* if delta of power indexes are the same, just skip */
14902774f206SBjoern A. Zeeb 	if (power_idx_cur == power_idx_last)
14912774f206SBjoern A. Zeeb 		return;
14922774f206SBjoern A. Zeeb 
14932774f206SBjoern A. Zeeb 	dm_info->delta_power_index[path] = power_idx_cur;
14942774f206SBjoern A. Zeeb 	rtw8822b_pwrtrack_set(rtwdev, path);
14952774f206SBjoern A. Zeeb }
14962774f206SBjoern A. Zeeb 
14972774f206SBjoern A. Zeeb static void rtw8822b_phy_pwrtrack(struct rtw_dev *rtwdev)
14982774f206SBjoern A. Zeeb {
14992774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
15002774f206SBjoern A. Zeeb 	struct rtw_swing_table swing_table;
15012774f206SBjoern A. Zeeb 	u8 thermal_value, path;
15022774f206SBjoern A. Zeeb 
15032774f206SBjoern A. Zeeb 	rtw_phy_config_swing_table(rtwdev, &swing_table);
15042774f206SBjoern A. Zeeb 
15052774f206SBjoern A. Zeeb 	if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff)
15062774f206SBjoern A. Zeeb 		return;
15072774f206SBjoern A. Zeeb 
15082774f206SBjoern A. Zeeb 	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
15092774f206SBjoern A. Zeeb 
15102774f206SBjoern A. Zeeb 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
15112774f206SBjoern A. Zeeb 
15122774f206SBjoern A. Zeeb 	if (dm_info->pwr_trk_init_trigger)
15132774f206SBjoern A. Zeeb 		dm_info->pwr_trk_init_trigger = false;
15142774f206SBjoern A. Zeeb 	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
15152774f206SBjoern A. Zeeb 						   RF_PATH_A))
15162774f206SBjoern A. Zeeb 		goto iqk;
15172774f206SBjoern A. Zeeb 
15182774f206SBjoern A. Zeeb 	for (path = 0; path < rtwdev->hal.rf_path_num; path++)
15192774f206SBjoern A. Zeeb 		rtw8822b_phy_pwrtrack_path(rtwdev, &swing_table, path);
15202774f206SBjoern A. Zeeb 
15212774f206SBjoern A. Zeeb iqk:
15222774f206SBjoern A. Zeeb 	if (rtw_phy_pwrtrack_need_iqk(rtwdev))
15232774f206SBjoern A. Zeeb 		rtw8822b_do_iqk(rtwdev);
15242774f206SBjoern A. Zeeb }
15252774f206SBjoern A. Zeeb 
15262774f206SBjoern A. Zeeb static void rtw8822b_pwr_track(struct rtw_dev *rtwdev)
15272774f206SBjoern A. Zeeb {
15282774f206SBjoern A. Zeeb 	struct rtw_efuse *efuse = &rtwdev->efuse;
15292774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
15302774f206SBjoern A. Zeeb 
15312774f206SBjoern A. Zeeb 	if (efuse->power_track_type != 0)
15322774f206SBjoern A. Zeeb 		return;
15332774f206SBjoern A. Zeeb 
15342774f206SBjoern A. Zeeb 	if (!dm_info->pwr_trk_triggered) {
15352774f206SBjoern A. Zeeb 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
15362774f206SBjoern A. Zeeb 			     GENMASK(17, 16), 0x03);
15372774f206SBjoern A. Zeeb 		dm_info->pwr_trk_triggered = true;
15382774f206SBjoern A. Zeeb 		return;
15392774f206SBjoern A. Zeeb 	}
15402774f206SBjoern A. Zeeb 
15412774f206SBjoern A. Zeeb 	rtw8822b_phy_pwrtrack(rtwdev);
15422774f206SBjoern A. Zeeb 	dm_info->pwr_trk_triggered = false;
15432774f206SBjoern A. Zeeb }
15442774f206SBjoern A. Zeeb 
15452774f206SBjoern A. Zeeb static void rtw8822b_bf_config_bfee_su(struct rtw_dev *rtwdev,
15462774f206SBjoern A. Zeeb 				       struct rtw_vif *vif,
15472774f206SBjoern A. Zeeb 				       struct rtw_bfee *bfee, bool enable)
15482774f206SBjoern A. Zeeb {
15492774f206SBjoern A. Zeeb 	if (enable)
15502774f206SBjoern A. Zeeb 		rtw_bf_enable_bfee_su(rtwdev, vif, bfee);
15512774f206SBjoern A. Zeeb 	else
15522774f206SBjoern A. Zeeb 		rtw_bf_remove_bfee_su(rtwdev, bfee);
15532774f206SBjoern A. Zeeb }
15542774f206SBjoern A. Zeeb 
15552774f206SBjoern A. Zeeb static void rtw8822b_bf_config_bfee_mu(struct rtw_dev *rtwdev,
15562774f206SBjoern A. Zeeb 				       struct rtw_vif *vif,
15572774f206SBjoern A. Zeeb 				       struct rtw_bfee *bfee, bool enable)
15582774f206SBjoern A. Zeeb {
15592774f206SBjoern A. Zeeb 	if (enable)
15602774f206SBjoern A. Zeeb 		rtw_bf_enable_bfee_mu(rtwdev, vif, bfee);
15612774f206SBjoern A. Zeeb 	else
15622774f206SBjoern A. Zeeb 		rtw_bf_remove_bfee_mu(rtwdev, bfee);
15632774f206SBjoern A. Zeeb }
15642774f206SBjoern A. Zeeb 
15652774f206SBjoern A. Zeeb static void rtw8822b_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif,
15662774f206SBjoern A. Zeeb 				    struct rtw_bfee *bfee, bool enable)
15672774f206SBjoern A. Zeeb {
15682774f206SBjoern A. Zeeb 	if (bfee->role == RTW_BFEE_SU)
15692774f206SBjoern A. Zeeb 		rtw8822b_bf_config_bfee_su(rtwdev, vif, bfee, enable);
15702774f206SBjoern A. Zeeb 	else if (bfee->role == RTW_BFEE_MU)
15712774f206SBjoern A. Zeeb 		rtw8822b_bf_config_bfee_mu(rtwdev, vif, bfee, enable);
15722774f206SBjoern A. Zeeb 	else
15732774f206SBjoern A. Zeeb 		rtw_warn(rtwdev, "wrong bfee role\n");
15742774f206SBjoern A. Zeeb }
15752774f206SBjoern A. Zeeb 
15762774f206SBjoern A. Zeeb static void rtw8822b_adaptivity_init(struct rtw_dev *rtwdev)
15772774f206SBjoern A. Zeeb {
15782774f206SBjoern A. Zeeb 	rtw_phy_set_edcca_th(rtwdev, RTW8822B_EDCCA_MAX, RTW8822B_EDCCA_MAX);
15792774f206SBjoern A. Zeeb 
15802774f206SBjoern A. Zeeb 	/* mac edcca state setting */
15812774f206SBjoern A. Zeeb 	rtw_write32_clr(rtwdev, REG_TX_PTCL_CTRL, BIT_DIS_EDCCA);
15822774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_RD_CTRL, BIT_EDCCA_MSK_CNTDOWN_EN);
15832774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_EDCCA_SOURCE, BIT_SOURCE_OPTION,
15842774f206SBjoern A. Zeeb 			 RTW8822B_EDCCA_SRC_DEF);
15852774f206SBjoern A. Zeeb 	rtw_write32_mask(rtwdev, REG_EDCCA_POW_MA, BIT_MA_LEVEL, 0);
15862774f206SBjoern A. Zeeb 
15872774f206SBjoern A. Zeeb 	/* edcca decision opt */
15882774f206SBjoern A. Zeeb 	rtw_write32_set(rtwdev, REG_EDCCA_DECISION, BIT_EDCCA_OPTION);
15892774f206SBjoern A. Zeeb }
15902774f206SBjoern A. Zeeb 
15912774f206SBjoern A. Zeeb static void rtw8822b_adaptivity(struct rtw_dev *rtwdev)
15922774f206SBjoern A. Zeeb {
15932774f206SBjoern A. Zeeb 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
15942774f206SBjoern A. Zeeb 	s8 l2h, h2l;
15952774f206SBjoern A. Zeeb 	u8 igi;
15962774f206SBjoern A. Zeeb 
15972774f206SBjoern A. Zeeb 	igi = dm_info->igi_history[0];
15982774f206SBjoern A. Zeeb 	if (dm_info->edcca_mode == RTW_EDCCA_NORMAL) {
15992774f206SBjoern A. Zeeb 		l2h = max_t(s8, igi + EDCCA_IGI_L2H_DIFF, EDCCA_TH_L2H_LB);
16002774f206SBjoern A. Zeeb 		h2l = l2h - EDCCA_L2H_H2L_DIFF_NORMAL;
16012774f206SBjoern A. Zeeb 	} else {
16022774f206SBjoern A. Zeeb 		l2h = min_t(s8, igi, dm_info->l2h_th_ini);
16032774f206SBjoern A. Zeeb 		h2l = l2h - EDCCA_L2H_H2L_DIFF;
16042774f206SBjoern A. Zeeb 	}
16052774f206SBjoern A. Zeeb 
16062774f206SBjoern A. Zeeb 	rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
16072774f206SBjoern A. Zeeb }
16082774f206SBjoern A. Zeeb 
160990aac0d8SBjoern A. Zeeb static void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev,
161090aac0d8SBjoern A. Zeeb 					  struct rtw_tx_pkt_info *pkt_info,
161190aac0d8SBjoern A. Zeeb 					  u8 *txdesc)
161290aac0d8SBjoern A. Zeeb {
161390aac0d8SBjoern A. Zeeb 	size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
161490aac0d8SBjoern A. Zeeb 
161590aac0d8SBjoern A. Zeeb 	fill_txdesc_checksum_common(txdesc, words);
161690aac0d8SBjoern A. Zeeb }
161790aac0d8SBjoern A. Zeeb 
16182774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = {
16192774f206SBjoern A. Zeeb 	{0x0086,
16202774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16212774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
16222774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
16232774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
16242774f206SBjoern A. Zeeb 	{0x0086,
16252774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16262774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
16272774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
16282774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
16292774f206SBjoern A. Zeeb 	{0x004A,
16302774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16312774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
16322774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16332774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
16342774f206SBjoern A. Zeeb 	{0x0005,
16352774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16362774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16372774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16382774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0},
16392774f206SBjoern A. Zeeb 	{0x0300,
16402774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16412774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
16422774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16432774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
16442774f206SBjoern A. Zeeb 	{0x0301,
16452774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16462774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
16472774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16482774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
16492774f206SBjoern A. Zeeb 	{0xFFFF,
16502774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16512774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16522774f206SBjoern A. Zeeb 	 0,
16532774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_END, 0, 0},
16542774f206SBjoern A. Zeeb };
16552774f206SBjoern A. Zeeb 
16562774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b[] = {
16572774f206SBjoern A. Zeeb 	{0x0012,
16582774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16592774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16602774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16612774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
16622774f206SBjoern A. Zeeb 	{0x0012,
16632774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16642774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16652774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16662774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
16672774f206SBjoern A. Zeeb 	{0x0020,
16682774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16692774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
16702774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16712774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
16722774f206SBjoern A. Zeeb 	{0x0001,
16732774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16742774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
16752774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16762774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
16772774f206SBjoern A. Zeeb 	{0x0000,
16782774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16792774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
16802774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16812774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
16822774f206SBjoern A. Zeeb 	{0x0005,
16832774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16842774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16852774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16862774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
16872774f206SBjoern A. Zeeb 	{0x0075,
16882774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16892774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
16902774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16912774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
16922774f206SBjoern A. Zeeb 	{0x0006,
16932774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16942774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
16952774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
16962774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
16972774f206SBjoern A. Zeeb 	{0x0075,
16982774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
16992774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
17002774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17012774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
17022774f206SBjoern A. Zeeb 	{0xFF1A,
17032774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17042774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
17052774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17062774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
17072774f206SBjoern A. Zeeb 	{0x0006,
17082774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17092774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17102774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17112774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
17122774f206SBjoern A. Zeeb 	{0x0005,
17132774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17142774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17152774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17162774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
17172774f206SBjoern A. Zeeb 	{0x0005,
17182774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17192774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17202774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17212774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
17222774f206SBjoern A. Zeeb 	{0x10C3,
17232774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17242774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
17252774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17262774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
17272774f206SBjoern A. Zeeb 	{0x0005,
17282774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17292774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17302774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17312774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
17322774f206SBjoern A. Zeeb 	{0x0005,
17332774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17342774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17352774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17362774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
17372774f206SBjoern A. Zeeb 	{0x0020,
17382774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17392774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17402774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17412774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
17422774f206SBjoern A. Zeeb 	{0x10A8,
17432774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_C_MSK,
17442774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17452774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17462774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
17472774f206SBjoern A. Zeeb 	{0x10A9,
17482774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_C_MSK,
17492774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17502774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17512774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0xef},
17522774f206SBjoern A. Zeeb 	{0x10AA,
17532774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_C_MSK,
17542774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17552774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17562774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x0c},
17572774f206SBjoern A. Zeeb 	{0x0068,
17582774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_C_MSK,
17592774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
17602774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17612774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
17622774f206SBjoern A. Zeeb 	{0x0029,
17632774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17642774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17652774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17662774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0xF9},
17672774f206SBjoern A. Zeeb 	{0x0024,
17682774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17692774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17702774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17712774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
17722774f206SBjoern A. Zeeb 	{0x0074,
17732774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17742774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
17752774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17762774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
17772774f206SBjoern A. Zeeb 	{0x00AF,
17782774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17792774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17802774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17812774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
17822774f206SBjoern A. Zeeb 	{0xFFFF,
17832774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17842774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17852774f206SBjoern A. Zeeb 	 0,
17862774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_END, 0, 0},
17872774f206SBjoern A. Zeeb };
17882774f206SBjoern A. Zeeb 
17892774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b[] = {
17902774f206SBjoern A. Zeeb 	{0x0003,
17912774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17922774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
17932774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17942774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
17952774f206SBjoern A. Zeeb 	{0x0093,
17962774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
17972774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
17982774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
17992774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
18002774f206SBjoern A. Zeeb 	{0x001F,
18012774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18022774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18032774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18042774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
18052774f206SBjoern A. Zeeb 	{0x00EF,
18062774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18072774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18082774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18092774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
18102774f206SBjoern A. Zeeb 	{0xFF1A,
18112774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18122774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
18132774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18142774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x30},
18152774f206SBjoern A. Zeeb 	{0x0049,
18162774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18172774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18182774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18192774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
18202774f206SBjoern A. Zeeb 	{0x0006,
18212774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18222774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18232774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18242774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
18252774f206SBjoern A. Zeeb 	{0x0002,
18262774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18272774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18282774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18292774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
18302774f206SBjoern A. Zeeb 	{0x10C3,
18312774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18322774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
18332774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18342774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
18352774f206SBjoern A. Zeeb 	{0x0005,
18362774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18372774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18382774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18392774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
18402774f206SBjoern A. Zeeb 	{0x0005,
18412774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18422774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18432774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18442774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
18452774f206SBjoern A. Zeeb 	{0x0020,
18462774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18472774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18482774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18492774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(3), 0},
18502774f206SBjoern A. Zeeb 	{0x0000,
18512774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18522774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
18532774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18542774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
18552774f206SBjoern A. Zeeb 	{0xFFFF,
18562774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18572774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18582774f206SBjoern A. Zeeb 	 0,
18592774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_END, 0, 0},
18602774f206SBjoern A. Zeeb };
18612774f206SBjoern A. Zeeb 
18622774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = {
18632774f206SBjoern A. Zeeb 	{0x0005,
18642774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18652774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
18662774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18672774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
18682774f206SBjoern A. Zeeb 	{0x0007,
18692774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18702774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
18712774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18722774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
18732774f206SBjoern A. Zeeb 	{0x0067,
18742774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18752774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
18762774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18772774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
18782774f206SBjoern A. Zeeb 	{0x0005,
18792774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18802774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_PCI_MSK,
18812774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18822774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
18832774f206SBjoern A. Zeeb 	{0x004A,
18842774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18852774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK,
18862774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18872774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
18882774f206SBjoern A. Zeeb 	{0x0067,
18892774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18902774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
18912774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18922774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
18932774f206SBjoern A. Zeeb 	{0x0067,
18942774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
18952774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
18962774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
18972774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
18982774f206SBjoern A. Zeeb 	{0x004F,
18992774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19002774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19012774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19022774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
19032774f206SBjoern A. Zeeb 	{0x0067,
19042774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19052774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19062774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19072774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
19082774f206SBjoern A. Zeeb 	{0x0046,
19092774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19102774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19112774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19122774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
19132774f206SBjoern A. Zeeb 	{0x0067,
19142774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19152774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19162774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19172774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
19182774f206SBjoern A. Zeeb 	{0x0046,
19192774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19202774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19212774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19222774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
19232774f206SBjoern A. Zeeb 	{0x0062,
19242774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19252774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19262774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19272774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
19282774f206SBjoern A. Zeeb 	{0x0081,
19292774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19302774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
19312774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19322774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0},
19332774f206SBjoern A. Zeeb 	{0x0005,
19342774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19352774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
19362774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19372774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
19382774f206SBjoern A. Zeeb 	{0x0086,
19392774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19402774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19412774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19422774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
19432774f206SBjoern A. Zeeb 	{0x0086,
19442774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19452774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19462774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19472774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
19482774f206SBjoern A. Zeeb 	{0x0090,
19492774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19502774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK,
19512774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_MAC,
19522774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
19532774f206SBjoern A. Zeeb 	{0x0044,
19542774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19552774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19562774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19572774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
19582774f206SBjoern A. Zeeb 	{0x0040,
19592774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19602774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19612774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19622774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x90},
19632774f206SBjoern A. Zeeb 	{0x0041,
19642774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19652774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19662774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19672774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
19682774f206SBjoern A. Zeeb 	{0x0042,
19692774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19702774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_SDIO_MSK,
19712774f206SBjoern A. Zeeb 	 RTW_PWR_ADDR_SDIO,
19722774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_WRITE, 0xFF, 0x04},
19732774f206SBjoern A. Zeeb 	{0xFFFF,
19742774f206SBjoern A. Zeeb 	 RTW_PWR_CUT_ALL_MSK,
19752774f206SBjoern A. Zeeb 	 RTW_PWR_INTF_ALL_MSK,
19762774f206SBjoern A. Zeeb 	 0,
19772774f206SBjoern A. Zeeb 	 RTW_PWR_CMD_END, 0, 0},
19782774f206SBjoern A. Zeeb };
19792774f206SBjoern A. Zeeb 
19802774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
19812774f206SBjoern A. Zeeb 	trans_carddis_to_cardemu_8822b,
19822774f206SBjoern A. Zeeb 	trans_cardemu_to_act_8822b,
19832774f206SBjoern A. Zeeb 	NULL
19842774f206SBjoern A. Zeeb };
19852774f206SBjoern A. Zeeb 
19862774f206SBjoern A. Zeeb static const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
19872774f206SBjoern A. Zeeb 	trans_act_to_cardemu_8822b,
19882774f206SBjoern A. Zeeb 	trans_cardemu_to_carddis_8822b,
19892774f206SBjoern A. Zeeb 	NULL
19902774f206SBjoern A. Zeeb };
19912774f206SBjoern A. Zeeb 
19922774f206SBjoern A. Zeeb static const struct rtw_intf_phy_para usb2_param_8822b[] = {
19932774f206SBjoern A. Zeeb 	{0xFFFF, 0x00,
19942774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
19952774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_ALL,
19962774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
19972774f206SBjoern A. Zeeb };
19982774f206SBjoern A. Zeeb 
19992774f206SBjoern A. Zeeb static const struct rtw_intf_phy_para usb3_param_8822b[] = {
20002774f206SBjoern A. Zeeb 	{0x0001, 0xA841,
20012774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20022774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_D,
20032774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20042774f206SBjoern A. Zeeb 	{0xFFFF, 0x0000,
20052774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20062774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_ALL,
20072774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20082774f206SBjoern A. Zeeb };
20092774f206SBjoern A. Zeeb 
20102774f206SBjoern A. Zeeb static const struct rtw_intf_phy_para pcie_gen1_param_8822b[] = {
20112774f206SBjoern A. Zeeb 	{0x0001, 0xA841,
20122774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20132774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20142774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20152774f206SBjoern A. Zeeb 	{0x0002, 0x60C6,
20162774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20172774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20182774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20192774f206SBjoern A. Zeeb 	{0x0008, 0x3596,
20202774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20212774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20222774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20232774f206SBjoern A. Zeeb 	{0x0009, 0x321C,
20242774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20252774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20262774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20272774f206SBjoern A. Zeeb 	{0x000A, 0x9623,
20282774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20292774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20302774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20312774f206SBjoern A. Zeeb 	{0x0020, 0x94FF,
20322774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20332774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20342774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20352774f206SBjoern A. Zeeb 	{0x0021, 0xFFCF,
20362774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20372774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20382774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20392774f206SBjoern A. Zeeb 	{0x0026, 0xC006,
20402774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20412774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20422774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20432774f206SBjoern A. Zeeb 	{0x0029, 0xFF0E,
20442774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20452774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20462774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20472774f206SBjoern A. Zeeb 	{0x002A, 0x1840,
20482774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20492774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20502774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20512774f206SBjoern A. Zeeb 	{0xFFFF, 0x0000,
20522774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20532774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_ALL,
20542774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20552774f206SBjoern A. Zeeb };
20562774f206SBjoern A. Zeeb 
20572774f206SBjoern A. Zeeb static const struct rtw_intf_phy_para pcie_gen2_param_8822b[] = {
20582774f206SBjoern A. Zeeb 	{0x0001, 0xA841,
20592774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20602774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20612774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20622774f206SBjoern A. Zeeb 	{0x0002, 0x60C6,
20632774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20642774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20652774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20662774f206SBjoern A. Zeeb 	{0x0008, 0x3597,
20672774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20682774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20692774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20702774f206SBjoern A. Zeeb 	{0x0009, 0x321C,
20712774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20722774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20732774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20742774f206SBjoern A. Zeeb 	{0x000A, 0x9623,
20752774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20762774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20772774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20782774f206SBjoern A. Zeeb 	{0x0020, 0x94FF,
20792774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20802774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20812774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20822774f206SBjoern A. Zeeb 	{0x0021, 0xFFCF,
20832774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20842774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20852774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20862774f206SBjoern A. Zeeb 	{0x0026, 0xC006,
20872774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20882774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20892774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20902774f206SBjoern A. Zeeb 	{0x0029, 0xFF0E,
20912774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20922774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20932774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20942774f206SBjoern A. Zeeb 	{0x002A, 0x3040,
20952774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
20962774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_C,
20972774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
20982774f206SBjoern A. Zeeb 	{0xFFFF, 0x0000,
20992774f206SBjoern A. Zeeb 	 RTW_IP_SEL_PHY,
21002774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_CUT_ALL,
21012774f206SBjoern A. Zeeb 	 RTW_INTF_PHY_PLATFORM_ALL},
21022774f206SBjoern A. Zeeb };
21032774f206SBjoern A. Zeeb 
21042774f206SBjoern A. Zeeb static const struct rtw_intf_phy_para_table phy_para_table_8822b = {
21052774f206SBjoern A. Zeeb 	.usb2_para	= usb2_param_8822b,
21062774f206SBjoern A. Zeeb 	.usb3_para	= usb3_param_8822b,
21072774f206SBjoern A. Zeeb 	.gen1_para	= pcie_gen1_param_8822b,
21082774f206SBjoern A. Zeeb 	.gen2_para	= pcie_gen2_param_8822b,
21092774f206SBjoern A. Zeeb 	.n_usb2_para	= ARRAY_SIZE(usb2_param_8822b),
21102774f206SBjoern A. Zeeb 	.n_usb3_para	= ARRAY_SIZE(usb2_param_8822b),
21112774f206SBjoern A. Zeeb 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8822b),
21122774f206SBjoern A. Zeeb 	.n_gen2_para	= ARRAY_SIZE(pcie_gen2_param_8822b),
21132774f206SBjoern A. Zeeb };
21142774f206SBjoern A. Zeeb 
21152774f206SBjoern A. Zeeb static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
21162774f206SBjoern A. Zeeb 	[2] = RTW_DEF_RFE(8822b, 2, 2),
21172774f206SBjoern A. Zeeb 	[3] = RTW_DEF_RFE(8822b, 3, 0),
21182774f206SBjoern A. Zeeb 	[5] = RTW_DEF_RFE(8822b, 5, 5),
21192774f206SBjoern A. Zeeb };
21202774f206SBjoern A. Zeeb 
21212774f206SBjoern A. Zeeb static const struct rtw_hw_reg rtw8822b_dig[] = {
21222774f206SBjoern A. Zeeb 	[0] = { .addr = 0xc50, .mask = 0x7f },
21232774f206SBjoern A. Zeeb 	[1] = { .addr = 0xe50, .mask = 0x7f },
21242774f206SBjoern A. Zeeb };
21252774f206SBjoern A. Zeeb 
21262774f206SBjoern A. Zeeb static const struct rtw_ltecoex_addr rtw8822b_ltecoex_addr = {
21272774f206SBjoern A. Zeeb 	.ctrl = LTECOEX_ACCESS_CTRL,
21282774f206SBjoern A. Zeeb 	.wdata = LTECOEX_WRITE_DATA,
21292774f206SBjoern A. Zeeb 	.rdata = LTECOEX_READ_DATA,
21302774f206SBjoern A. Zeeb };
21312774f206SBjoern A. Zeeb 
21322774f206SBjoern A. Zeeb static const struct rtw_page_table page_table_8822b[] = {
21332774f206SBjoern A. Zeeb 	{64, 64, 64, 64, 1},
21342774f206SBjoern A. Zeeb 	{64, 64, 64, 64, 1},
21352774f206SBjoern A. Zeeb 	{64, 64, 0, 0, 1},
21362774f206SBjoern A. Zeeb 	{64, 64, 64, 0, 1},
21372774f206SBjoern A. Zeeb 	{64, 64, 64, 64, 1},
21382774f206SBjoern A. Zeeb };
21392774f206SBjoern A. Zeeb 
21402774f206SBjoern A. Zeeb static const struct rtw_rqpn rqpn_table_8822b[] = {
21412774f206SBjoern A. Zeeb 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
21422774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
21432774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
21442774f206SBjoern A. Zeeb 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
21452774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
21462774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
21472774f206SBjoern A. Zeeb 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
21482774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
21492774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
21502774f206SBjoern A. Zeeb 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
21512774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
21522774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
21532774f206SBjoern A. Zeeb 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
21542774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
21552774f206SBjoern A. Zeeb 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
21562774f206SBjoern A. Zeeb };
21572774f206SBjoern A. Zeeb 
21582774f206SBjoern A. Zeeb static struct rtw_prioq_addrs prioq_addrs_8822b = {
21592774f206SBjoern A. Zeeb 	.prio[RTW_DMA_MAPPING_EXTRA] = {
21602774f206SBjoern A. Zeeb 		.rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
21612774f206SBjoern A. Zeeb 	},
21622774f206SBjoern A. Zeeb 	.prio[RTW_DMA_MAPPING_LOW] = {
21632774f206SBjoern A. Zeeb 		.rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2,
21642774f206SBjoern A. Zeeb 	},
21652774f206SBjoern A. Zeeb 	.prio[RTW_DMA_MAPPING_NORMAL] = {
21662774f206SBjoern A. Zeeb 		.rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2,
21672774f206SBjoern A. Zeeb 	},
21682774f206SBjoern A. Zeeb 	.prio[RTW_DMA_MAPPING_HIGH] = {
21692774f206SBjoern A. Zeeb 		.rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2,
21702774f206SBjoern A. Zeeb 	},
21712774f206SBjoern A. Zeeb 	.wsize = true,
21722774f206SBjoern A. Zeeb };
21732774f206SBjoern A. Zeeb 
21742774f206SBjoern A. Zeeb static struct rtw_chip_ops rtw8822b_ops = {
21752774f206SBjoern A. Zeeb 	.phy_set_param		= rtw8822b_phy_set_param,
21762774f206SBjoern A. Zeeb 	.read_efuse		= rtw8822b_read_efuse,
21772774f206SBjoern A. Zeeb 	.query_rx_desc		= rtw8822b_query_rx_desc,
21782774f206SBjoern A. Zeeb 	.set_channel		= rtw8822b_set_channel,
21792774f206SBjoern A. Zeeb 	.mac_init		= rtw8822b_mac_init,
21802774f206SBjoern A. Zeeb 	.read_rf		= rtw_phy_read_rf,
21812774f206SBjoern A. Zeeb 	.write_rf		= rtw_phy_write_rf_reg_sipi,
21822774f206SBjoern A. Zeeb 	.set_tx_power_index	= rtw8822b_set_tx_power_index,
21832774f206SBjoern A. Zeeb 	.set_antenna		= rtw8822b_set_antenna,
21842774f206SBjoern A. Zeeb 	.cfg_ldo25		= rtw8822b_cfg_ldo25,
21852774f206SBjoern A. Zeeb 	.false_alarm_statistics	= rtw8822b_false_alarm_statistics,
21862774f206SBjoern A. Zeeb 	.phy_calibration	= rtw8822b_phy_calibration,
21872774f206SBjoern A. Zeeb 	.pwr_track		= rtw8822b_pwr_track,
21882774f206SBjoern A. Zeeb 	.config_bfee		= rtw8822b_bf_config_bfee,
21892774f206SBjoern A. Zeeb 	.set_gid_table		= rtw_bf_set_gid_table,
21902774f206SBjoern A. Zeeb 	.cfg_csi_rate		= rtw_bf_cfg_csi_rate,
21912774f206SBjoern A. Zeeb 	.adaptivity_init	= rtw8822b_adaptivity_init,
21922774f206SBjoern A. Zeeb 	.adaptivity		= rtw8822b_adaptivity,
219390aac0d8SBjoern A. Zeeb 	.fill_txdesc_checksum	= rtw8822b_fill_txdesc_checksum,
21942774f206SBjoern A. Zeeb 
21952774f206SBjoern A. Zeeb 	.coex_set_init		= rtw8822b_coex_cfg_init,
21962774f206SBjoern A. Zeeb 	.coex_set_ant_switch	= rtw8822b_coex_cfg_ant_switch,
21972774f206SBjoern A. Zeeb 	.coex_set_gnt_fix	= rtw8822b_coex_cfg_gnt_fix,
21982774f206SBjoern A. Zeeb 	.coex_set_gnt_debug	= rtw8822b_coex_cfg_gnt_debug,
21992774f206SBjoern A. Zeeb 	.coex_set_rfe_type	= rtw8822b_coex_cfg_rfe_type,
22002774f206SBjoern A. Zeeb 	.coex_set_wl_tx_power	= rtw8822b_coex_cfg_wl_tx_power,
22012774f206SBjoern A. Zeeb 	.coex_set_wl_rx_gain	= rtw8822b_coex_cfg_wl_rx_gain,
22022774f206SBjoern A. Zeeb };
22032774f206SBjoern A. Zeeb 
22042774f206SBjoern A. Zeeb /* Shared-Antenna Coex Table */
22052774f206SBjoern A. Zeeb static const struct coex_table_para table_sant_8822b[] = {
22062774f206SBjoern A. Zeeb 	{0xffffffff, 0xffffffff}, /* case-0 */
22072774f206SBjoern A. Zeeb 	{0x55555555, 0x55555555},
22082774f206SBjoern A. Zeeb 	{0x66555555, 0x66555555},
22092774f206SBjoern A. Zeeb 	{0xaaaaaaaa, 0xaaaaaaaa},
22102774f206SBjoern A. Zeeb 	{0x5a5a5a5a, 0x5a5a5a5a},
22112774f206SBjoern A. Zeeb 	{0xfafafafa, 0xfafafafa}, /* case-5 */
22122774f206SBjoern A. Zeeb 	{0x6a5a5555, 0xaaaaaaaa},
22132774f206SBjoern A. Zeeb 	{0x6a5a56aa, 0x6a5a56aa},
22142774f206SBjoern A. Zeeb 	{0x6a5a5a5a, 0x6a5a5a5a},
22152774f206SBjoern A. Zeeb 	{0x66555555, 0x5a5a5a5a},
22162774f206SBjoern A. Zeeb 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
22172774f206SBjoern A. Zeeb 	{0x66555555, 0xfafafafa},
22182774f206SBjoern A. Zeeb 	{0x66555555, 0x5a5a5aaa},
22192774f206SBjoern A. Zeeb 	{0x66555555, 0x6aaa5aaa},
22202774f206SBjoern A. Zeeb 	{0x66555555, 0xaaaa5aaa},
22212774f206SBjoern A. Zeeb 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
22222774f206SBjoern A. Zeeb 	{0xffff55ff, 0xfafafafa},
22232774f206SBjoern A. Zeeb 	{0xffff55ff, 0x6afa5afa},
22242774f206SBjoern A. Zeeb 	{0xaaffffaa, 0xfafafafa},
22252774f206SBjoern A. Zeeb 	{0xaa5555aa, 0x5a5a5a5a},
22262774f206SBjoern A. Zeeb 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
22272774f206SBjoern A. Zeeb 	{0xaa5555aa, 0xaaaaaaaa},
22282774f206SBjoern A. Zeeb 	{0xffffffff, 0x5a5a5a5a},
22292774f206SBjoern A. Zeeb 	{0xffffffff, 0x5a5a5a5a},
22302774f206SBjoern A. Zeeb 	{0xffffffff, 0x55555555},
22312774f206SBjoern A. Zeeb 	{0xffffffff, 0x6a5a5aaa}, /* case-25 */
22322774f206SBjoern A. Zeeb 	{0x55555555, 0x5a5a5a5a},
22332774f206SBjoern A. Zeeb 	{0x55555555, 0xaaaaaaaa},
22342774f206SBjoern A. Zeeb 	{0x55555555, 0x6a5a6a5a},
22352774f206SBjoern A. Zeeb 	{0x66556655, 0x66556655},
22362774f206SBjoern A. Zeeb 	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
22372774f206SBjoern A. Zeeb 	{0xffffffff, 0x5aaa5aaa},
22382774f206SBjoern A. Zeeb 	{0x56555555, 0x5a5a5aaa},
22392774f206SBjoern A. Zeeb };
22402774f206SBjoern A. Zeeb 
22412774f206SBjoern A. Zeeb /* Non-Shared-Antenna Coex Table */
22422774f206SBjoern A. Zeeb static const struct coex_table_para table_nsant_8822b[] = {
22432774f206SBjoern A. Zeeb 	{0xffffffff, 0xffffffff}, /* case-100 */
22442774f206SBjoern A. Zeeb 	{0x55555555, 0x55555555},
22452774f206SBjoern A. Zeeb 	{0x66555555, 0x66555555},
22462774f206SBjoern A. Zeeb 	{0xaaaaaaaa, 0xaaaaaaaa},
22472774f206SBjoern A. Zeeb 	{0x5a5a5a5a, 0x5a5a5a5a},
22482774f206SBjoern A. Zeeb 	{0xfafafafa, 0xfafafafa}, /* case-105 */
22492774f206SBjoern A. Zeeb 	{0x5afa5afa, 0x5afa5afa},
22502774f206SBjoern A. Zeeb 	{0x55555555, 0xfafafafa},
22512774f206SBjoern A. Zeeb 	{0x66555555, 0xfafafafa},
22522774f206SBjoern A. Zeeb 	{0x66555555, 0x5a5a5a5a},
22532774f206SBjoern A. Zeeb 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
22542774f206SBjoern A. Zeeb 	{0x66555555, 0xaaaaaaaa},
22552774f206SBjoern A. Zeeb 	{0xffff55ff, 0xfafafafa},
22562774f206SBjoern A. Zeeb 	{0xffff55ff, 0x5afa5afa},
22572774f206SBjoern A. Zeeb 	{0xffff55ff, 0xaaaaaaaa},
22582774f206SBjoern A. Zeeb 	{0xffff55ff, 0xffff55ff}, /* case-115 */
22592774f206SBjoern A. Zeeb 	{0xaaffffaa, 0x5afa5afa},
22602774f206SBjoern A. Zeeb 	{0xaaffffaa, 0xaaaaaaaa},
22612774f206SBjoern A. Zeeb 	{0xffffffff, 0xfafafafa},
22622774f206SBjoern A. Zeeb 	{0xffffffff, 0x5afa5afa},
22632774f206SBjoern A. Zeeb 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
22642774f206SBjoern A. Zeeb 	{0x55ff55ff, 0x5afa5afa},
22652774f206SBjoern A. Zeeb 	{0x55ff55ff, 0xaaaaaaaa},
22662774f206SBjoern A. Zeeb 	{0x55ff55ff, 0x55ff55ff}
22672774f206SBjoern A. Zeeb };
22682774f206SBjoern A. Zeeb 
22692774f206SBjoern A. Zeeb /* Shared-Antenna TDMA */
22702774f206SBjoern A. Zeeb static const struct coex_tdma_para tdma_sant_8822b[] = {
22712774f206SBjoern A. Zeeb 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
22722774f206SBjoern A. Zeeb 	{ {0x61, 0x45, 0x03, 0x11, 0x11} },
22732774f206SBjoern A. Zeeb 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
22742774f206SBjoern A. Zeeb 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
22752774f206SBjoern A. Zeeb 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
22762774f206SBjoern A. Zeeb 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
22772774f206SBjoern A. Zeeb 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
22782774f206SBjoern A. Zeeb 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
22792774f206SBjoern A. Zeeb 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
22802774f206SBjoern A. Zeeb 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
22812774f206SBjoern A. Zeeb 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
22822774f206SBjoern A. Zeeb 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
22832774f206SBjoern A. Zeeb 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
22842774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
22852774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
22862774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
22872774f206SBjoern A. Zeeb 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
22882774f206SBjoern A. Zeeb 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
22892774f206SBjoern A. Zeeb 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
22902774f206SBjoern A. Zeeb 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
22912774f206SBjoern A. Zeeb 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
22922774f206SBjoern A. Zeeb 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
22932774f206SBjoern A. Zeeb 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
22942774f206SBjoern A. Zeeb 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
22952774f206SBjoern A. Zeeb 	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
22962774f206SBjoern A. Zeeb 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
22972774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
22982774f206SBjoern A. Zeeb 	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
22992774f206SBjoern A. Zeeb };
23002774f206SBjoern A. Zeeb 
23012774f206SBjoern A. Zeeb /* Non-Shared-Antenna TDMA */
23022774f206SBjoern A. Zeeb static const struct coex_tdma_para tdma_nsant_8822b[] = {
23032774f206SBjoern A. Zeeb 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */
23042774f206SBjoern A. Zeeb 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
23052774f206SBjoern A. Zeeb 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
23062774f206SBjoern A. Zeeb 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
23072774f206SBjoern A. Zeeb 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
23082774f206SBjoern A. Zeeb 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
23092774f206SBjoern A. Zeeb 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
23102774f206SBjoern A. Zeeb 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
23112774f206SBjoern A. Zeeb 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
23122774f206SBjoern A. Zeeb 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
23132774f206SBjoern A. Zeeb 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
23142774f206SBjoern A. Zeeb 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
23152774f206SBjoern A. Zeeb 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
23162774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
23172774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
23182774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
23192774f206SBjoern A. Zeeb 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
23202774f206SBjoern A. Zeeb 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
23212774f206SBjoern A. Zeeb 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
23222774f206SBjoern A. Zeeb 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
23232774f206SBjoern A. Zeeb 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
23242774f206SBjoern A. Zeeb 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
23252774f206SBjoern A. Zeeb };
23262774f206SBjoern A. Zeeb 
23272774f206SBjoern A. Zeeb /* rssi in percentage % (dbm = % - 100) */
23282774f206SBjoern A. Zeeb static const u8 wl_rssi_step_8822b[] = {60, 50, 44, 30};
23292774f206SBjoern A. Zeeb static const u8 bt_rssi_step_8822b[] = {30, 30, 30, 30};
23302774f206SBjoern A. Zeeb 
23312774f206SBjoern A. Zeeb /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
23322774f206SBjoern A. Zeeb static const struct coex_rf_para rf_para_tx_8822b[] = {
23332774f206SBjoern A. Zeeb 	{0, 0, false, 7},  /* for normal */
23342774f206SBjoern A. Zeeb 	{0, 16, false, 7}, /* for WL-CPT */
23352774f206SBjoern A. Zeeb 	{4, 0, true, 1},
23362774f206SBjoern A. Zeeb 	{3, 6, true, 1},
23372774f206SBjoern A. Zeeb 	{2, 9, true, 1},
23382774f206SBjoern A. Zeeb 	{1, 13, true, 1}
23392774f206SBjoern A. Zeeb };
23402774f206SBjoern A. Zeeb 
23412774f206SBjoern A. Zeeb static const struct coex_rf_para rf_para_rx_8822b[] = {
23422774f206SBjoern A. Zeeb 	{0, 0, false, 7},  /* for normal */
23432774f206SBjoern A. Zeeb 	{0, 16, false, 7}, /* for WL-CPT */
23442774f206SBjoern A. Zeeb 	{4, 0, true, 1},
23452774f206SBjoern A. Zeeb 	{3, 6, true, 1},
23462774f206SBjoern A. Zeeb 	{2, 9, true, 1},
23472774f206SBjoern A. Zeeb 	{1, 13, true, 1}
23482774f206SBjoern A. Zeeb };
23492774f206SBjoern A. Zeeb 
23502774f206SBjoern A. Zeeb static const struct coex_5g_afh_map afh_5g_8822b[] = {
23512774f206SBjoern A. Zeeb 	{120, 2, 4},
23522774f206SBjoern A. Zeeb 	{124, 8, 8},
23532774f206SBjoern A. Zeeb 	{128, 17, 8},
23542774f206SBjoern A. Zeeb 	{132, 26, 10},
23552774f206SBjoern A. Zeeb 	{136, 34, 8},
23562774f206SBjoern A. Zeeb 	{140, 42, 10},
23572774f206SBjoern A. Zeeb 	{144, 51, 8},
23582774f206SBjoern A. Zeeb 	{149, 62, 8},
23592774f206SBjoern A. Zeeb 	{153, 71, 10},
23602774f206SBjoern A. Zeeb 	{157, 77, 4},
23612774f206SBjoern A. Zeeb 	{118, 2, 4},
23622774f206SBjoern A. Zeeb 	{126, 12, 16},
23632774f206SBjoern A. Zeeb 	{134, 29, 16},
23642774f206SBjoern A. Zeeb 	{142, 46, 16},
23652774f206SBjoern A. Zeeb 	{151, 66, 16},
23662774f206SBjoern A. Zeeb 	{159, 76, 4},
23672774f206SBjoern A. Zeeb 	{122, 10, 20},
23682774f206SBjoern A. Zeeb 	{138, 37, 34},
23692774f206SBjoern A. Zeeb 	{155, 68, 20}
23702774f206SBjoern A. Zeeb };
23712774f206SBjoern A. Zeeb #if defined(__linux__)
23722774f206SBjoern A. Zeeb static_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b));
23732774f206SBjoern A. Zeeb #elif defined(__FreeBSD__)
23742774f206SBjoern A. Zeeb rtw88_static_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b));
23752774f206SBjoern A. Zeeb #endif
23762774f206SBjoern A. Zeeb 
23772774f206SBjoern A. Zeeb static const u8
23782774f206SBjoern A. Zeeb rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
23792774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23802774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
23812774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
23822774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23832774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
23842774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
23852774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23862774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
23872774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
23882774f206SBjoern A. Zeeb };
23892774f206SBjoern A. Zeeb 
23902774f206SBjoern A. Zeeb static const u8
23912774f206SBjoern A. Zeeb rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
23922774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23932774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
23942774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
23952774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23962774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
23972774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
23982774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
23992774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
24002774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 },
24012774f206SBjoern A. Zeeb };
24022774f206SBjoern A. Zeeb 
24032774f206SBjoern A. Zeeb static const u8
24042774f206SBjoern A. Zeeb rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
24052774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24062774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
24072774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
24082774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24092774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
24102774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
24112774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24122774f206SBjoern A. Zeeb 	  8,  8,  9, 10, 11, 11, 12, 13, 14, 14,
24132774f206SBjoern A. Zeeb 	 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 },
24142774f206SBjoern A. Zeeb };
24152774f206SBjoern A. Zeeb 
24162774f206SBjoern A. Zeeb static const u8
24172774f206SBjoern A. Zeeb rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = {
24182774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24192774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
24202774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
24212774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24222774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
24232774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
24242774f206SBjoern A. Zeeb 	{ 0,  1,  2,  2,  3,  4,  5,  5,  6,  7,
24252774f206SBjoern A. Zeeb 	  8,  9,  9, 10, 11, 12, 13, 14, 14, 15,
24262774f206SBjoern A. Zeeb 	 16, 17, 18, 19, 19, 20, 21, 22, 22, 23},
24272774f206SBjoern A. Zeeb };
24282774f206SBjoern A. Zeeb 
24292774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = {
24302774f206SBjoern A. Zeeb 	0,  1,  1,  1,  2,  2,  3,  3,  3,  4,
24312774f206SBjoern A. Zeeb 	4,  5,  5,  5,  6,  6,  7,  7,  7,  8,
24322774f206SBjoern A. Zeeb 	8,  9,  9,  9, 10, 10, 11, 11, 11, 12
24332774f206SBjoern A. Zeeb };
24342774f206SBjoern A. Zeeb 
24352774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = {
24362774f206SBjoern A. Zeeb 	0,  0,  1,  1,  2,  2,  3,  3,  4,  4,
24372774f206SBjoern A. Zeeb 	5,  5,  6,  6,  6,  7,  7,  8,  8,  9,
24382774f206SBjoern A. Zeeb 	9, 10, 10, 11, 11, 12, 12, 12, 13, 13
24392774f206SBjoern A. Zeeb };
24402774f206SBjoern A. Zeeb 
24412774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = {
24422774f206SBjoern A. Zeeb 	0,  1,  1,  1,  2,  2,  3,  3,  3,  4,
24432774f206SBjoern A. Zeeb 	4,  5,  5,  5,  6,  6,  7,  7,  7,  8,
24442774f206SBjoern A. Zeeb 	8,  9,  9,  9, 10, 10, 11, 11, 11, 12
24452774f206SBjoern A. Zeeb };
24462774f206SBjoern A. Zeeb 
24472774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = {
24482774f206SBjoern A. Zeeb 	0,  1,  1,  2,  2,  3,  3,  4,  4,  5,
24492774f206SBjoern A. Zeeb 	5,  6,  6,  7,  7,  8,  8,  9,  9, 10,
24502774f206SBjoern A. Zeeb 	10, 11, 11, 12, 12, 13, 13, 14, 14, 15
24512774f206SBjoern A. Zeeb };
24522774f206SBjoern A. Zeeb 
24532774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = {
24542774f206SBjoern A. Zeeb 	0,  1,  1,  1,  2,  2,  3,  3,  3,  4,
24552774f206SBjoern A. Zeeb 	4,  5,  5,  5,  6,  6,  7,  7,  7,  8,
24562774f206SBjoern A. Zeeb 	8,  9,  9,  9, 10, 10, 11, 11, 11, 12
24572774f206SBjoern A. Zeeb };
24582774f206SBjoern A. Zeeb 
24592774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = {
24602774f206SBjoern A. Zeeb 	0,  0,  1,  1,  2,  2,  3,  3,  4,  4,
24612774f206SBjoern A. Zeeb 	5,  5,  6,  6,  6,  7,  7,  8,  8,  9,
24622774f206SBjoern A. Zeeb 	9, 10, 10, 11, 11, 12, 12, 12, 13, 13
24632774f206SBjoern A. Zeeb };
24642774f206SBjoern A. Zeeb 
24652774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = {
24662774f206SBjoern A. Zeeb 	0,  1,  1,  1,  2,  2,  3,  3,  3,  4,
24672774f206SBjoern A. Zeeb 	4,  5,  5,  5,  6,  6,  7,  7,  7,  8,
24682774f206SBjoern A. Zeeb 	8,  9,  9,  9, 10, 10, 11, 11, 11, 12
24692774f206SBjoern A. Zeeb };
24702774f206SBjoern A. Zeeb 
24712774f206SBjoern A. Zeeb static const u8 rtw8822b_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
24722774f206SBjoern A. Zeeb 	 0,  1,  1,  2,  2,  3,  3,  4,  4,  5,
24732774f206SBjoern A. Zeeb 	 5,  6,  6,  7,  7,  8,  8,  9,  9, 10,
24742774f206SBjoern A. Zeeb 	10, 11, 11, 12, 12, 13, 13, 14, 14, 15
24752774f206SBjoern A. Zeeb };
24762774f206SBjoern A. Zeeb 
24772774f206SBjoern A. Zeeb static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
24782774f206SBjoern A. Zeeb 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
24792774f206SBjoern A. Zeeb 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
24802774f206SBjoern A. Zeeb 	.pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
24812774f206SBjoern A. Zeeb 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1],
24822774f206SBjoern A. Zeeb 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2],
24832774f206SBjoern A. Zeeb 	.pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3],
24842774f206SBjoern A. Zeeb 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1],
24852774f206SBjoern A. Zeeb 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2],
24862774f206SBjoern A. Zeeb 	.pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3],
24872774f206SBjoern A. Zeeb 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1],
24882774f206SBjoern A. Zeeb 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2],
24892774f206SBjoern A. Zeeb 	.pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3],
24902774f206SBjoern A. Zeeb 	.pwrtrk_2gb_n = rtw8822b_pwrtrk_2gb_n,
24912774f206SBjoern A. Zeeb 	.pwrtrk_2gb_p = rtw8822b_pwrtrk_2gb_p,
24922774f206SBjoern A. Zeeb 	.pwrtrk_2ga_n = rtw8822b_pwrtrk_2ga_n,
24932774f206SBjoern A. Zeeb 	.pwrtrk_2ga_p = rtw8822b_pwrtrk_2ga_p,
24942774f206SBjoern A. Zeeb 	.pwrtrk_2g_cckb_n = rtw8822b_pwrtrk_2g_cck_b_n,
24952774f206SBjoern A. Zeeb 	.pwrtrk_2g_cckb_p = rtw8822b_pwrtrk_2g_cck_b_p,
24962774f206SBjoern A. Zeeb 	.pwrtrk_2g_ccka_n = rtw8822b_pwrtrk_2g_cck_a_n,
24972774f206SBjoern A. Zeeb 	.pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
24982774f206SBjoern A. Zeeb };
24992774f206SBjoern A. Zeeb 
25002774f206SBjoern A. Zeeb static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
25012774f206SBjoern A. Zeeb 	{0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
25022774f206SBjoern A. Zeeb 	{0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
25032774f206SBjoern A. Zeeb 	{0xcba, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25042774f206SBjoern A. Zeeb 	{0xcbd, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25052774f206SBjoern A. Zeeb 	{0xc58, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25062774f206SBjoern A. Zeeb 	{0xcbd, BIT(0), RTW_REG_DOMAIN_MAC8},
25072774f206SBjoern A. Zeeb 	{0, 0, RTW_REG_DOMAIN_NL},
25082774f206SBjoern A. Zeeb 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
25092774f206SBjoern A. Zeeb 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
25102774f206SBjoern A. Zeeb 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
25112774f206SBjoern A. Zeeb 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25122774f206SBjoern A. Zeeb 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
25132774f206SBjoern A. Zeeb 	{0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16},
25142774f206SBjoern A. Zeeb 	{0, 0, RTW_REG_DOMAIN_NL},
25152774f206SBjoern A. Zeeb 	{0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32},
25162774f206SBjoern A. Zeeb 	{0x64, BIT(0), RTW_REG_DOMAIN_MAC8},
25172774f206SBjoern A. Zeeb 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
25182774f206SBjoern A. Zeeb 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
25192774f206SBjoern A. Zeeb 	{0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B},
25202774f206SBjoern A. Zeeb 	{0, 0, RTW_REG_DOMAIN_NL},
25212774f206SBjoern A. Zeeb 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
25222774f206SBjoern A. Zeeb 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25232774f206SBjoern A. Zeeb 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
25242774f206SBjoern A. Zeeb 	{0xc50,  MASKBYTE0, RTW_REG_DOMAIN_MAC8},
25252774f206SBjoern A. Zeeb };
25262774f206SBjoern A. Zeeb 
25272774f206SBjoern A. Zeeb static struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
25282774f206SBjoern A. Zeeb 	[EDCCA_TH_L2H_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE0}, .offset = 0},
25292774f206SBjoern A. Zeeb 	[EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset = 0},
25302774f206SBjoern A. Zeeb };
25312774f206SBjoern A. Zeeb 
25329c951734SBjoern A. Zeeb const struct rtw_chip_info rtw8822b_hw_spec = {
25332774f206SBjoern A. Zeeb 	.ops = &rtw8822b_ops,
25342774f206SBjoern A. Zeeb 	.id = RTW_CHIP_TYPE_8822B,
25352774f206SBjoern A. Zeeb 	.fw_name = "rtw88/rtw8822b_fw.bin",
25362774f206SBjoern A. Zeeb 	.wlan_cpu = RTW_WCPU_11AC,
25372774f206SBjoern A. Zeeb 	.tx_pkt_desc_sz = 48,
25382774f206SBjoern A. Zeeb 	.tx_buf_desc_sz = 16,
25392774f206SBjoern A. Zeeb 	.rx_pkt_desc_sz = 24,
25402774f206SBjoern A. Zeeb 	.rx_buf_desc_sz = 8,
25412774f206SBjoern A. Zeeb 	.phy_efuse_size = 1024,
25422774f206SBjoern A. Zeeb 	.log_efuse_size = 768,
25432774f206SBjoern A. Zeeb 	.ptct_efuse_size = 96,
25442774f206SBjoern A. Zeeb 	.txff_size = 262144,
25452774f206SBjoern A. Zeeb 	.rxff_size = 24576,
25462774f206SBjoern A. Zeeb 	.fw_rxff_size = 12288,
254790aac0d8SBjoern A. Zeeb 	.rsvd_drv_pg_num = 8,
25482774f206SBjoern A. Zeeb 	.txgi_factor = 1,
25492774f206SBjoern A. Zeeb 	.is_pwr_by_rate_dec = true,
25502774f206SBjoern A. Zeeb 	.max_power_index = 0x3f,
25512774f206SBjoern A. Zeeb 	.csi_buf_pg_num = 0,
25522774f206SBjoern A. Zeeb 	.band = RTW_BAND_2G | RTW_BAND_5G,
255390aac0d8SBjoern A. Zeeb 	.page_size = TX_PAGE_SIZE,
25542774f206SBjoern A. Zeeb 	.dig_min = 0x1c,
2555*11c53278SBjoern A. Zeeb 	.usb_tx_agg_desc_num = 3,
25562774f206SBjoern A. Zeeb 	.ht_supported = true,
25572774f206SBjoern A. Zeeb 	.vht_supported = true,
25582774f206SBjoern A. Zeeb 	.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
25592774f206SBjoern A. Zeeb 	.sys_func_en = 0xDC,
25602774f206SBjoern A. Zeeb 	.pwr_on_seq = card_enable_flow_8822b,
25612774f206SBjoern A. Zeeb 	.pwr_off_seq = card_disable_flow_8822b,
25622774f206SBjoern A. Zeeb 	.page_table = page_table_8822b,
25632774f206SBjoern A. Zeeb 	.rqpn_table = rqpn_table_8822b,
25642774f206SBjoern A. Zeeb 	.prioq_addrs = &prioq_addrs_8822b,
25652774f206SBjoern A. Zeeb 	.intf_table = &phy_para_table_8822b,
25662774f206SBjoern A. Zeeb 	.dig = rtw8822b_dig,
25672774f206SBjoern A. Zeeb 	.dig_cck = NULL,
25682774f206SBjoern A. Zeeb 	.rf_base_addr = {0x2800, 0x2c00},
25692774f206SBjoern A. Zeeb 	.rf_sipi_addr = {0xc90, 0xe90},
25702774f206SBjoern A. Zeeb 	.ltecoex_addr = &rtw8822b_ltecoex_addr,
25712774f206SBjoern A. Zeeb 	.mac_tbl = &rtw8822b_mac_tbl,
25722774f206SBjoern A. Zeeb 	.agc_tbl = &rtw8822b_agc_tbl,
25732774f206SBjoern A. Zeeb 	.bb_tbl = &rtw8822b_bb_tbl,
25742774f206SBjoern A. Zeeb 	.rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
25752774f206SBjoern A. Zeeb 	.rfe_defs = rtw8822b_rfe_defs,
25762774f206SBjoern A. Zeeb 	.rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
25772774f206SBjoern A. Zeeb 	.pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl,
25782774f206SBjoern A. Zeeb 	.iqk_threshold = 8,
25792774f206SBjoern A. Zeeb 	.bfer_su_max_num = 2,
25802774f206SBjoern A. Zeeb 	.bfer_mu_max_num = 1,
25812774f206SBjoern A. Zeeb 	.rx_ldpc = true,
25822774f206SBjoern A. Zeeb 	.edcca_th = rtw8822b_edcca_th,
25832774f206SBjoern A. Zeeb 	.l2h_th_ini_cs = 10 + EDCCA_IGI_BASE,
25842774f206SBjoern A. Zeeb 	.l2h_th_ini_ad = -14 + EDCCA_IGI_BASE,
25859c951734SBjoern A. Zeeb 	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_2,
258690aac0d8SBjoern A. Zeeb 	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
25872774f206SBjoern A. Zeeb 
25882774f206SBjoern A. Zeeb 	.coex_para_ver = 0x20070206,
25892774f206SBjoern A. Zeeb 	.bt_desired_ver = 0x6,
25902774f206SBjoern A. Zeeb 	.scbd_support = true,
25912774f206SBjoern A. Zeeb 	.new_scbd10_def = false,
25922774f206SBjoern A. Zeeb 	.ble_hid_profile_support = false,
25939c951734SBjoern A. Zeeb 	.wl_mimo_ps_support = false,
25942774f206SBjoern A. Zeeb 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
25952774f206SBjoern A. Zeeb 	.bt_rssi_type = COEX_BTRSSI_RATIO,
25962774f206SBjoern A. Zeeb 	.ant_isolation = 15,
25972774f206SBjoern A. Zeeb 	.rssi_tolerance = 2,
25982774f206SBjoern A. Zeeb 	.wl_rssi_step = wl_rssi_step_8822b,
25992774f206SBjoern A. Zeeb 	.bt_rssi_step = bt_rssi_step_8822b,
26002774f206SBjoern A. Zeeb 	.table_sant_num = ARRAY_SIZE(table_sant_8822b),
26012774f206SBjoern A. Zeeb 	.table_sant = table_sant_8822b,
26022774f206SBjoern A. Zeeb 	.table_nsant_num = ARRAY_SIZE(table_nsant_8822b),
26032774f206SBjoern A. Zeeb 	.table_nsant = table_nsant_8822b,
26042774f206SBjoern A. Zeeb 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8822b),
26052774f206SBjoern A. Zeeb 	.tdma_sant = tdma_sant_8822b,
26062774f206SBjoern A. Zeeb 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822b),
26072774f206SBjoern A. Zeeb 	.tdma_nsant = tdma_nsant_8822b,
26082774f206SBjoern A. Zeeb 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822b),
26092774f206SBjoern A. Zeeb 	.wl_rf_para_tx = rf_para_tx_8822b,
26102774f206SBjoern A. Zeeb 	.wl_rf_para_rx = rf_para_rx_8822b,
26112774f206SBjoern A. Zeeb 	.bt_afh_span_bw20 = 0x24,
26122774f206SBjoern A. Zeeb 	.bt_afh_span_bw40 = 0x36,
26132774f206SBjoern A. Zeeb 	.afh_5g_num = ARRAY_SIZE(afh_5g_8822b),
26142774f206SBjoern A. Zeeb 	.afh_5g = afh_5g_8822b,
26152774f206SBjoern A. Zeeb 
26162774f206SBjoern A. Zeeb 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822b),
26172774f206SBjoern A. Zeeb 	.coex_info_hw_regs = coex_info_hw_regs_8822b,
26182774f206SBjoern A. Zeeb 
26192774f206SBjoern A. Zeeb 	.fw_fifo_addr = {0x780, 0x700, 0x780, 0x660, 0x650, 0x680},
26202774f206SBjoern A. Zeeb };
26212774f206SBjoern A. Zeeb EXPORT_SYMBOL(rtw8822b_hw_spec);
26222774f206SBjoern A. Zeeb 
26232774f206SBjoern A. Zeeb MODULE_FIRMWARE("rtw88/rtw8822b_fw.bin");
26242774f206SBjoern A. Zeeb 
26252774f206SBjoern A. Zeeb MODULE_AUTHOR("Realtek Corporation");
26262774f206SBjoern A. Zeeb MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822b driver");
26272774f206SBjoern A. Zeeb MODULE_LICENSE("Dual BSD/GPL");
2628