162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 262306a36Sopenharmony_ci/* Copyright(c) 2018-2019 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/module.h> 662306a36Sopenharmony_ci#include "main.h" 762306a36Sopenharmony_ci#include "coex.h" 862306a36Sopenharmony_ci#include "fw.h" 962306a36Sopenharmony_ci#include "tx.h" 1062306a36Sopenharmony_ci#include "rx.h" 1162306a36Sopenharmony_ci#include "phy.h" 1262306a36Sopenharmony_ci#include "rtw8822b.h" 1362306a36Sopenharmony_ci#include "rtw8822b_table.h" 1462306a36Sopenharmony_ci#include "mac.h" 1562306a36Sopenharmony_ci#include "reg.h" 1662306a36Sopenharmony_ci#include "debug.h" 1762306a36Sopenharmony_ci#include "bf.h" 1862306a36Sopenharmony_ci#include "regd.h" 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_cistatic void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path, 2162306a36Sopenharmony_ci u8 rx_path, bool is_tx2_path); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic void rtw8822be_efuse_parsing(struct rtw_efuse *efuse, 2462306a36Sopenharmony_ci struct rtw8822b_efuse *map) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci ether_addr_copy(efuse->addr, map->e.mac_addr); 2762306a36Sopenharmony_ci} 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_cistatic void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, 3062306a36Sopenharmony_ci struct rtw8822b_efuse *map) 3162306a36Sopenharmony_ci{ 3262306a36Sopenharmony_ci ether_addr_copy(efuse->addr, map->u.mac_addr); 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic void rtw8822bs_efuse_parsing(struct rtw_efuse *efuse, 3662306a36Sopenharmony_ci struct rtw8822b_efuse *map) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci ether_addr_copy(efuse->addr, map->s.mac_addr); 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 4462306a36Sopenharmony_ci struct rtw8822b_efuse *map; 4562306a36Sopenharmony_ci int i; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci map = (struct rtw8822b_efuse *)log_map; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci efuse->rfe_option = map->rfe_option; 5062306a36Sopenharmony_ci efuse->rf_board_option = map->rf_board_option; 5162306a36Sopenharmony_ci efuse->crystal_cap = map->xtal_k; 5262306a36Sopenharmony_ci efuse->pa_type_2g = map->pa_type; 5362306a36Sopenharmony_ci efuse->pa_type_5g = map->pa_type; 5462306a36Sopenharmony_ci efuse->lna_type_2g = map->lna_type_2g[0]; 5562306a36Sopenharmony_ci efuse->lna_type_5g = map->lna_type_5g[0]; 5662306a36Sopenharmony_ci efuse->channel_plan = map->channel_plan; 5762306a36Sopenharmony_ci efuse->country_code[0] = map->country_code[0]; 5862306a36Sopenharmony_ci efuse->country_code[1] = map->country_code[1]; 5962306a36Sopenharmony_ci efuse->bt_setting = map->rf_bt_setting; 6062306a36Sopenharmony_ci efuse->regd = map->rf_board_option & 0x7; 6162306a36Sopenharmony_ci efuse->thermal_meter[RF_PATH_A] = map->thermal_meter; 6262306a36Sopenharmony_ci efuse->thermal_meter_k = map->thermal_meter; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci for (i = 0; i < 4; i++) 6562306a36Sopenharmony_ci efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci switch (rtw_hci_type(rtwdev)) { 6862306a36Sopenharmony_ci case RTW_HCI_TYPE_PCIE: 6962306a36Sopenharmony_ci rtw8822be_efuse_parsing(efuse, map); 7062306a36Sopenharmony_ci break; 7162306a36Sopenharmony_ci case RTW_HCI_TYPE_USB: 7262306a36Sopenharmony_ci rtw8822bu_efuse_parsing(efuse, map); 7362306a36Sopenharmony_ci break; 7462306a36Sopenharmony_ci case RTW_HCI_TYPE_SDIO: 7562306a36Sopenharmony_ci rtw8822bs_efuse_parsing(efuse, map); 7662306a36Sopenharmony_ci break; 7762306a36Sopenharmony_ci default: 7862306a36Sopenharmony_ci /* unsupported now */ 7962306a36Sopenharmony_ci return -ENOTSUPP; 8062306a36Sopenharmony_ci } 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci return 0; 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic void rtw8822b_phy_rfe_init(struct rtw_dev *rtwdev) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci /* chip top mux */ 8862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x64, BIT(29) | BIT(28), 0x3); 8962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x4c, BIT(26) | BIT(25), 0x0); 9062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x40, BIT(2), 0x1); 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci /* from s0 or s1 */ 9362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x1990, 0x3f, 0x30); 9462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x1990, (BIT(11) | BIT(10)), 0x3); 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci /* input or output */ 9762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x974, 0x3f, 0x3f); 9862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x974, (BIT(11) | BIT(10)), 0x3); 9962306a36Sopenharmony_ci} 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci#define RTW_TXSCALE_SIZE 37 10262306a36Sopenharmony_cistatic const u32 rtw8822b_txscale_tbl[RTW_TXSCALE_SIZE] = { 10362306a36Sopenharmony_ci 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8, 10462306a36Sopenharmony_ci 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180, 10562306a36Sopenharmony_ci 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab, 10662306a36Sopenharmony_ci 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe 10762306a36Sopenharmony_ci}; 10862306a36Sopenharmony_ci 10962306a36Sopenharmony_cistatic u8 rtw8822b_get_swing_index(struct rtw_dev *rtwdev) 11062306a36Sopenharmony_ci{ 11162306a36Sopenharmony_ci u8 i = 0; 11262306a36Sopenharmony_ci u32 swing, table_value; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_ci swing = rtw_read32_mask(rtwdev, 0xc1c, 0xffe00000); 11562306a36Sopenharmony_ci for (i = 0; i < RTW_TXSCALE_SIZE; i++) { 11662306a36Sopenharmony_ci table_value = rtw8822b_txscale_tbl[i]; 11762306a36Sopenharmony_ci if (swing == table_value) 11862306a36Sopenharmony_ci break; 11962306a36Sopenharmony_ci } 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci return i; 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic void rtw8822b_pwrtrack_init(struct rtw_dev *rtwdev) 12562306a36Sopenharmony_ci{ 12662306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 12762306a36Sopenharmony_ci u8 swing_idx = rtw8822b_get_swing_index(rtwdev); 12862306a36Sopenharmony_ci u8 path; 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci if (swing_idx >= RTW_TXSCALE_SIZE) 13162306a36Sopenharmony_ci dm_info->default_ofdm_index = 24; 13262306a36Sopenharmony_ci else 13362306a36Sopenharmony_ci dm_info->default_ofdm_index = swing_idx; 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) { 13662306a36Sopenharmony_ci ewma_thermal_init(&dm_info->avg_thermal[path]); 13762306a36Sopenharmony_ci dm_info->delta_power_index[path] = 0; 13862306a36Sopenharmony_ci } 13962306a36Sopenharmony_ci dm_info->pwr_trk_triggered = false; 14062306a36Sopenharmony_ci dm_info->pwr_trk_init_trigger = true; 14162306a36Sopenharmony_ci dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k; 14262306a36Sopenharmony_ci} 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistatic void rtw8822b_phy_bf_init(struct rtw_dev *rtwdev) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci rtw_bf_phy_init(rtwdev); 14762306a36Sopenharmony_ci /* Grouping bitmap parameters */ 14862306a36Sopenharmony_ci rtw_write32(rtwdev, 0x1C94, 0xAFFFAFFF); 14962306a36Sopenharmony_ci} 15062306a36Sopenharmony_ci 15162306a36Sopenharmony_cistatic void rtw8822b_phy_set_param(struct rtw_dev *rtwdev) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 15462306a36Sopenharmony_ci u8 crystal_cap; 15562306a36Sopenharmony_ci bool is_tx2_path; 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_ci /* power on BB/RF domain */ 15862306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, 15962306a36Sopenharmony_ci BIT_FEN_BB_RSTB | BIT_FEN_BB_GLB_RST); 16062306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_RF_CTRL, 16162306a36Sopenharmony_ci BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB); 16262306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_WLRF1, BIT_WLRF1_BBRF_EN); 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_ci /* pre init before header files config */ 16562306a36Sopenharmony_ci rtw_write32_clr(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci rtw_phy_load_tables(rtwdev); 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_ci crystal_cap = rtwdev->efuse.crystal_cap & 0x3F; 17062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x24, 0x7e000000, crystal_cap); 17162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0x28, 0x7e, crystal_cap); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci /* post init after header files config */ 17462306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci is_tx2_path = false; 17762306a36Sopenharmony_ci rtw8822b_config_trx_mode(rtwdev, hal->antenna_tx, hal->antenna_rx, 17862306a36Sopenharmony_ci is_tx2_path); 17962306a36Sopenharmony_ci rtw_phy_init(rtwdev); 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci rtw8822b_phy_rfe_init(rtwdev); 18262306a36Sopenharmony_ci rtw8822b_pwrtrack_init(rtwdev); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci rtw8822b_phy_bf_init(rtwdev); 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci#define WLAN_SLOT_TIME 0x09 18862306a36Sopenharmony_ci#define WLAN_PIFS_TIME 0x19 18962306a36Sopenharmony_ci#define WLAN_SIFS_CCK_CONT_TX 0xA 19062306a36Sopenharmony_ci#define WLAN_SIFS_OFDM_CONT_TX 0xE 19162306a36Sopenharmony_ci#define WLAN_SIFS_CCK_TRX 0x10 19262306a36Sopenharmony_ci#define WLAN_SIFS_OFDM_TRX 0x10 19362306a36Sopenharmony_ci#define WLAN_VO_TXOP_LIMIT 0x186 /* unit : 32us */ 19462306a36Sopenharmony_ci#define WLAN_VI_TXOP_LIMIT 0x3BC /* unit : 32us */ 19562306a36Sopenharmony_ci#define WLAN_RDG_NAV 0x05 19662306a36Sopenharmony_ci#define WLAN_TXOP_NAV 0x1B 19762306a36Sopenharmony_ci#define WLAN_CCK_RX_TSF 0x30 19862306a36Sopenharmony_ci#define WLAN_OFDM_RX_TSF 0x30 19962306a36Sopenharmony_ci#define WLAN_TBTT_PROHIBIT 0x04 /* unit : 32us */ 20062306a36Sopenharmony_ci#define WLAN_TBTT_HOLD_TIME 0x064 /* unit : 32us */ 20162306a36Sopenharmony_ci#define WLAN_DRV_EARLY_INT 0x04 20262306a36Sopenharmony_ci#define WLAN_BCN_DMA_TIME 0x02 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci#define WLAN_RX_FILTER0 0x0FFFFFFF 20562306a36Sopenharmony_ci#define WLAN_RX_FILTER2 0xFFFF 20662306a36Sopenharmony_ci#define WLAN_RCR_CFG 0xE400220E 20762306a36Sopenharmony_ci#define WLAN_RXPKT_MAX_SZ 12288 20862306a36Sopenharmony_ci#define WLAN_RXPKT_MAX_SZ_512 (WLAN_RXPKT_MAX_SZ >> 9) 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci#define WLAN_AMPDU_MAX_TIME 0x70 21162306a36Sopenharmony_ci#define WLAN_RTS_LEN_TH 0xFF 21262306a36Sopenharmony_ci#define WLAN_RTS_TX_TIME_TH 0x08 21362306a36Sopenharmony_ci#define WLAN_MAX_AGG_PKT_LIMIT 0x20 21462306a36Sopenharmony_ci#define WLAN_RTS_MAX_AGG_PKT_LIMIT 0x20 21562306a36Sopenharmony_ci#define FAST_EDCA_VO_TH 0x06 21662306a36Sopenharmony_ci#define FAST_EDCA_VI_TH 0x06 21762306a36Sopenharmony_ci#define FAST_EDCA_BE_TH 0x06 21862306a36Sopenharmony_ci#define FAST_EDCA_BK_TH 0x06 21962306a36Sopenharmony_ci#define WLAN_BAR_RETRY_LIMIT 0x01 22062306a36Sopenharmony_ci#define WLAN_RA_TRY_RATE_AGG_LIMIT 0x08 22162306a36Sopenharmony_ci 22262306a36Sopenharmony_ci#define WLAN_TX_FUNC_CFG1 0x30 22362306a36Sopenharmony_ci#define WLAN_TX_FUNC_CFG2 0x30 22462306a36Sopenharmony_ci#define WLAN_MAC_OPT_NORM_FUNC1 0x98 22562306a36Sopenharmony_ci#define WLAN_MAC_OPT_LB_FUNC1 0x80 22662306a36Sopenharmony_ci#define WLAN_MAC_OPT_FUNC2 0xb0810041 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci#define WLAN_SIFS_CFG (WLAN_SIFS_CCK_CONT_TX | \ 22962306a36Sopenharmony_ci (WLAN_SIFS_OFDM_CONT_TX << BIT_SHIFT_SIFS_OFDM_CTX) | \ 23062306a36Sopenharmony_ci (WLAN_SIFS_CCK_TRX << BIT_SHIFT_SIFS_CCK_TRX) | \ 23162306a36Sopenharmony_ci (WLAN_SIFS_OFDM_TRX << BIT_SHIFT_SIFS_OFDM_TRX)) 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci#define WLAN_TBTT_TIME (WLAN_TBTT_PROHIBIT |\ 23462306a36Sopenharmony_ci (WLAN_TBTT_HOLD_TIME << BIT_SHIFT_TBTT_HOLD_TIME_AP)) 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci#define WLAN_NAV_CFG (WLAN_RDG_NAV | (WLAN_TXOP_NAV << 16)) 23762306a36Sopenharmony_ci#define WLAN_RX_TSF_CFG (WLAN_CCK_RX_TSF | (WLAN_OFDM_RX_TSF) << 8) 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic int rtw8822b_mac_init(struct rtw_dev *rtwdev) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci u32 value32; 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci /* protocol configuration */ 24462306a36Sopenharmony_ci rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, BIT_PRE_TX_CMD); 24562306a36Sopenharmony_ci rtw_write8(rtwdev, REG_AMPDU_MAX_TIME_V1, WLAN_AMPDU_MAX_TIME); 24662306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_TX_HANG_CTRL, BIT_EN_EOF_V1); 24762306a36Sopenharmony_ci value32 = WLAN_RTS_LEN_TH | (WLAN_RTS_TX_TIME_TH << 8) | 24862306a36Sopenharmony_ci (WLAN_MAX_AGG_PKT_LIMIT << 16) | 24962306a36Sopenharmony_ci (WLAN_RTS_MAX_AGG_PKT_LIMIT << 24); 25062306a36Sopenharmony_ci rtw_write32(rtwdev, REG_PROT_MODE_CTRL, value32); 25162306a36Sopenharmony_ci rtw_write16(rtwdev, REG_BAR_MODE_CTRL + 2, 25262306a36Sopenharmony_ci WLAN_BAR_RETRY_LIMIT | WLAN_RA_TRY_RATE_AGG_LIMIT << 8); 25362306a36Sopenharmony_ci rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING, FAST_EDCA_VO_TH); 25462306a36Sopenharmony_ci rtw_write8(rtwdev, REG_FAST_EDCA_VOVI_SETTING + 2, FAST_EDCA_VI_TH); 25562306a36Sopenharmony_ci rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING, FAST_EDCA_BE_TH); 25662306a36Sopenharmony_ci rtw_write8(rtwdev, REG_FAST_EDCA_BEBK_SETTING + 2, FAST_EDCA_BK_TH); 25762306a36Sopenharmony_ci /* EDCA configuration */ 25862306a36Sopenharmony_ci rtw_write8_clr(rtwdev, REG_TIMER0_SRC_SEL, BIT_TSFT_SEL_TIMER0); 25962306a36Sopenharmony_ci rtw_write16(rtwdev, REG_TXPAUSE, 0x0000); 26062306a36Sopenharmony_ci rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME); 26162306a36Sopenharmony_ci rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_TIME); 26262306a36Sopenharmony_ci rtw_write32(rtwdev, REG_SIFS, WLAN_SIFS_CFG); 26362306a36Sopenharmony_ci rtw_write16(rtwdev, REG_EDCA_VO_PARAM + 2, WLAN_VO_TXOP_LIMIT); 26462306a36Sopenharmony_ci rtw_write16(rtwdev, REG_EDCA_VI_PARAM + 2, WLAN_VI_TXOP_LIMIT); 26562306a36Sopenharmony_ci rtw_write32(rtwdev, REG_RD_NAV_NXT, WLAN_NAV_CFG); 26662306a36Sopenharmony_ci rtw_write16(rtwdev, REG_RXTSF_OFFSET_CCK, WLAN_RX_TSF_CFG); 26762306a36Sopenharmony_ci /* Set beacon cotnrol - enable TSF and other related functions */ 26862306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 26962306a36Sopenharmony_ci /* Set send beacon related registers */ 27062306a36Sopenharmony_ci rtw_write32(rtwdev, REG_TBTT_PROHIBIT, WLAN_TBTT_TIME); 27162306a36Sopenharmony_ci rtw_write8(rtwdev, REG_DRVERLYINT, WLAN_DRV_EARLY_INT); 27262306a36Sopenharmony_ci rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME); 27362306a36Sopenharmony_ci rtw_write8_clr(rtwdev, REG_TX_PTCL_CTRL + 1, BIT_SIFS_BK_EN >> 8); 27462306a36Sopenharmony_ci /* WMAC configuration */ 27562306a36Sopenharmony_ci rtw_write32(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0); 27662306a36Sopenharmony_ci rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2); 27762306a36Sopenharmony_ci rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG); 27862306a36Sopenharmony_ci rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RXPKT_MAX_SZ_512); 27962306a36Sopenharmony_ci rtw_write8(rtwdev, REG_TCR + 2, WLAN_TX_FUNC_CFG2); 28062306a36Sopenharmony_ci rtw_write8(rtwdev, REG_TCR + 1, WLAN_TX_FUNC_CFG1); 28162306a36Sopenharmony_ci rtw_write32(rtwdev, REG_WMAC_OPTION_FUNCTION + 8, WLAN_MAC_OPT_FUNC2); 28262306a36Sopenharmony_ci rtw_write8(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, WLAN_MAC_OPT_NORM_FUNC1); 28362306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_SND_PTCL_CTRL, 28462306a36Sopenharmony_ci BIT_DIS_CHK_VHTSIGB_CRC); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci return 0; 28762306a36Sopenharmony_ci} 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_cistatic void rtw8822b_set_channel_rfe_efem(struct rtw_dev *rtwdev, u8 channel) 29062306a36Sopenharmony_ci{ 29162306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) { 29462306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x705770); 29562306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57); 29662306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(4), 0); 29762306a36Sopenharmony_ci } else { 29862306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x177517); 29962306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75); 30062306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFECTL, BIT(5), 0); 30162306a36Sopenharmony_ci } 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0); 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci if (hal->antenna_rx == BB_PATH_AB || 30662306a36Sopenharmony_ci hal->antenna_tx == BB_PATH_AB) { 30762306a36Sopenharmony_ci /* 2TX or 2RX */ 30862306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501); 30962306a36Sopenharmony_ci } else if (hal->antenna_rx == hal->antenna_tx) { 31062306a36Sopenharmony_ci /* TXA+RXA or TXB+RXB */ 31162306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500); 31262306a36Sopenharmony_ci } else { 31362306a36Sopenharmony_ci /* TXB+RXA or TXA+RXB */ 31462306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005); 31562306a36Sopenharmony_ci } 31662306a36Sopenharmony_ci} 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_cistatic void rtw8822b_set_channel_rfe_ifem(struct rtw_dev *rtwdev, u8 channel) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 32162306a36Sopenharmony_ci 32262306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) { 32362306a36Sopenharmony_ci /* signal source */ 32462306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x745774); 32562306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x57); 32662306a36Sopenharmony_ci } else { 32762306a36Sopenharmony_ci /* signal source */ 32862306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL0, 0xffffff, 0x477547); 32962306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFESEL8, MASKBYTE1, 0x75); 33062306a36Sopenharmony_ci } 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_RFEINV, BIT(11) | BIT(10) | 0x3f, 0x0); 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) { 33562306a36Sopenharmony_ci if (hal->antenna_rx == BB_PATH_AB || 33662306a36Sopenharmony_ci hal->antenna_tx == BB_PATH_AB) { 33762306a36Sopenharmony_ci /* 2TX or 2RX */ 33862306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa501); 33962306a36Sopenharmony_ci } else if (hal->antenna_rx == hal->antenna_tx) { 34062306a36Sopenharmony_ci /* TXA+RXA or TXB+RXB */ 34162306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa500); 34262306a36Sopenharmony_ci } else { 34362306a36Sopenharmony_ci /* TXB+RXA or TXA+RXB */ 34462306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa005); 34562306a36Sopenharmony_ci } 34662306a36Sopenharmony_ci } else { 34762306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TRSW, MASKLWORD, 0xa5a5); 34862306a36Sopenharmony_ci } 34962306a36Sopenharmony_ci} 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_cienum { 35262306a36Sopenharmony_ci CCUT_IDX_1R_2G, 35362306a36Sopenharmony_ci CCUT_IDX_2R_2G, 35462306a36Sopenharmony_ci CCUT_IDX_1R_5G, 35562306a36Sopenharmony_ci CCUT_IDX_2R_5G, 35662306a36Sopenharmony_ci CCUT_IDX_NR, 35762306a36Sopenharmony_ci}; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistruct cca_ccut { 36062306a36Sopenharmony_ci u32 reg82c[CCUT_IDX_NR]; 36162306a36Sopenharmony_ci u32 reg830[CCUT_IDX_NR]; 36262306a36Sopenharmony_ci u32 reg838[CCUT_IDX_NR]; 36362306a36Sopenharmony_ci}; 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistatic const struct cca_ccut cca_ifem_ccut = { 36662306a36Sopenharmony_ci {0x75C97010, 0x75C97010, 0x75C97010, 0x75C97010}, /*Reg82C*/ 36762306a36Sopenharmony_ci {0x79a0eaaa, 0x79A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/ 36862306a36Sopenharmony_ci {0x87765541, 0x87746341, 0x87765541, 0x87746341}, /*Reg838*/ 36962306a36Sopenharmony_ci}; 37062306a36Sopenharmony_ci 37162306a36Sopenharmony_cistatic const struct cca_ccut cca_efem_ccut = { 37262306a36Sopenharmony_ci {0x75B86010, 0x75B76010, 0x75B86010, 0x75B76010}, /*Reg82C*/ 37362306a36Sopenharmony_ci {0x79A0EAA8, 0x79A0EAAC, 0x79A0EAA8, 0x79a0eaaa}, /*Reg830*/ 37462306a36Sopenharmony_ci {0x87766451, 0x87766431, 0x87766451, 0x87766431}, /*Reg838*/ 37562306a36Sopenharmony_ci}; 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_cistatic const struct cca_ccut cca_ifem_ccut_ext = { 37862306a36Sopenharmony_ci {0x75da8010, 0x75da8010, 0x75da8010, 0x75da8010}, /*Reg82C*/ 37962306a36Sopenharmony_ci {0x79a0eaaa, 0x97A0EAAC, 0x79a0eaaa, 0x79a0eaaa}, /*Reg830*/ 38062306a36Sopenharmony_ci {0x87765541, 0x86666341, 0x87765561, 0x86666361}, /*Reg838*/ 38162306a36Sopenharmony_ci}; 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_cistatic void rtw8822b_get_cca_val(const struct cca_ccut *cca_ccut, u8 col, 38462306a36Sopenharmony_ci u32 *reg82c, u32 *reg830, u32 *reg838) 38562306a36Sopenharmony_ci{ 38662306a36Sopenharmony_ci *reg82c = cca_ccut->reg82c[col]; 38762306a36Sopenharmony_ci *reg830 = cca_ccut->reg830[col]; 38862306a36Sopenharmony_ci *reg838 = cca_ccut->reg838[col]; 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_cistruct rtw8822b_rfe_info { 39262306a36Sopenharmony_ci const struct cca_ccut *cca_ccut_2g; 39362306a36Sopenharmony_ci const struct cca_ccut *cca_ccut_5g; 39462306a36Sopenharmony_ci enum rtw_rfe_fem fem; 39562306a36Sopenharmony_ci bool ifem_ext; 39662306a36Sopenharmony_ci void (*rtw_set_channel_rfe)(struct rtw_dev *rtwdev, u8 channel); 39762306a36Sopenharmony_ci}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci#define I2GE5G_CCUT(set_ch) { \ 40062306a36Sopenharmony_ci .cca_ccut_2g = &cca_ifem_ccut, \ 40162306a36Sopenharmony_ci .cca_ccut_5g = &cca_efem_ccut, \ 40262306a36Sopenharmony_ci .fem = RTW_RFE_IFEM2G_EFEM5G, \ 40362306a36Sopenharmony_ci .ifem_ext = false, \ 40462306a36Sopenharmony_ci .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \ 40562306a36Sopenharmony_ci } 40662306a36Sopenharmony_ci#define IFEM_EXT_CCUT(set_ch) { \ 40762306a36Sopenharmony_ci .cca_ccut_2g = &cca_ifem_ccut_ext, \ 40862306a36Sopenharmony_ci .cca_ccut_5g = &cca_ifem_ccut_ext, \ 40962306a36Sopenharmony_ci .fem = RTW_RFE_IFEM, \ 41062306a36Sopenharmony_ci .ifem_ext = true, \ 41162306a36Sopenharmony_ci .rtw_set_channel_rfe = &rtw8822b_set_channel_rfe_ ## set_ch, \ 41262306a36Sopenharmony_ci } 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_cistatic const struct rtw8822b_rfe_info rtw8822b_rfe_info[] = { 41562306a36Sopenharmony_ci [2] = I2GE5G_CCUT(efem), 41662306a36Sopenharmony_ci [3] = IFEM_EXT_CCUT(ifem), 41762306a36Sopenharmony_ci [5] = IFEM_EXT_CCUT(ifem), 41862306a36Sopenharmony_ci}; 41962306a36Sopenharmony_ci 42062306a36Sopenharmony_cistatic void rtw8822b_set_channel_cca(struct rtw_dev *rtwdev, u8 channel, u8 bw, 42162306a36Sopenharmony_ci const struct rtw8822b_rfe_info *rfe_info) 42262306a36Sopenharmony_ci{ 42362306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 42462306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 42562306a36Sopenharmony_ci const struct cca_ccut *cca_ccut; 42662306a36Sopenharmony_ci u8 col; 42762306a36Sopenharmony_ci u32 reg82c, reg830, reg838; 42862306a36Sopenharmony_ci bool is_efem_cca = false, is_ifem_cca = false, is_rfe_type = false; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) { 43162306a36Sopenharmony_ci cca_ccut = rfe_info->cca_ccut_2g; 43262306a36Sopenharmony_ci 43362306a36Sopenharmony_ci if (hal->antenna_rx == BB_PATH_A || 43462306a36Sopenharmony_ci hal->antenna_rx == BB_PATH_B) 43562306a36Sopenharmony_ci col = CCUT_IDX_1R_2G; 43662306a36Sopenharmony_ci else 43762306a36Sopenharmony_ci col = CCUT_IDX_2R_2G; 43862306a36Sopenharmony_ci } else { 43962306a36Sopenharmony_ci cca_ccut = rfe_info->cca_ccut_5g; 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci if (hal->antenna_rx == BB_PATH_A || 44262306a36Sopenharmony_ci hal->antenna_rx == BB_PATH_B) 44362306a36Sopenharmony_ci col = CCUT_IDX_1R_5G; 44462306a36Sopenharmony_ci else 44562306a36Sopenharmony_ci col = CCUT_IDX_2R_5G; 44662306a36Sopenharmony_ci } 44762306a36Sopenharmony_ci 44862306a36Sopenharmony_ci rtw8822b_get_cca_val(cca_ccut, col, ®82c, ®830, ®838); 44962306a36Sopenharmony_ci 45062306a36Sopenharmony_ci switch (rfe_info->fem) { 45162306a36Sopenharmony_ci case RTW_RFE_IFEM: 45262306a36Sopenharmony_ci default: 45362306a36Sopenharmony_ci is_ifem_cca = true; 45462306a36Sopenharmony_ci if (rfe_info->ifem_ext) 45562306a36Sopenharmony_ci is_rfe_type = true; 45662306a36Sopenharmony_ci break; 45762306a36Sopenharmony_ci case RTW_RFE_EFEM: 45862306a36Sopenharmony_ci is_efem_cca = true; 45962306a36Sopenharmony_ci break; 46062306a36Sopenharmony_ci case RTW_RFE_IFEM2G_EFEM5G: 46162306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) 46262306a36Sopenharmony_ci is_ifem_cca = true; 46362306a36Sopenharmony_ci else 46462306a36Sopenharmony_ci is_efem_cca = true; 46562306a36Sopenharmony_ci break; 46662306a36Sopenharmony_ci } 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ci if (is_ifem_cca) { 46962306a36Sopenharmony_ci if ((hal->cut_version == RTW_CHIP_VER_CUT_B && 47062306a36Sopenharmony_ci (col == CCUT_IDX_2R_2G || col == CCUT_IDX_2R_5G) && 47162306a36Sopenharmony_ci bw == RTW_CHANNEL_WIDTH_40) || 47262306a36Sopenharmony_ci (!is_rfe_type && col == CCUT_IDX_2R_5G && 47362306a36Sopenharmony_ci bw == RTW_CHANNEL_WIDTH_40) || 47462306a36Sopenharmony_ci (efuse->rfe_option == 5 && col == CCUT_IDX_2R_5G)) 47562306a36Sopenharmony_ci reg830 = 0x79a0ea28; 47662306a36Sopenharmony_ci } 47762306a36Sopenharmony_ci 47862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CCASEL, MASKDWORD, reg82c); 47962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_PDMFTH, MASKDWORD, reg830); 48062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CCA2ND, MASKDWORD, reg838); 48162306a36Sopenharmony_ci 48262306a36Sopenharmony_ci if (is_efem_cca && !(hal->cut_version == RTW_CHIP_VER_CUT_B)) 48362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_L1WT, MASKDWORD, 0x9194b2b9); 48462306a36Sopenharmony_ci 48562306a36Sopenharmony_ci if (bw == RTW_CHANNEL_WIDTH_20 && IS_CH_5G_BAND_MID(channel)) 48662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf0, 0x4); 48762306a36Sopenharmony_ci} 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_cistatic const u8 low_band[15] = {0x7, 0x6, 0x6, 0x5, 0x0, 0x0, 0x7, 0xff, 0x6, 49062306a36Sopenharmony_ci 0x5, 0x0, 0x0, 0x7, 0x6, 0x6}; 49162306a36Sopenharmony_cistatic const u8 middle_band[23] = {0x6, 0x5, 0x0, 0x0, 0x7, 0x6, 0x6, 0xff, 0x0, 49262306a36Sopenharmony_ci 0x0, 0x7, 0x6, 0x6, 0x5, 0x0, 0xff, 0x7, 0x6, 49362306a36Sopenharmony_ci 0x6, 0x5, 0x0, 0x0, 0x7}; 49462306a36Sopenharmony_cistatic const u8 high_band[15] = {0x5, 0x5, 0x0, 0x7, 0x7, 0x6, 0x5, 0xff, 0x0, 49562306a36Sopenharmony_ci 0x7, 0x7, 0x6, 0x5, 0x5, 0x0}; 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cistatic void rtw8822b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) 49862306a36Sopenharmony_ci{ 49962306a36Sopenharmony_ci#define RF18_BAND_MASK (BIT(16) | BIT(9) | BIT(8)) 50062306a36Sopenharmony_ci#define RF18_BAND_2G (0) 50162306a36Sopenharmony_ci#define RF18_BAND_5G (BIT(16) | BIT(8)) 50262306a36Sopenharmony_ci#define RF18_CHANNEL_MASK (MASKBYTE0) 50362306a36Sopenharmony_ci#define RF18_RFSI_MASK (BIT(18) | BIT(17)) 50462306a36Sopenharmony_ci#define RF18_RFSI_GE_CH80 (BIT(17)) 50562306a36Sopenharmony_ci#define RF18_RFSI_GT_CH144 (BIT(18)) 50662306a36Sopenharmony_ci#define RF18_BW_MASK (BIT(11) | BIT(10)) 50762306a36Sopenharmony_ci#define RF18_BW_20M (BIT(11) | BIT(10)) 50862306a36Sopenharmony_ci#define RF18_BW_40M (BIT(11)) 50962306a36Sopenharmony_ci#define RF18_BW_80M (BIT(10)) 51062306a36Sopenharmony_ci#define RFBE_MASK (BIT(17) | BIT(16) | BIT(15)) 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 51362306a36Sopenharmony_ci u32 rf_reg18, rf_reg_be; 51462306a36Sopenharmony_ci 51562306a36Sopenharmony_ci rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci rf_reg18 &= ~(RF18_BAND_MASK | RF18_CHANNEL_MASK | RF18_RFSI_MASK | 51862306a36Sopenharmony_ci RF18_BW_MASK); 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci rf_reg18 |= (IS_CH_2G_BAND(channel) ? RF18_BAND_2G : RF18_BAND_5G); 52162306a36Sopenharmony_ci rf_reg18 |= (channel & RF18_CHANNEL_MASK); 52262306a36Sopenharmony_ci if (channel > 144) 52362306a36Sopenharmony_ci rf_reg18 |= RF18_RFSI_GT_CH144; 52462306a36Sopenharmony_ci else if (channel >= 80) 52562306a36Sopenharmony_ci rf_reg18 |= RF18_RFSI_GE_CH80; 52662306a36Sopenharmony_ci 52762306a36Sopenharmony_ci switch (bw) { 52862306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_5: 52962306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_10: 53062306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_20: 53162306a36Sopenharmony_ci default: 53262306a36Sopenharmony_ci rf_reg18 |= RF18_BW_20M; 53362306a36Sopenharmony_ci break; 53462306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_40: 53562306a36Sopenharmony_ci rf_reg18 |= RF18_BW_40M; 53662306a36Sopenharmony_ci break; 53762306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_80: 53862306a36Sopenharmony_ci rf_reg18 |= RF18_BW_80M; 53962306a36Sopenharmony_ci break; 54062306a36Sopenharmony_ci } 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) 54362306a36Sopenharmony_ci rf_reg_be = 0x0; 54462306a36Sopenharmony_ci else if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) 54562306a36Sopenharmony_ci rf_reg_be = low_band[(channel - 36) >> 1]; 54662306a36Sopenharmony_ci else if (IS_CH_5G_BAND_3(channel)) 54762306a36Sopenharmony_ci rf_reg_be = middle_band[(channel - 100) >> 1]; 54862306a36Sopenharmony_ci else if (IS_CH_5G_BAND_4(channel)) 54962306a36Sopenharmony_ci rf_reg_be = high_band[(channel - 149) >> 1]; 55062306a36Sopenharmony_ci else 55162306a36Sopenharmony_ci goto err; 55262306a36Sopenharmony_ci 55362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_MALSEL, RFBE_MASK, rf_reg_be); 55462306a36Sopenharmony_ci 55562306a36Sopenharmony_ci /* need to set 0xdf[18]=1 before writing RF18 when channel 144 */ 55662306a36Sopenharmony_ci if (channel == 144) 55762306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x1); 55862306a36Sopenharmony_ci else 55962306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(18), 0x0); 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK, rf_reg18); 56262306a36Sopenharmony_ci if (hal->rf_type > RF_1T1R) 56362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_B, 0x18, RFREG_MASK, rf_reg18); 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 0); 56662306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_XTALX2, BIT(19), 1); 56762306a36Sopenharmony_ci 56862306a36Sopenharmony_ci return; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cierr: 57162306a36Sopenharmony_ci WARN_ON(1); 57262306a36Sopenharmony_ci} 57362306a36Sopenharmony_ci 57462306a36Sopenharmony_cistatic void rtw8822b_toggle_igi(struct rtw_dev *rtwdev) 57562306a36Sopenharmony_ci{ 57662306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 57762306a36Sopenharmony_ci u32 igi; 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci igi = rtw_read32_mask(rtwdev, REG_RXIGI_A, 0x7f); 58062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi - 2); 58162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXIGI_A, 0x7f, igi); 58262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi - 2); 58362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXIGI_B, 0x7f, igi); 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 0x0); 58662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, 58762306a36Sopenharmony_ci hal->antenna_rx | (hal->antenna_rx << 4)); 58862306a36Sopenharmony_ci} 58962306a36Sopenharmony_ci 59062306a36Sopenharmony_cistatic void rtw8822b_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw) 59162306a36Sopenharmony_ci{ 59262306a36Sopenharmony_ci if (bw == RTW_CHANNEL_WIDTH_40) { 59362306a36Sopenharmony_ci /* RX DFIR for BW40 */ 59462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x1); 59562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x0); 59662306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 59762306a36Sopenharmony_ci } else if (bw == RTW_CHANNEL_WIDTH_80) { 59862306a36Sopenharmony_ci /* RX DFIR for BW80 */ 59962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 60062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x1); 60162306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x0); 60262306a36Sopenharmony_ci } else { 60362306a36Sopenharmony_ci /* RX DFIR for BW20, BW10 and BW5*/ 60462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBB0, BIT(29) | BIT(28), 0x2); 60562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACBBRXFIR, BIT(29) | BIT(28), 0x2); 60662306a36Sopenharmony_ci rtw_write32s_mask(rtwdev, REG_TXDFIR, BIT(31), 0x1); 60762306a36Sopenharmony_ci } 60862306a36Sopenharmony_ci} 60962306a36Sopenharmony_ci 61062306a36Sopenharmony_cistatic void rtw8822b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw, 61162306a36Sopenharmony_ci u8 primary_ch_idx) 61262306a36Sopenharmony_ci{ 61362306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 61462306a36Sopenharmony_ci u8 rfe_option = efuse->rfe_option; 61562306a36Sopenharmony_ci u32 val32; 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ci if (IS_CH_2G_BAND(channel)) { 61862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x1); 61962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x0); 62062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x0); 62162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 15); 62262306a36Sopenharmony_ci 62362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x0); 62462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a); 62562306a36Sopenharmony_ci if (channel == 14) { 62662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x00006577); 62762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000); 62862306a36Sopenharmony_ci } else { 62962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x384f6577); 63062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x1525); 63162306a36Sopenharmony_ci } 63262306a36Sopenharmony_ci 63362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RFEINV, 0x300, 0x2); 63462306a36Sopenharmony_ci } else if (IS_CH_5G_BAND(channel)) { 63562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ENTXCCK, BIT(18), 0x1); 63662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CCK_CHECK, BIT(7), 0x1); 63762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXPSEL, BIT(28), 0x0); 63862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXCCAMSK, 0x0000FC00, 34); 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci if (IS_CH_5G_BAND_1(channel) || IS_CH_5G_BAND_2(channel)) 64162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x1); 64262306a36Sopenharmony_ci else if (IS_CH_5G_BAND_3(channel)) 64362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x2); 64462306a36Sopenharmony_ci else if (IS_CH_5G_BAND_4(channel)) 64562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ACGG2TBL, 0x1f, 0x3); 64662306a36Sopenharmony_ci 64762306a36Sopenharmony_ci if (IS_CH_5G_BAND_1(channel)) 64862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x494); 64962306a36Sopenharmony_ci else if (IS_CH_5G_BAND_2(channel)) 65062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x453); 65162306a36Sopenharmony_ci else if (channel >= 100 && channel <= 116) 65262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x452); 65362306a36Sopenharmony_ci else if (channel >= 118 && channel <= 177) 65462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412); 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, 0xcbc, 0x300, 0x1); 65762306a36Sopenharmony_ci } 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ci switch (bw) { 66062306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_20: 66162306a36Sopenharmony_ci default: 66262306a36Sopenharmony_ci val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 66362306a36Sopenharmony_ci val32 &= 0xFFCFFC00; 66462306a36Sopenharmony_ci val32 |= (RTW_CHANNEL_WIDTH_20); 66562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 66862306a36Sopenharmony_ci break; 66962306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_40: 67062306a36Sopenharmony_ci if (primary_ch_idx == RTW_SC_20_UPPER) 67162306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_RXSB, BIT(4)); 67262306a36Sopenharmony_ci else 67362306a36Sopenharmony_ci rtw_write32_clr(rtwdev, REG_RXSB, BIT(4)); 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 67662306a36Sopenharmony_ci val32 &= 0xFF3FF300; 67762306a36Sopenharmony_ci val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_40); 67862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 68162306a36Sopenharmony_ci break; 68262306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_80: 68362306a36Sopenharmony_ci val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 68462306a36Sopenharmony_ci val32 &= 0xFCEFCF00; 68562306a36Sopenharmony_ci val32 |= (((primary_ch_idx & 0xf) << 2) | RTW_CHANNEL_WIDTH_80); 68662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x1); 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci if (rfe_option == 2 || rfe_option == 3) { 69162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_L1PKWT, 0x0000f000, 0x6); 69262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC40, BIT(10), 0x1); 69362306a36Sopenharmony_ci } 69462306a36Sopenharmony_ci break; 69562306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_5: 69662306a36Sopenharmony_ci val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 69762306a36Sopenharmony_ci val32 &= 0xEFEEFE00; 69862306a36Sopenharmony_ci val32 |= ((BIT(6) | RTW_CHANNEL_WIDTH_20)); 69962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 70062306a36Sopenharmony_ci 70162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 70262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 70362306a36Sopenharmony_ci break; 70462306a36Sopenharmony_ci case RTW_CHANNEL_WIDTH_10: 70562306a36Sopenharmony_ci val32 = rtw_read32_mask(rtwdev, REG_ADCCLK, MASKDWORD); 70662306a36Sopenharmony_ci val32 &= 0xEFFEFF00; 70762306a36Sopenharmony_ci val32 |= ((BIT(7) | RTW_CHANNEL_WIDTH_20)); 70862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCCLK, MASKDWORD, val32); 70962306a36Sopenharmony_ci 71062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC160, BIT(30), 0x0); 71162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADC40, BIT(31), 0x1); 71262306a36Sopenharmony_ci break; 71362306a36Sopenharmony_ci } 71462306a36Sopenharmony_ci} 71562306a36Sopenharmony_ci 71662306a36Sopenharmony_cistatic void rtw8822b_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw, 71762306a36Sopenharmony_ci u8 primary_chan_idx) 71862306a36Sopenharmony_ci{ 71962306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 72062306a36Sopenharmony_ci const struct rtw8822b_rfe_info *rfe_info; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info), 72362306a36Sopenharmony_ci "rfe_option %d is out of boundary\n", efuse->rfe_option)) 72462306a36Sopenharmony_ci return; 72562306a36Sopenharmony_ci 72662306a36Sopenharmony_ci rfe_info = &rtw8822b_rfe_info[efuse->rfe_option]; 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci rtw8822b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx); 72962306a36Sopenharmony_ci rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx); 73062306a36Sopenharmony_ci rtw8822b_set_channel_rf(rtwdev, channel, bw); 73162306a36Sopenharmony_ci rtw8822b_set_channel_rxdfir(rtwdev, bw); 73262306a36Sopenharmony_ci rtw8822b_toggle_igi(rtwdev); 73362306a36Sopenharmony_ci rtw8822b_set_channel_cca(rtwdev, channel, bw, rfe_info); 73462306a36Sopenharmony_ci (*rfe_info->rtw_set_channel_rfe)(rtwdev, channel); 73562306a36Sopenharmony_ci} 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_cistatic void rtw8822b_config_trx_mode(struct rtw_dev *rtwdev, u8 tx_path, 73862306a36Sopenharmony_ci u8 rx_path, bool is_tx2_path) 73962306a36Sopenharmony_ci{ 74062306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 74162306a36Sopenharmony_ci const struct rtw8822b_rfe_info *rfe_info; 74262306a36Sopenharmony_ci u8 ch = rtwdev->hal.current_channel; 74362306a36Sopenharmony_ci u8 tx_path_sel, rx_path_sel; 74462306a36Sopenharmony_ci int counter; 74562306a36Sopenharmony_ci 74662306a36Sopenharmony_ci if (WARN(efuse->rfe_option >= ARRAY_SIZE(rtw8822b_rfe_info), 74762306a36Sopenharmony_ci "rfe_option %d is out of boundary\n", efuse->rfe_option)) 74862306a36Sopenharmony_ci return; 74962306a36Sopenharmony_ci 75062306a36Sopenharmony_ci rfe_info = &rtw8822b_rfe_info[efuse->rfe_option]; 75162306a36Sopenharmony_ci 75262306a36Sopenharmony_ci if ((tx_path | rx_path) & BB_PATH_A) 75362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x3231); 75462306a36Sopenharmony_ci else 75562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_AGCTR_A, MASKLWORD, 0x1111); 75662306a36Sopenharmony_ci 75762306a36Sopenharmony_ci if ((tx_path | rx_path) & BB_PATH_B) 75862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x3231); 75962306a36Sopenharmony_ci else 76062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_AGCTR_B, MASKLWORD, 0x1111); 76162306a36Sopenharmony_ci 76262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CDDTXP, (BIT(19) | BIT(18)), 0x3); 76362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXPSEL, (BIT(29) | BIT(28)), 0x1); 76462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXPSEL, BIT(30), 0x1); 76562306a36Sopenharmony_ci 76662306a36Sopenharmony_ci if (tx_path & BB_PATH_A) { 76762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x001); 76862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x8); 76962306a36Sopenharmony_ci } else if (tx_path & BB_PATH_B) { 77062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x002); 77162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0x4); 77262306a36Sopenharmony_ci } 77362306a36Sopenharmony_ci 77462306a36Sopenharmony_ci if (tx_path == BB_PATH_A || tx_path == BB_PATH_B) 77562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x01); 77662306a36Sopenharmony_ci else 77762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXPSEL1, 0xfff0, 0x43); 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci tx_path_sel = (tx_path << 4) | tx_path; 78062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_TXPSEL, MASKBYTE0, tx_path_sel); 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci if (tx_path != BB_PATH_A && tx_path != BB_PATH_B) { 78362306a36Sopenharmony_ci if (is_tx2_path || rtwdev->mp_mode) { 78462306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_CDDTXP, 0xfff00000, 0x043); 78562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCINI, 0xf0000000, 0xc); 78662306a36Sopenharmony_ci } 78762306a36Sopenharmony_ci } 78862306a36Sopenharmony_ci 78962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXDESC, BIT(22), 0x0); 79062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXDESC, BIT(18), 0x0); 79162306a36Sopenharmony_ci 79262306a36Sopenharmony_ci if (rx_path & BB_PATH_A) 79362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x0); 79462306a36Sopenharmony_ci else if (rx_path & BB_PATH_B) 79562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ADCINI, 0x0f000000, 0x5); 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci rx_path_sel = (rx_path << 4) | rx_path; 79862306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_RXPSEL, MASKBYTE0, rx_path_sel); 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci if (rx_path == BB_PATH_A || rx_path == BB_PATH_B) { 80162306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x0); 80262306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x0); 80362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x0); 80462306a36Sopenharmony_ci } else { 80562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_ANTWT, BIT(16), 0x1); 80662306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_HTSTFWT, BIT(28), 0x1); 80762306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_MRC, BIT(23), 0x1); 80862306a36Sopenharmony_ci } 80962306a36Sopenharmony_ci 81062306a36Sopenharmony_ci for (counter = 100; counter > 0; counter--) { 81162306a36Sopenharmony_ci u32 rf_reg33; 81262306a36Sopenharmony_ci 81362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000); 81462306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001); 81562306a36Sopenharmony_ci 81662306a36Sopenharmony_ci udelay(2); 81762306a36Sopenharmony_ci rf_reg33 = rtw_read_rf(rtwdev, RF_PATH_A, 0x33, RFREG_MASK); 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci if (rf_reg33 == 0x00001) 82062306a36Sopenharmony_ci break; 82162306a36Sopenharmony_ci } 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci if (WARN(counter <= 0, "write RF mode table fail\n")) 82462306a36Sopenharmony_ci return; 82562306a36Sopenharmony_ci 82662306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x80000); 82762306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00001); 82862306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x00034); 82962306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x4080c); 83062306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000); 83162306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x00000); 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci rtw8822b_toggle_igi(rtwdev); 83462306a36Sopenharmony_ci rtw8822b_set_channel_cca(rtwdev, 1, RTW_CHANNEL_WIDTH_20, rfe_info); 83562306a36Sopenharmony_ci (*rfe_info->rtw_set_channel_rfe)(rtwdev, ch); 83662306a36Sopenharmony_ci} 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_cistatic void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status, 83962306a36Sopenharmony_ci struct rtw_rx_pkt_stat *pkt_stat) 84062306a36Sopenharmony_ci{ 84162306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 84262306a36Sopenharmony_ci s8 min_rx_power = -120; 84362306a36Sopenharmony_ci u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status); 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci /* 8822B uses only 1 antenna to RX CCK rates */ 84662306a36Sopenharmony_ci pkt_stat->rx_power[RF_PATH_A] = pwdb - 110; 84762306a36Sopenharmony_ci pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 84862306a36Sopenharmony_ci pkt_stat->bw = RTW_CHANNEL_WIDTH_20; 84962306a36Sopenharmony_ci pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A], 85062306a36Sopenharmony_ci min_rx_power); 85162306a36Sopenharmony_ci dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 85262306a36Sopenharmony_ci} 85362306a36Sopenharmony_ci 85462306a36Sopenharmony_cistatic void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status, 85562306a36Sopenharmony_ci struct rtw_rx_pkt_stat *pkt_stat) 85662306a36Sopenharmony_ci{ 85762306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 85862306a36Sopenharmony_ci u8 rxsc, bw; 85962306a36Sopenharmony_ci s8 min_rx_power = -120; 86062306a36Sopenharmony_ci s8 rx_evm; 86162306a36Sopenharmony_ci u8 evm_dbm = 0; 86262306a36Sopenharmony_ci u8 rssi; 86362306a36Sopenharmony_ci int path; 86462306a36Sopenharmony_ci 86562306a36Sopenharmony_ci if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0) 86662306a36Sopenharmony_ci rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status); 86762306a36Sopenharmony_ci else 86862306a36Sopenharmony_ci rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status); 86962306a36Sopenharmony_ci 87062306a36Sopenharmony_ci if (rxsc >= 1 && rxsc <= 8) 87162306a36Sopenharmony_ci bw = RTW_CHANNEL_WIDTH_20; 87262306a36Sopenharmony_ci else if (rxsc >= 9 && rxsc <= 12) 87362306a36Sopenharmony_ci bw = RTW_CHANNEL_WIDTH_40; 87462306a36Sopenharmony_ci else if (rxsc >= 13) 87562306a36Sopenharmony_ci bw = RTW_CHANNEL_WIDTH_80; 87662306a36Sopenharmony_ci else 87762306a36Sopenharmony_ci bw = GET_PHY_STAT_P1_RF_MODE(phy_status); 87862306a36Sopenharmony_ci 87962306a36Sopenharmony_ci pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110; 88062306a36Sopenharmony_ci pkt_stat->rx_power[RF_PATH_B] = GET_PHY_STAT_P1_PWDB_B(phy_status) - 110; 88162306a36Sopenharmony_ci pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 2); 88262306a36Sopenharmony_ci pkt_stat->bw = bw; 88362306a36Sopenharmony_ci pkt_stat->signal_power = max3(pkt_stat->rx_power[RF_PATH_A], 88462306a36Sopenharmony_ci pkt_stat->rx_power[RF_PATH_B], 88562306a36Sopenharmony_ci min_rx_power); 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_ci dm_info->curr_rx_rate = pkt_stat->rate; 88862306a36Sopenharmony_ci 88962306a36Sopenharmony_ci pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status); 89062306a36Sopenharmony_ci pkt_stat->rx_evm[RF_PATH_B] = GET_PHY_STAT_P1_RXEVM_B(phy_status); 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status); 89362306a36Sopenharmony_ci pkt_stat->rx_snr[RF_PATH_B] = GET_PHY_STAT_P1_RXSNR_B(phy_status); 89462306a36Sopenharmony_ci 89562306a36Sopenharmony_ci pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status); 89662306a36Sopenharmony_ci pkt_stat->cfo_tail[RF_PATH_B] = GET_PHY_STAT_P1_CFO_TAIL_B(phy_status); 89762306a36Sopenharmony_ci 89862306a36Sopenharmony_ci for (path = 0; path <= rtwdev->hal.rf_path_num; path++) { 89962306a36Sopenharmony_ci rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[path], 1); 90062306a36Sopenharmony_ci dm_info->rssi[path] = rssi; 90162306a36Sopenharmony_ci dm_info->rx_snr[path] = pkt_stat->rx_snr[path] >> 1; 90262306a36Sopenharmony_ci dm_info->cfo_tail[path] = (pkt_stat->cfo_tail[path] * 5) >> 1; 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_ci rx_evm = pkt_stat->rx_evm[path]; 90562306a36Sopenharmony_ci 90662306a36Sopenharmony_ci if (rx_evm < 0) { 90762306a36Sopenharmony_ci if (rx_evm == S8_MIN) 90862306a36Sopenharmony_ci evm_dbm = 0; 90962306a36Sopenharmony_ci else 91062306a36Sopenharmony_ci evm_dbm = ((u8)-rx_evm >> 1); 91162306a36Sopenharmony_ci } 91262306a36Sopenharmony_ci dm_info->rx_evm_dbm[path] = evm_dbm; 91362306a36Sopenharmony_ci } 91462306a36Sopenharmony_ci} 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_cistatic void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 91762306a36Sopenharmony_ci struct rtw_rx_pkt_stat *pkt_stat) 91862306a36Sopenharmony_ci{ 91962306a36Sopenharmony_ci u8 page; 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci page = *phy_status & 0xf; 92262306a36Sopenharmony_ci 92362306a36Sopenharmony_ci switch (page) { 92462306a36Sopenharmony_ci case 0: 92562306a36Sopenharmony_ci query_phy_status_page0(rtwdev, phy_status, pkt_stat); 92662306a36Sopenharmony_ci break; 92762306a36Sopenharmony_ci case 1: 92862306a36Sopenharmony_ci query_phy_status_page1(rtwdev, phy_status, pkt_stat); 92962306a36Sopenharmony_ci break; 93062306a36Sopenharmony_ci default: 93162306a36Sopenharmony_ci rtw_warn(rtwdev, "unused phy status page (%d)\n", page); 93262306a36Sopenharmony_ci return; 93362306a36Sopenharmony_ci } 93462306a36Sopenharmony_ci} 93562306a36Sopenharmony_ci 93662306a36Sopenharmony_cistatic void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc, 93762306a36Sopenharmony_ci struct rtw_rx_pkt_stat *pkt_stat, 93862306a36Sopenharmony_ci struct ieee80211_rx_status *rx_status) 93962306a36Sopenharmony_ci{ 94062306a36Sopenharmony_ci struct ieee80211_hdr *hdr; 94162306a36Sopenharmony_ci u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz; 94262306a36Sopenharmony_ci u8 *phy_status = NULL; 94362306a36Sopenharmony_ci 94462306a36Sopenharmony_ci memset(pkt_stat, 0, sizeof(*pkt_stat)); 94562306a36Sopenharmony_ci 94662306a36Sopenharmony_ci pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc); 94762306a36Sopenharmony_ci pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc); 94862306a36Sopenharmony_ci pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc); 94962306a36Sopenharmony_ci pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) && 95062306a36Sopenharmony_ci GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE; 95162306a36Sopenharmony_ci pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc); 95262306a36Sopenharmony_ci pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc); 95362306a36Sopenharmony_ci pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc); 95462306a36Sopenharmony_ci pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc); 95562306a36Sopenharmony_ci pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc); 95662306a36Sopenharmony_ci pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc); 95762306a36Sopenharmony_ci pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc); 95862306a36Sopenharmony_ci pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc); 95962306a36Sopenharmony_ci 96062306a36Sopenharmony_ci /* drv_info_sz is in unit of 8-bytes */ 96162306a36Sopenharmony_ci pkt_stat->drv_info_sz *= 8; 96262306a36Sopenharmony_ci 96362306a36Sopenharmony_ci /* c2h cmd pkt's rx/phy status is not interested */ 96462306a36Sopenharmony_ci if (pkt_stat->is_c2h) 96562306a36Sopenharmony_ci return; 96662306a36Sopenharmony_ci 96762306a36Sopenharmony_ci hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift + 96862306a36Sopenharmony_ci pkt_stat->drv_info_sz); 96962306a36Sopenharmony_ci if (pkt_stat->phy_status) { 97062306a36Sopenharmony_ci phy_status = rx_desc + desc_sz + pkt_stat->shift; 97162306a36Sopenharmony_ci query_phy_status(rtwdev, phy_status, pkt_stat); 97262306a36Sopenharmony_ci } 97362306a36Sopenharmony_ci 97462306a36Sopenharmony_ci rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status); 97562306a36Sopenharmony_ci} 97662306a36Sopenharmony_ci 97762306a36Sopenharmony_cistatic void 97862306a36Sopenharmony_cirtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) 97962306a36Sopenharmony_ci{ 98062306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 98162306a36Sopenharmony_ci static const u32 offset_txagc[2] = {0x1d00, 0x1d80}; 98262306a36Sopenharmony_ci static u32 phy_pwr_idx; 98362306a36Sopenharmony_ci u8 rate, rate_idx, pwr_index, shift; 98462306a36Sopenharmony_ci int j; 98562306a36Sopenharmony_ci 98662306a36Sopenharmony_ci for (j = 0; j < rtw_rate_size[rs]; j++) { 98762306a36Sopenharmony_ci rate = rtw_rate_section[rs][j]; 98862306a36Sopenharmony_ci pwr_index = hal->tx_pwr_tbl[path][rate]; 98962306a36Sopenharmony_ci shift = rate & 0x3; 99062306a36Sopenharmony_ci phy_pwr_idx |= ((u32)pwr_index << (shift * 8)); 99162306a36Sopenharmony_ci if (shift == 0x3) { 99262306a36Sopenharmony_ci rate_idx = rate & 0xfc; 99362306a36Sopenharmony_ci rtw_write32(rtwdev, offset_txagc[path] + rate_idx, 99462306a36Sopenharmony_ci phy_pwr_idx); 99562306a36Sopenharmony_ci phy_pwr_idx = 0; 99662306a36Sopenharmony_ci } 99762306a36Sopenharmony_ci } 99862306a36Sopenharmony_ci} 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_cistatic void rtw8822b_set_tx_power_index(struct rtw_dev *rtwdev) 100162306a36Sopenharmony_ci{ 100262306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 100362306a36Sopenharmony_ci int rs, path; 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_ci for (path = 0; path < hal->rf_path_num; path++) { 100662306a36Sopenharmony_ci for (rs = 0; rs < RTW_RATE_SECTION_MAX; rs++) 100762306a36Sopenharmony_ci rtw8822b_set_tx_power_index_by_rate(rtwdev, path, rs); 100862306a36Sopenharmony_ci } 100962306a36Sopenharmony_ci} 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_cistatic bool rtw8822b_check_rf_path(u8 antenna) 101262306a36Sopenharmony_ci{ 101362306a36Sopenharmony_ci switch (antenna) { 101462306a36Sopenharmony_ci case BB_PATH_A: 101562306a36Sopenharmony_ci case BB_PATH_B: 101662306a36Sopenharmony_ci case BB_PATH_AB: 101762306a36Sopenharmony_ci return true; 101862306a36Sopenharmony_ci default: 101962306a36Sopenharmony_ci return false; 102062306a36Sopenharmony_ci } 102162306a36Sopenharmony_ci} 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_cistatic int rtw8822b_set_antenna(struct rtw_dev *rtwdev, 102462306a36Sopenharmony_ci u32 antenna_tx, 102562306a36Sopenharmony_ci u32 antenna_rx) 102662306a36Sopenharmony_ci{ 102762306a36Sopenharmony_ci struct rtw_hal *hal = &rtwdev->hal; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_PHY, "config RF path, tx=0x%x rx=0x%x\n", 103062306a36Sopenharmony_ci antenna_tx, antenna_rx); 103162306a36Sopenharmony_ci 103262306a36Sopenharmony_ci if (!rtw8822b_check_rf_path(antenna_tx)) { 103362306a36Sopenharmony_ci rtw_warn(rtwdev, "unsupported tx path 0x%x\n", antenna_tx); 103462306a36Sopenharmony_ci return -EINVAL; 103562306a36Sopenharmony_ci } 103662306a36Sopenharmony_ci 103762306a36Sopenharmony_ci if (!rtw8822b_check_rf_path(antenna_rx)) { 103862306a36Sopenharmony_ci rtw_warn(rtwdev, "unsupported rx path 0x%x\n", antenna_rx); 103962306a36Sopenharmony_ci return -EINVAL; 104062306a36Sopenharmony_ci } 104162306a36Sopenharmony_ci 104262306a36Sopenharmony_ci hal->antenna_tx = antenna_tx; 104362306a36Sopenharmony_ci hal->antenna_rx = antenna_rx; 104462306a36Sopenharmony_ci 104562306a36Sopenharmony_ci rtw8822b_config_trx_mode(rtwdev, antenna_tx, antenna_rx, false); 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci return 0; 104862306a36Sopenharmony_ci} 104962306a36Sopenharmony_ci 105062306a36Sopenharmony_cistatic void rtw8822b_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) 105162306a36Sopenharmony_ci{ 105262306a36Sopenharmony_ci u8 ldo_pwr; 105362306a36Sopenharmony_ci 105462306a36Sopenharmony_ci ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3); 105562306a36Sopenharmony_ci ldo_pwr = enable ? ldo_pwr | BIT_LDO25_EN : ldo_pwr & ~BIT_LDO25_EN; 105662306a36Sopenharmony_ci rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr); 105762306a36Sopenharmony_ci} 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_cistatic void rtw8822b_false_alarm_statistics(struct rtw_dev *rtwdev) 106062306a36Sopenharmony_ci{ 106162306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 106262306a36Sopenharmony_ci u32 cck_enable; 106362306a36Sopenharmony_ci u32 cck_fa_cnt; 106462306a36Sopenharmony_ci u32 ofdm_fa_cnt; 106562306a36Sopenharmony_ci u32 crc32_cnt; 106662306a36Sopenharmony_ci u32 cca32_cnt; 106762306a36Sopenharmony_ci 106862306a36Sopenharmony_ci cck_enable = rtw_read32(rtwdev, 0x808) & BIT(28); 106962306a36Sopenharmony_ci cck_fa_cnt = rtw_read16(rtwdev, 0xa5c); 107062306a36Sopenharmony_ci ofdm_fa_cnt = rtw_read16(rtwdev, 0xf48); 107162306a36Sopenharmony_ci 107262306a36Sopenharmony_ci dm_info->cck_fa_cnt = cck_fa_cnt; 107362306a36Sopenharmony_ci dm_info->ofdm_fa_cnt = ofdm_fa_cnt; 107462306a36Sopenharmony_ci dm_info->total_fa_cnt = ofdm_fa_cnt; 107562306a36Sopenharmony_ci dm_info->total_fa_cnt += cck_enable ? cck_fa_cnt : 0; 107662306a36Sopenharmony_ci 107762306a36Sopenharmony_ci crc32_cnt = rtw_read32(rtwdev, 0xf04); 107862306a36Sopenharmony_ci dm_info->cck_ok_cnt = crc32_cnt & 0xffff; 107962306a36Sopenharmony_ci dm_info->cck_err_cnt = (crc32_cnt & 0xffff0000) >> 16; 108062306a36Sopenharmony_ci crc32_cnt = rtw_read32(rtwdev, 0xf14); 108162306a36Sopenharmony_ci dm_info->ofdm_ok_cnt = crc32_cnt & 0xffff; 108262306a36Sopenharmony_ci dm_info->ofdm_err_cnt = (crc32_cnt & 0xffff0000) >> 16; 108362306a36Sopenharmony_ci crc32_cnt = rtw_read32(rtwdev, 0xf10); 108462306a36Sopenharmony_ci dm_info->ht_ok_cnt = crc32_cnt & 0xffff; 108562306a36Sopenharmony_ci dm_info->ht_err_cnt = (crc32_cnt & 0xffff0000) >> 16; 108662306a36Sopenharmony_ci crc32_cnt = rtw_read32(rtwdev, 0xf0c); 108762306a36Sopenharmony_ci dm_info->vht_ok_cnt = crc32_cnt & 0xffff; 108862306a36Sopenharmony_ci dm_info->vht_err_cnt = (crc32_cnt & 0xffff0000) >> 16; 108962306a36Sopenharmony_ci 109062306a36Sopenharmony_ci cca32_cnt = rtw_read32(rtwdev, 0xf08); 109162306a36Sopenharmony_ci dm_info->ofdm_cca_cnt = ((cca32_cnt & 0xffff0000) >> 16); 109262306a36Sopenharmony_ci dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt; 109362306a36Sopenharmony_ci if (cck_enable) { 109462306a36Sopenharmony_ci cca32_cnt = rtw_read32(rtwdev, 0xfcc); 109562306a36Sopenharmony_ci dm_info->cck_cca_cnt = cca32_cnt & 0xffff; 109662306a36Sopenharmony_ci dm_info->total_cca_cnt += dm_info->cck_cca_cnt; 109762306a36Sopenharmony_ci } 109862306a36Sopenharmony_ci 109962306a36Sopenharmony_ci rtw_write32_set(rtwdev, 0x9a4, BIT(17)); 110062306a36Sopenharmony_ci rtw_write32_clr(rtwdev, 0x9a4, BIT(17)); 110162306a36Sopenharmony_ci rtw_write32_clr(rtwdev, 0xa2c, BIT(15)); 110262306a36Sopenharmony_ci rtw_write32_set(rtwdev, 0xa2c, BIT(15)); 110362306a36Sopenharmony_ci rtw_write32_set(rtwdev, 0xb58, BIT(0)); 110462306a36Sopenharmony_ci rtw_write32_clr(rtwdev, 0xb58, BIT(0)); 110562306a36Sopenharmony_ci} 110662306a36Sopenharmony_ci 110762306a36Sopenharmony_cistatic void rtw8822b_do_iqk(struct rtw_dev *rtwdev) 110862306a36Sopenharmony_ci{ 110962306a36Sopenharmony_ci static int do_iqk_cnt; 111062306a36Sopenharmony_ci struct rtw_iqk_para para = {.clear = 0, .segment_iqk = 0}; 111162306a36Sopenharmony_ci u32 rf_reg, iqk_fail_mask; 111262306a36Sopenharmony_ci int counter; 111362306a36Sopenharmony_ci bool reload; 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_ci rtw_fw_do_iqk(rtwdev, ¶); 111662306a36Sopenharmony_ci 111762306a36Sopenharmony_ci for (counter = 0; counter < 300; counter++) { 111862306a36Sopenharmony_ci rf_reg = rtw_read_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK); 111962306a36Sopenharmony_ci if (rf_reg == 0xabcde) 112062306a36Sopenharmony_ci break; 112162306a36Sopenharmony_ci msleep(20); 112262306a36Sopenharmony_ci } 112362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_DTXLOK, RFREG_MASK, 0x0); 112462306a36Sopenharmony_ci 112562306a36Sopenharmony_ci reload = !!rtw_read32_mask(rtwdev, REG_IQKFAILMSK, BIT(16)); 112662306a36Sopenharmony_ci iqk_fail_mask = rtw_read32_mask(rtwdev, REG_IQKFAILMSK, GENMASK(7, 0)); 112762306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_PHY, 112862306a36Sopenharmony_ci "iqk counter=%d reload=%d do_iqk_cnt=%d n_iqk_fail(mask)=0x%02x\n", 112962306a36Sopenharmony_ci counter, reload, ++do_iqk_cnt, iqk_fail_mask); 113062306a36Sopenharmony_ci} 113162306a36Sopenharmony_ci 113262306a36Sopenharmony_cistatic void rtw8822b_phy_calibration(struct rtw_dev *rtwdev) 113362306a36Sopenharmony_ci{ 113462306a36Sopenharmony_ci rtw8822b_do_iqk(rtwdev); 113562306a36Sopenharmony_ci} 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_init(struct rtw_dev *rtwdev) 113862306a36Sopenharmony_ci{ 113962306a36Sopenharmony_ci /* enable TBTT nterrupt */ 114062306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION); 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_ci /* BT report packet sample rate */ 114362306a36Sopenharmony_ci /* 0x790[5:0]=0x5 */ 114462306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5); 114562306a36Sopenharmony_ci 114662306a36Sopenharmony_ci /* enable BT counter statistics */ 114762306a36Sopenharmony_ci rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1); 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci /* enable PTA (3-wire function form BT side) */ 115062306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN); 115162306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS); 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci /* enable PTA (tx/rx signal form WiFi side) */ 115462306a36Sopenharmony_ci rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN); 115562306a36Sopenharmony_ci /* wl tx signal to PTA not case EDCCA */ 115662306a36Sopenharmony_ci rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT_PTA_EDCCA_EN); 115762306a36Sopenharmony_ci /* GNT_BT=1 while select both */ 115862306a36Sopenharmony_ci rtw_write16_set(rtwdev, REG_BT_COEX_V2, BIT_GNT_BT_POLARITY); 115962306a36Sopenharmony_ci} 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_ant_switch(struct rtw_dev *rtwdev, 116262306a36Sopenharmony_ci u8 ctrl_type, u8 pos_type) 116362306a36Sopenharmony_ci{ 116462306a36Sopenharmony_ci struct rtw_coex *coex = &rtwdev->coex; 116562306a36Sopenharmony_ci struct rtw_coex_dm *coex_dm = &coex->dm; 116662306a36Sopenharmony_ci struct rtw_coex_rfe *coex_rfe = &coex->rfe; 116762306a36Sopenharmony_ci bool polarity_inverse; 116862306a36Sopenharmony_ci u8 regval = 0; 116962306a36Sopenharmony_ci 117062306a36Sopenharmony_ci if (((ctrl_type << 8) + pos_type) == coex_dm->cur_switch_status) 117162306a36Sopenharmony_ci return; 117262306a36Sopenharmony_ci 117362306a36Sopenharmony_ci coex_dm->cur_switch_status = (ctrl_type << 8) + pos_type; 117462306a36Sopenharmony_ci 117562306a36Sopenharmony_ci if (coex_rfe->ant_switch_diversity && 117662306a36Sopenharmony_ci ctrl_type == COEX_SWITCH_CTRL_BY_BBSW) 117762306a36Sopenharmony_ci ctrl_type = COEX_SWITCH_CTRL_BY_ANTDIV; 117862306a36Sopenharmony_ci 117962306a36Sopenharmony_ci polarity_inverse = (coex_rfe->ant_switch_polarity == 1); 118062306a36Sopenharmony_ci 118162306a36Sopenharmony_ci switch (ctrl_type) { 118262306a36Sopenharmony_ci default: 118362306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_BBSW: 118462306a36Sopenharmony_ci /* 0x4c[23] = 0 */ 118562306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0); 118662306a36Sopenharmony_ci /* 0x4c[24] = 1 */ 118762306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1); 118862306a36Sopenharmony_ci /* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 118962306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x77); 119062306a36Sopenharmony_ci 119162306a36Sopenharmony_ci if (pos_type == COEX_SWITCH_TO_WLG_BT) { 119262306a36Sopenharmony_ci if (coex_rfe->rfe_module_type != 0x4 && 119362306a36Sopenharmony_ci coex_rfe->rfe_module_type != 0x2) 119462306a36Sopenharmony_ci regval = 0x3; 119562306a36Sopenharmony_ci else 119662306a36Sopenharmony_ci regval = (!polarity_inverse ? 0x2 : 0x1); 119762306a36Sopenharmony_ci } else if (pos_type == COEX_SWITCH_TO_WLG) { 119862306a36Sopenharmony_ci regval = (!polarity_inverse ? 0x2 : 0x1); 119962306a36Sopenharmony_ci } else { 120062306a36Sopenharmony_ci regval = (!polarity_inverse ? 0x1 : 0x2); 120162306a36Sopenharmony_ci } 120262306a36Sopenharmony_ci 120362306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval); 120462306a36Sopenharmony_ci break; 120562306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_PTA: 120662306a36Sopenharmony_ci /* 0x4c[23] = 0 */ 120762306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0); 120862306a36Sopenharmony_ci /* 0x4c[24] = 1 */ 120962306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1); 121062306a36Sopenharmony_ci /* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ 121162306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x66); 121262306a36Sopenharmony_ci 121362306a36Sopenharmony_ci regval = (!polarity_inverse ? 0x2 : 0x1); 121462306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_INV8, BIT_MASK_RFE_INV89, regval); 121562306a36Sopenharmony_ci break; 121662306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_ANTDIV: 121762306a36Sopenharmony_ci /* 0x4c[23] = 0 */ 121862306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0); 121962306a36Sopenharmony_ci /* 0x4c[24] = 1 */ 122062306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1); 122162306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_CTRL8, BIT_MASK_RFE_SEL89, 0x88); 122262306a36Sopenharmony_ci break; 122362306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_MAC: 122462306a36Sopenharmony_ci /* 0x4c[23] = 1 */ 122562306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x1); 122662306a36Sopenharmony_ci 122762306a36Sopenharmony_ci regval = (!polarity_inverse ? 0x0 : 0x1); 122862306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_PAD_CTRL1, BIT_SW_DPDT_SEL_DATA, regval); 122962306a36Sopenharmony_ci break; 123062306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_FW: 123162306a36Sopenharmony_ci /* 0x4c[23] = 0 */ 123262306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0); 123362306a36Sopenharmony_ci /* 0x4c[24] = 1 */ 123462306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x1); 123562306a36Sopenharmony_ci break; 123662306a36Sopenharmony_ci case COEX_SWITCH_CTRL_BY_BT: 123762306a36Sopenharmony_ci /* 0x4c[23] = 0 */ 123862306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 2, BIT_DPDT_SEL_EN >> 16, 0x0); 123962306a36Sopenharmony_ci /* 0x4c[24] = 0 */ 124062306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_LED_CFG + 3, BIT_DPDT_WL_SEL >> 24, 0x0); 124162306a36Sopenharmony_ci break; 124262306a36Sopenharmony_ci } 124362306a36Sopenharmony_ci} 124462306a36Sopenharmony_ci 124562306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) 124662306a36Sopenharmony_ci{ 124762306a36Sopenharmony_ci} 124862306a36Sopenharmony_ci 124962306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) 125062306a36Sopenharmony_ci{ 125162306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT_BTGP_SPI_EN >> 16, 0); 125262306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT_BTGP_JTAG_EN >> 24, 0); 125362306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT_FSPI_EN >> 16, 0); 125462306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 1, BIT_LED1DIS >> 8, 0); 125562306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT_DBG_GNT_WL_BT >> 24, 0); 125662306a36Sopenharmony_ci} 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_rfe_type(struct rtw_dev *rtwdev) 125962306a36Sopenharmony_ci{ 126062306a36Sopenharmony_ci struct rtw_coex *coex = &rtwdev->coex; 126162306a36Sopenharmony_ci struct rtw_coex_rfe *coex_rfe = &coex->rfe; 126262306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 126362306a36Sopenharmony_ci bool is_ext_fem = false; 126462306a36Sopenharmony_ci 126562306a36Sopenharmony_ci coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option; 126662306a36Sopenharmony_ci coex_rfe->ant_switch_polarity = 0; 126762306a36Sopenharmony_ci coex_rfe->ant_switch_diversity = false; 126862306a36Sopenharmony_ci if (coex_rfe->rfe_module_type == 0x12 || 126962306a36Sopenharmony_ci coex_rfe->rfe_module_type == 0x15 || 127062306a36Sopenharmony_ci coex_rfe->rfe_module_type == 0x16) 127162306a36Sopenharmony_ci coex_rfe->ant_switch_exist = false; 127262306a36Sopenharmony_ci else 127362306a36Sopenharmony_ci coex_rfe->ant_switch_exist = true; 127462306a36Sopenharmony_ci 127562306a36Sopenharmony_ci if (coex_rfe->rfe_module_type == 2 || 127662306a36Sopenharmony_ci coex_rfe->rfe_module_type == 4) { 127762306a36Sopenharmony_ci rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, true); 127862306a36Sopenharmony_ci is_ext_fem = true; 127962306a36Sopenharmony_ci } else { 128062306a36Sopenharmony_ci rtw_coex_write_scbd(rtwdev, COEX_SCBD_EXTFEM, false); 128162306a36Sopenharmony_ci } 128262306a36Sopenharmony_ci 128362306a36Sopenharmony_ci coex_rfe->wlg_at_btg = false; 128462306a36Sopenharmony_ci 128562306a36Sopenharmony_ci if (efuse->share_ant && 128662306a36Sopenharmony_ci coex_rfe->ant_switch_exist && !is_ext_fem) 128762306a36Sopenharmony_ci coex_rfe->ant_switch_with_bt = true; 128862306a36Sopenharmony_ci else 128962306a36Sopenharmony_ci coex_rfe->ant_switch_with_bt = false; 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci /* Ext switch buffer mux */ 129262306a36Sopenharmony_ci rtw_write8(rtwdev, REG_RFE_CTRL_E, 0xff); 129362306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFESEL_CTRL + 1, 0x3, 0x0); 129462306a36Sopenharmony_ci rtw_write8_mask(rtwdev, REG_RFE_INV16, BIT_RFE_BUF_EN, 0x0); 129562306a36Sopenharmony_ci 129662306a36Sopenharmony_ci /* Disable LTE Coex Function in WiFi side */ 129762306a36Sopenharmony_ci rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0); 129862306a36Sopenharmony_ci 129962306a36Sopenharmony_ci /* BTC_CTT_WL_VS_LTE */ 130062306a36Sopenharmony_ci rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff); 130162306a36Sopenharmony_ci 130262306a36Sopenharmony_ci /* BTC_CTT_BT_VS_LTE */ 130362306a36Sopenharmony_ci rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff); 130462306a36Sopenharmony_ci} 130562306a36Sopenharmony_ci 130662306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 130762306a36Sopenharmony_ci{ 130862306a36Sopenharmony_ci struct rtw_coex *coex = &rtwdev->coex; 130962306a36Sopenharmony_ci struct rtw_coex_dm *coex_dm = &coex->dm; 131062306a36Sopenharmony_ci static const u16 reg_addr[] = {0xc58, 0xe58}; 131162306a36Sopenharmony_ci static const u8 wl_tx_power[] = {0xd8, 0xd4, 0xd0, 0xcc, 0xc8}; 131262306a36Sopenharmony_ci u8 i, pwr; 131362306a36Sopenharmony_ci 131462306a36Sopenharmony_ci if (wl_pwr == coex_dm->cur_wl_pwr_lvl) 131562306a36Sopenharmony_ci return; 131662306a36Sopenharmony_ci 131762306a36Sopenharmony_ci coex_dm->cur_wl_pwr_lvl = wl_pwr; 131862306a36Sopenharmony_ci 131962306a36Sopenharmony_ci if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power)) 132062306a36Sopenharmony_ci coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1; 132162306a36Sopenharmony_ci 132262306a36Sopenharmony_ci pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl]; 132362306a36Sopenharmony_ci 132462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(reg_addr); i++) 132562306a36Sopenharmony_ci rtw_write8_mask(rtwdev, reg_addr[i], 0xff, pwr); 132662306a36Sopenharmony_ci} 132762306a36Sopenharmony_ci 132862306a36Sopenharmony_cistatic void rtw8822b_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 132962306a36Sopenharmony_ci{ 133062306a36Sopenharmony_ci struct rtw_coex *coex = &rtwdev->coex; 133162306a36Sopenharmony_ci struct rtw_coex_dm *coex_dm = &coex->dm; 133262306a36Sopenharmony_ci /* WL Rx Low gain on */ 133362306a36Sopenharmony_ci static const u32 wl_rx_low_gain_on[] = { 133462306a36Sopenharmony_ci 0xff000003, 0xbd120003, 0xbe100003, 0xbf080003, 0xbf060003, 133562306a36Sopenharmony_ci 0xbf050003, 0xbc140003, 0xbb160003, 0xba180003, 0xb91a0003, 133662306a36Sopenharmony_ci 0xb81c0003, 0xb71e0003, 0xb4200003, 0xb5220003, 0xb4240003, 133762306a36Sopenharmony_ci 0xb3260003, 0xb2280003, 0xb12a0003, 0xb02c0003, 0xaf2e0003, 133862306a36Sopenharmony_ci 0xae300003, 0xad320003, 0xac340003, 0xab360003, 0x8d380003, 133962306a36Sopenharmony_ci 0x8c3a0003, 0x8b3c0003, 0x8a3e0003, 0x6e400003, 0x6d420003, 134062306a36Sopenharmony_ci 0x6c440003, 0x6b460003, 0x6a480003, 0x694a0003, 0x684c0003, 134162306a36Sopenharmony_ci 0x674e0003, 0x66500003, 0x65520003, 0x64540003, 0x64560003, 134262306a36Sopenharmony_ci 0x007e0403 134362306a36Sopenharmony_ci }; 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci /* WL Rx Low gain off */ 134662306a36Sopenharmony_ci static const u32 wl_rx_low_gain_off[] = { 134762306a36Sopenharmony_ci 0xff000003, 0xf4120003, 0xf5100003, 0xf60e0003, 0xf70c0003, 134862306a36Sopenharmony_ci 0xf80a0003, 0xf3140003, 0xf2160003, 0xf1180003, 0xf01a0003, 134962306a36Sopenharmony_ci 0xef1c0003, 0xee1e0003, 0xed200003, 0xec220003, 0xeb240003, 135062306a36Sopenharmony_ci 0xea260003, 0xe9280003, 0xe82a0003, 0xe72c0003, 0xe62e0003, 135162306a36Sopenharmony_ci 0xe5300003, 0xc8320003, 0xc7340003, 0xc6360003, 0xc5380003, 135262306a36Sopenharmony_ci 0xc43a0003, 0xc33c0003, 0xc23e0003, 0xc1400003, 0xc0420003, 135362306a36Sopenharmony_ci 0xa5440003, 0xa4460003, 0xa3480003, 0xa24a0003, 0xa14c0003, 135462306a36Sopenharmony_ci 0x834e0003, 0x82500003, 0x81520003, 0x80540003, 0x65560003, 135562306a36Sopenharmony_ci 0x007e0403 135662306a36Sopenharmony_ci }; 135762306a36Sopenharmony_ci u8 i; 135862306a36Sopenharmony_ci 135962306a36Sopenharmony_ci if (low_gain == coex_dm->cur_wl_rx_low_gain_en) 136062306a36Sopenharmony_ci return; 136162306a36Sopenharmony_ci 136262306a36Sopenharmony_ci coex_dm->cur_wl_rx_low_gain_en = low_gain; 136362306a36Sopenharmony_ci 136462306a36Sopenharmony_ci if (coex_dm->cur_wl_rx_low_gain_en) { 136562306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table On!\n"); 136662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++) 136762306a36Sopenharmony_ci rtw_write32(rtwdev, REG_RX_GAIN_EN, wl_rx_low_gain_on[i]); 136862306a36Sopenharmony_ci 136962306a36Sopenharmony_ci /* set Rx filter corner RCK offset */ 137062306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x1); 137162306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x3f); 137262306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x1); 137362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x3f); 137462306a36Sopenharmony_ci } else { 137562306a36Sopenharmony_ci rtw_dbg(rtwdev, RTW_DBG_COEX, "[BTCoex], Hi-Li Table Off!\n"); 137662306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++) 137762306a36Sopenharmony_ci rtw_write32(rtwdev, 0x81c, wl_rx_low_gain_off[i]); 137862306a36Sopenharmony_ci 137962306a36Sopenharmony_ci /* set Rx filter corner RCK offset */ 138062306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK, 0x3f, 0x4); 138162306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_RCKD, 0x2, 0x0); 138262306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK, 0x3f, 0x4); 138362306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_B, RF_RCKD, 0x2, 0x0); 138462306a36Sopenharmony_ci } 138562306a36Sopenharmony_ci} 138662306a36Sopenharmony_ci 138762306a36Sopenharmony_cistatic void rtw8822b_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path, 138862306a36Sopenharmony_ci u8 tx_pwr_idx_offset, 138962306a36Sopenharmony_ci s8 *txagc_idx, u8 *swing_idx) 139062306a36Sopenharmony_ci{ 139162306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 139262306a36Sopenharmony_ci s8 delta_pwr_idx = dm_info->delta_power_index[path]; 139362306a36Sopenharmony_ci u8 swing_upper_bound = dm_info->default_ofdm_index + 10; 139462306a36Sopenharmony_ci u8 swing_lower_bound = 0; 139562306a36Sopenharmony_ci u8 max_tx_pwr_idx_offset = 0xf; 139662306a36Sopenharmony_ci s8 agc_index = 0; 139762306a36Sopenharmony_ci u8 swing_index = dm_info->default_ofdm_index; 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_ci tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset); 140062306a36Sopenharmony_ci 140162306a36Sopenharmony_ci if (delta_pwr_idx >= 0) { 140262306a36Sopenharmony_ci if (delta_pwr_idx <= tx_pwr_idx_offset) { 140362306a36Sopenharmony_ci agc_index = delta_pwr_idx; 140462306a36Sopenharmony_ci swing_index = dm_info->default_ofdm_index; 140562306a36Sopenharmony_ci } else if (delta_pwr_idx > tx_pwr_idx_offset) { 140662306a36Sopenharmony_ci agc_index = tx_pwr_idx_offset; 140762306a36Sopenharmony_ci swing_index = dm_info->default_ofdm_index + 140862306a36Sopenharmony_ci delta_pwr_idx - tx_pwr_idx_offset; 140962306a36Sopenharmony_ci swing_index = min_t(u8, swing_index, swing_upper_bound); 141062306a36Sopenharmony_ci } 141162306a36Sopenharmony_ci } else { 141262306a36Sopenharmony_ci if (dm_info->default_ofdm_index > abs(delta_pwr_idx)) 141362306a36Sopenharmony_ci swing_index = 141462306a36Sopenharmony_ci dm_info->default_ofdm_index + delta_pwr_idx; 141562306a36Sopenharmony_ci else 141662306a36Sopenharmony_ci swing_index = swing_lower_bound; 141762306a36Sopenharmony_ci swing_index = max_t(u8, swing_index, swing_lower_bound); 141862306a36Sopenharmony_ci 141962306a36Sopenharmony_ci agc_index = 0; 142062306a36Sopenharmony_ci } 142162306a36Sopenharmony_ci 142262306a36Sopenharmony_ci if (swing_index >= RTW_TXSCALE_SIZE) { 142362306a36Sopenharmony_ci rtw_warn(rtwdev, "swing index overflow\n"); 142462306a36Sopenharmony_ci swing_index = RTW_TXSCALE_SIZE - 1; 142562306a36Sopenharmony_ci } 142662306a36Sopenharmony_ci *txagc_idx = agc_index; 142762306a36Sopenharmony_ci *swing_idx = swing_index; 142862306a36Sopenharmony_ci} 142962306a36Sopenharmony_ci 143062306a36Sopenharmony_cistatic void rtw8822b_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path, 143162306a36Sopenharmony_ci u8 pwr_idx_offset) 143262306a36Sopenharmony_ci{ 143362306a36Sopenharmony_ci s8 txagc_idx; 143462306a36Sopenharmony_ci u8 swing_idx; 143562306a36Sopenharmony_ci u32 reg1, reg2; 143662306a36Sopenharmony_ci 143762306a36Sopenharmony_ci if (path == RF_PATH_A) { 143862306a36Sopenharmony_ci reg1 = 0xc94; 143962306a36Sopenharmony_ci reg2 = 0xc1c; 144062306a36Sopenharmony_ci } else if (path == RF_PATH_B) { 144162306a36Sopenharmony_ci reg1 = 0xe94; 144262306a36Sopenharmony_ci reg2 = 0xe1c; 144362306a36Sopenharmony_ci } else { 144462306a36Sopenharmony_ci return; 144562306a36Sopenharmony_ci } 144662306a36Sopenharmony_ci 144762306a36Sopenharmony_ci rtw8822b_txagc_swing_offset(rtwdev, path, pwr_idx_offset, 144862306a36Sopenharmony_ci &txagc_idx, &swing_idx); 144962306a36Sopenharmony_ci rtw_write32_mask(rtwdev, reg1, GENMASK(29, 25), txagc_idx); 145062306a36Sopenharmony_ci rtw_write32_mask(rtwdev, reg2, GENMASK(31, 21), 145162306a36Sopenharmony_ci rtw8822b_txscale_tbl[swing_idx]); 145262306a36Sopenharmony_ci} 145362306a36Sopenharmony_ci 145462306a36Sopenharmony_cistatic void rtw8822b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path) 145562306a36Sopenharmony_ci{ 145662306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 145762306a36Sopenharmony_ci u8 pwr_idx_offset, tx_pwr_idx; 145862306a36Sopenharmony_ci u8 channel = rtwdev->hal.current_channel; 145962306a36Sopenharmony_ci u8 band_width = rtwdev->hal.current_band_width; 146062306a36Sopenharmony_ci u8 regd = rtw_regd_get(rtwdev); 146162306a36Sopenharmony_ci u8 tx_rate = dm_info->tx_rate; 146262306a36Sopenharmony_ci u8 max_pwr_idx = rtwdev->chip->max_power_index; 146362306a36Sopenharmony_ci 146462306a36Sopenharmony_ci tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate, 146562306a36Sopenharmony_ci band_width, channel, regd); 146662306a36Sopenharmony_ci 146762306a36Sopenharmony_ci tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx); 146862306a36Sopenharmony_ci 146962306a36Sopenharmony_ci pwr_idx_offset = max_pwr_idx - tx_pwr_idx; 147062306a36Sopenharmony_ci 147162306a36Sopenharmony_ci rtw8822b_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset); 147262306a36Sopenharmony_ci} 147362306a36Sopenharmony_ci 147462306a36Sopenharmony_cistatic void rtw8822b_phy_pwrtrack_path(struct rtw_dev *rtwdev, 147562306a36Sopenharmony_ci struct rtw_swing_table *swing_table, 147662306a36Sopenharmony_ci u8 path) 147762306a36Sopenharmony_ci{ 147862306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 147962306a36Sopenharmony_ci u8 power_idx_cur, power_idx_last; 148062306a36Sopenharmony_ci u8 delta; 148162306a36Sopenharmony_ci 148262306a36Sopenharmony_ci /* 8822B only has one thermal meter at PATH A */ 148362306a36Sopenharmony_ci delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A); 148462306a36Sopenharmony_ci 148562306a36Sopenharmony_ci power_idx_last = dm_info->delta_power_index[path]; 148662306a36Sopenharmony_ci power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, 148762306a36Sopenharmony_ci path, RF_PATH_A, delta); 148862306a36Sopenharmony_ci 148962306a36Sopenharmony_ci /* if delta of power indexes are the same, just skip */ 149062306a36Sopenharmony_ci if (power_idx_cur == power_idx_last) 149162306a36Sopenharmony_ci return; 149262306a36Sopenharmony_ci 149362306a36Sopenharmony_ci dm_info->delta_power_index[path] = power_idx_cur; 149462306a36Sopenharmony_ci rtw8822b_pwrtrack_set(rtwdev, path); 149562306a36Sopenharmony_ci} 149662306a36Sopenharmony_ci 149762306a36Sopenharmony_cistatic void rtw8822b_phy_pwrtrack(struct rtw_dev *rtwdev) 149862306a36Sopenharmony_ci{ 149962306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 150062306a36Sopenharmony_ci struct rtw_swing_table swing_table; 150162306a36Sopenharmony_ci u8 thermal_value, path; 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci rtw_phy_config_swing_table(rtwdev, &swing_table); 150462306a36Sopenharmony_ci 150562306a36Sopenharmony_ci if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff) 150662306a36Sopenharmony_ci return; 150762306a36Sopenharmony_ci 150862306a36Sopenharmony_ci thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00); 150962306a36Sopenharmony_ci 151062306a36Sopenharmony_ci rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A); 151162306a36Sopenharmony_ci 151262306a36Sopenharmony_ci if (dm_info->pwr_trk_init_trigger) 151362306a36Sopenharmony_ci dm_info->pwr_trk_init_trigger = false; 151462306a36Sopenharmony_ci else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value, 151562306a36Sopenharmony_ci RF_PATH_A)) 151662306a36Sopenharmony_ci goto iqk; 151762306a36Sopenharmony_ci 151862306a36Sopenharmony_ci for (path = 0; path < rtwdev->hal.rf_path_num; path++) 151962306a36Sopenharmony_ci rtw8822b_phy_pwrtrack_path(rtwdev, &swing_table, path); 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ciiqk: 152262306a36Sopenharmony_ci if (rtw_phy_pwrtrack_need_iqk(rtwdev)) 152362306a36Sopenharmony_ci rtw8822b_do_iqk(rtwdev); 152462306a36Sopenharmony_ci} 152562306a36Sopenharmony_ci 152662306a36Sopenharmony_cistatic void rtw8822b_pwr_track(struct rtw_dev *rtwdev) 152762306a36Sopenharmony_ci{ 152862306a36Sopenharmony_ci struct rtw_efuse *efuse = &rtwdev->efuse; 152962306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 153062306a36Sopenharmony_ci 153162306a36Sopenharmony_ci if (efuse->power_track_type != 0) 153262306a36Sopenharmony_ci return; 153362306a36Sopenharmony_ci 153462306a36Sopenharmony_ci if (!dm_info->pwr_trk_triggered) { 153562306a36Sopenharmony_ci rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, 153662306a36Sopenharmony_ci GENMASK(17, 16), 0x03); 153762306a36Sopenharmony_ci dm_info->pwr_trk_triggered = true; 153862306a36Sopenharmony_ci return; 153962306a36Sopenharmony_ci } 154062306a36Sopenharmony_ci 154162306a36Sopenharmony_ci rtw8822b_phy_pwrtrack(rtwdev); 154262306a36Sopenharmony_ci dm_info->pwr_trk_triggered = false; 154362306a36Sopenharmony_ci} 154462306a36Sopenharmony_ci 154562306a36Sopenharmony_cistatic void rtw8822b_bf_config_bfee_su(struct rtw_dev *rtwdev, 154662306a36Sopenharmony_ci struct rtw_vif *vif, 154762306a36Sopenharmony_ci struct rtw_bfee *bfee, bool enable) 154862306a36Sopenharmony_ci{ 154962306a36Sopenharmony_ci if (enable) 155062306a36Sopenharmony_ci rtw_bf_enable_bfee_su(rtwdev, vif, bfee); 155162306a36Sopenharmony_ci else 155262306a36Sopenharmony_ci rtw_bf_remove_bfee_su(rtwdev, bfee); 155362306a36Sopenharmony_ci} 155462306a36Sopenharmony_ci 155562306a36Sopenharmony_cistatic void rtw8822b_bf_config_bfee_mu(struct rtw_dev *rtwdev, 155662306a36Sopenharmony_ci struct rtw_vif *vif, 155762306a36Sopenharmony_ci struct rtw_bfee *bfee, bool enable) 155862306a36Sopenharmony_ci{ 155962306a36Sopenharmony_ci if (enable) 156062306a36Sopenharmony_ci rtw_bf_enable_bfee_mu(rtwdev, vif, bfee); 156162306a36Sopenharmony_ci else 156262306a36Sopenharmony_ci rtw_bf_remove_bfee_mu(rtwdev, bfee); 156362306a36Sopenharmony_ci} 156462306a36Sopenharmony_ci 156562306a36Sopenharmony_cistatic void rtw8822b_bf_config_bfee(struct rtw_dev *rtwdev, struct rtw_vif *vif, 156662306a36Sopenharmony_ci struct rtw_bfee *bfee, bool enable) 156762306a36Sopenharmony_ci{ 156862306a36Sopenharmony_ci if (bfee->role == RTW_BFEE_SU) 156962306a36Sopenharmony_ci rtw8822b_bf_config_bfee_su(rtwdev, vif, bfee, enable); 157062306a36Sopenharmony_ci else if (bfee->role == RTW_BFEE_MU) 157162306a36Sopenharmony_ci rtw8822b_bf_config_bfee_mu(rtwdev, vif, bfee, enable); 157262306a36Sopenharmony_ci else 157362306a36Sopenharmony_ci rtw_warn(rtwdev, "wrong bfee role\n"); 157462306a36Sopenharmony_ci} 157562306a36Sopenharmony_ci 157662306a36Sopenharmony_cistatic void rtw8822b_adaptivity_init(struct rtw_dev *rtwdev) 157762306a36Sopenharmony_ci{ 157862306a36Sopenharmony_ci rtw_phy_set_edcca_th(rtwdev, RTW8822B_EDCCA_MAX, RTW8822B_EDCCA_MAX); 157962306a36Sopenharmony_ci 158062306a36Sopenharmony_ci /* mac edcca state setting */ 158162306a36Sopenharmony_ci rtw_write32_clr(rtwdev, REG_TX_PTCL_CTRL, BIT_DIS_EDCCA); 158262306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_RD_CTRL, BIT_EDCCA_MSK_CNTDOWN_EN); 158362306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_EDCCA_SOURCE, BIT_SOURCE_OPTION, 158462306a36Sopenharmony_ci RTW8822B_EDCCA_SRC_DEF); 158562306a36Sopenharmony_ci rtw_write32_mask(rtwdev, REG_EDCCA_POW_MA, BIT_MA_LEVEL, 0); 158662306a36Sopenharmony_ci 158762306a36Sopenharmony_ci /* edcca decision opt */ 158862306a36Sopenharmony_ci rtw_write32_set(rtwdev, REG_EDCCA_DECISION, BIT_EDCCA_OPTION); 158962306a36Sopenharmony_ci} 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_cistatic void rtw8822b_adaptivity(struct rtw_dev *rtwdev) 159262306a36Sopenharmony_ci{ 159362306a36Sopenharmony_ci struct rtw_dm_info *dm_info = &rtwdev->dm_info; 159462306a36Sopenharmony_ci s8 l2h, h2l; 159562306a36Sopenharmony_ci u8 igi; 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_ci igi = dm_info->igi_history[0]; 159862306a36Sopenharmony_ci if (dm_info->edcca_mode == RTW_EDCCA_NORMAL) { 159962306a36Sopenharmony_ci l2h = max_t(s8, igi + EDCCA_IGI_L2H_DIFF, EDCCA_TH_L2H_LB); 160062306a36Sopenharmony_ci h2l = l2h - EDCCA_L2H_H2L_DIFF_NORMAL; 160162306a36Sopenharmony_ci } else { 160262306a36Sopenharmony_ci l2h = min_t(s8, igi, dm_info->l2h_th_ini); 160362306a36Sopenharmony_ci h2l = l2h - EDCCA_L2H_H2L_DIFF; 160462306a36Sopenharmony_ci } 160562306a36Sopenharmony_ci 160662306a36Sopenharmony_ci rtw_phy_set_edcca_th(rtwdev, l2h, h2l); 160762306a36Sopenharmony_ci} 160862306a36Sopenharmony_ci 160962306a36Sopenharmony_cistatic void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev, 161062306a36Sopenharmony_ci struct rtw_tx_pkt_info *pkt_info, 161162306a36Sopenharmony_ci u8 *txdesc) 161262306a36Sopenharmony_ci{ 161362306a36Sopenharmony_ci size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_ci fill_txdesc_checksum_common(txdesc, words); 161662306a36Sopenharmony_ci} 161762306a36Sopenharmony_ci 161862306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = { 161962306a36Sopenharmony_ci {0x0086, 162062306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 162162306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 162262306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 162362306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 162462306a36Sopenharmony_ci {0x0086, 162562306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 162662306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 162762306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 162862306a36Sopenharmony_ci RTW_PWR_CMD_POLLING, BIT(1), BIT(1)}, 162962306a36Sopenharmony_ci {0x004A, 163062306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 163162306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 163262306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 163362306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 163462306a36Sopenharmony_ci {0x0005, 163562306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 163662306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 163762306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 163862306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(3) | BIT(4) | BIT(7), 0}, 163962306a36Sopenharmony_ci {0x0300, 164062306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 164162306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 164262306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 164362306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 164462306a36Sopenharmony_ci {0x0301, 164562306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 164662306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 164762306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 164862306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 164962306a36Sopenharmony_ci {0xFFFF, 165062306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 165162306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 165262306a36Sopenharmony_ci 0, 165362306a36Sopenharmony_ci RTW_PWR_CMD_END, 0, 0}, 165462306a36Sopenharmony_ci}; 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8822b[] = { 165762306a36Sopenharmony_ci {0x0012, 165862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 165962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 166062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 166162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), 0}, 166262306a36Sopenharmony_ci {0x0012, 166362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 166462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 166562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 166662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 166762306a36Sopenharmony_ci {0x0020, 166862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 166962306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 167062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 167162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 167262306a36Sopenharmony_ci {0x0001, 167362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 167462306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 167562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 167662306a36Sopenharmony_ci RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS}, 167762306a36Sopenharmony_ci {0x0000, 167862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 167962306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 168062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 168162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), 0}, 168262306a36Sopenharmony_ci {0x0005, 168362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 168462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 168562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 168662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0}, 168762306a36Sopenharmony_ci {0x0075, 168862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 168962306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 169062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 169162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 169262306a36Sopenharmony_ci {0x0006, 169362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 169462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 169562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 169662306a36Sopenharmony_ci RTW_PWR_CMD_POLLING, BIT(1), BIT(1)}, 169762306a36Sopenharmony_ci {0x0075, 169862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 169962306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 170062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 170162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 170262306a36Sopenharmony_ci {0xFF1A, 170362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 170462306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 170562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 170662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 170762306a36Sopenharmony_ci {0x0006, 170862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 170962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 171062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 171162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 171262306a36Sopenharmony_ci {0x0005, 171362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 171462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 171562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 171662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(7), 0}, 171762306a36Sopenharmony_ci {0x0005, 171862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 171962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 172062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 172162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0}, 172262306a36Sopenharmony_ci {0x10C3, 172362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 172462306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 172562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 172662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 172762306a36Sopenharmony_ci {0x0005, 172862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 172962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 173062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 173162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 173262306a36Sopenharmony_ci {0x0005, 173362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 173462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 173562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 173662306a36Sopenharmony_ci RTW_PWR_CMD_POLLING, BIT(0), 0}, 173762306a36Sopenharmony_ci {0x0020, 173862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 173962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 174062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 174162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(3), BIT(3)}, 174262306a36Sopenharmony_ci {0x10A8, 174362306a36Sopenharmony_ci RTW_PWR_CUT_C_MSK, 174462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 174562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 174662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 174762306a36Sopenharmony_ci {0x10A9, 174862306a36Sopenharmony_ci RTW_PWR_CUT_C_MSK, 174962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 175062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 175162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0xef}, 175262306a36Sopenharmony_ci {0x10AA, 175362306a36Sopenharmony_ci RTW_PWR_CUT_C_MSK, 175462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 175562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 175662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x0c}, 175762306a36Sopenharmony_ci {0x0068, 175862306a36Sopenharmony_ci RTW_PWR_CUT_C_MSK, 175962306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 176062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 176162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(4), BIT(4)}, 176262306a36Sopenharmony_ci {0x0029, 176362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 176462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 176562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 176662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0xF9}, 176762306a36Sopenharmony_ci {0x0024, 176862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 176962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 177062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 177162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(2), 0}, 177262306a36Sopenharmony_ci {0x0074, 177362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 177462306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 177562306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 177662306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 177762306a36Sopenharmony_ci {0x00AF, 177862306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 177962306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 178062306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 178162306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 178262306a36Sopenharmony_ci {0xFFFF, 178362306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 178462306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 178562306a36Sopenharmony_ci 0, 178662306a36Sopenharmony_ci RTW_PWR_CMD_END, 0, 0}, 178762306a36Sopenharmony_ci}; 178862306a36Sopenharmony_ci 178962306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8822b[] = { 179062306a36Sopenharmony_ci {0x0003, 179162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 179262306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 179362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 179462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(2), 0}, 179562306a36Sopenharmony_ci {0x0093, 179662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 179762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 179862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 179962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(3), 0}, 180062306a36Sopenharmony_ci {0x001F, 180162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 180262306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 180362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 180462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 180562306a36Sopenharmony_ci {0x00EF, 180662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 180762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 180862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 180962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 181062306a36Sopenharmony_ci {0xFF1A, 181162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 181262306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 181362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 181462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x30}, 181562306a36Sopenharmony_ci {0x0049, 181662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 181762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 181862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 181962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), 0}, 182062306a36Sopenharmony_ci {0x0006, 182162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 182262306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 182362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 182462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 182562306a36Sopenharmony_ci {0x0002, 182662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 182762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 182862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 182962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), 0}, 183062306a36Sopenharmony_ci {0x10C3, 183162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 183262306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 183362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 183462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 183562306a36Sopenharmony_ci {0x0005, 183662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 183762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 183862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 183962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), BIT(1)}, 184062306a36Sopenharmony_ci {0x0005, 184162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 184262306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 184362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 184462306a36Sopenharmony_ci RTW_PWR_CMD_POLLING, BIT(1), 0}, 184562306a36Sopenharmony_ci {0x0020, 184662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 184762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 184862306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 184962306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(3), 0}, 185062306a36Sopenharmony_ci {0x0000, 185162306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 185262306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 185362306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 185462306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), BIT(5)}, 185562306a36Sopenharmony_ci {0xFFFF, 185662306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 185762306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 185862306a36Sopenharmony_ci 0, 185962306a36Sopenharmony_ci RTW_PWR_CMD_END, 0, 0}, 186062306a36Sopenharmony_ci}; 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = { 186362306a36Sopenharmony_ci {0x0005, 186462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 186562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 186662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 186762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(7), BIT(7)}, 186862306a36Sopenharmony_ci {0x0007, 186962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 187062306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 187162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 187262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x20}, 187362306a36Sopenharmony_ci {0x0067, 187462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 187562306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 187662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 187762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), 0}, 187862306a36Sopenharmony_ci {0x0005, 187962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 188062306a36Sopenharmony_ci RTW_PWR_INTF_PCI_MSK, 188162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 188262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(2), BIT(2)}, 188362306a36Sopenharmony_ci {0x004A, 188462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 188562306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK, 188662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 188762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 188862306a36Sopenharmony_ci {0x0067, 188962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 189062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 189162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 189262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(5), 0}, 189362306a36Sopenharmony_ci {0x0067, 189462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 189562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 189662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 189762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(4), 0}, 189862306a36Sopenharmony_ci {0x004F, 189962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 190062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 190162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 190262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), 0}, 190362306a36Sopenharmony_ci {0x0067, 190462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 190562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 190662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 190762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), 0}, 190862306a36Sopenharmony_ci {0x0046, 190962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 191062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 191162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 191262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(6), BIT(6)}, 191362306a36Sopenharmony_ci {0x0067, 191462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 191562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 191662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 191762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(2), 0}, 191862306a36Sopenharmony_ci {0x0046, 191962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 192062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 192162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 192262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(7), BIT(7)}, 192362306a36Sopenharmony_ci {0x0062, 192462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 192562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 192662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 192762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(4), BIT(4)}, 192862306a36Sopenharmony_ci {0x0081, 192962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 193062306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 193162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 193262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(7) | BIT(6), 0}, 193362306a36Sopenharmony_ci {0x0005, 193462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 193562306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK, 193662306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 193762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)}, 193862306a36Sopenharmony_ci {0x0086, 193962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 194062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 194162306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 194262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(0), BIT(0)}, 194362306a36Sopenharmony_ci {0x0086, 194462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 194562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 194662306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 194762306a36Sopenharmony_ci RTW_PWR_CMD_POLLING, BIT(1), 0}, 194862306a36Sopenharmony_ci {0x0090, 194962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 195062306a36Sopenharmony_ci RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_PCI_MSK, 195162306a36Sopenharmony_ci RTW_PWR_ADDR_MAC, 195262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, BIT(1), 0}, 195362306a36Sopenharmony_ci {0x0044, 195462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 195562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 195662306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 195762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0}, 195862306a36Sopenharmony_ci {0x0040, 195962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 196062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 196162306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 196262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x90}, 196362306a36Sopenharmony_ci {0x0041, 196462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 196562306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 196662306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 196762306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x00}, 196862306a36Sopenharmony_ci {0x0042, 196962306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 197062306a36Sopenharmony_ci RTW_PWR_INTF_SDIO_MSK, 197162306a36Sopenharmony_ci RTW_PWR_ADDR_SDIO, 197262306a36Sopenharmony_ci RTW_PWR_CMD_WRITE, 0xFF, 0x04}, 197362306a36Sopenharmony_ci {0xFFFF, 197462306a36Sopenharmony_ci RTW_PWR_CUT_ALL_MSK, 197562306a36Sopenharmony_ci RTW_PWR_INTF_ALL_MSK, 197662306a36Sopenharmony_ci 0, 197762306a36Sopenharmony_ci RTW_PWR_CMD_END, 0, 0}, 197862306a36Sopenharmony_ci}; 197962306a36Sopenharmony_ci 198062306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = { 198162306a36Sopenharmony_ci trans_carddis_to_cardemu_8822b, 198262306a36Sopenharmony_ci trans_cardemu_to_act_8822b, 198362306a36Sopenharmony_ci NULL 198462306a36Sopenharmony_ci}; 198562306a36Sopenharmony_ci 198662306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = { 198762306a36Sopenharmony_ci trans_act_to_cardemu_8822b, 198862306a36Sopenharmony_ci trans_cardemu_to_carddis_8822b, 198962306a36Sopenharmony_ci NULL 199062306a36Sopenharmony_ci}; 199162306a36Sopenharmony_ci 199262306a36Sopenharmony_cistatic const struct rtw_intf_phy_para usb2_param_8822b[] = { 199362306a36Sopenharmony_ci {0xFFFF, 0x00, 199462306a36Sopenharmony_ci RTW_IP_SEL_PHY, 199562306a36Sopenharmony_ci RTW_INTF_PHY_CUT_ALL, 199662306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 199762306a36Sopenharmony_ci}; 199862306a36Sopenharmony_ci 199962306a36Sopenharmony_cistatic const struct rtw_intf_phy_para usb3_param_8822b[] = { 200062306a36Sopenharmony_ci {0x0001, 0xA841, 200162306a36Sopenharmony_ci RTW_IP_SEL_PHY, 200262306a36Sopenharmony_ci RTW_INTF_PHY_CUT_D, 200362306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 200462306a36Sopenharmony_ci {0xFFFF, 0x0000, 200562306a36Sopenharmony_ci RTW_IP_SEL_PHY, 200662306a36Sopenharmony_ci RTW_INTF_PHY_CUT_ALL, 200762306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 200862306a36Sopenharmony_ci}; 200962306a36Sopenharmony_ci 201062306a36Sopenharmony_cistatic const struct rtw_intf_phy_para pcie_gen1_param_8822b[] = { 201162306a36Sopenharmony_ci {0x0001, 0xA841, 201262306a36Sopenharmony_ci RTW_IP_SEL_PHY, 201362306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 201462306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 201562306a36Sopenharmony_ci {0x0002, 0x60C6, 201662306a36Sopenharmony_ci RTW_IP_SEL_PHY, 201762306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 201862306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 201962306a36Sopenharmony_ci {0x0008, 0x3596, 202062306a36Sopenharmony_ci RTW_IP_SEL_PHY, 202162306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 202262306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 202362306a36Sopenharmony_ci {0x0009, 0x321C, 202462306a36Sopenharmony_ci RTW_IP_SEL_PHY, 202562306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 202662306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 202762306a36Sopenharmony_ci {0x000A, 0x9623, 202862306a36Sopenharmony_ci RTW_IP_SEL_PHY, 202962306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 203062306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 203162306a36Sopenharmony_ci {0x0020, 0x94FF, 203262306a36Sopenharmony_ci RTW_IP_SEL_PHY, 203362306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 203462306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 203562306a36Sopenharmony_ci {0x0021, 0xFFCF, 203662306a36Sopenharmony_ci RTW_IP_SEL_PHY, 203762306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 203862306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 203962306a36Sopenharmony_ci {0x0026, 0xC006, 204062306a36Sopenharmony_ci RTW_IP_SEL_PHY, 204162306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 204262306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 204362306a36Sopenharmony_ci {0x0029, 0xFF0E, 204462306a36Sopenharmony_ci RTW_IP_SEL_PHY, 204562306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 204662306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 204762306a36Sopenharmony_ci {0x002A, 0x1840, 204862306a36Sopenharmony_ci RTW_IP_SEL_PHY, 204962306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 205062306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 205162306a36Sopenharmony_ci {0xFFFF, 0x0000, 205262306a36Sopenharmony_ci RTW_IP_SEL_PHY, 205362306a36Sopenharmony_ci RTW_INTF_PHY_CUT_ALL, 205462306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 205562306a36Sopenharmony_ci}; 205662306a36Sopenharmony_ci 205762306a36Sopenharmony_cistatic const struct rtw_intf_phy_para pcie_gen2_param_8822b[] = { 205862306a36Sopenharmony_ci {0x0001, 0xA841, 205962306a36Sopenharmony_ci RTW_IP_SEL_PHY, 206062306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 206162306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 206262306a36Sopenharmony_ci {0x0002, 0x60C6, 206362306a36Sopenharmony_ci RTW_IP_SEL_PHY, 206462306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 206562306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 206662306a36Sopenharmony_ci {0x0008, 0x3597, 206762306a36Sopenharmony_ci RTW_IP_SEL_PHY, 206862306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 206962306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 207062306a36Sopenharmony_ci {0x0009, 0x321C, 207162306a36Sopenharmony_ci RTW_IP_SEL_PHY, 207262306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 207362306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 207462306a36Sopenharmony_ci {0x000A, 0x9623, 207562306a36Sopenharmony_ci RTW_IP_SEL_PHY, 207662306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 207762306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 207862306a36Sopenharmony_ci {0x0020, 0x94FF, 207962306a36Sopenharmony_ci RTW_IP_SEL_PHY, 208062306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 208162306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 208262306a36Sopenharmony_ci {0x0021, 0xFFCF, 208362306a36Sopenharmony_ci RTW_IP_SEL_PHY, 208462306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 208562306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 208662306a36Sopenharmony_ci {0x0026, 0xC006, 208762306a36Sopenharmony_ci RTW_IP_SEL_PHY, 208862306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 208962306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 209062306a36Sopenharmony_ci {0x0029, 0xFF0E, 209162306a36Sopenharmony_ci RTW_IP_SEL_PHY, 209262306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 209362306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 209462306a36Sopenharmony_ci {0x002A, 0x3040, 209562306a36Sopenharmony_ci RTW_IP_SEL_PHY, 209662306a36Sopenharmony_ci RTW_INTF_PHY_CUT_C, 209762306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 209862306a36Sopenharmony_ci {0xFFFF, 0x0000, 209962306a36Sopenharmony_ci RTW_IP_SEL_PHY, 210062306a36Sopenharmony_ci RTW_INTF_PHY_CUT_ALL, 210162306a36Sopenharmony_ci RTW_INTF_PHY_PLATFORM_ALL}, 210262306a36Sopenharmony_ci}; 210362306a36Sopenharmony_ci 210462306a36Sopenharmony_cistatic const struct rtw_intf_phy_para_table phy_para_table_8822b = { 210562306a36Sopenharmony_ci .usb2_para = usb2_param_8822b, 210662306a36Sopenharmony_ci .usb3_para = usb3_param_8822b, 210762306a36Sopenharmony_ci .gen1_para = pcie_gen1_param_8822b, 210862306a36Sopenharmony_ci .gen2_para = pcie_gen2_param_8822b, 210962306a36Sopenharmony_ci .n_usb2_para = ARRAY_SIZE(usb2_param_8822b), 211062306a36Sopenharmony_ci .n_usb3_para = ARRAY_SIZE(usb2_param_8822b), 211162306a36Sopenharmony_ci .n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8822b), 211262306a36Sopenharmony_ci .n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8822b), 211362306a36Sopenharmony_ci}; 211462306a36Sopenharmony_ci 211562306a36Sopenharmony_cistatic const struct rtw_rfe_def rtw8822b_rfe_defs[] = { 211662306a36Sopenharmony_ci [2] = RTW_DEF_RFE(8822b, 2, 2), 211762306a36Sopenharmony_ci [3] = RTW_DEF_RFE(8822b, 3, 0), 211862306a36Sopenharmony_ci [5] = RTW_DEF_RFE(8822b, 5, 5), 211962306a36Sopenharmony_ci}; 212062306a36Sopenharmony_ci 212162306a36Sopenharmony_cistatic const struct rtw_hw_reg rtw8822b_dig[] = { 212262306a36Sopenharmony_ci [0] = { .addr = 0xc50, .mask = 0x7f }, 212362306a36Sopenharmony_ci [1] = { .addr = 0xe50, .mask = 0x7f }, 212462306a36Sopenharmony_ci}; 212562306a36Sopenharmony_ci 212662306a36Sopenharmony_cistatic const struct rtw_ltecoex_addr rtw8822b_ltecoex_addr = { 212762306a36Sopenharmony_ci .ctrl = LTECOEX_ACCESS_CTRL, 212862306a36Sopenharmony_ci .wdata = LTECOEX_WRITE_DATA, 212962306a36Sopenharmony_ci .rdata = LTECOEX_READ_DATA, 213062306a36Sopenharmony_ci}; 213162306a36Sopenharmony_ci 213262306a36Sopenharmony_cistatic const struct rtw_page_table page_table_8822b[] = { 213362306a36Sopenharmony_ci {64, 64, 64, 64, 1}, 213462306a36Sopenharmony_ci {64, 64, 64, 64, 1}, 213562306a36Sopenharmony_ci {64, 64, 0, 0, 1}, 213662306a36Sopenharmony_ci {64, 64, 64, 0, 1}, 213762306a36Sopenharmony_ci {64, 64, 64, 64, 1}, 213862306a36Sopenharmony_ci}; 213962306a36Sopenharmony_ci 214062306a36Sopenharmony_cistatic const struct rtw_rqpn rqpn_table_8822b[] = { 214162306a36Sopenharmony_ci {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 214262306a36Sopenharmony_ci RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 214362306a36Sopenharmony_ci RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 214462306a36Sopenharmony_ci {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 214562306a36Sopenharmony_ci RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 214662306a36Sopenharmony_ci RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 214762306a36Sopenharmony_ci {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 214862306a36Sopenharmony_ci RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH, 214962306a36Sopenharmony_ci RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 215062306a36Sopenharmony_ci {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 215162306a36Sopenharmony_ci RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 215262306a36Sopenharmony_ci RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 215362306a36Sopenharmony_ci {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 215462306a36Sopenharmony_ci RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 215562306a36Sopenharmony_ci RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, 215662306a36Sopenharmony_ci}; 215762306a36Sopenharmony_ci 215862306a36Sopenharmony_cistatic struct rtw_prioq_addrs prioq_addrs_8822b = { 215962306a36Sopenharmony_ci .prio[RTW_DMA_MAPPING_EXTRA] = { 216062306a36Sopenharmony_ci .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2, 216162306a36Sopenharmony_ci }, 216262306a36Sopenharmony_ci .prio[RTW_DMA_MAPPING_LOW] = { 216362306a36Sopenharmony_ci .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2, 216462306a36Sopenharmony_ci }, 216562306a36Sopenharmony_ci .prio[RTW_DMA_MAPPING_NORMAL] = { 216662306a36Sopenharmony_ci .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2, 216762306a36Sopenharmony_ci }, 216862306a36Sopenharmony_ci .prio[RTW_DMA_MAPPING_HIGH] = { 216962306a36Sopenharmony_ci .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2, 217062306a36Sopenharmony_ci }, 217162306a36Sopenharmony_ci .wsize = true, 217262306a36Sopenharmony_ci}; 217362306a36Sopenharmony_ci 217462306a36Sopenharmony_cistatic struct rtw_chip_ops rtw8822b_ops = { 217562306a36Sopenharmony_ci .phy_set_param = rtw8822b_phy_set_param, 217662306a36Sopenharmony_ci .read_efuse = rtw8822b_read_efuse, 217762306a36Sopenharmony_ci .query_rx_desc = rtw8822b_query_rx_desc, 217862306a36Sopenharmony_ci .set_channel = rtw8822b_set_channel, 217962306a36Sopenharmony_ci .mac_init = rtw8822b_mac_init, 218062306a36Sopenharmony_ci .read_rf = rtw_phy_read_rf, 218162306a36Sopenharmony_ci .write_rf = rtw_phy_write_rf_reg_sipi, 218262306a36Sopenharmony_ci .set_tx_power_index = rtw8822b_set_tx_power_index, 218362306a36Sopenharmony_ci .set_antenna = rtw8822b_set_antenna, 218462306a36Sopenharmony_ci .cfg_ldo25 = rtw8822b_cfg_ldo25, 218562306a36Sopenharmony_ci .false_alarm_statistics = rtw8822b_false_alarm_statistics, 218662306a36Sopenharmony_ci .phy_calibration = rtw8822b_phy_calibration, 218762306a36Sopenharmony_ci .pwr_track = rtw8822b_pwr_track, 218862306a36Sopenharmony_ci .config_bfee = rtw8822b_bf_config_bfee, 218962306a36Sopenharmony_ci .set_gid_table = rtw_bf_set_gid_table, 219062306a36Sopenharmony_ci .cfg_csi_rate = rtw_bf_cfg_csi_rate, 219162306a36Sopenharmony_ci .adaptivity_init = rtw8822b_adaptivity_init, 219262306a36Sopenharmony_ci .adaptivity = rtw8822b_adaptivity, 219362306a36Sopenharmony_ci .fill_txdesc_checksum = rtw8822b_fill_txdesc_checksum, 219462306a36Sopenharmony_ci 219562306a36Sopenharmony_ci .coex_set_init = rtw8822b_coex_cfg_init, 219662306a36Sopenharmony_ci .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch, 219762306a36Sopenharmony_ci .coex_set_gnt_fix = rtw8822b_coex_cfg_gnt_fix, 219862306a36Sopenharmony_ci .coex_set_gnt_debug = rtw8822b_coex_cfg_gnt_debug, 219962306a36Sopenharmony_ci .coex_set_rfe_type = rtw8822b_coex_cfg_rfe_type, 220062306a36Sopenharmony_ci .coex_set_wl_tx_power = rtw8822b_coex_cfg_wl_tx_power, 220162306a36Sopenharmony_ci .coex_set_wl_rx_gain = rtw8822b_coex_cfg_wl_rx_gain, 220262306a36Sopenharmony_ci}; 220362306a36Sopenharmony_ci 220462306a36Sopenharmony_ci/* Shared-Antenna Coex Table */ 220562306a36Sopenharmony_cistatic const struct coex_table_para table_sant_8822b[] = { 220662306a36Sopenharmony_ci {0xffffffff, 0xffffffff}, /* case-0 */ 220762306a36Sopenharmony_ci {0x55555555, 0x55555555}, 220862306a36Sopenharmony_ci {0x66555555, 0x66555555}, 220962306a36Sopenharmony_ci {0xaaaaaaaa, 0xaaaaaaaa}, 221062306a36Sopenharmony_ci {0x5a5a5a5a, 0x5a5a5a5a}, 221162306a36Sopenharmony_ci {0xfafafafa, 0xfafafafa}, /* case-5 */ 221262306a36Sopenharmony_ci {0x6a5a5555, 0xaaaaaaaa}, 221362306a36Sopenharmony_ci {0x6a5a56aa, 0x6a5a56aa}, 221462306a36Sopenharmony_ci {0x6a5a5a5a, 0x6a5a5a5a}, 221562306a36Sopenharmony_ci {0x66555555, 0x5a5a5a5a}, 221662306a36Sopenharmony_ci {0x66555555, 0x6a5a5a5a}, /* case-10 */ 221762306a36Sopenharmony_ci {0x66555555, 0xfafafafa}, 221862306a36Sopenharmony_ci {0x66555555, 0x5a5a5aaa}, 221962306a36Sopenharmony_ci {0x66555555, 0x6aaa5aaa}, 222062306a36Sopenharmony_ci {0x66555555, 0xaaaa5aaa}, 222162306a36Sopenharmony_ci {0x66555555, 0xaaaaaaaa}, /* case-15 */ 222262306a36Sopenharmony_ci {0xffff55ff, 0xfafafafa}, 222362306a36Sopenharmony_ci {0xffff55ff, 0x6afa5afa}, 222462306a36Sopenharmony_ci {0xaaffffaa, 0xfafafafa}, 222562306a36Sopenharmony_ci {0xaa5555aa, 0x5a5a5a5a}, 222662306a36Sopenharmony_ci {0xaa5555aa, 0x6a5a5a5a}, /* case-20 */ 222762306a36Sopenharmony_ci {0xaa5555aa, 0xaaaaaaaa}, 222862306a36Sopenharmony_ci {0xffffffff, 0x5a5a5a5a}, 222962306a36Sopenharmony_ci {0xffffffff, 0x5a5a5a5a}, 223062306a36Sopenharmony_ci {0xffffffff, 0x55555555}, 223162306a36Sopenharmony_ci {0xffffffff, 0x6a5a5aaa}, /* case-25 */ 223262306a36Sopenharmony_ci {0x55555555, 0x5a5a5a5a}, 223362306a36Sopenharmony_ci {0x55555555, 0xaaaaaaaa}, 223462306a36Sopenharmony_ci {0x55555555, 0x6a5a6a5a}, 223562306a36Sopenharmony_ci {0x66556655, 0x66556655}, 223662306a36Sopenharmony_ci {0x66556aaa, 0x6a5a6aaa}, /* case-30 */ 223762306a36Sopenharmony_ci {0xffffffff, 0x5aaa5aaa}, 223862306a36Sopenharmony_ci {0x56555555, 0x5a5a5aaa}, 223962306a36Sopenharmony_ci}; 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci/* Non-Shared-Antenna Coex Table */ 224262306a36Sopenharmony_cistatic const struct coex_table_para table_nsant_8822b[] = { 224362306a36Sopenharmony_ci {0xffffffff, 0xffffffff}, /* case-100 */ 224462306a36Sopenharmony_ci {0x55555555, 0x55555555}, 224562306a36Sopenharmony_ci {0x66555555, 0x66555555}, 224662306a36Sopenharmony_ci {0xaaaaaaaa, 0xaaaaaaaa}, 224762306a36Sopenharmony_ci {0x5a5a5a5a, 0x5a5a5a5a}, 224862306a36Sopenharmony_ci {0xfafafafa, 0xfafafafa}, /* case-105 */ 224962306a36Sopenharmony_ci {0x5afa5afa, 0x5afa5afa}, 225062306a36Sopenharmony_ci {0x55555555, 0xfafafafa}, 225162306a36Sopenharmony_ci {0x66555555, 0xfafafafa}, 225262306a36Sopenharmony_ci {0x66555555, 0x5a5a5a5a}, 225362306a36Sopenharmony_ci {0x66555555, 0x6a5a5a5a}, /* case-110 */ 225462306a36Sopenharmony_ci {0x66555555, 0xaaaaaaaa}, 225562306a36Sopenharmony_ci {0xffff55ff, 0xfafafafa}, 225662306a36Sopenharmony_ci {0xffff55ff, 0x5afa5afa}, 225762306a36Sopenharmony_ci {0xffff55ff, 0xaaaaaaaa}, 225862306a36Sopenharmony_ci {0xffff55ff, 0xffff55ff}, /* case-115 */ 225962306a36Sopenharmony_ci {0xaaffffaa, 0x5afa5afa}, 226062306a36Sopenharmony_ci {0xaaffffaa, 0xaaaaaaaa}, 226162306a36Sopenharmony_ci {0xffffffff, 0xfafafafa}, 226262306a36Sopenharmony_ci {0xffffffff, 0x5afa5afa}, 226362306a36Sopenharmony_ci {0xffffffff, 0xaaaaaaaa}, /* case-120 */ 226462306a36Sopenharmony_ci {0x55ff55ff, 0x5afa5afa}, 226562306a36Sopenharmony_ci {0x55ff55ff, 0xaaaaaaaa}, 226662306a36Sopenharmony_ci {0x55ff55ff, 0x55ff55ff} 226762306a36Sopenharmony_ci}; 226862306a36Sopenharmony_ci 226962306a36Sopenharmony_ci/* Shared-Antenna TDMA */ 227062306a36Sopenharmony_cistatic const struct coex_tdma_para tdma_sant_8822b[] = { 227162306a36Sopenharmony_ci { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */ 227262306a36Sopenharmony_ci { {0x61, 0x45, 0x03, 0x11, 0x11} }, 227362306a36Sopenharmony_ci { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 227462306a36Sopenharmony_ci { {0x61, 0x30, 0x03, 0x11, 0x11} }, 227562306a36Sopenharmony_ci { {0x61, 0x20, 0x03, 0x11, 0x11} }, 227662306a36Sopenharmony_ci { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */ 227762306a36Sopenharmony_ci { {0x61, 0x45, 0x03, 0x11, 0x10} }, 227862306a36Sopenharmony_ci { {0x61, 0x3a, 0x03, 0x11, 0x10} }, 227962306a36Sopenharmony_ci { {0x61, 0x30, 0x03, 0x11, 0x10} }, 228062306a36Sopenharmony_ci { {0x61, 0x20, 0x03, 0x11, 0x10} }, 228162306a36Sopenharmony_ci { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */ 228262306a36Sopenharmony_ci { {0x61, 0x08, 0x03, 0x11, 0x14} }, 228362306a36Sopenharmony_ci { {0x61, 0x08, 0x03, 0x10, 0x14} }, 228462306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x54} }, 228562306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x55} }, 228662306a36Sopenharmony_ci { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */ 228762306a36Sopenharmony_ci { {0x51, 0x45, 0x03, 0x10, 0x50} }, 228862306a36Sopenharmony_ci { {0x51, 0x3a, 0x03, 0x10, 0x50} }, 228962306a36Sopenharmony_ci { {0x51, 0x30, 0x03, 0x10, 0x50} }, 229062306a36Sopenharmony_ci { {0x51, 0x20, 0x03, 0x10, 0x50} }, 229162306a36Sopenharmony_ci { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */ 229262306a36Sopenharmony_ci { {0x51, 0x4a, 0x03, 0x10, 0x50} }, 229362306a36Sopenharmony_ci { {0x51, 0x0c, 0x03, 0x10, 0x54} }, 229462306a36Sopenharmony_ci { {0x55, 0x08, 0x03, 0x10, 0x54} }, 229562306a36Sopenharmony_ci { {0x65, 0x10, 0x03, 0x11, 0x10} }, 229662306a36Sopenharmony_ci { {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */ 229762306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x50} }, 229862306a36Sopenharmony_ci { {0x61, 0x08, 0x03, 0x11, 0x11} } 229962306a36Sopenharmony_ci}; 230062306a36Sopenharmony_ci 230162306a36Sopenharmony_ci/* Non-Shared-Antenna TDMA */ 230262306a36Sopenharmony_cistatic const struct coex_tdma_para tdma_nsant_8822b[] = { 230362306a36Sopenharmony_ci { {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-100 */ 230462306a36Sopenharmony_ci { {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */ 230562306a36Sopenharmony_ci { {0x61, 0x3a, 0x03, 0x11, 0x11} }, 230662306a36Sopenharmony_ci { {0x61, 0x30, 0x03, 0x11, 0x11} }, 230762306a36Sopenharmony_ci { {0x61, 0x20, 0x03, 0x11, 0x11} }, 230862306a36Sopenharmony_ci { {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */ 230962306a36Sopenharmony_ci { {0x61, 0x45, 0x03, 0x11, 0x10} }, 231062306a36Sopenharmony_ci { {0x61, 0x3a, 0x03, 0x11, 0x10} }, 231162306a36Sopenharmony_ci { {0x61, 0x30, 0x03, 0x11, 0x10} }, 231262306a36Sopenharmony_ci { {0x61, 0x20, 0x03, 0x11, 0x10} }, 231362306a36Sopenharmony_ci { {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */ 231462306a36Sopenharmony_ci { {0x61, 0x08, 0x03, 0x11, 0x14} }, 231562306a36Sopenharmony_ci { {0x61, 0x08, 0x03, 0x10, 0x14} }, 231662306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x54} }, 231762306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x55} }, 231862306a36Sopenharmony_ci { {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */ 231962306a36Sopenharmony_ci { {0x51, 0x45, 0x03, 0x10, 0x50} }, 232062306a36Sopenharmony_ci { {0x51, 0x3a, 0x03, 0x10, 0x50} }, 232162306a36Sopenharmony_ci { {0x51, 0x30, 0x03, 0x10, 0x50} }, 232262306a36Sopenharmony_ci { {0x51, 0x20, 0x03, 0x10, 0x50} }, 232362306a36Sopenharmony_ci { {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */ 232462306a36Sopenharmony_ci { {0x51, 0x08, 0x03, 0x10, 0x50} } 232562306a36Sopenharmony_ci}; 232662306a36Sopenharmony_ci 232762306a36Sopenharmony_ci/* rssi in percentage % (dbm = % - 100) */ 232862306a36Sopenharmony_cistatic const u8 wl_rssi_step_8822b[] = {60, 50, 44, 30}; 232962306a36Sopenharmony_cistatic const u8 bt_rssi_step_8822b[] = {30, 30, 30, 30}; 233062306a36Sopenharmony_ci 233162306a36Sopenharmony_ci/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */ 233262306a36Sopenharmony_cistatic const struct coex_rf_para rf_para_tx_8822b[] = { 233362306a36Sopenharmony_ci {0, 0, false, 7}, /* for normal */ 233462306a36Sopenharmony_ci {0, 16, false, 7}, /* for WL-CPT */ 233562306a36Sopenharmony_ci {4, 0, true, 1}, 233662306a36Sopenharmony_ci {3, 6, true, 1}, 233762306a36Sopenharmony_ci {2, 9, true, 1}, 233862306a36Sopenharmony_ci {1, 13, true, 1} 233962306a36Sopenharmony_ci}; 234062306a36Sopenharmony_ci 234162306a36Sopenharmony_cistatic const struct coex_rf_para rf_para_rx_8822b[] = { 234262306a36Sopenharmony_ci {0, 0, false, 7}, /* for normal */ 234362306a36Sopenharmony_ci {0, 16, false, 7}, /* for WL-CPT */ 234462306a36Sopenharmony_ci {4, 0, true, 1}, 234562306a36Sopenharmony_ci {3, 6, true, 1}, 234662306a36Sopenharmony_ci {2, 9, true, 1}, 234762306a36Sopenharmony_ci {1, 13, true, 1} 234862306a36Sopenharmony_ci}; 234962306a36Sopenharmony_ci 235062306a36Sopenharmony_cistatic const struct coex_5g_afh_map afh_5g_8822b[] = { 235162306a36Sopenharmony_ci {120, 2, 4}, 235262306a36Sopenharmony_ci {124, 8, 8}, 235362306a36Sopenharmony_ci {128, 17, 8}, 235462306a36Sopenharmony_ci {132, 26, 10}, 235562306a36Sopenharmony_ci {136, 34, 8}, 235662306a36Sopenharmony_ci {140, 42, 10}, 235762306a36Sopenharmony_ci {144, 51, 8}, 235862306a36Sopenharmony_ci {149, 62, 8}, 235962306a36Sopenharmony_ci {153, 71, 10}, 236062306a36Sopenharmony_ci {157, 77, 4}, 236162306a36Sopenharmony_ci {118, 2, 4}, 236262306a36Sopenharmony_ci {126, 12, 16}, 236362306a36Sopenharmony_ci {134, 29, 16}, 236462306a36Sopenharmony_ci {142, 46, 16}, 236562306a36Sopenharmony_ci {151, 66, 16}, 236662306a36Sopenharmony_ci {159, 76, 4}, 236762306a36Sopenharmony_ci {122, 10, 20}, 236862306a36Sopenharmony_ci {138, 37, 34}, 236962306a36Sopenharmony_ci {155, 68, 20} 237062306a36Sopenharmony_ci}; 237162306a36Sopenharmony_cistatic_assert(ARRAY_SIZE(rf_para_tx_8822b) == ARRAY_SIZE(rf_para_rx_8822b)); 237262306a36Sopenharmony_ci 237362306a36Sopenharmony_cistatic const u8 237462306a36Sopenharmony_cirtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = { 237562306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 237662306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 237762306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 237862306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 237962306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 238062306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 238162306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 238262306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 238362306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 238462306a36Sopenharmony_ci}; 238562306a36Sopenharmony_ci 238662306a36Sopenharmony_cistatic const u8 238762306a36Sopenharmony_cirtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = { 238862306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 238962306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 239062306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 }, 239162306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 239262306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 239362306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 }, 239462306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 239562306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 239662306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23 }, 239762306a36Sopenharmony_ci}; 239862306a36Sopenharmony_ci 239962306a36Sopenharmony_cistatic const u8 240062306a36Sopenharmony_cirtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = { 240162306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 240262306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 240362306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 240462306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 240562306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 240662306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 240762306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 240862306a36Sopenharmony_ci 8, 8, 9, 10, 11, 11, 12, 13, 14, 14, 240962306a36Sopenharmony_ci 15, 16, 17, 17, 18, 19, 20, 20, 21, 22 }, 241062306a36Sopenharmony_ci}; 241162306a36Sopenharmony_ci 241262306a36Sopenharmony_cistatic const u8 241362306a36Sopenharmony_cirtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_NUM][RTW_PWR_TRK_TBL_SZ] = { 241462306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 241562306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 241662306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23}, 241762306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 241862306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 241962306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23}, 242062306a36Sopenharmony_ci { 0, 1, 2, 2, 3, 4, 5, 5, 6, 7, 242162306a36Sopenharmony_ci 8, 9, 9, 10, 11, 12, 13, 14, 14, 15, 242262306a36Sopenharmony_ci 16, 17, 18, 19, 19, 20, 21, 22, 22, 23}, 242362306a36Sopenharmony_ci}; 242462306a36Sopenharmony_ci 242562306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2gb_n[RTW_PWR_TRK_TBL_SZ] = { 242662306a36Sopenharmony_ci 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 242762306a36Sopenharmony_ci 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 242862306a36Sopenharmony_ci 8, 9, 9, 9, 10, 10, 11, 11, 11, 12 242962306a36Sopenharmony_ci}; 243062306a36Sopenharmony_ci 243162306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2gb_p[RTW_PWR_TRK_TBL_SZ] = { 243262306a36Sopenharmony_ci 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 243362306a36Sopenharmony_ci 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 243462306a36Sopenharmony_ci 9, 10, 10, 11, 11, 12, 12, 12, 13, 13 243562306a36Sopenharmony_ci}; 243662306a36Sopenharmony_ci 243762306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2ga_n[RTW_PWR_TRK_TBL_SZ] = { 243862306a36Sopenharmony_ci 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 243962306a36Sopenharmony_ci 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 244062306a36Sopenharmony_ci 8, 9, 9, 9, 10, 10, 11, 11, 11, 12 244162306a36Sopenharmony_ci}; 244262306a36Sopenharmony_ci 244362306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2ga_p[RTW_PWR_TRK_TBL_SZ] = { 244462306a36Sopenharmony_ci 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 244562306a36Sopenharmony_ci 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 244662306a36Sopenharmony_ci 10, 11, 11, 12, 12, 13, 13, 14, 14, 15 244762306a36Sopenharmony_ci}; 244862306a36Sopenharmony_ci 244962306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2g_cck_b_n[RTW_PWR_TRK_TBL_SZ] = { 245062306a36Sopenharmony_ci 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 245162306a36Sopenharmony_ci 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 245262306a36Sopenharmony_ci 8, 9, 9, 9, 10, 10, 11, 11, 11, 12 245362306a36Sopenharmony_ci}; 245462306a36Sopenharmony_ci 245562306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2g_cck_b_p[RTW_PWR_TRK_TBL_SZ] = { 245662306a36Sopenharmony_ci 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 245762306a36Sopenharmony_ci 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 245862306a36Sopenharmony_ci 9, 10, 10, 11, 11, 12, 12, 12, 13, 13 245962306a36Sopenharmony_ci}; 246062306a36Sopenharmony_ci 246162306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2g_cck_a_n[RTW_PWR_TRK_TBL_SZ] = { 246262306a36Sopenharmony_ci 0, 1, 1, 1, 2, 2, 3, 3, 3, 4, 246362306a36Sopenharmony_ci 4, 5, 5, 5, 6, 6, 7, 7, 7, 8, 246462306a36Sopenharmony_ci 8, 9, 9, 9, 10, 10, 11, 11, 11, 12 246562306a36Sopenharmony_ci}; 246662306a36Sopenharmony_ci 246762306a36Sopenharmony_cistatic const u8 rtw8822b_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = { 246862306a36Sopenharmony_ci 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 246962306a36Sopenharmony_ci 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 247062306a36Sopenharmony_ci 10, 11, 11, 12, 12, 13, 13, 14, 14, 15 247162306a36Sopenharmony_ci}; 247262306a36Sopenharmony_ci 247362306a36Sopenharmony_cistatic const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = { 247462306a36Sopenharmony_ci .pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1], 247562306a36Sopenharmony_ci .pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2], 247662306a36Sopenharmony_ci .pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3], 247762306a36Sopenharmony_ci .pwrtrk_5gb_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_1], 247862306a36Sopenharmony_ci .pwrtrk_5gb_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_2], 247962306a36Sopenharmony_ci .pwrtrk_5gb_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_p[RTW_PWR_TRK_5G_3], 248062306a36Sopenharmony_ci .pwrtrk_5ga_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_1], 248162306a36Sopenharmony_ci .pwrtrk_5ga_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_2], 248262306a36Sopenharmony_ci .pwrtrk_5ga_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_n[RTW_PWR_TRK_5G_3], 248362306a36Sopenharmony_ci .pwrtrk_5ga_p[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_1], 248462306a36Sopenharmony_ci .pwrtrk_5ga_p[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_2], 248562306a36Sopenharmony_ci .pwrtrk_5ga_p[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5ga_p[RTW_PWR_TRK_5G_3], 248662306a36Sopenharmony_ci .pwrtrk_2gb_n = rtw8822b_pwrtrk_2gb_n, 248762306a36Sopenharmony_ci .pwrtrk_2gb_p = rtw8822b_pwrtrk_2gb_p, 248862306a36Sopenharmony_ci .pwrtrk_2ga_n = rtw8822b_pwrtrk_2ga_n, 248962306a36Sopenharmony_ci .pwrtrk_2ga_p = rtw8822b_pwrtrk_2ga_p, 249062306a36Sopenharmony_ci .pwrtrk_2g_cckb_n = rtw8822b_pwrtrk_2g_cck_b_n, 249162306a36Sopenharmony_ci .pwrtrk_2g_cckb_p = rtw8822b_pwrtrk_2g_cck_b_p, 249262306a36Sopenharmony_ci .pwrtrk_2g_ccka_n = rtw8822b_pwrtrk_2g_cck_a_n, 249362306a36Sopenharmony_ci .pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p, 249462306a36Sopenharmony_ci}; 249562306a36Sopenharmony_ci 249662306a36Sopenharmony_cistatic const struct rtw_reg_domain coex_info_hw_regs_8822b[] = { 249762306a36Sopenharmony_ci {0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 249862306a36Sopenharmony_ci {0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 249962306a36Sopenharmony_ci {0xcba, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 250062306a36Sopenharmony_ci {0xcbd, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 250162306a36Sopenharmony_ci {0xc58, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 250262306a36Sopenharmony_ci {0xcbd, BIT(0), RTW_REG_DOMAIN_MAC8}, 250362306a36Sopenharmony_ci {0, 0, RTW_REG_DOMAIN_NL}, 250462306a36Sopenharmony_ci {0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 250562306a36Sopenharmony_ci {0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 250662306a36Sopenharmony_ci {0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 250762306a36Sopenharmony_ci {0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 250862306a36Sopenharmony_ci {0x45e, BIT(3), RTW_REG_DOMAIN_MAC8}, 250962306a36Sopenharmony_ci {0x454, MASKLWORD, RTW_REG_DOMAIN_MAC16}, 251062306a36Sopenharmony_ci {0, 0, RTW_REG_DOMAIN_NL}, 251162306a36Sopenharmony_ci {0x4c, BIT(24) | BIT(23), RTW_REG_DOMAIN_MAC32}, 251262306a36Sopenharmony_ci {0x64, BIT(0), RTW_REG_DOMAIN_MAC8}, 251362306a36Sopenharmony_ci {0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8}, 251462306a36Sopenharmony_ci {0x40, BIT(5), RTW_REG_DOMAIN_MAC8}, 251562306a36Sopenharmony_ci {0x1, RFREG_MASK, RTW_REG_DOMAIN_RF_B}, 251662306a36Sopenharmony_ci {0, 0, RTW_REG_DOMAIN_NL}, 251762306a36Sopenharmony_ci {0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32}, 251862306a36Sopenharmony_ci {0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 251962306a36Sopenharmony_ci {0x953, BIT(1), RTW_REG_DOMAIN_MAC8}, 252062306a36Sopenharmony_ci {0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8}, 252162306a36Sopenharmony_ci}; 252262306a36Sopenharmony_ci 252362306a36Sopenharmony_cistatic struct rtw_hw_reg_offset rtw8822b_edcca_th[] = { 252462306a36Sopenharmony_ci [EDCCA_TH_L2H_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE0}, .offset = 0}, 252562306a36Sopenharmony_ci [EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset = 0}, 252662306a36Sopenharmony_ci}; 252762306a36Sopenharmony_ci 252862306a36Sopenharmony_ciconst struct rtw_chip_info rtw8822b_hw_spec = { 252962306a36Sopenharmony_ci .ops = &rtw8822b_ops, 253062306a36Sopenharmony_ci .id = RTW_CHIP_TYPE_8822B, 253162306a36Sopenharmony_ci .fw_name = "rtw88/rtw8822b_fw.bin", 253262306a36Sopenharmony_ci .wlan_cpu = RTW_WCPU_11AC, 253362306a36Sopenharmony_ci .tx_pkt_desc_sz = 48, 253462306a36Sopenharmony_ci .tx_buf_desc_sz = 16, 253562306a36Sopenharmony_ci .rx_pkt_desc_sz = 24, 253662306a36Sopenharmony_ci .rx_buf_desc_sz = 8, 253762306a36Sopenharmony_ci .phy_efuse_size = 1024, 253862306a36Sopenharmony_ci .log_efuse_size = 768, 253962306a36Sopenharmony_ci .ptct_efuse_size = 96, 254062306a36Sopenharmony_ci .txff_size = 262144, 254162306a36Sopenharmony_ci .rxff_size = 24576, 254262306a36Sopenharmony_ci .fw_rxff_size = 12288, 254362306a36Sopenharmony_ci .rsvd_drv_pg_num = 8, 254462306a36Sopenharmony_ci .txgi_factor = 1, 254562306a36Sopenharmony_ci .is_pwr_by_rate_dec = true, 254662306a36Sopenharmony_ci .max_power_index = 0x3f, 254762306a36Sopenharmony_ci .csi_buf_pg_num = 0, 254862306a36Sopenharmony_ci .band = RTW_BAND_2G | RTW_BAND_5G, 254962306a36Sopenharmony_ci .page_size = TX_PAGE_SIZE, 255062306a36Sopenharmony_ci .dig_min = 0x1c, 255162306a36Sopenharmony_ci .ht_supported = true, 255262306a36Sopenharmony_ci .vht_supported = true, 255362306a36Sopenharmony_ci .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK), 255462306a36Sopenharmony_ci .sys_func_en = 0xDC, 255562306a36Sopenharmony_ci .pwr_on_seq = card_enable_flow_8822b, 255662306a36Sopenharmony_ci .pwr_off_seq = card_disable_flow_8822b, 255762306a36Sopenharmony_ci .page_table = page_table_8822b, 255862306a36Sopenharmony_ci .rqpn_table = rqpn_table_8822b, 255962306a36Sopenharmony_ci .prioq_addrs = &prioq_addrs_8822b, 256062306a36Sopenharmony_ci .intf_table = &phy_para_table_8822b, 256162306a36Sopenharmony_ci .dig = rtw8822b_dig, 256262306a36Sopenharmony_ci .dig_cck = NULL, 256362306a36Sopenharmony_ci .rf_base_addr = {0x2800, 0x2c00}, 256462306a36Sopenharmony_ci .rf_sipi_addr = {0xc90, 0xe90}, 256562306a36Sopenharmony_ci .ltecoex_addr = &rtw8822b_ltecoex_addr, 256662306a36Sopenharmony_ci .mac_tbl = &rtw8822b_mac_tbl, 256762306a36Sopenharmony_ci .agc_tbl = &rtw8822b_agc_tbl, 256862306a36Sopenharmony_ci .bb_tbl = &rtw8822b_bb_tbl, 256962306a36Sopenharmony_ci .rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl}, 257062306a36Sopenharmony_ci .rfe_defs = rtw8822b_rfe_defs, 257162306a36Sopenharmony_ci .rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs), 257262306a36Sopenharmony_ci .pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl, 257362306a36Sopenharmony_ci .iqk_threshold = 8, 257462306a36Sopenharmony_ci .bfer_su_max_num = 2, 257562306a36Sopenharmony_ci .bfer_mu_max_num = 1, 257662306a36Sopenharmony_ci .rx_ldpc = true, 257762306a36Sopenharmony_ci .edcca_th = rtw8822b_edcca_th, 257862306a36Sopenharmony_ci .l2h_th_ini_cs = 10 + EDCCA_IGI_BASE, 257962306a36Sopenharmony_ci .l2h_th_ini_ad = -14 + EDCCA_IGI_BASE, 258062306a36Sopenharmony_ci .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2, 258162306a36Sopenharmony_ci .max_scan_ie_len = IEEE80211_MAX_DATA_LEN, 258262306a36Sopenharmony_ci 258362306a36Sopenharmony_ci .coex_para_ver = 0x20070206, 258462306a36Sopenharmony_ci .bt_desired_ver = 0x6, 258562306a36Sopenharmony_ci .scbd_support = true, 258662306a36Sopenharmony_ci .new_scbd10_def = false, 258762306a36Sopenharmony_ci .ble_hid_profile_support = false, 258862306a36Sopenharmony_ci .wl_mimo_ps_support = false, 258962306a36Sopenharmony_ci .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 259062306a36Sopenharmony_ci .bt_rssi_type = COEX_BTRSSI_RATIO, 259162306a36Sopenharmony_ci .ant_isolation = 15, 259262306a36Sopenharmony_ci .rssi_tolerance = 2, 259362306a36Sopenharmony_ci .wl_rssi_step = wl_rssi_step_8822b, 259462306a36Sopenharmony_ci .bt_rssi_step = bt_rssi_step_8822b, 259562306a36Sopenharmony_ci .table_sant_num = ARRAY_SIZE(table_sant_8822b), 259662306a36Sopenharmony_ci .table_sant = table_sant_8822b, 259762306a36Sopenharmony_ci .table_nsant_num = ARRAY_SIZE(table_nsant_8822b), 259862306a36Sopenharmony_ci .table_nsant = table_nsant_8822b, 259962306a36Sopenharmony_ci .tdma_sant_num = ARRAY_SIZE(tdma_sant_8822b), 260062306a36Sopenharmony_ci .tdma_sant = tdma_sant_8822b, 260162306a36Sopenharmony_ci .tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8822b), 260262306a36Sopenharmony_ci .tdma_nsant = tdma_nsant_8822b, 260362306a36Sopenharmony_ci .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8822b), 260462306a36Sopenharmony_ci .wl_rf_para_tx = rf_para_tx_8822b, 260562306a36Sopenharmony_ci .wl_rf_para_rx = rf_para_rx_8822b, 260662306a36Sopenharmony_ci .bt_afh_span_bw20 = 0x24, 260762306a36Sopenharmony_ci .bt_afh_span_bw40 = 0x36, 260862306a36Sopenharmony_ci .afh_5g_num = ARRAY_SIZE(afh_5g_8822b), 260962306a36Sopenharmony_ci .afh_5g = afh_5g_8822b, 261062306a36Sopenharmony_ci 261162306a36Sopenharmony_ci .coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8822b), 261262306a36Sopenharmony_ci .coex_info_hw_regs = coex_info_hw_regs_8822b, 261362306a36Sopenharmony_ci 261462306a36Sopenharmony_ci .fw_fifo_addr = {0x780, 0x700, 0x780, 0x660, 0x650, 0x680}, 261562306a36Sopenharmony_ci}; 261662306a36Sopenharmony_ciEXPORT_SYMBOL(rtw8822b_hw_spec); 261762306a36Sopenharmony_ci 261862306a36Sopenharmony_ciMODULE_FIRMWARE("rtw88/rtw8822b_fw.bin"); 261962306a36Sopenharmony_ci 262062306a36Sopenharmony_ciMODULE_AUTHOR("Realtek Corporation"); 262162306a36Sopenharmony_ciMODULE_DESCRIPTION("Realtek 802.11ac wireless 8822b driver"); 262262306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL"); 2623