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, ®82c, ®830, ®838); 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, ¶); 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