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 "rtw8723d.h"
1362306a36Sopenharmony_ci#include "rtw8723d_table.h"
1462306a36Sopenharmony_ci#include "mac.h"
1562306a36Sopenharmony_ci#include "reg.h"
1662306a36Sopenharmony_ci#include "debug.h"
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic const struct rtw_hw_reg rtw8723d_txagc[] = {
1962306a36Sopenharmony_ci	[DESC_RATE1M]	= { .addr = 0xe08, .mask = 0x0000ff00 },
2062306a36Sopenharmony_ci	[DESC_RATE2M]	= { .addr = 0x86c, .mask = 0x0000ff00 },
2162306a36Sopenharmony_ci	[DESC_RATE5_5M]	= { .addr = 0x86c, .mask = 0x00ff0000 },
2262306a36Sopenharmony_ci	[DESC_RATE11M]	= { .addr = 0x86c, .mask = 0xff000000 },
2362306a36Sopenharmony_ci	[DESC_RATE6M]	= { .addr = 0xe00, .mask = 0x000000ff },
2462306a36Sopenharmony_ci	[DESC_RATE9M]	= { .addr = 0xe00, .mask = 0x0000ff00 },
2562306a36Sopenharmony_ci	[DESC_RATE12M]	= { .addr = 0xe00, .mask = 0x00ff0000 },
2662306a36Sopenharmony_ci	[DESC_RATE18M]	= { .addr = 0xe00, .mask = 0xff000000 },
2762306a36Sopenharmony_ci	[DESC_RATE24M]	= { .addr = 0xe04, .mask = 0x000000ff },
2862306a36Sopenharmony_ci	[DESC_RATE36M]	= { .addr = 0xe04, .mask = 0x0000ff00 },
2962306a36Sopenharmony_ci	[DESC_RATE48M]	= { .addr = 0xe04, .mask = 0x00ff0000 },
3062306a36Sopenharmony_ci	[DESC_RATE54M]	= { .addr = 0xe04, .mask = 0xff000000 },
3162306a36Sopenharmony_ci	[DESC_RATEMCS0]	= { .addr = 0xe10, .mask = 0x000000ff },
3262306a36Sopenharmony_ci	[DESC_RATEMCS1]	= { .addr = 0xe10, .mask = 0x0000ff00 },
3362306a36Sopenharmony_ci	[DESC_RATEMCS2]	= { .addr = 0xe10, .mask = 0x00ff0000 },
3462306a36Sopenharmony_ci	[DESC_RATEMCS3]	= { .addr = 0xe10, .mask = 0xff000000 },
3562306a36Sopenharmony_ci	[DESC_RATEMCS4]	= { .addr = 0xe14, .mask = 0x000000ff },
3662306a36Sopenharmony_ci	[DESC_RATEMCS5]	= { .addr = 0xe14, .mask = 0x0000ff00 },
3762306a36Sopenharmony_ci	[DESC_RATEMCS6]	= { .addr = 0xe14, .mask = 0x00ff0000 },
3862306a36Sopenharmony_ci	[DESC_RATEMCS7]	= { .addr = 0xe14, .mask = 0xff000000 },
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define WLAN_TXQ_RPT_EN		0x1F
4262306a36Sopenharmony_ci#define WLAN_SLOT_TIME		0x09
4362306a36Sopenharmony_ci#define WLAN_RL_VAL		0x3030
4462306a36Sopenharmony_ci#define WLAN_BAR_VAL		0x0201ffff
4562306a36Sopenharmony_ci#define BIT_MASK_TBTT_HOLD	0x00000fff
4662306a36Sopenharmony_ci#define BIT_SHIFT_TBTT_HOLD	8
4762306a36Sopenharmony_ci#define BIT_MASK_TBTT_SETUP	0x000000ff
4862306a36Sopenharmony_ci#define BIT_SHIFT_TBTT_SETUP	0
4962306a36Sopenharmony_ci#define BIT_MASK_TBTT_MASK	((BIT_MASK_TBTT_HOLD << BIT_SHIFT_TBTT_HOLD) | \
5062306a36Sopenharmony_ci				 (BIT_MASK_TBTT_SETUP << BIT_SHIFT_TBTT_SETUP))
5162306a36Sopenharmony_ci#define TBTT_TIME(s, h)((((s) & BIT_MASK_TBTT_SETUP) << BIT_SHIFT_TBTT_SETUP) |\
5262306a36Sopenharmony_ci			(((h) & BIT_MASK_TBTT_HOLD) << BIT_SHIFT_TBTT_HOLD))
5362306a36Sopenharmony_ci#define WLAN_TBTT_TIME_NORMAL	TBTT_TIME(0x04, 0x80)
5462306a36Sopenharmony_ci#define WLAN_TBTT_TIME_STOP_BCN	TBTT_TIME(0x04, 0x64)
5562306a36Sopenharmony_ci#define WLAN_PIFS_VAL		0
5662306a36Sopenharmony_ci#define WLAN_AGG_BRK_TIME	0x16
5762306a36Sopenharmony_ci#define WLAN_NAV_PROT_LEN	0x0040
5862306a36Sopenharmony_ci#define WLAN_SPEC_SIFS		0x100a
5962306a36Sopenharmony_ci#define WLAN_RX_PKT_LIMIT	0x17
6062306a36Sopenharmony_ci#define WLAN_MAX_AGG_NR		0x0A
6162306a36Sopenharmony_ci#define WLAN_AMPDU_MAX_TIME	0x1C
6262306a36Sopenharmony_ci#define WLAN_ANT_SEL		0x82
6362306a36Sopenharmony_ci#define WLAN_LTR_IDLE_LAT	0x90039003
6462306a36Sopenharmony_ci#define WLAN_LTR_ACT_LAT	0x883c883c
6562306a36Sopenharmony_ci#define WLAN_LTR_CTRL1		0xCB004010
6662306a36Sopenharmony_ci#define WLAN_LTR_CTRL2		0x01233425
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_cistatic void rtw8723d_lck(struct rtw_dev *rtwdev)
6962306a36Sopenharmony_ci{
7062306a36Sopenharmony_ci	u32 lc_cal;
7162306a36Sopenharmony_ci	u8 val_ctx, rf_val;
7262306a36Sopenharmony_ci	int ret;
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci	val_ctx = rtw_read8(rtwdev, REG_CTX);
7562306a36Sopenharmony_ci	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
7662306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_CTX, val_ctx & ~BIT_MASK_CTX_TYPE);
7762306a36Sopenharmony_ci	else
7862306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_TXPAUSE, 0xFF);
7962306a36Sopenharmony_ci	lc_cal = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal | BIT_LCK);
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	ret = read_poll_timeout(rtw_read_rf, rf_val, rf_val != 0x1,
8462306a36Sopenharmony_ci				10000, 1000000, false,
8562306a36Sopenharmony_ci				rtwdev, RF_PATH_A, RF_CFGCH, BIT_LCK);
8662306a36Sopenharmony_ci	if (ret)
8762306a36Sopenharmony_ci		rtw_warn(rtwdev, "failed to poll LCK status bit\n");
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
9062306a36Sopenharmony_ci	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
9162306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_CTX, val_ctx);
9262306a36Sopenharmony_ci	else
9362306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_TXPAUSE, 0x00);
9462306a36Sopenharmony_ci}
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_cistatic const u32 rtw8723d_ofdm_swing_table[] = {
9762306a36Sopenharmony_ci	0x0b40002d, 0x0c000030, 0x0cc00033, 0x0d800036, 0x0e400039, 0x0f00003c,
9862306a36Sopenharmony_ci	0x10000040, 0x11000044, 0x12000048, 0x1300004c, 0x14400051, 0x15800056,
9962306a36Sopenharmony_ci	0x16c0005b, 0x18000060, 0x19800066, 0x1b00006c, 0x1c800072, 0x1e400079,
10062306a36Sopenharmony_ci	0x20000080, 0x22000088, 0x24000090, 0x26000098, 0x288000a2, 0x2ac000ab,
10162306a36Sopenharmony_ci	0x2d4000b5, 0x300000c0, 0x32c000cb, 0x35c000d7, 0x390000e4, 0x3c8000f2,
10262306a36Sopenharmony_ci	0x40000100, 0x43c0010f, 0x47c0011f, 0x4c000130, 0x50800142, 0x55400155,
10362306a36Sopenharmony_ci	0x5a400169, 0x5fc0017f, 0x65400195, 0x6b8001ae, 0x71c001c7, 0x788001e2,
10462306a36Sopenharmony_ci	0x7f8001fe,
10562306a36Sopenharmony_ci};
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_cistatic const u32 rtw8723d_cck_swing_table[] = {
10862306a36Sopenharmony_ci	0x0CD, 0x0D9, 0x0E6, 0x0F3, 0x102, 0x111, 0x121, 0x132, 0x144, 0x158,
10962306a36Sopenharmony_ci	0x16C, 0x182, 0x198, 0x1B1, 0x1CA, 0x1E5, 0x202, 0x221, 0x241, 0x263,
11062306a36Sopenharmony_ci	0x287, 0x2AE, 0x2D6, 0x301, 0x32F, 0x35F, 0x392, 0x3C9, 0x402, 0x43F,
11162306a36Sopenharmony_ci	0x47F, 0x4C3, 0x50C, 0x558, 0x5A9, 0x5FF, 0x65A, 0x6BA, 0x720, 0x78C,
11262306a36Sopenharmony_ci	0x7FF,
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci#define RTW_OFDM_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_ofdm_swing_table)
11662306a36Sopenharmony_ci#define RTW_CCK_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_cck_swing_table)
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_cistatic void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
11962306a36Sopenharmony_ci{
12062306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
12162306a36Sopenharmony_ci	u8 path;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	dm_info->default_ofdm_index = RTW_DEF_OFDM_SWING_INDEX;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
12662306a36Sopenharmony_ci		ewma_thermal_init(&dm_info->avg_thermal[path]);
12762306a36Sopenharmony_ci		dm_info->delta_power_index[path] = 0;
12862306a36Sopenharmony_ci	}
12962306a36Sopenharmony_ci	dm_info->pwr_trk_triggered = false;
13062306a36Sopenharmony_ci	dm_info->pwr_trk_init_trigger = true;
13162306a36Sopenharmony_ci	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
13262306a36Sopenharmony_ci	dm_info->txagc_remnant_cck = 0;
13362306a36Sopenharmony_ci	dm_info->txagc_remnant_ofdm = 0;
13462306a36Sopenharmony_ci}
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cistatic void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
13762306a36Sopenharmony_ci{
13862306a36Sopenharmony_ci	u8 xtal_cap;
13962306a36Sopenharmony_ci	u32 val32;
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	/* power on BB/RF domain */
14262306a36Sopenharmony_ci	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
14362306a36Sopenharmony_ci			BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
14462306a36Sopenharmony_ci	rtw_write8_set(rtwdev, REG_RF_CTRL,
14562306a36Sopenharmony_ci		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
14662306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	rtw_phy_load_tables(rtwdev);
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	/* post init after header files config */
15162306a36Sopenharmony_ci	rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
15262306a36Sopenharmony_ci	rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, BIT_HIQ_NO_LMT_EN_ROOT);
15362306a36Sopenharmony_ci	rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
15662306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
15762306a36Sopenharmony_ci			 xtal_cap | (xtal_cap << 6));
15862306a36Sopenharmony_ci	rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
15962306a36Sopenharmony_ci	if ((rtwdev->efuse.afe >> 4) == 14) {
16062306a36Sopenharmony_ci		rtw_write32_set(rtwdev, REG_AFE_CTRL3, BIT_XTAL_GMP_BIT4);
16162306a36Sopenharmony_ci		rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BITS_PLL);
16262306a36Sopenharmony_ci		rtw_write32_set(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA1);
16362306a36Sopenharmony_ci		rtw_write32_clr(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA0);
16462306a36Sopenharmony_ci	}
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
16762306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
16862306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
16962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
17062306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_ATIMWND, 0x2);
17162306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_BCN_CTRL,
17262306a36Sopenharmony_ci		   BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
17362306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_TBTT_PROHIBIT);
17462306a36Sopenharmony_ci	val32 &= ~BIT_MASK_TBTT_MASK;
17562306a36Sopenharmony_ci	val32 |= WLAN_TBTT_TIME_STOP_BCN;
17662306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_TBTT_PROHIBIT, val32);
17762306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
17862306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_AGGR_BREAK_TIME, WLAN_AGG_BRK_TIME);
17962306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_NAV_PROT_LEN, WLAN_NAV_PROT_LEN);
18062306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
18162306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS);
18262306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS);
18362306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
18462306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
18562306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
18662306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
18762306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_LEDCFG2, WLAN_ANT_SEL);
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTR_IDLE_LATENCY, WLAN_LTR_IDLE_LAT);
19062306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTR_ACTIVE_LATENCY, WLAN_LTR_ACT_LAT);
19162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC, WLAN_LTR_CTRL1);
19262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC + 4, WLAN_LTR_CTRL2);
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	rtw_phy_init(rtwdev);
19562306a36Sopenharmony_ci	rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	rtw8723d_lck(rtwdev);
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
20262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	rtw8723d_pwrtrack_init(rtwdev);
20562306a36Sopenharmony_ci}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistatic void rtw8723de_efuse_parsing(struct rtw_efuse *efuse,
20862306a36Sopenharmony_ci				    struct rtw8723d_efuse *map)
20962306a36Sopenharmony_ci{
21062306a36Sopenharmony_ci	ether_addr_copy(efuse->addr, map->e.mac_addr);
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistatic void rtw8723du_efuse_parsing(struct rtw_efuse *efuse,
21462306a36Sopenharmony_ci				    struct rtw8723d_efuse *map)
21562306a36Sopenharmony_ci{
21662306a36Sopenharmony_ci	ether_addr_copy(efuse->addr, map->u.mac_addr);
21762306a36Sopenharmony_ci}
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistatic void rtw8723ds_efuse_parsing(struct rtw_efuse *efuse,
22062306a36Sopenharmony_ci				    struct rtw8723d_efuse *map)
22162306a36Sopenharmony_ci{
22262306a36Sopenharmony_ci	ether_addr_copy(efuse->addr, map->s.mac_addr);
22362306a36Sopenharmony_ci}
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cistatic int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
22662306a36Sopenharmony_ci{
22762306a36Sopenharmony_ci	struct rtw_efuse *efuse = &rtwdev->efuse;
22862306a36Sopenharmony_ci	struct rtw8723d_efuse *map;
22962306a36Sopenharmony_ci	int i;
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	map = (struct rtw8723d_efuse *)log_map;
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci	efuse->rfe_option = 0;
23462306a36Sopenharmony_ci	efuse->rf_board_option = map->rf_board_option;
23562306a36Sopenharmony_ci	efuse->crystal_cap = map->xtal_k;
23662306a36Sopenharmony_ci	efuse->pa_type_2g = map->pa_type;
23762306a36Sopenharmony_ci	efuse->lna_type_2g = map->lna_type_2g[0];
23862306a36Sopenharmony_ci	efuse->channel_plan = map->channel_plan;
23962306a36Sopenharmony_ci	efuse->country_code[0] = map->country_code[0];
24062306a36Sopenharmony_ci	efuse->country_code[1] = map->country_code[1];
24162306a36Sopenharmony_ci	efuse->bt_setting = map->rf_bt_setting;
24262306a36Sopenharmony_ci	efuse->regd = map->rf_board_option & 0x7;
24362306a36Sopenharmony_ci	efuse->thermal_meter[0] = map->thermal_meter;
24462306a36Sopenharmony_ci	efuse->thermal_meter_k = map->thermal_meter;
24562306a36Sopenharmony_ci	efuse->afe = map->afe;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	for (i = 0; i < 4; i++)
24862306a36Sopenharmony_ci		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	switch (rtw_hci_type(rtwdev)) {
25162306a36Sopenharmony_ci	case RTW_HCI_TYPE_PCIE:
25262306a36Sopenharmony_ci		rtw8723de_efuse_parsing(efuse, map);
25362306a36Sopenharmony_ci		break;
25462306a36Sopenharmony_ci	case RTW_HCI_TYPE_USB:
25562306a36Sopenharmony_ci		rtw8723du_efuse_parsing(efuse, map);
25662306a36Sopenharmony_ci		break;
25762306a36Sopenharmony_ci	case RTW_HCI_TYPE_SDIO:
25862306a36Sopenharmony_ci		rtw8723ds_efuse_parsing(efuse, map);
25962306a36Sopenharmony_ci		break;
26062306a36Sopenharmony_ci	default:
26162306a36Sopenharmony_ci		/* unsupported now */
26262306a36Sopenharmony_ci		return -ENOTSUPP;
26362306a36Sopenharmony_ci	}
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	return 0;
26662306a36Sopenharmony_ci}
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_cistatic void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
26962306a36Sopenharmony_ci				   struct rtw_rx_pkt_stat *pkt_stat)
27062306a36Sopenharmony_ci{
27162306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
27262306a36Sopenharmony_ci	s8 min_rx_power = -120;
27362306a36Sopenharmony_ci	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_ci	pkt_stat->rx_power[RF_PATH_A] = pwdb - 97;
27662306a36Sopenharmony_ci	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
27762306a36Sopenharmony_ci	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
27862306a36Sopenharmony_ci	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
27962306a36Sopenharmony_ci				     min_rx_power);
28062306a36Sopenharmony_ci	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
28162306a36Sopenharmony_ci}
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_cistatic void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
28462306a36Sopenharmony_ci				   struct rtw_rx_pkt_stat *pkt_stat)
28562306a36Sopenharmony_ci{
28662306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
28762306a36Sopenharmony_ci	u8 rxsc, bw;
28862306a36Sopenharmony_ci	s8 min_rx_power = -120;
28962306a36Sopenharmony_ci	s8 rx_evm;
29062306a36Sopenharmony_ci
29162306a36Sopenharmony_ci	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
29262306a36Sopenharmony_ci		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
29362306a36Sopenharmony_ci	else
29462306a36Sopenharmony_ci		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci	if (GET_PHY_STAT_P1_RF_MODE(phy_status) == 0)
29762306a36Sopenharmony_ci		bw = RTW_CHANNEL_WIDTH_20;
29862306a36Sopenharmony_ci	else if ((rxsc == 1) || (rxsc == 2))
29962306a36Sopenharmony_ci		bw = RTW_CHANNEL_WIDTH_20;
30062306a36Sopenharmony_ci	else
30162306a36Sopenharmony_ci		bw = RTW_CHANNEL_WIDTH_40;
30262306a36Sopenharmony_ci
30362306a36Sopenharmony_ci	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
30462306a36Sopenharmony_ci	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
30562306a36Sopenharmony_ci	pkt_stat->bw = bw;
30662306a36Sopenharmony_ci	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
30762306a36Sopenharmony_ci				     min_rx_power);
30862306a36Sopenharmony_ci	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
30962306a36Sopenharmony_ci	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
31062306a36Sopenharmony_ci	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	dm_info->curr_rx_rate = pkt_stat->rate;
31362306a36Sopenharmony_ci	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
31462306a36Sopenharmony_ci	dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
31562306a36Sopenharmony_ci	dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_ci	rx_evm = clamp_t(s8, -pkt_stat->rx_evm[RF_PATH_A] >> 1, 0, 64);
31862306a36Sopenharmony_ci	rx_evm &= 0x3F;	/* 64->0: second path of 1SS rate is 64 */
31962306a36Sopenharmony_ci	dm_info->rx_evm_dbm[RF_PATH_A] = rx_evm;
32062306a36Sopenharmony_ci}
32162306a36Sopenharmony_ci
32262306a36Sopenharmony_cistatic void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
32362306a36Sopenharmony_ci			     struct rtw_rx_pkt_stat *pkt_stat)
32462306a36Sopenharmony_ci{
32562306a36Sopenharmony_ci	u8 page;
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	page = *phy_status & 0xf;
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	switch (page) {
33062306a36Sopenharmony_ci	case 0:
33162306a36Sopenharmony_ci		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
33262306a36Sopenharmony_ci		break;
33362306a36Sopenharmony_ci	case 1:
33462306a36Sopenharmony_ci		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
33562306a36Sopenharmony_ci		break;
33662306a36Sopenharmony_ci	default:
33762306a36Sopenharmony_ci		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
33862306a36Sopenharmony_ci		return;
33962306a36Sopenharmony_ci	}
34062306a36Sopenharmony_ci}
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_cistatic void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
34362306a36Sopenharmony_ci				   struct rtw_rx_pkt_stat *pkt_stat,
34462306a36Sopenharmony_ci				   struct ieee80211_rx_status *rx_status)
34562306a36Sopenharmony_ci{
34662306a36Sopenharmony_ci	struct ieee80211_hdr *hdr;
34762306a36Sopenharmony_ci	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
34862306a36Sopenharmony_ci	u8 *phy_status = NULL;
34962306a36Sopenharmony_ci
35062306a36Sopenharmony_ci	memset(pkt_stat, 0, sizeof(*pkt_stat));
35162306a36Sopenharmony_ci
35262306a36Sopenharmony_ci	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
35362306a36Sopenharmony_ci	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
35462306a36Sopenharmony_ci	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
35562306a36Sopenharmony_ci	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
35662306a36Sopenharmony_ci			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
35762306a36Sopenharmony_ci	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
35862306a36Sopenharmony_ci	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
35962306a36Sopenharmony_ci	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
36062306a36Sopenharmony_ci	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
36162306a36Sopenharmony_ci	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
36262306a36Sopenharmony_ci	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
36362306a36Sopenharmony_ci	pkt_stat->ppdu_cnt = 0;
36462306a36Sopenharmony_ci	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	/* drv_info_sz is in unit of 8-bytes */
36762306a36Sopenharmony_ci	pkt_stat->drv_info_sz *= 8;
36862306a36Sopenharmony_ci
36962306a36Sopenharmony_ci	/* c2h cmd pkt's rx/phy status is not interested */
37062306a36Sopenharmony_ci	if (pkt_stat->is_c2h)
37162306a36Sopenharmony_ci		return;
37262306a36Sopenharmony_ci
37362306a36Sopenharmony_ci	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
37462306a36Sopenharmony_ci				       pkt_stat->drv_info_sz);
37562306a36Sopenharmony_ci	if (pkt_stat->phy_status) {
37662306a36Sopenharmony_ci		phy_status = rx_desc + desc_sz + pkt_stat->shift;
37762306a36Sopenharmony_ci		query_phy_status(rtwdev, phy_status, pkt_stat);
37862306a36Sopenharmony_ci	}
37962306a36Sopenharmony_ci
38062306a36Sopenharmony_ci	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
38162306a36Sopenharmony_ci}
38262306a36Sopenharmony_ci
38362306a36Sopenharmony_cistatic bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
38462306a36Sopenharmony_ci					 u8 channel, u32 thres)
38562306a36Sopenharmony_ci{
38662306a36Sopenharmony_ci	u32 freq;
38762306a36Sopenharmony_ci	bool ret = false;
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci	if (channel == 13)
39062306a36Sopenharmony_ci		freq = FREQ_CH13;
39162306a36Sopenharmony_ci	else if (channel == 14)
39262306a36Sopenharmony_ci		freq = FREQ_CH14;
39362306a36Sopenharmony_ci	else
39462306a36Sopenharmony_ci		return false;
39562306a36Sopenharmony_ci
39662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
39762306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_PSDFN, freq);
39862306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
39962306a36Sopenharmony_ci
40062306a36Sopenharmony_ci	msleep(30);
40162306a36Sopenharmony_ci	if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
40262306a36Sopenharmony_ci		ret = true;
40362306a36Sopenharmony_ci
40462306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_PSDFN, freq);
40562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
40662306a36Sopenharmony_ci
40762306a36Sopenharmony_ci	return ret;
40862306a36Sopenharmony_ci}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_cistatic void rtw8723d_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
41162306a36Sopenharmony_ci{
41262306a36Sopenharmony_ci	if (!notch) {
41362306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
41462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
41562306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
41662306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
41762306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
41862306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
41962306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
42062306a36Sopenharmony_ci		return;
42162306a36Sopenharmony_ci	}
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci	switch (channel) {
42462306a36Sopenharmony_ci	case 13:
42562306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
42662306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
42762306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x04000000);
42862306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
42962306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
43062306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
43162306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
43262306a36Sopenharmony_ci		break;
43362306a36Sopenharmony_ci	case 14:
43462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
43562306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
43662306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
43762306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
43862306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
43962306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00080000);
44062306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
44162306a36Sopenharmony_ci		break;
44262306a36Sopenharmony_ci	default:
44362306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
44462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
44562306a36Sopenharmony_ci		break;
44662306a36Sopenharmony_ci	}
44762306a36Sopenharmony_ci}
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_cistatic void rtw8723d_spur_cal(struct rtw_dev *rtwdev, u8 channel)
45062306a36Sopenharmony_ci{
45162306a36Sopenharmony_ci	bool notch;
45262306a36Sopenharmony_ci
45362306a36Sopenharmony_ci	if (channel < 13) {
45462306a36Sopenharmony_ci		rtw8723d_cfg_notch(rtwdev, channel, false);
45562306a36Sopenharmony_ci		return;
45662306a36Sopenharmony_ci	}
45762306a36Sopenharmony_ci
45862306a36Sopenharmony_ci	notch = rtw8723d_check_spur_ov_thres(rtwdev, channel, SPUR_THRES);
45962306a36Sopenharmony_ci	rtw8723d_cfg_notch(rtwdev, channel, notch);
46062306a36Sopenharmony_ci}
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_cistatic void rtw8723d_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
46362306a36Sopenharmony_ci{
46462306a36Sopenharmony_ci	u32 rf_cfgch_a, rf_cfgch_b;
46562306a36Sopenharmony_ci
46662306a36Sopenharmony_ci	rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
46762306a36Sopenharmony_ci	rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
46862306a36Sopenharmony_ci
46962306a36Sopenharmony_ci	rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
47062306a36Sopenharmony_ci	rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
47162306a36Sopenharmony_ci	rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
47262306a36Sopenharmony_ci	rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ci	rf_cfgch_a &= ~RFCFGCH_BW_MASK;
47562306a36Sopenharmony_ci	switch (bw) {
47662306a36Sopenharmony_ci	case RTW_CHANNEL_WIDTH_20:
47762306a36Sopenharmony_ci		rf_cfgch_a |= RFCFGCH_BW_20M;
47862306a36Sopenharmony_ci		break;
47962306a36Sopenharmony_ci	case RTW_CHANNEL_WIDTH_40:
48062306a36Sopenharmony_ci		rf_cfgch_a |= RFCFGCH_BW_40M;
48162306a36Sopenharmony_ci		break;
48262306a36Sopenharmony_ci	default:
48362306a36Sopenharmony_ci		break;
48462306a36Sopenharmony_ci	}
48562306a36Sopenharmony_ci
48662306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
48762306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci	rtw8723d_spur_cal(rtwdev, channel);
49062306a36Sopenharmony_ci}
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_cistatic const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR] = {
49362306a36Sopenharmony_ci	[0] = {
49462306a36Sopenharmony_ci		{ .len = 4, .reg = 0xA24, .val = 0x64B80C1C },
49562306a36Sopenharmony_ci		{ .len = 4, .reg = 0xA28, .val = 0x00008810 },
49662306a36Sopenharmony_ci		{ .len = 4, .reg = 0xAAC, .val = 0x01235667 },
49762306a36Sopenharmony_ci	},
49862306a36Sopenharmony_ci	[1] = {
49962306a36Sopenharmony_ci		{ .len = 4, .reg = 0xA24, .val = 0x0000B81C },
50062306a36Sopenharmony_ci		{ .len = 4, .reg = 0xA28, .val = 0x00000000 },
50162306a36Sopenharmony_ci		{ .len = 4, .reg = 0xAAC, .val = 0x00003667 },
50262306a36Sopenharmony_ci	},
50362306a36Sopenharmony_ci};
50462306a36Sopenharmony_ci
50562306a36Sopenharmony_cistatic void rtw8723d_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
50662306a36Sopenharmony_ci				    u8 primary_ch_idx)
50762306a36Sopenharmony_ci{
50862306a36Sopenharmony_ci	const struct rtw_backup_info *cck_dfir;
50962306a36Sopenharmony_ci	int i;
51062306a36Sopenharmony_ci
51162306a36Sopenharmony_ci	cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
51262306a36Sopenharmony_ci
51362306a36Sopenharmony_ci	for (i = 0; i < CCK_DFIR_NR; i++, cck_dfir++)
51462306a36Sopenharmony_ci		rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
51562306a36Sopenharmony_ci
51662306a36Sopenharmony_ci	switch (bw) {
51762306a36Sopenharmony_ci	case RTW_CHANNEL_WIDTH_20:
51862306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
51962306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
52062306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 1);
52162306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_MASK_RXBB_DFIR, 0xa);
52262306a36Sopenharmony_ci		break;
52362306a36Sopenharmony_ci	case RTW_CHANNEL_WIDTH_40:
52462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
52562306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
52662306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 0);
52762306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
52862306a36Sopenharmony_ci				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
52962306a36Sopenharmony_ci		break;
53062306a36Sopenharmony_ci	default:
53162306a36Sopenharmony_ci		break;
53262306a36Sopenharmony_ci	}
53362306a36Sopenharmony_ci}
53462306a36Sopenharmony_ci
53562306a36Sopenharmony_cistatic void rtw8723d_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
53662306a36Sopenharmony_ci				 u8 primary_chan_idx)
53762306a36Sopenharmony_ci{
53862306a36Sopenharmony_ci	rtw8723d_set_channel_rf(rtwdev, channel, bw);
53962306a36Sopenharmony_ci	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
54062306a36Sopenharmony_ci	rtw8723d_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
54162306a36Sopenharmony_ci}
54262306a36Sopenharmony_ci
54362306a36Sopenharmony_ci#define BIT_CFENDFORM		BIT(9)
54462306a36Sopenharmony_ci#define BIT_WMAC_TCR_ERR0	BIT(12)
54562306a36Sopenharmony_ci#define BIT_WMAC_TCR_ERR1	BIT(13)
54662306a36Sopenharmony_ci#define BIT_TCR_CFG		(BIT_CFENDFORM | BIT_WMAC_TCR_ERR0 |	       \
54762306a36Sopenharmony_ci				 BIT_WMAC_TCR_ERR1)
54862306a36Sopenharmony_ci#define WLAN_RX_FILTER0		0xFFFF
54962306a36Sopenharmony_ci#define WLAN_RX_FILTER1		0x400
55062306a36Sopenharmony_ci#define WLAN_RX_FILTER2		0xFFFF
55162306a36Sopenharmony_ci#define WLAN_RCR_CFG		0x700060CE
55262306a36Sopenharmony_ci
55362306a36Sopenharmony_cistatic int rtw8723d_mac_init(struct rtw_dev *rtwdev)
55462306a36Sopenharmony_ci{
55562306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
55662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
55762306a36Sopenharmony_ci
55862306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
55962306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_RXFLTMAP1, WLAN_RX_FILTER1);
56062306a36Sopenharmony_ci	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
56162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
56262306a36Sopenharmony_ci
56362306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_INT_MIG, 0);
56462306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_MCUTST_1, 0x0);
56562306a36Sopenharmony_ci
56662306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA);
56762306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_2ND_CCA_CTRL, 0);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_ci	return 0;
57062306a36Sopenharmony_ci}
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_cistatic void rtw8723d_shutdown(struct rtw_dev *rtwdev)
57362306a36Sopenharmony_ci{
57462306a36Sopenharmony_ci	rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
57562306a36Sopenharmony_ci}
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_cistatic void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
57862306a36Sopenharmony_ci{
57962306a36Sopenharmony_ci	u8 ldo_pwr;
58062306a36Sopenharmony_ci
58162306a36Sopenharmony_ci	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
58262306a36Sopenharmony_ci	if (enable) {
58362306a36Sopenharmony_ci		ldo_pwr &= ~BIT_MASK_LDO25_VOLTAGE;
58462306a36Sopenharmony_ci		ldo_pwr |= (BIT_LDO25_VOLTAGE_V25 << 4) | BIT_LDO25_EN;
58562306a36Sopenharmony_ci	} else {
58662306a36Sopenharmony_ci		ldo_pwr &= ~BIT_LDO25_EN;
58762306a36Sopenharmony_ci	}
58862306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
58962306a36Sopenharmony_ci}
59062306a36Sopenharmony_ci
59162306a36Sopenharmony_cistatic void
59262306a36Sopenharmony_cirtw8723d_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
59362306a36Sopenharmony_ci{
59462306a36Sopenharmony_ci	struct rtw_hal *hal = &rtwdev->hal;
59562306a36Sopenharmony_ci	const struct rtw_hw_reg *txagc;
59662306a36Sopenharmony_ci	u8 rate, pwr_index;
59762306a36Sopenharmony_ci	int j;
59862306a36Sopenharmony_ci
59962306a36Sopenharmony_ci	for (j = 0; j < rtw_rate_size[rs]; j++) {
60062306a36Sopenharmony_ci		rate = rtw_rate_section[rs][j];
60162306a36Sopenharmony_ci		pwr_index = hal->tx_pwr_tbl[path][rate];
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci		if (rate >= ARRAY_SIZE(rtw8723d_txagc)) {
60462306a36Sopenharmony_ci			rtw_warn(rtwdev, "rate 0x%x isn't supported\n", rate);
60562306a36Sopenharmony_ci			continue;
60662306a36Sopenharmony_ci		}
60762306a36Sopenharmony_ci		txagc = &rtw8723d_txagc[rate];
60862306a36Sopenharmony_ci		if (!txagc->addr) {
60962306a36Sopenharmony_ci			rtw_warn(rtwdev, "rate 0x%x isn't defined\n", rate);
61062306a36Sopenharmony_ci			continue;
61162306a36Sopenharmony_ci		}
61262306a36Sopenharmony_ci
61362306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, txagc->addr, txagc->mask, pwr_index);
61462306a36Sopenharmony_ci	}
61562306a36Sopenharmony_ci}
61662306a36Sopenharmony_ci
61762306a36Sopenharmony_cistatic void rtw8723d_set_tx_power_index(struct rtw_dev *rtwdev)
61862306a36Sopenharmony_ci{
61962306a36Sopenharmony_ci	struct rtw_hal *hal = &rtwdev->hal;
62062306a36Sopenharmony_ci	int rs, path;
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci	for (path = 0; path < hal->rf_path_num; path++) {
62362306a36Sopenharmony_ci		for (rs = 0; rs <= RTW_RATE_SECTION_HT_1S; rs++)
62462306a36Sopenharmony_ci			rtw8723d_set_tx_power_index_by_rate(rtwdev, path, rs);
62562306a36Sopenharmony_ci	}
62662306a36Sopenharmony_ci}
62762306a36Sopenharmony_ci
62862306a36Sopenharmony_cistatic void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on)
62962306a36Sopenharmony_ci{
63062306a36Sopenharmony_ci	if (on) {
63162306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
63262306a36Sopenharmony_ci
63362306a36Sopenharmony_ci		rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
63462306a36Sopenharmony_ci		rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M);
63562306a36Sopenharmony_ci	} else {
63662306a36Sopenharmony_ci		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
63762306a36Sopenharmony_ci	}
63862306a36Sopenharmony_ci}
63962306a36Sopenharmony_ci
64062306a36Sopenharmony_cistatic void rtw8723d_false_alarm_statistics(struct rtw_dev *rtwdev)
64162306a36Sopenharmony_ci{
64262306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
64362306a36Sopenharmony_ci	u32 cck_fa_cnt;
64462306a36Sopenharmony_ci	u32 ofdm_fa_cnt;
64562306a36Sopenharmony_ci	u32 crc32_cnt;
64662306a36Sopenharmony_ci	u32 val32;
64762306a36Sopenharmony_ci
64862306a36Sopenharmony_ci	/* hold counter */
64962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 1);
65062306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 1);
65162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KEEP, 1);
65262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KEEP, 1);
65362306a36Sopenharmony_ci
65462306a36Sopenharmony_ci	cck_fa_cnt = rtw_read32_mask(rtwdev, REG_CCK_FA_LSB_11N, MASKBYTE0);
65562306a36Sopenharmony_ci	cck_fa_cnt += rtw_read32_mask(rtwdev, REG_CCK_FA_MSB_11N, MASKBYTE3) << 8;
65662306a36Sopenharmony_ci
65762306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE1_11N);
65862306a36Sopenharmony_ci	ofdm_fa_cnt = u32_get_bits(val32, BIT_MASK_OFDM_FF_CNT);
65962306a36Sopenharmony_ci	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_SF_CNT);
66062306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE2_11N);
66162306a36Sopenharmony_ci	dm_info->ofdm_cca_cnt = u32_get_bits(val32, BIT_MASK_OFDM_CCA_CNT);
66262306a36Sopenharmony_ci	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_PF_CNT);
66362306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE3_11N);
66462306a36Sopenharmony_ci	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_RI_CNT);
66562306a36Sopenharmony_ci	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_CRC_CNT);
66662306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE4_11N);
66762306a36Sopenharmony_ci	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_MNS_CNT);
66862306a36Sopenharmony_ci
66962306a36Sopenharmony_ci	dm_info->cck_fa_cnt = cck_fa_cnt;
67062306a36Sopenharmony_ci	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
67162306a36Sopenharmony_ci	dm_info->total_fa_cnt = cck_fa_cnt + ofdm_fa_cnt;
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci	dm_info->cck_err_cnt = rtw_read32(rtwdev, REG_IGI_C_11N);
67462306a36Sopenharmony_ci	dm_info->cck_ok_cnt = rtw_read32(rtwdev, REG_IGI_D_11N);
67562306a36Sopenharmony_ci	crc32_cnt = rtw_read32(rtwdev, REG_OFDM_CRC32_CNT_11N);
67662306a36Sopenharmony_ci	dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_ERR);
67762306a36Sopenharmony_ci	dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_OK);
67862306a36Sopenharmony_ci	crc32_cnt = rtw_read32(rtwdev, REG_HT_CRC32_CNT_11N);
67962306a36Sopenharmony_ci	dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_ERR);
68062306a36Sopenharmony_ci	dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_OK);
68162306a36Sopenharmony_ci	dm_info->vht_err_cnt = 0;
68262306a36Sopenharmony_ci	dm_info->vht_ok_cnt = 0;
68362306a36Sopenharmony_ci
68462306a36Sopenharmony_ci	val32 = rtw_read32(rtwdev, REG_CCK_CCA_CNT_11N);
68562306a36Sopenharmony_ci	dm_info->cck_cca_cnt = (u32_get_bits(val32, BIT_MASK_CCK_FA_MSB) << 8) |
68662306a36Sopenharmony_ci			       u32_get_bits(val32, BIT_MASK_CCK_FA_LSB);
68762306a36Sopenharmony_ci	dm_info->total_cca_cnt = dm_info->cck_cca_cnt + dm_info->ofdm_cca_cnt;
68862306a36Sopenharmony_ci
68962306a36Sopenharmony_ci	/* reset counter */
69062306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 1);
69162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 0);
69262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 1);
69362306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 0);
69462306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 0);
69562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 0);
69662306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 0);
69762306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 2);
69862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 0);
69962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 2);
70062306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 1);
70162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 0);
70262306a36Sopenharmony_ci}
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_cistatic const u32 iqk_adda_regs[] = {
70562306a36Sopenharmony_ci	0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
70662306a36Sopenharmony_ci	0xed0, 0xed4, 0xed8, 0xedc, 0xee0, 0xeec
70762306a36Sopenharmony_ci};
70862306a36Sopenharmony_ci
70962306a36Sopenharmony_cistatic const u32 iqk_mac8_regs[] = {0x522, 0x550, 0x551};
71062306a36Sopenharmony_cistatic const u32 iqk_mac32_regs[] = {0x40};
71162306a36Sopenharmony_ci
71262306a36Sopenharmony_cistatic const u32 iqk_bb_regs[] = {
71362306a36Sopenharmony_ci	0xc04, 0xc08, 0x874, 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0xa04
71462306a36Sopenharmony_ci};
71562306a36Sopenharmony_ci
71662306a36Sopenharmony_ci#define IQK_ADDA_REG_NUM	ARRAY_SIZE(iqk_adda_regs)
71762306a36Sopenharmony_ci#define IQK_MAC8_REG_NUM	ARRAY_SIZE(iqk_mac8_regs)
71862306a36Sopenharmony_ci#define IQK_MAC32_REG_NUM	ARRAY_SIZE(iqk_mac32_regs)
71962306a36Sopenharmony_ci#define IQK_BB_REG_NUM		ARRAY_SIZE(iqk_bb_regs)
72062306a36Sopenharmony_ci
72162306a36Sopenharmony_cistruct iqk_backup_regs {
72262306a36Sopenharmony_ci	u32 adda[IQK_ADDA_REG_NUM];
72362306a36Sopenharmony_ci	u8 mac8[IQK_MAC8_REG_NUM];
72462306a36Sopenharmony_ci	u32 mac32[IQK_MAC32_REG_NUM];
72562306a36Sopenharmony_ci	u32 bb[IQK_BB_REG_NUM];
72662306a36Sopenharmony_ci
72762306a36Sopenharmony_ci	u32 lte_path;
72862306a36Sopenharmony_ci	u32 lte_gnt;
72962306a36Sopenharmony_ci
73062306a36Sopenharmony_ci	u32 bb_sel_btg;
73162306a36Sopenharmony_ci	u8 btg_sel;
73262306a36Sopenharmony_ci
73362306a36Sopenharmony_ci	u8 igia;
73462306a36Sopenharmony_ci	u8 igib;
73562306a36Sopenharmony_ci};
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_cistatic void rtw8723d_iqk_backup_regs(struct rtw_dev *rtwdev,
73862306a36Sopenharmony_ci				     struct iqk_backup_regs *backup)
73962306a36Sopenharmony_ci{
74062306a36Sopenharmony_ci	int i;
74162306a36Sopenharmony_ci
74262306a36Sopenharmony_ci	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
74362306a36Sopenharmony_ci		backup->adda[i] = rtw_read32(rtwdev, iqk_adda_regs[i]);
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_ci	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
74662306a36Sopenharmony_ci		backup->mac8[i] = rtw_read8(rtwdev, iqk_mac8_regs[i]);
74762306a36Sopenharmony_ci	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
74862306a36Sopenharmony_ci		backup->mac32[i] = rtw_read32(rtwdev, iqk_mac32_regs[i]);
74962306a36Sopenharmony_ci
75062306a36Sopenharmony_ci	for (i = 0; i < IQK_BB_REG_NUM; i++)
75162306a36Sopenharmony_ci		backup->bb[i] = rtw_read32(rtwdev, iqk_bb_regs[i]);
75262306a36Sopenharmony_ci
75362306a36Sopenharmony_ci	backup->igia = rtw_read32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0);
75462306a36Sopenharmony_ci	backup->igib = rtw_read32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0);
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	backup->bb_sel_btg = rtw_read32(rtwdev, REG_BB_SEL_BTG);
75762306a36Sopenharmony_ci}
75862306a36Sopenharmony_ci
75962306a36Sopenharmony_cistatic void rtw8723d_iqk_restore_regs(struct rtw_dev *rtwdev,
76062306a36Sopenharmony_ci				      const struct iqk_backup_regs *backup)
76162306a36Sopenharmony_ci{
76262306a36Sopenharmony_ci	int i;
76362306a36Sopenharmony_ci
76462306a36Sopenharmony_ci	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
76562306a36Sopenharmony_ci		rtw_write32(rtwdev, iqk_adda_regs[i], backup->adda[i]);
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
76862306a36Sopenharmony_ci		rtw_write8(rtwdev, iqk_mac8_regs[i], backup->mac8[i]);
76962306a36Sopenharmony_ci	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
77062306a36Sopenharmony_ci		rtw_write32(rtwdev, iqk_mac32_regs[i], backup->mac32[i]);
77162306a36Sopenharmony_ci
77262306a36Sopenharmony_ci	for (i = 0; i < IQK_BB_REG_NUM; i++)
77362306a36Sopenharmony_ci		rtw_write32(rtwdev, iqk_bb_regs[i], backup->bb[i]);
77462306a36Sopenharmony_ci
77562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
77662306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, backup->igia);
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, 0x50);
77962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, backup->igib);
78062306a36Sopenharmony_ci
78162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x01008c00);
78262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x01008c00);
78362306a36Sopenharmony_ci}
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_cistatic void rtw8723d_iqk_backup_path_ctrl(struct rtw_dev *rtwdev,
78662306a36Sopenharmony_ci					  struct iqk_backup_regs *backup)
78762306a36Sopenharmony_ci{
78862306a36Sopenharmony_ci	backup->btg_sel = rtw_read8(rtwdev, REG_BTG_SEL);
78962306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] original 0x67 = 0x%x\n",
79062306a36Sopenharmony_ci		backup->btg_sel);
79162306a36Sopenharmony_ci}
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_cistatic void rtw8723d_iqk_config_path_ctrl(struct rtw_dev *rtwdev)
79462306a36Sopenharmony_ci{
79562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_PAD_CTRL1, BIT_BT_BTG_SEL, 0x1);
79662306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] set 0x67 = 0x%x\n",
79762306a36Sopenharmony_ci		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
79862306a36Sopenharmony_ci}
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_cistatic void rtw8723d_iqk_restore_path_ctrl(struct rtw_dev *rtwdev,
80162306a36Sopenharmony_ci					   const struct iqk_backup_regs *backup)
80262306a36Sopenharmony_ci{
80362306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_BTG_SEL, backup->btg_sel);
80462306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] restore 0x67 = 0x%x\n",
80562306a36Sopenharmony_ci		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
80662306a36Sopenharmony_ci}
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_cistatic void rtw8723d_iqk_backup_lte_path_gnt(struct rtw_dev *rtwdev,
80962306a36Sopenharmony_ci					     struct iqk_backup_regs *backup)
81062306a36Sopenharmony_ci{
81162306a36Sopenharmony_ci	backup->lte_path = rtw_read32(rtwdev, REG_LTECOEX_PATH_CONTROL);
81262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0038);
81362306a36Sopenharmony_ci	mdelay(1);
81462306a36Sopenharmony_ci	backup->lte_gnt = rtw_read32(rtwdev, REG_LTECOEX_READ_DATA);
81562306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] OriginalGNT = 0x%x\n",
81662306a36Sopenharmony_ci		backup->lte_gnt);
81762306a36Sopenharmony_ci}
81862306a36Sopenharmony_ci
81962306a36Sopenharmony_cistatic void rtw8723d_iqk_config_lte_path_gnt(struct rtw_dev *rtwdev)
82062306a36Sopenharmony_ci{
82162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, 0x0000ff00);
82262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc0020038);
82362306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_LTECOEX_PATH_CONTROL, BIT_LTE_MUX_CTRL_PATH, 0x1);
82462306a36Sopenharmony_ci}
82562306a36Sopenharmony_ci
82662306a36Sopenharmony_cistatic void rtw8723d_iqk_restore_lte_path_gnt(struct rtw_dev *rtwdev,
82762306a36Sopenharmony_ci					      const struct iqk_backup_regs *bak)
82862306a36Sopenharmony_ci{
82962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, bak->lte_gnt);
83062306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc00f0038);
83162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_PATH_CONTROL, bak->lte_path);
83262306a36Sopenharmony_ci}
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_cistruct rtw_8723d_iqk_cfg {
83562306a36Sopenharmony_ci	const char *name;
83662306a36Sopenharmony_ci	u32 val_bb_sel_btg;
83762306a36Sopenharmony_ci	u32 reg_lutwe;
83862306a36Sopenharmony_ci	u32 val_txiqk_pi;
83962306a36Sopenharmony_ci	u32 reg_padlut;
84062306a36Sopenharmony_ci	u32 reg_gaintx;
84162306a36Sopenharmony_ci	u32 reg_bspad;
84262306a36Sopenharmony_ci	u32 val_wlint;
84362306a36Sopenharmony_ci	u32 val_wlsel;
84462306a36Sopenharmony_ci	u32 val_iqkpts;
84562306a36Sopenharmony_ci};
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_cistatic const struct rtw_8723d_iqk_cfg iqk_tx_cfg[PATH_NR] = {
84862306a36Sopenharmony_ci	[PATH_S1] = {
84962306a36Sopenharmony_ci		.name = "S1",
85062306a36Sopenharmony_ci		.val_bb_sel_btg = 0x99000000,
85162306a36Sopenharmony_ci		.reg_lutwe = RF_LUTWE,
85262306a36Sopenharmony_ci		.val_txiqk_pi = 0x8214019f,
85362306a36Sopenharmony_ci		.reg_padlut = RF_LUTDBG,
85462306a36Sopenharmony_ci		.reg_gaintx = RF_GAINTX,
85562306a36Sopenharmony_ci		.reg_bspad = RF_BSPAD,
85662306a36Sopenharmony_ci		.val_wlint = 0xe0d,
85762306a36Sopenharmony_ci		.val_wlsel = 0x60d,
85862306a36Sopenharmony_ci		.val_iqkpts = 0xfa000000,
85962306a36Sopenharmony_ci	},
86062306a36Sopenharmony_ci	[PATH_S0] = {
86162306a36Sopenharmony_ci		.name = "S0",
86262306a36Sopenharmony_ci		.val_bb_sel_btg = 0x99000280,
86362306a36Sopenharmony_ci		.reg_lutwe = RF_LUTWE2,
86462306a36Sopenharmony_ci		.val_txiqk_pi = 0x8214018a,
86562306a36Sopenharmony_ci		.reg_padlut = RF_TXADBG,
86662306a36Sopenharmony_ci		.reg_gaintx = RF_TRXIQ,
86762306a36Sopenharmony_ci		.reg_bspad = RF_TXATANK,
86862306a36Sopenharmony_ci		.val_wlint = 0xe6d,
86962306a36Sopenharmony_ci		.val_wlsel = 0x66d,
87062306a36Sopenharmony_ci		.val_iqkpts = 0xf9000000,
87162306a36Sopenharmony_ci	},
87262306a36Sopenharmony_ci};
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_cistatic u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
87562306a36Sopenharmony_ci				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
87662306a36Sopenharmony_ci{
87762306a36Sopenharmony_ci	s32 tx_x, tx_y;
87862306a36Sopenharmony_ci	u32 tx_fail;
87962306a36Sopenharmony_ci
88062306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
88162306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_IQK_RES_RY));
88262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
88362306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_IQK_RES_TX),
88462306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_IQK_RES_TY));
88562306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
88662306a36Sopenharmony_ci		"[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
88762306a36Sopenharmony_ci		rtw_read32(rtwdev, 0xe90),
88862306a36Sopenharmony_ci		rtw_read32(rtwdev, 0xe98));
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci	tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
89162306a36Sopenharmony_ci	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
89262306a36Sopenharmony_ci	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
89362306a36Sopenharmony_ci
89462306a36Sopenharmony_ci	if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
89562306a36Sopenharmony_ci		return IQK_TX_OK;
89662306a36Sopenharmony_ci
89762306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s TXIQK is failed\n",
89862306a36Sopenharmony_ci		iqk_cfg->name);
89962306a36Sopenharmony_ci
90062306a36Sopenharmony_ci	return 0;
90162306a36Sopenharmony_ci}
90262306a36Sopenharmony_ci
90362306a36Sopenharmony_cistatic u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
90462306a36Sopenharmony_ci				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
90562306a36Sopenharmony_ci{
90662306a36Sopenharmony_ci	s32 rx_x, rx_y;
90762306a36Sopenharmony_ci	u32 rx_fail;
90862306a36Sopenharmony_ci
90962306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
91062306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_IQK_RES_RX),
91162306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_IQK_RES_RY));
91262306a36Sopenharmony_ci
91362306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
91462306a36Sopenharmony_ci		"[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
91562306a36Sopenharmony_ci		rtw_read32(rtwdev, 0xea0),
91662306a36Sopenharmony_ci		rtw_read32(rtwdev, 0xea8));
91762306a36Sopenharmony_ci
91862306a36Sopenharmony_ci	rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
91962306a36Sopenharmony_ci	rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
92062306a36Sopenharmony_ci	rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
92162306a36Sopenharmony_ci	rx_y = abs(iqkxy_to_s32(rx_y));
92262306a36Sopenharmony_ci
92362306a36Sopenharmony_ci	if (!rx_fail && rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
92462306a36Sopenharmony_ci	    rx_y < IQK_RX_Y_LMT)
92562306a36Sopenharmony_ci		return IQK_RX_OK;
92662306a36Sopenharmony_ci
92762306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s RXIQK STEP2 is failed\n",
92862306a36Sopenharmony_ci		iqk_cfg->name);
92962306a36Sopenharmony_ci
93062306a36Sopenharmony_ci	return 0;
93162306a36Sopenharmony_ci}
93262306a36Sopenharmony_ci
93362306a36Sopenharmony_cistatic void rtw8723d_iqk_one_shot(struct rtw_dev *rtwdev, bool tx,
93462306a36Sopenharmony_ci				  const struct rtw_8723d_iqk_cfg *iqk_cfg)
93562306a36Sopenharmony_ci{
93662306a36Sopenharmony_ci	u32 pts = (tx ? iqk_cfg->val_iqkpts : 0xf9000000);
93762306a36Sopenharmony_ci
93862306a36Sopenharmony_ci	/* enter IQK mode */
93962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
94062306a36Sopenharmony_ci	rtw8723d_iqk_config_lte_path_gnt(rtwdev);
94162306a36Sopenharmony_ci
94262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0054);
94362306a36Sopenharmony_ci	mdelay(1);
94462306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] GNT_BT @%s %sIQK1 = 0x%x\n",
94562306a36Sopenharmony_ci		iqk_cfg->name, tx ? "TX" : "RX",
94662306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_LTECOEX_READ_DATA));
94762306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x948 @%s %sIQK1 = 0x%x\n",
94862306a36Sopenharmony_ci		iqk_cfg->name, tx ? "TX" : "RX",
94962306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_BB_SEL_BTG));
95062306a36Sopenharmony_ci
95162306a36Sopenharmony_ci	/* One shot, LOK & IQK */
95262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, pts);
95362306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
95462306a36Sopenharmony_ci
95562306a36Sopenharmony_ci	if (!check_hw_ready(rtwdev, REG_IQK_RES_RY, BIT_IQK_DONE, 1))
95662306a36Sopenharmony_ci		rtw_warn(rtwdev, "%s %s IQK isn't done\n", iqk_cfg->name,
95762306a36Sopenharmony_ci			 tx ? "TX" : "RX");
95862306a36Sopenharmony_ci}
95962306a36Sopenharmony_ci
96062306a36Sopenharmony_cistatic void rtw8723d_iqk_txrx_path_post(struct rtw_dev *rtwdev,
96162306a36Sopenharmony_ci					const struct rtw_8723d_iqk_cfg *iqk_cfg,
96262306a36Sopenharmony_ci					const struct iqk_backup_regs *backup)
96362306a36Sopenharmony_ci{
96462306a36Sopenharmony_ci	rtw8723d_iqk_restore_lte_path_gnt(rtwdev, backup);
96562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	/* leave IQK mode */
96862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
96962306a36Sopenharmony_ci	mdelay(1);
97062306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x0);
97162306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, BIT(0), 0x0);
97262306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, BIT(0), 0x0);
97362306a36Sopenharmony_ci}
97462306a36Sopenharmony_ci
97562306a36Sopenharmony_cistatic u8 rtw8723d_iqk_tx_path(struct rtw_dev *rtwdev,
97662306a36Sopenharmony_ci			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
97762306a36Sopenharmony_ci			       const struct iqk_backup_regs *backup)
97862306a36Sopenharmony_ci{
97962306a36Sopenharmony_ci	u8 status;
98062306a36Sopenharmony_ci
98162306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s TXIQK!!\n", iqk_cfg->name);
98262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s TXIQK = 0x%x\n",
98362306a36Sopenharmony_ci		iqk_cfg->name,
98462306a36Sopenharmony_ci		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
98562306a36Sopenharmony_ci
98662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
98762306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
98862306a36Sopenharmony_ci	mdelay(1);
98962306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
99062306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00004);
99162306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005d);
99262306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xBFFE0);
99362306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci	/* IQK setting */
99662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x08008c0c);
99762306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
99862306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, iqk_cfg->val_txiqk_pi);
99962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160200);
100062306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
100162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
100262306a36Sopenharmony_ci
100362306a36Sopenharmony_ci	/* LOK setting */
100462306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
100562306a36Sopenharmony_ci
100662306a36Sopenharmony_ci	/* PA, PAD setting */
100762306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
100862306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
100962306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x1E0, 0x3);
101062306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_RXIQGEN, 0x1F, 0xf);
101162306a36Sopenharmony_ci
101262306a36Sopenharmony_ci	/* LOK setting for 8723D */
101362306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x10, 0x1);
101462306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_bspad, 0x1, 0x1);
101562306a36Sopenharmony_ci
101662306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
101762306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s TXIQK = 0x%x\n",
102062306a36Sopenharmony_ci		iqk_cfg->name,
102162306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
102262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s TXIQK = 0x%x\n",
102362306a36Sopenharmony_ci		iqk_cfg->name,
102462306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
102562306a36Sopenharmony_ci
102662306a36Sopenharmony_ci	rtw8723d_iqk_one_shot(rtwdev, true, iqk_cfg);
102762306a36Sopenharmony_ci	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
102862306a36Sopenharmony_ci
102962306a36Sopenharmony_ci	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ci	return status;
103262306a36Sopenharmony_ci}
103362306a36Sopenharmony_ci
103462306a36Sopenharmony_cistatic u8 rtw8723d_iqk_rx_path(struct rtw_dev *rtwdev,
103562306a36Sopenharmony_ci			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
103662306a36Sopenharmony_ci			       const struct iqk_backup_regs *backup)
103762306a36Sopenharmony_ci{
103862306a36Sopenharmony_ci	u32 tx_x, tx_y;
103962306a36Sopenharmony_ci	u8 status;
104062306a36Sopenharmony_ci
104162306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK Step1!!\n",
104262306a36Sopenharmony_ci		iqk_cfg->name);
104362306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK1 = 0x%x\n",
104462306a36Sopenharmony_ci		iqk_cfg->name,
104562306a36Sopenharmony_ci		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
104662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
104762306a36Sopenharmony_ci
104862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
104962306a36Sopenharmony_ci
105062306a36Sopenharmony_ci	/* IQK setting */
105162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
105262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
105362306a36Sopenharmony_ci
105462306a36Sopenharmony_ci	/* path IQK setting */
105562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
105662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
105762306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
105862306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
105962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82160000);
106062306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160000);
106162306a36Sopenharmony_ci
106262306a36Sopenharmony_ci	/* LOK setting */
106362306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
106462306a36Sopenharmony_ci
106562306a36Sopenharmony_ci	/* RXIQK mode */
106662306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
106762306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00006);
106862306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
106962306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xa7ffb);
107062306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci	/* PA/PAD=0 */
107362306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
107462306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
107562306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
107662306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
107762306a36Sopenharmony_ci
107862306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1@ path %s RXIQK1 = 0x%x\n",
107962306a36Sopenharmony_ci		iqk_cfg->name,
108062306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
108162306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2@ path %s RXIQK1 = 0x%x\n",
108262306a36Sopenharmony_ci		iqk_cfg->name,
108362306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
108462306a36Sopenharmony_ci
108562306a36Sopenharmony_ci	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
108662306a36Sopenharmony_ci	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
108762306a36Sopenharmony_ci
108862306a36Sopenharmony_ci	if (!status)
108962306a36Sopenharmony_ci		goto restore;
109062306a36Sopenharmony_ci
109162306a36Sopenharmony_ci	/* second round */
109262306a36Sopenharmony_ci	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
109362306a36Sopenharmony_ci	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
109462306a36Sopenharmony_ci
109562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
109662306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
109762306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_TXIQK_11N),
109862306a36Sopenharmony_ci		BIT_SET_TXIQK_11N(tx_x, tx_y));
109962306a36Sopenharmony_ci
110062306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK STEP2!!\n",
110162306a36Sopenharmony_ci		iqk_cfg->name);
110262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK2 = 0x%x\n",
110362306a36Sopenharmony_ci		iqk_cfg->name,
110462306a36Sopenharmony_ci		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
110562306a36Sopenharmony_ci
110662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
110762306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
110862306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
110962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
111062306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
111162306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82170000);
111262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28171400);
111362306a36Sopenharmony_ci
111462306a36Sopenharmony_ci	/* LOK setting */
111562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
111662306a36Sopenharmony_ci
111762306a36Sopenharmony_ci	/* RXIQK mode */
111862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
111962306a36Sopenharmony_ci	mdelay(1);
112062306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x80000, 0x1);
112162306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00007);
112262306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
112362306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xb3fdb);
112462306a36Sopenharmony_ci	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
112562306a36Sopenharmony_ci
112662306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s RXIQK2 = 0x%x\n",
112762306a36Sopenharmony_ci		iqk_cfg->name,
112862306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
112962306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s RXIQK2 = 0x%x\n",
113062306a36Sopenharmony_ci		iqk_cfg->name,
113162306a36Sopenharmony_ci		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
113262306a36Sopenharmony_ci
113362306a36Sopenharmony_ci	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
113462306a36Sopenharmony_ci	status |= rtw8723d_iqk_check_rx_failed(rtwdev, iqk_cfg);
113562306a36Sopenharmony_ci
113662306a36Sopenharmony_cirestore:
113762306a36Sopenharmony_ci	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
113862306a36Sopenharmony_ci
113962306a36Sopenharmony_ci	return status;
114062306a36Sopenharmony_ci}
114162306a36Sopenharmony_ci
114262306a36Sopenharmony_cistatic
114362306a36Sopenharmony_civoid rtw8723d_iqk_fill_s1_matrix(struct rtw_dev *rtwdev, const s32 result[])
114462306a36Sopenharmony_ci{
114562306a36Sopenharmony_ci	s32 oldval_1;
114662306a36Sopenharmony_ci	s32 x, y;
114762306a36Sopenharmony_ci	s32 tx1_a, tx1_a_ext;
114862306a36Sopenharmony_ci	s32 tx1_c, tx1_c_ext;
114962306a36Sopenharmony_ci
115062306a36Sopenharmony_ci	if (result[IQK_S1_TX_X] == 0)
115162306a36Sopenharmony_ci		return;
115262306a36Sopenharmony_ci
115362306a36Sopenharmony_ci	oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
115462306a36Sopenharmony_ci				   BIT_MASK_TXIQ_ELM_D);
115562306a36Sopenharmony_ci
115662306a36Sopenharmony_ci	x = iqkxy_to_s32(result[IQK_S1_TX_X]);
115762306a36Sopenharmony_ci	tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
115862306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
115962306a36Sopenharmony_ci			 BIT_MASK_TXIQ_ELM_A, tx1_a);
116062306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
116162306a36Sopenharmony_ci			 BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
116262306a36Sopenharmony_ci
116362306a36Sopenharmony_ci	y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
116462306a36Sopenharmony_ci	tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
116562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
116662306a36Sopenharmony_ci			 BIT_SET_TXIQ_ELM_C1(tx1_c));
116762306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
116862306a36Sopenharmony_ci			 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
116962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
117062306a36Sopenharmony_ci			 BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
117162306a36Sopenharmony_ci
117262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
117362306a36Sopenharmony_ci		"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
117462306a36Sopenharmony_ci		x, tx1_a, oldval_1);
117562306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
117662306a36Sopenharmony_ci		"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
117762306a36Sopenharmony_ci
117862306a36Sopenharmony_ci	if (result[IQK_S1_RX_X] == 0)
117962306a36Sopenharmony_ci		return;
118062306a36Sopenharmony_ci
118162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_X,
118262306a36Sopenharmony_ci			 result[IQK_S1_RX_X]);
118362306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_Y1,
118462306a36Sopenharmony_ci			 BIT_SET_RXIQ_S1_Y1(result[IQK_S1_RX_Y]));
118562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
118662306a36Sopenharmony_ci			 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
118762306a36Sopenharmony_ci}
118862306a36Sopenharmony_ci
118962306a36Sopenharmony_cistatic
119062306a36Sopenharmony_civoid rtw8723d_iqk_fill_s0_matrix(struct rtw_dev *rtwdev, const s32 result[])
119162306a36Sopenharmony_ci{
119262306a36Sopenharmony_ci	s32 oldval_0;
119362306a36Sopenharmony_ci	s32 x, y;
119462306a36Sopenharmony_ci	s32 tx0_a, tx0_a_ext;
119562306a36Sopenharmony_ci	s32 tx0_c, tx0_c_ext;
119662306a36Sopenharmony_ci
119762306a36Sopenharmony_ci	if (result[IQK_S0_TX_X] == 0)
119862306a36Sopenharmony_ci		return;
119962306a36Sopenharmony_ci
120062306a36Sopenharmony_ci	oldval_0 = rtw_read32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0);
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	x = iqkxy_to_s32(result[IQK_S0_TX_X]);
120362306a36Sopenharmony_ci	tx0_a = iqk_mult(x, oldval_0, &tx0_a_ext);
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, tx0_a);
120662306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, tx0_a_ext);
120762306a36Sopenharmony_ci
120862306a36Sopenharmony_ci	y = iqkxy_to_s32(result[IQK_S0_TX_Y]);
120962306a36Sopenharmony_ci	tx0_c = iqk_mult(y, oldval_0, &tx0_c_ext);
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, tx0_c);
121262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, tx0_c_ext);
121362306a36Sopenharmony_ci
121462306a36Sopenharmony_ci	if (result[IQK_S0_RX_X] == 0)
121562306a36Sopenharmony_ci		return;
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_X_S0,
121862306a36Sopenharmony_ci			 result[IQK_S0_RX_X]);
121962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_Y_S0,
122062306a36Sopenharmony_ci			 result[IQK_S0_RX_Y]);
122162306a36Sopenharmony_ci}
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_cistatic void rtw8723d_iqk_path_adda_on(struct rtw_dev *rtwdev)
122462306a36Sopenharmony_ci{
122562306a36Sopenharmony_ci	int i;
122662306a36Sopenharmony_ci
122762306a36Sopenharmony_ci	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
122862306a36Sopenharmony_ci		rtw_write32(rtwdev, iqk_adda_regs[i], 0x03c00016);
122962306a36Sopenharmony_ci}
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_cistatic void rtw8723d_iqk_config_mac(struct rtw_dev *rtwdev)
123262306a36Sopenharmony_ci{
123362306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
123462306a36Sopenharmony_ci}
123562306a36Sopenharmony_ci
123662306a36Sopenharmony_cistatic
123762306a36Sopenharmony_civoid rtw8723d_iqk_rf_standby(struct rtw_dev *rtwdev, enum rtw_rf_path path)
123862306a36Sopenharmony_ci{
123962306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path-%s standby mode!\n",
124062306a36Sopenharmony_ci		path == RF_PATH_A ? "S1" : "S0");
124162306a36Sopenharmony_ci
124262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
124362306a36Sopenharmony_ci	mdelay(1);
124462306a36Sopenharmony_ci	rtw_write_rf(rtwdev, path, RF_MODE, RFREG_MASK, 0x10000);
124562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
124662306a36Sopenharmony_ci}
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_cistatic
124962306a36Sopenharmony_cibool rtw8723d_iqk_similarity_cmp(struct rtw_dev *rtwdev, s32 result[][IQK_NR],
125062306a36Sopenharmony_ci				 u8 c1, u8 c2)
125162306a36Sopenharmony_ci{
125262306a36Sopenharmony_ci	u32 i, j, diff;
125362306a36Sopenharmony_ci	u32 bitmap = 0;
125462306a36Sopenharmony_ci	u8 candidate[PATH_NR] = {IQK_ROUND_INVALID, IQK_ROUND_INVALID};
125562306a36Sopenharmony_ci	bool ret = true;
125662306a36Sopenharmony_ci
125762306a36Sopenharmony_ci	s32 tmp1, tmp2;
125862306a36Sopenharmony_ci
125962306a36Sopenharmony_ci	for (i = 0; i < IQK_NR; i++) {
126062306a36Sopenharmony_ci		tmp1 = iqkxy_to_s32(result[c1][i]);
126162306a36Sopenharmony_ci		tmp2 = iqkxy_to_s32(result[c2][i]);
126262306a36Sopenharmony_ci
126362306a36Sopenharmony_ci		diff = abs(tmp1 - tmp2);
126462306a36Sopenharmony_ci
126562306a36Sopenharmony_ci		if (diff <= MAX_TOLERANCE)
126662306a36Sopenharmony_ci			continue;
126762306a36Sopenharmony_ci
126862306a36Sopenharmony_ci		if ((i == IQK_S1_RX_X || i == IQK_S0_RX_X) && !bitmap) {
126962306a36Sopenharmony_ci			if (result[c1][i] + result[c1][i + 1] == 0)
127062306a36Sopenharmony_ci				candidate[i / IQK_SX_NR] = c2;
127162306a36Sopenharmony_ci			else if (result[c2][i] + result[c2][i + 1] == 0)
127262306a36Sopenharmony_ci				candidate[i / IQK_SX_NR] = c1;
127362306a36Sopenharmony_ci			else
127462306a36Sopenharmony_ci				bitmap |= BIT(i);
127562306a36Sopenharmony_ci		} else {
127662306a36Sopenharmony_ci			bitmap |= BIT(i);
127762306a36Sopenharmony_ci		}
127862306a36Sopenharmony_ci	}
127962306a36Sopenharmony_ci
128062306a36Sopenharmony_ci	if (bitmap != 0)
128162306a36Sopenharmony_ci		goto check_sim;
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci	for (i = 0; i < PATH_NR; i++) {
128462306a36Sopenharmony_ci		if (candidate[i] == IQK_ROUND_INVALID)
128562306a36Sopenharmony_ci			continue;
128662306a36Sopenharmony_ci
128762306a36Sopenharmony_ci		for (j = i * IQK_SX_NR; j < i * IQK_SX_NR + 2; j++)
128862306a36Sopenharmony_ci			result[IQK_ROUND_HYBRID][j] = result[candidate[i]][j];
128962306a36Sopenharmony_ci		ret = false;
129062306a36Sopenharmony_ci	}
129162306a36Sopenharmony_ci
129262306a36Sopenharmony_ci	return ret;
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_cicheck_sim:
129562306a36Sopenharmony_ci	for (i = 0; i < IQK_NR; i++) {
129662306a36Sopenharmony_ci		j = i & ~1;	/* 2 bits are a pair for IQ[X, Y] */
129762306a36Sopenharmony_ci		if (bitmap & GENMASK(j + 1, j))
129862306a36Sopenharmony_ci			continue;
129962306a36Sopenharmony_ci
130062306a36Sopenharmony_ci		result[IQK_ROUND_HYBRID][i] = result[c1][i];
130162306a36Sopenharmony_ci	}
130262306a36Sopenharmony_ci
130362306a36Sopenharmony_ci	return false;
130462306a36Sopenharmony_ci}
130562306a36Sopenharmony_ci
130662306a36Sopenharmony_cistatic
130762306a36Sopenharmony_civoid rtw8723d_iqk_precfg_path(struct rtw_dev *rtwdev, enum rtw8723d_path path)
130862306a36Sopenharmony_ci{
130962306a36Sopenharmony_ci	if (path == PATH_S0) {
131062306a36Sopenharmony_ci		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_A);
131162306a36Sopenharmony_ci		rtw8723d_iqk_path_adda_on(rtwdev);
131262306a36Sopenharmony_ci	}
131362306a36Sopenharmony_ci
131462306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
131562306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
131662306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
131762306a36Sopenharmony_ci
131862306a36Sopenharmony_ci	if (path == PATH_S1) {
131962306a36Sopenharmony_ci		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_B);
132062306a36Sopenharmony_ci		rtw8723d_iqk_path_adda_on(rtwdev);
132162306a36Sopenharmony_ci	}
132262306a36Sopenharmony_ci}
132362306a36Sopenharmony_ci
132462306a36Sopenharmony_cistatic
132562306a36Sopenharmony_civoid rtw8723d_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
132662306a36Sopenharmony_ci			    const struct iqk_backup_regs *backup)
132762306a36Sopenharmony_ci{
132862306a36Sopenharmony_ci	u32 i;
132962306a36Sopenharmony_ci	u8 s1_ok, s0_ok;
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
133262306a36Sopenharmony_ci		"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
133362306a36Sopenharmony_ci
133462306a36Sopenharmony_ci	rtw8723d_iqk_path_adda_on(rtwdev);
133562306a36Sopenharmony_ci	rtw8723d_iqk_config_mac(rtwdev);
133662306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
133762306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05611);
133862306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
133962306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204200);
134062306a36Sopenharmony_ci	rtw8723d_iqk_precfg_path(rtwdev, PATH_S1);
134162306a36Sopenharmony_ci
134262306a36Sopenharmony_ci	for (i = 0; i < PATH_IQK_RETRY; i++) {
134362306a36Sopenharmony_ci		s1_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
134462306a36Sopenharmony_ci		if (s1_ok == IQK_TX_OK) {
134562306a36Sopenharmony_ci			rtw_dbg(rtwdev, RTW_DBG_RFK,
134662306a36Sopenharmony_ci				"[IQK] path S1 Tx IQK Success!!\n");
134762306a36Sopenharmony_ci			result[t][IQK_S1_TX_X] =
134862306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
134962306a36Sopenharmony_ci			result[t][IQK_S1_TX_Y] =
135062306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
135162306a36Sopenharmony_ci			break;
135262306a36Sopenharmony_ci		}
135362306a36Sopenharmony_ci
135462306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Tx IQK Fail!!\n");
135562306a36Sopenharmony_ci		result[t][IQK_S1_TX_X] = 0x100;
135662306a36Sopenharmony_ci		result[t][IQK_S1_TX_Y] = 0x0;
135762306a36Sopenharmony_ci	}
135862306a36Sopenharmony_ci
135962306a36Sopenharmony_ci	for (i = 0; i < PATH_IQK_RETRY; i++) {
136062306a36Sopenharmony_ci		s1_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
136162306a36Sopenharmony_ci		if (s1_ok == (IQK_TX_OK | IQK_RX_OK)) {
136262306a36Sopenharmony_ci			rtw_dbg(rtwdev, RTW_DBG_RFK,
136362306a36Sopenharmony_ci				"[IQK] path S1 Rx IQK Success!!\n");
136462306a36Sopenharmony_ci			result[t][IQK_S1_RX_X] =
136562306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
136662306a36Sopenharmony_ci			result[t][IQK_S1_RX_Y] =
136762306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
136862306a36Sopenharmony_ci			break;
136962306a36Sopenharmony_ci		}
137062306a36Sopenharmony_ci
137162306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Rx IQK Fail!!\n");
137262306a36Sopenharmony_ci		result[t][IQK_S1_RX_X] = 0x100;
137362306a36Sopenharmony_ci		result[t][IQK_S1_RX_Y] = 0x0;
137462306a36Sopenharmony_ci	}
137562306a36Sopenharmony_ci
137662306a36Sopenharmony_ci	if (s1_ok == 0x0)
137762306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 IQK is failed!!\n");
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_ci	rtw8723d_iqk_precfg_path(rtwdev, PATH_S0);
138062306a36Sopenharmony_ci
138162306a36Sopenharmony_ci	for (i = 0; i < PATH_IQK_RETRY; i++) {
138262306a36Sopenharmony_ci		s0_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
138362306a36Sopenharmony_ci		if (s0_ok == IQK_TX_OK) {
138462306a36Sopenharmony_ci			rtw_dbg(rtwdev, RTW_DBG_RFK,
138562306a36Sopenharmony_ci				"[IQK] path S0 Tx IQK Success!!\n");
138662306a36Sopenharmony_ci			result[t][IQK_S0_TX_X] =
138762306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
138862306a36Sopenharmony_ci			result[t][IQK_S0_TX_Y] =
138962306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
139062306a36Sopenharmony_ci			break;
139162306a36Sopenharmony_ci		}
139262306a36Sopenharmony_ci
139362306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Tx IQK Fail!!\n");
139462306a36Sopenharmony_ci		result[t][IQK_S0_TX_X] = 0x100;
139562306a36Sopenharmony_ci		result[t][IQK_S0_TX_Y] = 0x0;
139662306a36Sopenharmony_ci	}
139762306a36Sopenharmony_ci
139862306a36Sopenharmony_ci	for (i = 0; i < PATH_IQK_RETRY; i++) {
139962306a36Sopenharmony_ci		s0_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
140062306a36Sopenharmony_ci		if (s0_ok == (IQK_TX_OK | IQK_RX_OK)) {
140162306a36Sopenharmony_ci			rtw_dbg(rtwdev, RTW_DBG_RFK,
140262306a36Sopenharmony_ci				"[IQK] path S0 Rx IQK Success!!\n");
140362306a36Sopenharmony_ci
140462306a36Sopenharmony_ci			result[t][IQK_S0_RX_X] =
140562306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
140662306a36Sopenharmony_ci			result[t][IQK_S0_RX_Y] =
140762306a36Sopenharmony_ci			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
140862306a36Sopenharmony_ci			break;
140962306a36Sopenharmony_ci		}
141062306a36Sopenharmony_ci
141162306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Rx IQK Fail!!\n");
141262306a36Sopenharmony_ci		result[t][IQK_S0_RX_X] = 0x100;
141362306a36Sopenharmony_ci		result[t][IQK_S0_RX_Y] = 0x0;
141462306a36Sopenharmony_ci	}
141562306a36Sopenharmony_ci
141662306a36Sopenharmony_ci	if (s0_ok == 0x0)
141762306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 IQK is failed!!\n");
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
142062306a36Sopenharmony_ci	mdelay(1);
142162306a36Sopenharmony_ci
142262306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
142362306a36Sopenharmony_ci		"[IQK] back to BB mode, load original value!\n");
142462306a36Sopenharmony_ci}
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_cistatic void rtw8723d_phy_calibration(struct rtw_dev *rtwdev)
142762306a36Sopenharmony_ci{
142862306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
142962306a36Sopenharmony_ci	s32 result[IQK_ROUND_SIZE][IQK_NR];
143062306a36Sopenharmony_ci	struct iqk_backup_regs backup;
143162306a36Sopenharmony_ci	u8 i, j;
143262306a36Sopenharmony_ci	u8 final_candidate = IQK_ROUND_INVALID;
143362306a36Sopenharmony_ci	bool good;
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!!!\n");
143662306a36Sopenharmony_ci
143762306a36Sopenharmony_ci	memset(result, 0, sizeof(result));
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_ci	rtw8723d_iqk_backup_path_ctrl(rtwdev, &backup);
144062306a36Sopenharmony_ci	rtw8723d_iqk_backup_lte_path_gnt(rtwdev, &backup);
144162306a36Sopenharmony_ci	rtw8723d_iqk_backup_regs(rtwdev, &backup);
144262306a36Sopenharmony_ci
144362306a36Sopenharmony_ci	for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
144462306a36Sopenharmony_ci		rtw8723d_iqk_config_path_ctrl(rtwdev);
144562306a36Sopenharmony_ci		rtw8723d_iqk_config_lte_path_gnt(rtwdev);
144662306a36Sopenharmony_ci
144762306a36Sopenharmony_ci		rtw8723d_iqk_one_round(rtwdev, result, i, &backup);
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci		if (i > IQK_ROUND_0)
145062306a36Sopenharmony_ci			rtw8723d_iqk_restore_regs(rtwdev, &backup);
145162306a36Sopenharmony_ci		rtw8723d_iqk_restore_lte_path_gnt(rtwdev, &backup);
145262306a36Sopenharmony_ci		rtw8723d_iqk_restore_path_ctrl(rtwdev, &backup);
145362306a36Sopenharmony_ci
145462306a36Sopenharmony_ci		for (j = IQK_ROUND_0; j < i; j++) {
145562306a36Sopenharmony_ci			good = rtw8723d_iqk_similarity_cmp(rtwdev, result, j, i);
145662306a36Sopenharmony_ci
145762306a36Sopenharmony_ci			if (good) {
145862306a36Sopenharmony_ci				final_candidate = j;
145962306a36Sopenharmony_ci				rtw_dbg(rtwdev, RTW_DBG_RFK,
146062306a36Sopenharmony_ci					"[IQK] cmp %d:%d final_candidate is %x\n",
146162306a36Sopenharmony_ci					j, i, final_candidate);
146262306a36Sopenharmony_ci				goto iqk_done;
146362306a36Sopenharmony_ci			}
146462306a36Sopenharmony_ci		}
146562306a36Sopenharmony_ci	}
146662306a36Sopenharmony_ci
146762306a36Sopenharmony_ci	if (final_candidate == IQK_ROUND_INVALID) {
146862306a36Sopenharmony_ci		s32 reg_tmp = 0;
146962306a36Sopenharmony_ci
147062306a36Sopenharmony_ci		for (i = 0; i < IQK_NR; i++)
147162306a36Sopenharmony_ci			reg_tmp += result[IQK_ROUND_HYBRID][i];
147262306a36Sopenharmony_ci
147362306a36Sopenharmony_ci		if (reg_tmp != 0) {
147462306a36Sopenharmony_ci			final_candidate = IQK_ROUND_HYBRID;
147562306a36Sopenharmony_ci		} else {
147662306a36Sopenharmony_ci			WARN(1, "IQK is failed\n");
147762306a36Sopenharmony_ci			goto out;
147862306a36Sopenharmony_ci		}
147962306a36Sopenharmony_ci	}
148062306a36Sopenharmony_ci
148162306a36Sopenharmony_ciiqk_done:
148262306a36Sopenharmony_ci	rtw8723d_iqk_fill_s1_matrix(rtwdev, result[final_candidate]);
148362306a36Sopenharmony_ci	rtw8723d_iqk_fill_s0_matrix(rtwdev, result[final_candidate]);
148462306a36Sopenharmony_ci
148562306a36Sopenharmony_ci	dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
148662306a36Sopenharmony_ci	dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
148762306a36Sopenharmony_ci	dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
148862306a36Sopenharmony_ci	dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
148962306a36Sopenharmony_ci	dm_info->iqk.done = true;
149062306a36Sopenharmony_ci
149162306a36Sopenharmony_ciout:
149262306a36Sopenharmony_ci	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
149362306a36Sopenharmony_ci
149462306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
149562306a36Sopenharmony_ci		final_candidate);
149662306a36Sopenharmony_ci
149762306a36Sopenharmony_ci	for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
149862306a36Sopenharmony_ci		rtw_dbg(rtwdev, RTW_DBG_RFK,
149962306a36Sopenharmony_ci			"[IQK] Result %u: rege94_s1=%x rege9c_s1=%x regea4_s1=%x regeac_s1=%x rege94_s0=%x rege9c_s0=%x regea4_s0=%x regeac_s0=%x %s\n",
150062306a36Sopenharmony_ci			i,
150162306a36Sopenharmony_ci			result[i][0], result[i][1], result[i][2], result[i][3],
150262306a36Sopenharmony_ci			result[i][4], result[i][5], result[i][6], result[i][7],
150362306a36Sopenharmony_ci			final_candidate == i ? "(final candidate)" : "");
150462306a36Sopenharmony_ci
150562306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
150662306a36Sopenharmony_ci		"[IQK]0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
150762306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
150862306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
150962306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_A_RXIQI),
151062306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
151162306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK,
151262306a36Sopenharmony_ci		"[IQK]0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
151362306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_TXIQ_AB_S0),
151462306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_TXIQ_CD_S0),
151562306a36Sopenharmony_ci		rtw_read32(rtwdev, REG_RXIQ_AB_S0));
151662306a36Sopenharmony_ci
151762306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] finished\n");
151862306a36Sopenharmony_ci}
151962306a36Sopenharmony_ci
152062306a36Sopenharmony_cistatic void rtw8723d_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
152162306a36Sopenharmony_ci{
152262306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
152362306a36Sopenharmony_ci	u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
152462306a36Sopenharmony_ci	u8 cck_n_rx;
152562306a36Sopenharmony_ci
152662306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
152762306a36Sopenharmony_ci		dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
152862306a36Sopenharmony_ci
152962306a36Sopenharmony_ci	if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
153062306a36Sopenharmony_ci		return;
153162306a36Sopenharmony_ci
153262306a36Sopenharmony_ci	cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
153362306a36Sopenharmony_ci		    rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
153462306a36Sopenharmony_ci	rtw_dbg(rtwdev, RTW_DBG_PHY,
153562306a36Sopenharmony_ci		"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
153662306a36Sopenharmony_ci		rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
153762306a36Sopenharmony_ci		dm_info->cck_pd_default + new_lvl * 2,
153862306a36Sopenharmony_ci		pd[new_lvl], dm_info->cck_fa_avg);
153962306a36Sopenharmony_ci
154062306a36Sopenharmony_ci	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
154162306a36Sopenharmony_ci
154262306a36Sopenharmony_ci	dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
154362306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
154462306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
154562306a36Sopenharmony_ci			 dm_info->cck_pd_default + new_lvl * 2);
154662306a36Sopenharmony_ci}
154762306a36Sopenharmony_ci
154862306a36Sopenharmony_ci/* for coex */
154962306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_init(struct rtw_dev *rtwdev)
155062306a36Sopenharmony_ci{
155162306a36Sopenharmony_ci	/* enable TBTT nterrupt */
155262306a36Sopenharmony_ci	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
155362306a36Sopenharmony_ci
155462306a36Sopenharmony_ci	/* BT report packet sample rate	 */
155562306a36Sopenharmony_ci	/* 0x790[5:0]=0x5 */
155662306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
155762306a36Sopenharmony_ci
155862306a36Sopenharmony_ci	/* enable BT counter statistics */
155962306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
156062306a36Sopenharmony_ci
156162306a36Sopenharmony_ci	/* enable PTA (3-wire function form BT side) */
156262306a36Sopenharmony_ci	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
156362306a36Sopenharmony_ci	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
156462306a36Sopenharmony_ci
156562306a36Sopenharmony_ci	/* enable PTA (tx/rx signal form WiFi side) */
156662306a36Sopenharmony_ci	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
156762306a36Sopenharmony_ci}
156862306a36Sopenharmony_ci
156962306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
157062306a36Sopenharmony_ci{
157162306a36Sopenharmony_ci}
157262306a36Sopenharmony_ci
157362306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
157462306a36Sopenharmony_ci{
157562306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_LEDCFG2, BIT(6), 0);
157662306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(0), 0);
157762306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_GPIO_INTM + 2, BIT(4), 0);
157862306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT(1), 0);
157962306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(1), 0);
158062306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT(7), 0);
158162306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_SYS_CLKR + 1, BIT(1), 0);
158262306a36Sopenharmony_ci	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT(3), 0);
158362306a36Sopenharmony_ci}
158462306a36Sopenharmony_ci
158562306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
158662306a36Sopenharmony_ci{
158762306a36Sopenharmony_ci	struct rtw_efuse *efuse = &rtwdev->efuse;
158862306a36Sopenharmony_ci	struct rtw_coex *coex = &rtwdev->coex;
158962306a36Sopenharmony_ci	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
159062306a36Sopenharmony_ci	bool aux = efuse->bt_setting & BIT(6);
159162306a36Sopenharmony_ci
159262306a36Sopenharmony_ci	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
159362306a36Sopenharmony_ci	coex_rfe->ant_switch_polarity = 0;
159462306a36Sopenharmony_ci	coex_rfe->ant_switch_exist = false;
159562306a36Sopenharmony_ci	coex_rfe->ant_switch_with_bt = false;
159662306a36Sopenharmony_ci	coex_rfe->ant_switch_diversity = false;
159762306a36Sopenharmony_ci	coex_rfe->wlg_at_btg = true;
159862306a36Sopenharmony_ci
159962306a36Sopenharmony_ci	/* decide antenna at main or aux */
160062306a36Sopenharmony_ci	if (efuse->share_ant) {
160162306a36Sopenharmony_ci		if (aux)
160262306a36Sopenharmony_ci			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x80);
160362306a36Sopenharmony_ci		else
160462306a36Sopenharmony_ci			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x200);
160562306a36Sopenharmony_ci	} else {
160662306a36Sopenharmony_ci		if (aux)
160762306a36Sopenharmony_ci			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x280);
160862306a36Sopenharmony_ci		else
160962306a36Sopenharmony_ci			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x0);
161062306a36Sopenharmony_ci	}
161162306a36Sopenharmony_ci
161262306a36Sopenharmony_ci	/* disable LTE coex in wifi side */
161362306a36Sopenharmony_ci	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
161462306a36Sopenharmony_ci	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
161562306a36Sopenharmony_ci	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
161662306a36Sopenharmony_ci}
161762306a36Sopenharmony_ci
161862306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
161962306a36Sopenharmony_ci{
162062306a36Sopenharmony_ci	struct rtw_coex *coex = &rtwdev->coex;
162162306a36Sopenharmony_ci	struct rtw_coex_dm *coex_dm = &coex->dm;
162262306a36Sopenharmony_ci	static const u8	wl_tx_power[] = {0xb2, 0x90};
162362306a36Sopenharmony_ci	u8 pwr;
162462306a36Sopenharmony_ci
162562306a36Sopenharmony_ci	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
162662306a36Sopenharmony_ci		return;
162762306a36Sopenharmony_ci
162862306a36Sopenharmony_ci	coex_dm->cur_wl_pwr_lvl = wl_pwr;
162962306a36Sopenharmony_ci
163062306a36Sopenharmony_ci	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
163162306a36Sopenharmony_ci		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
163262306a36Sopenharmony_ci
163362306a36Sopenharmony_ci	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
163462306a36Sopenharmony_ci
163562306a36Sopenharmony_ci	rtw_write8(rtwdev, REG_ANA_PARAM1 + 3, pwr);
163662306a36Sopenharmony_ci}
163762306a36Sopenharmony_ci
163862306a36Sopenharmony_cistatic void rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
163962306a36Sopenharmony_ci{
164062306a36Sopenharmony_ci	struct rtw_coex *coex = &rtwdev->coex;
164162306a36Sopenharmony_ci	struct rtw_coex_dm *coex_dm = &coex->dm;
164262306a36Sopenharmony_ci	/* WL Rx Low gain on */
164362306a36Sopenharmony_ci	static const u32 wl_rx_low_gain_on[] = {
164462306a36Sopenharmony_ci		0xec120101, 0xeb130101, 0xce140101, 0xcd150101, 0xcc160101,
164562306a36Sopenharmony_ci		0xcb170101, 0xca180101, 0x8d190101, 0x8c1a0101, 0x8b1b0101,
164662306a36Sopenharmony_ci		0x4f1c0101, 0x4e1d0101, 0x4d1e0101, 0x4c1f0101, 0x0e200101,
164762306a36Sopenharmony_ci		0x0d210101, 0x0c220101, 0x0b230101, 0xcf240001, 0xce250001,
164862306a36Sopenharmony_ci		0xcd260001, 0xcc270001, 0x8f280001
164962306a36Sopenharmony_ci	};
165062306a36Sopenharmony_ci	/* WL Rx Low gain off */
165162306a36Sopenharmony_ci	static const u32 wl_rx_low_gain_off[] = {
165262306a36Sopenharmony_ci		0xec120101, 0xeb130101, 0xea140101, 0xe9150101, 0xe8160101,
165362306a36Sopenharmony_ci		0xe7170101, 0xe6180101, 0xe5190101, 0xe41a0101, 0xe31b0101,
165462306a36Sopenharmony_ci		0xe21c0101, 0xe11d0101, 0xe01e0101, 0x861f0101, 0x85200101,
165562306a36Sopenharmony_ci		0x84210101, 0x83220101, 0x82230101, 0x81240101, 0x80250101,
165662306a36Sopenharmony_ci		0x44260101, 0x43270101, 0x42280101
165762306a36Sopenharmony_ci	};
165862306a36Sopenharmony_ci	u8 i;
165962306a36Sopenharmony_ci
166062306a36Sopenharmony_ci	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
166162306a36Sopenharmony_ci		return;
166262306a36Sopenharmony_ci
166362306a36Sopenharmony_ci	coex_dm->cur_wl_rx_low_gain_en = low_gain;
166462306a36Sopenharmony_ci
166562306a36Sopenharmony_ci	if (coex_dm->cur_wl_rx_low_gain_en) {
166662306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
166762306a36Sopenharmony_ci			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_on[i]);
166862306a36Sopenharmony_ci	} else {
166962306a36Sopenharmony_ci		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
167062306a36Sopenharmony_ci			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_off[i]);
167162306a36Sopenharmony_ci	}
167262306a36Sopenharmony_ci}
167362306a36Sopenharmony_ci
167462306a36Sopenharmony_cistatic u8 rtw8723d_pwrtrack_get_limit_ofdm(struct rtw_dev *rtwdev)
167562306a36Sopenharmony_ci{
167662306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
167762306a36Sopenharmony_ci	u8 tx_rate = dm_info->tx_rate;
167862306a36Sopenharmony_ci	u8 limit_ofdm = 30;
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci	switch (tx_rate) {
168162306a36Sopenharmony_ci	case DESC_RATE1M...DESC_RATE5_5M:
168262306a36Sopenharmony_ci	case DESC_RATE11M:
168362306a36Sopenharmony_ci		break;
168462306a36Sopenharmony_ci	case DESC_RATE6M...DESC_RATE48M:
168562306a36Sopenharmony_ci		limit_ofdm = 36;
168662306a36Sopenharmony_ci		break;
168762306a36Sopenharmony_ci	case DESC_RATE54M:
168862306a36Sopenharmony_ci		limit_ofdm = 34;
168962306a36Sopenharmony_ci		break;
169062306a36Sopenharmony_ci	case DESC_RATEMCS0...DESC_RATEMCS2:
169162306a36Sopenharmony_ci		limit_ofdm = 38;
169262306a36Sopenharmony_ci		break;
169362306a36Sopenharmony_ci	case DESC_RATEMCS3...DESC_RATEMCS4:
169462306a36Sopenharmony_ci		limit_ofdm = 36;
169562306a36Sopenharmony_ci		break;
169662306a36Sopenharmony_ci	case DESC_RATEMCS5...DESC_RATEMCS7:
169762306a36Sopenharmony_ci		limit_ofdm = 34;
169862306a36Sopenharmony_ci		break;
169962306a36Sopenharmony_ci	default:
170062306a36Sopenharmony_ci		rtw_warn(rtwdev, "pwrtrack unhandled tx_rate 0x%x\n", tx_rate);
170162306a36Sopenharmony_ci		break;
170262306a36Sopenharmony_ci	}
170362306a36Sopenharmony_ci
170462306a36Sopenharmony_ci	return limit_ofdm;
170562306a36Sopenharmony_ci}
170662306a36Sopenharmony_ci
170762306a36Sopenharmony_cistatic void rtw8723d_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
170862306a36Sopenharmony_ci					      u32 ofdm_swing, u8 rf_path)
170962306a36Sopenharmony_ci{
171062306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
171162306a36Sopenharmony_ci	s32 ele_A, ele_D, ele_C;
171262306a36Sopenharmony_ci	s32 ele_A_ext, ele_C_ext, ele_D_ext;
171362306a36Sopenharmony_ci	s32 iqk_result_x;
171462306a36Sopenharmony_ci	s32 iqk_result_y;
171562306a36Sopenharmony_ci	s32 value32;
171662306a36Sopenharmony_ci
171762306a36Sopenharmony_ci	switch (rf_path) {
171862306a36Sopenharmony_ci	default:
171962306a36Sopenharmony_ci	case RF_PATH_A:
172062306a36Sopenharmony_ci		iqk_result_x = dm_info->iqk.result.s1_x;
172162306a36Sopenharmony_ci		iqk_result_y = dm_info->iqk.result.s1_y;
172262306a36Sopenharmony_ci		break;
172362306a36Sopenharmony_ci	case RF_PATH_B:
172462306a36Sopenharmony_ci		iqk_result_x = dm_info->iqk.result.s0_x;
172562306a36Sopenharmony_ci		iqk_result_y = dm_info->iqk.result.s0_y;
172662306a36Sopenharmony_ci		break;
172762306a36Sopenharmony_ci	}
172862306a36Sopenharmony_ci
172962306a36Sopenharmony_ci	/* new element D */
173062306a36Sopenharmony_ci	ele_D = OFDM_SWING_D(ofdm_swing);
173162306a36Sopenharmony_ci	iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
173262306a36Sopenharmony_ci	/* new element A */
173362306a36Sopenharmony_ci	iqk_result_x = iqkxy_to_s32(iqk_result_x);
173462306a36Sopenharmony_ci	ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
173562306a36Sopenharmony_ci	/* new element C */
173662306a36Sopenharmony_ci	iqk_result_y = iqkxy_to_s32(iqk_result_y);
173762306a36Sopenharmony_ci	ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_ci	switch (rf_path) {
174062306a36Sopenharmony_ci	case RF_PATH_A:
174162306a36Sopenharmony_ci	default:
174262306a36Sopenharmony_ci		/* write new elements A, C, D, and element B is always 0 */
174362306a36Sopenharmony_ci		value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
174462306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
174562306a36Sopenharmony_ci		value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
174662306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
174762306a36Sopenharmony_ci				 value32);
174862306a36Sopenharmony_ci		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
174962306a36Sopenharmony_ci		value32 &= ~BIT_MASK_OFDM0_EXTS;
175062306a36Sopenharmony_ci		value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
175162306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
175262306a36Sopenharmony_ci		break;
175362306a36Sopenharmony_ci
175462306a36Sopenharmony_ci	case RF_PATH_B:
175562306a36Sopenharmony_ci		/* write new elements A, C, D, and element B is always 0 */
175662306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0, ele_D);
175762306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, ele_C);
175862306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, ele_A);
175962306a36Sopenharmony_ci
176062306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0,
176162306a36Sopenharmony_ci				 ele_D_ext);
176262306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0,
176362306a36Sopenharmony_ci				 ele_A_ext);
176462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0,
176562306a36Sopenharmony_ci				 ele_C_ext);
176662306a36Sopenharmony_ci		break;
176762306a36Sopenharmony_ci	}
176862306a36Sopenharmony_ci}
176962306a36Sopenharmony_ci
177062306a36Sopenharmony_cistatic void rtw8723d_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
177162306a36Sopenharmony_ci				    u8 rf_path)
177262306a36Sopenharmony_ci{
177362306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
177462306a36Sopenharmony_ci	s32 value32;
177562306a36Sopenharmony_ci	u32 ofdm_swing;
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_ci	if (ofdm_index >= RTW_OFDM_SWING_TABLE_SIZE)
177862306a36Sopenharmony_ci		ofdm_index = RTW_OFDM_SWING_TABLE_SIZE - 1;
177962306a36Sopenharmony_ci	else if (ofdm_index < 0)
178062306a36Sopenharmony_ci		ofdm_index = 0;
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_ci	ofdm_swing = rtw8723d_ofdm_swing_table[ofdm_index];
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_ci	if (dm_info->iqk.done) {
178562306a36Sopenharmony_ci		rtw8723d_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
178662306a36Sopenharmony_ci		return;
178762306a36Sopenharmony_ci	}
178862306a36Sopenharmony_ci
178962306a36Sopenharmony_ci	switch (rf_path) {
179062306a36Sopenharmony_ci	case RF_PATH_A:
179162306a36Sopenharmony_ci	default:
179262306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
179362306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
179462306a36Sopenharmony_ci				 0x00);
179562306a36Sopenharmony_ci		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
179662306a36Sopenharmony_ci		value32 &= ~BIT_MASK_OFDM0_EXTS;
179762306a36Sopenharmony_ci		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
179862306a36Sopenharmony_ci		break;
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ci	case RF_PATH_B:
180162306a36Sopenharmony_ci		/* image S1:c80 to S0:Cd0 and Cd4 */
180262306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0,
180362306a36Sopenharmony_ci				 OFDM_SWING_A(ofdm_swing));
180462306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_B_S0,
180562306a36Sopenharmony_ci				 OFDM_SWING_B(ofdm_swing));
180662306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0,
180762306a36Sopenharmony_ci				 OFDM_SWING_C(ofdm_swing));
180862306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0,
180962306a36Sopenharmony_ci				 OFDM_SWING_D(ofdm_swing));
181062306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0, 0x0);
181162306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, 0x0);
181262306a36Sopenharmony_ci		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, 0x0);
181362306a36Sopenharmony_ci		break;
181462306a36Sopenharmony_ci	}
181562306a36Sopenharmony_ci}
181662306a36Sopenharmony_ci
181762306a36Sopenharmony_cistatic void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
181862306a36Sopenharmony_ci					   s8 txagc_idx)
181962306a36Sopenharmony_ci{
182062306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
182162306a36Sopenharmony_ci
182262306a36Sopenharmony_ci	dm_info->txagc_remnant_ofdm = txagc_idx;
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
182562306a36Sopenharmony_ci	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
182662306a36Sopenharmony_ci}
182762306a36Sopenharmony_ci
182862306a36Sopenharmony_cistatic void rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
182962306a36Sopenharmony_ci					  s8 txagc_idx)
183062306a36Sopenharmony_ci{
183162306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
183262306a36Sopenharmony_ci
183362306a36Sopenharmony_ci	dm_info->txagc_remnant_cck = txagc_idx;
183462306a36Sopenharmony_ci
183562306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, 0xab4, 0x000007FF,
183662306a36Sopenharmony_ci			 rtw8723d_cck_swing_table[swing_idx]);
183762306a36Sopenharmony_ci}
183862306a36Sopenharmony_ci
183962306a36Sopenharmony_cistatic void rtw8723d_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
184062306a36Sopenharmony_ci{
184162306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
184262306a36Sopenharmony_ci	struct rtw_hal *hal = &rtwdev->hal;
184362306a36Sopenharmony_ci	u8 limit_ofdm;
184462306a36Sopenharmony_ci	u8 limit_cck = 40;
184562306a36Sopenharmony_ci	s8 final_ofdm_swing_index;
184662306a36Sopenharmony_ci	s8 final_cck_swing_index;
184762306a36Sopenharmony_ci
184862306a36Sopenharmony_ci	limit_ofdm = rtw8723d_pwrtrack_get_limit_ofdm(rtwdev);
184962306a36Sopenharmony_ci
185062306a36Sopenharmony_ci	final_ofdm_swing_index = RTW_DEF_OFDM_SWING_INDEX +
185162306a36Sopenharmony_ci				 dm_info->delta_power_index[path];
185262306a36Sopenharmony_ci	final_cck_swing_index = RTW_DEF_CCK_SWING_INDEX +
185362306a36Sopenharmony_ci				dm_info->delta_power_index[path];
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_ci	if (final_ofdm_swing_index > limit_ofdm)
185662306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
185762306a36Sopenharmony_ci					       final_ofdm_swing_index - limit_ofdm);
185862306a36Sopenharmony_ci	else if (final_ofdm_swing_index < 0)
185962306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, 0,
186062306a36Sopenharmony_ci					       final_ofdm_swing_index);
186162306a36Sopenharmony_ci	else
186262306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
186362306a36Sopenharmony_ci
186462306a36Sopenharmony_ci	if (final_cck_swing_index > limit_cck)
186562306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
186662306a36Sopenharmony_ci					      final_cck_swing_index - limit_cck);
186762306a36Sopenharmony_ci	else if (final_cck_swing_index < 0)
186862306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, 0,
186962306a36Sopenharmony_ci					      final_cck_swing_index);
187062306a36Sopenharmony_ci	else
187162306a36Sopenharmony_ci		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
187262306a36Sopenharmony_ci
187362306a36Sopenharmony_ci	rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
187462306a36Sopenharmony_ci}
187562306a36Sopenharmony_ci
187662306a36Sopenharmony_cistatic void rtw8723d_pwrtrack_set_xtal(struct rtw_dev *rtwdev, u8 therm_path,
187762306a36Sopenharmony_ci				       u8 delta)
187862306a36Sopenharmony_ci{
187962306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
188062306a36Sopenharmony_ci	const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
188162306a36Sopenharmony_ci	const s8 *pwrtrk_xtal;
188262306a36Sopenharmony_ci	s8 xtal_cap;
188362306a36Sopenharmony_ci
188462306a36Sopenharmony_ci	if (dm_info->thermal_avg[therm_path] >
188562306a36Sopenharmony_ci	    rtwdev->efuse.thermal_meter[therm_path])
188662306a36Sopenharmony_ci		pwrtrk_xtal = tbl->pwrtrk_xtal_p;
188762306a36Sopenharmony_ci	else
188862306a36Sopenharmony_ci		pwrtrk_xtal = tbl->pwrtrk_xtal_n;
188962306a36Sopenharmony_ci
189062306a36Sopenharmony_ci	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
189162306a36Sopenharmony_ci	xtal_cap = clamp_t(s8, xtal_cap + pwrtrk_xtal[delta], 0, 0x3F);
189262306a36Sopenharmony_ci	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
189362306a36Sopenharmony_ci			 xtal_cap | (xtal_cap << 6));
189462306a36Sopenharmony_ci}
189562306a36Sopenharmony_ci
189662306a36Sopenharmony_cistatic void rtw8723d_phy_pwrtrack(struct rtw_dev *rtwdev)
189762306a36Sopenharmony_ci{
189862306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
189962306a36Sopenharmony_ci	struct rtw_swing_table swing_table;
190062306a36Sopenharmony_ci	u8 thermal_value, delta, path;
190162306a36Sopenharmony_ci	bool do_iqk = false;
190262306a36Sopenharmony_ci
190362306a36Sopenharmony_ci	rtw_phy_config_swing_table(rtwdev, &swing_table);
190462306a36Sopenharmony_ci
190562306a36Sopenharmony_ci	if (rtwdev->efuse.thermal_meter[0] == 0xff)
190662306a36Sopenharmony_ci		return;
190762306a36Sopenharmony_ci
190862306a36Sopenharmony_ci	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
190962306a36Sopenharmony_ci
191062306a36Sopenharmony_ci	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
191162306a36Sopenharmony_ci
191262306a36Sopenharmony_ci	do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
191362306a36Sopenharmony_ci
191462306a36Sopenharmony_ci	if (do_iqk)
191562306a36Sopenharmony_ci		rtw8723d_lck(rtwdev);
191662306a36Sopenharmony_ci
191762306a36Sopenharmony_ci	if (dm_info->pwr_trk_init_trigger)
191862306a36Sopenharmony_ci		dm_info->pwr_trk_init_trigger = false;
191962306a36Sopenharmony_ci	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
192062306a36Sopenharmony_ci						   RF_PATH_A))
192162306a36Sopenharmony_ci		goto iqk;
192262306a36Sopenharmony_ci
192362306a36Sopenharmony_ci	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
192462306a36Sopenharmony_ci
192562306a36Sopenharmony_ci	delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_ci	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
192862306a36Sopenharmony_ci		s8 delta_cur, delta_last;
192962306a36Sopenharmony_ci
193062306a36Sopenharmony_ci		delta_last = dm_info->delta_power_index[path];
193162306a36Sopenharmony_ci		delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
193262306a36Sopenharmony_ci							path, RF_PATH_A, delta);
193362306a36Sopenharmony_ci		if (delta_last == delta_cur)
193462306a36Sopenharmony_ci			continue;
193562306a36Sopenharmony_ci
193662306a36Sopenharmony_ci		dm_info->delta_power_index[path] = delta_cur;
193762306a36Sopenharmony_ci		rtw8723d_pwrtrack_set(rtwdev, path);
193862306a36Sopenharmony_ci	}
193962306a36Sopenharmony_ci
194062306a36Sopenharmony_ci	rtw8723d_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
194162306a36Sopenharmony_ci
194262306a36Sopenharmony_ciiqk:
194362306a36Sopenharmony_ci	if (do_iqk)
194462306a36Sopenharmony_ci		rtw8723d_phy_calibration(rtwdev);
194562306a36Sopenharmony_ci}
194662306a36Sopenharmony_ci
194762306a36Sopenharmony_cistatic void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
194862306a36Sopenharmony_ci{
194962306a36Sopenharmony_ci	struct rtw_efuse *efuse = &rtwdev->efuse;
195062306a36Sopenharmony_ci	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci	if (efuse->power_track_type != 0)
195362306a36Sopenharmony_ci		return;
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_ci	if (!dm_info->pwr_trk_triggered) {
195662306a36Sopenharmony_ci		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
195762306a36Sopenharmony_ci			     GENMASK(17, 16), 0x03);
195862306a36Sopenharmony_ci		dm_info->pwr_trk_triggered = true;
195962306a36Sopenharmony_ci		return;
196062306a36Sopenharmony_ci	}
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_ci	rtw8723d_phy_pwrtrack(rtwdev);
196362306a36Sopenharmony_ci	dm_info->pwr_trk_triggered = false;
196462306a36Sopenharmony_ci}
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_cistatic void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev,
196762306a36Sopenharmony_ci					  struct rtw_tx_pkt_info *pkt_info,
196862306a36Sopenharmony_ci					  u8 *txdesc)
196962306a36Sopenharmony_ci{
197062306a36Sopenharmony_ci	size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
197162306a36Sopenharmony_ci	__le16 chksum = 0;
197262306a36Sopenharmony_ci	__le16 *data = (__le16 *)(txdesc);
197362306a36Sopenharmony_ci	struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)txdesc;
197462306a36Sopenharmony_ci
197562306a36Sopenharmony_ci	le32p_replace_bits(&tx_desc->w7, 0, RTW_TX_DESC_W7_TXDESC_CHECKSUM);
197662306a36Sopenharmony_ci
197762306a36Sopenharmony_ci	while (words--)
197862306a36Sopenharmony_ci		chksum ^= *data++;
197962306a36Sopenharmony_ci
198062306a36Sopenharmony_ci	chksum = ~chksum;
198162306a36Sopenharmony_ci
198262306a36Sopenharmony_ci	le32p_replace_bits(&tx_desc->w7, __le16_to_cpu(chksum),
198362306a36Sopenharmony_ci			   RTW_TX_DESC_W7_TXDESC_CHECKSUM);
198462306a36Sopenharmony_ci}
198562306a36Sopenharmony_ci
198662306a36Sopenharmony_cistatic struct rtw_chip_ops rtw8723d_ops = {
198762306a36Sopenharmony_ci	.phy_set_param		= rtw8723d_phy_set_param,
198862306a36Sopenharmony_ci	.read_efuse		= rtw8723d_read_efuse,
198962306a36Sopenharmony_ci	.query_rx_desc		= rtw8723d_query_rx_desc,
199062306a36Sopenharmony_ci	.set_channel		= rtw8723d_set_channel,
199162306a36Sopenharmony_ci	.mac_init		= rtw8723d_mac_init,
199262306a36Sopenharmony_ci	.shutdown		= rtw8723d_shutdown,
199362306a36Sopenharmony_ci	.read_rf		= rtw_phy_read_rf_sipi,
199462306a36Sopenharmony_ci	.write_rf		= rtw_phy_write_rf_reg_sipi,
199562306a36Sopenharmony_ci	.set_tx_power_index	= rtw8723d_set_tx_power_index,
199662306a36Sopenharmony_ci	.set_antenna		= NULL,
199762306a36Sopenharmony_ci	.cfg_ldo25		= rtw8723d_cfg_ldo25,
199862306a36Sopenharmony_ci	.efuse_grant		= rtw8723d_efuse_grant,
199962306a36Sopenharmony_ci	.false_alarm_statistics	= rtw8723d_false_alarm_statistics,
200062306a36Sopenharmony_ci	.phy_calibration	= rtw8723d_phy_calibration,
200162306a36Sopenharmony_ci	.cck_pd_set		= rtw8723d_phy_cck_pd_set,
200262306a36Sopenharmony_ci	.pwr_track		= rtw8723d_pwr_track,
200362306a36Sopenharmony_ci	.config_bfee		= NULL,
200462306a36Sopenharmony_ci	.set_gid_table		= NULL,
200562306a36Sopenharmony_ci	.cfg_csi_rate		= NULL,
200662306a36Sopenharmony_ci	.fill_txdesc_checksum	= rtw8723d_fill_txdesc_checksum,
200762306a36Sopenharmony_ci
200862306a36Sopenharmony_ci	.coex_set_init		= rtw8723d_coex_cfg_init,
200962306a36Sopenharmony_ci	.coex_set_ant_switch	= NULL,
201062306a36Sopenharmony_ci	.coex_set_gnt_fix	= rtw8723d_coex_cfg_gnt_fix,
201162306a36Sopenharmony_ci	.coex_set_gnt_debug	= rtw8723d_coex_cfg_gnt_debug,
201262306a36Sopenharmony_ci	.coex_set_rfe_type	= rtw8723d_coex_cfg_rfe_type,
201362306a36Sopenharmony_ci	.coex_set_wl_tx_power	= rtw8723d_coex_cfg_wl_tx_power,
201462306a36Sopenharmony_ci	.coex_set_wl_rx_gain	= rtw8723d_coex_cfg_wl_rx_gain,
201562306a36Sopenharmony_ci};
201662306a36Sopenharmony_ci
201762306a36Sopenharmony_ci/* Shared-Antenna Coex Table */
201862306a36Sopenharmony_cistatic const struct coex_table_para table_sant_8723d[] = {
201962306a36Sopenharmony_ci	{0xffffffff, 0xffffffff}, /* case-0 */
202062306a36Sopenharmony_ci	{0x55555555, 0x55555555},
202162306a36Sopenharmony_ci	{0x66555555, 0x66555555},
202262306a36Sopenharmony_ci	{0xaaaaaaaa, 0xaaaaaaaa},
202362306a36Sopenharmony_ci	{0x5a5a5a5a, 0x5a5a5a5a},
202462306a36Sopenharmony_ci	{0xfafafafa, 0xfafafafa}, /* case-5 */
202562306a36Sopenharmony_ci	{0x6a5a5555, 0xaaaaaaaa},
202662306a36Sopenharmony_ci	{0x6a5a56aa, 0x6a5a56aa},
202762306a36Sopenharmony_ci	{0x6a5a5a5a, 0x6a5a5a5a},
202862306a36Sopenharmony_ci	{0x66555555, 0x5a5a5a5a},
202962306a36Sopenharmony_ci	{0x66555555, 0x6a5a5a5a}, /* case-10 */
203062306a36Sopenharmony_ci	{0x66555555, 0x6a5a5aaa},
203162306a36Sopenharmony_ci	{0x66555555, 0x5a5a5aaa},
203262306a36Sopenharmony_ci	{0x66555555, 0x6aaa5aaa},
203362306a36Sopenharmony_ci	{0x66555555, 0xaaaa5aaa},
203462306a36Sopenharmony_ci	{0x66555555, 0xaaaaaaaa}, /* case-15 */
203562306a36Sopenharmony_ci	{0xffff55ff, 0xfafafafa},
203662306a36Sopenharmony_ci	{0xffff55ff, 0x6afa5afa},
203762306a36Sopenharmony_ci	{0xaaffffaa, 0xfafafafa},
203862306a36Sopenharmony_ci	{0xaa5555aa, 0x5a5a5a5a},
203962306a36Sopenharmony_ci	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
204062306a36Sopenharmony_ci	{0xaa5555aa, 0xaaaaaaaa},
204162306a36Sopenharmony_ci	{0xffffffff, 0x5a5a5a5a},
204262306a36Sopenharmony_ci	{0xffffffff, 0x5a5a5a5a},
204362306a36Sopenharmony_ci	{0xffffffff, 0x55555555},
204462306a36Sopenharmony_ci	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
204562306a36Sopenharmony_ci	{0x55555555, 0x5a5a5a5a},
204662306a36Sopenharmony_ci	{0x55555555, 0xaaaaaaaa},
204762306a36Sopenharmony_ci	{0x55555555, 0x6a5a6a5a},
204862306a36Sopenharmony_ci	{0x66556655, 0x66556655},
204962306a36Sopenharmony_ci	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
205062306a36Sopenharmony_ci	{0xffffffff, 0x5aaa5aaa},
205162306a36Sopenharmony_ci	{0x56555555, 0x5a5a5aaa},
205262306a36Sopenharmony_ci};
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci/* Non-Shared-Antenna Coex Table */
205562306a36Sopenharmony_cistatic const struct coex_table_para table_nsant_8723d[] = {
205662306a36Sopenharmony_ci	{0xffffffff, 0xffffffff}, /* case-100 */
205762306a36Sopenharmony_ci	{0x55555555, 0x55555555},
205862306a36Sopenharmony_ci	{0x66555555, 0x66555555},
205962306a36Sopenharmony_ci	{0xaaaaaaaa, 0xaaaaaaaa},
206062306a36Sopenharmony_ci	{0x5a5a5a5a, 0x5a5a5a5a},
206162306a36Sopenharmony_ci	{0xfafafafa, 0xfafafafa}, /* case-105 */
206262306a36Sopenharmony_ci	{0x5afa5afa, 0x5afa5afa},
206362306a36Sopenharmony_ci	{0x55555555, 0xfafafafa},
206462306a36Sopenharmony_ci	{0x66555555, 0xfafafafa},
206562306a36Sopenharmony_ci	{0x66555555, 0x5a5a5a5a},
206662306a36Sopenharmony_ci	{0x66555555, 0x6a5a5a5a}, /* case-110 */
206762306a36Sopenharmony_ci	{0x66555555, 0xaaaaaaaa},
206862306a36Sopenharmony_ci	{0xffff55ff, 0xfafafafa},
206962306a36Sopenharmony_ci	{0xffff55ff, 0x5afa5afa},
207062306a36Sopenharmony_ci	{0xffff55ff, 0xaaaaaaaa},
207162306a36Sopenharmony_ci	{0xffff55ff, 0xffff55ff}, /* case-115 */
207262306a36Sopenharmony_ci	{0xaaffffaa, 0x5afa5afa},
207362306a36Sopenharmony_ci	{0xaaffffaa, 0xaaaaaaaa},
207462306a36Sopenharmony_ci	{0xffffffff, 0xfafafafa},
207562306a36Sopenharmony_ci	{0xffffffff, 0x5afa5afa},
207662306a36Sopenharmony_ci	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
207762306a36Sopenharmony_ci	{0x55ff55ff, 0x5afa5afa},
207862306a36Sopenharmony_ci	{0x55ff55ff, 0xaaaaaaaa},
207962306a36Sopenharmony_ci	{0x55ff55ff, 0x55ff55ff}
208062306a36Sopenharmony_ci};
208162306a36Sopenharmony_ci
208262306a36Sopenharmony_ci/* Shared-Antenna TDMA */
208362306a36Sopenharmony_cistatic const struct coex_tdma_para tdma_sant_8723d[] = {
208462306a36Sopenharmony_ci	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
208562306a36Sopenharmony_ci	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
208662306a36Sopenharmony_ci	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
208762306a36Sopenharmony_ci	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
208862306a36Sopenharmony_ci	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
208962306a36Sopenharmony_ci	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
209062306a36Sopenharmony_ci	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
209162306a36Sopenharmony_ci	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
209262306a36Sopenharmony_ci	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
209362306a36Sopenharmony_ci	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
209462306a36Sopenharmony_ci	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
209562306a36Sopenharmony_ci	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
209662306a36Sopenharmony_ci	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
209762306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
209862306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
209962306a36Sopenharmony_ci	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
210062306a36Sopenharmony_ci	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
210162306a36Sopenharmony_ci	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
210262306a36Sopenharmony_ci	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
210362306a36Sopenharmony_ci	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
210462306a36Sopenharmony_ci	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
210562306a36Sopenharmony_ci	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
210662306a36Sopenharmony_ci	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
210762306a36Sopenharmony_ci	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
210862306a36Sopenharmony_ci	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
210962306a36Sopenharmony_ci	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
211062306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
211162306a36Sopenharmony_ci	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
211262306a36Sopenharmony_ci};
211362306a36Sopenharmony_ci
211462306a36Sopenharmony_ci/* Non-Shared-Antenna TDMA */
211562306a36Sopenharmony_cistatic const struct coex_tdma_para tdma_nsant_8723d[] = {
211662306a36Sopenharmony_ci	{ {0x00, 0x00, 0x00, 0x00, 0x01} }, /* case-100 */
211762306a36Sopenharmony_ci	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
211862306a36Sopenharmony_ci	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
211962306a36Sopenharmony_ci	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
212062306a36Sopenharmony_ci	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
212162306a36Sopenharmony_ci	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
212262306a36Sopenharmony_ci	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
212362306a36Sopenharmony_ci	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
212462306a36Sopenharmony_ci	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
212562306a36Sopenharmony_ci	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
212662306a36Sopenharmony_ci	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
212762306a36Sopenharmony_ci	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
212862306a36Sopenharmony_ci	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
212962306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
213062306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
213162306a36Sopenharmony_ci	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
213262306a36Sopenharmony_ci	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
213362306a36Sopenharmony_ci	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
213462306a36Sopenharmony_ci	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
213562306a36Sopenharmony_ci	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
213662306a36Sopenharmony_ci	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
213762306a36Sopenharmony_ci	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
213862306a36Sopenharmony_ci};
213962306a36Sopenharmony_ci
214062306a36Sopenharmony_ci/* rssi in percentage % (dbm = % - 100) */
214162306a36Sopenharmony_cistatic const u8 wl_rssi_step_8723d[] = {60, 50, 44, 30};
214262306a36Sopenharmony_cistatic const u8 bt_rssi_step_8723d[] = {30, 30, 30, 30};
214362306a36Sopenharmony_cistatic const struct coex_5g_afh_map afh_5g_8723d[] = { {0, 0, 0} };
214462306a36Sopenharmony_ci
214562306a36Sopenharmony_cistatic const struct rtw_hw_reg btg_reg_8723d = {
214662306a36Sopenharmony_ci	.addr = REG_BTG_SEL, .mask = BIT_MASK_BTG_WL,
214762306a36Sopenharmony_ci};
214862306a36Sopenharmony_ci
214962306a36Sopenharmony_ci/* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
215062306a36Sopenharmony_cistatic const struct coex_rf_para rf_para_tx_8723d[] = {
215162306a36Sopenharmony_ci	{0, 0, false, 7},  /* for normal */
215262306a36Sopenharmony_ci	{0, 10, false, 7}, /* for WL-CPT */
215362306a36Sopenharmony_ci	{1, 0, true, 4},
215462306a36Sopenharmony_ci	{1, 2, true, 4},
215562306a36Sopenharmony_ci	{1, 10, true, 4},
215662306a36Sopenharmony_ci	{1, 15, true, 4}
215762306a36Sopenharmony_ci};
215862306a36Sopenharmony_ci
215962306a36Sopenharmony_cistatic const struct coex_rf_para rf_para_rx_8723d[] = {
216062306a36Sopenharmony_ci	{0, 0, false, 7},  /* for normal */
216162306a36Sopenharmony_ci	{0, 10, false, 7}, /* for WL-CPT */
216262306a36Sopenharmony_ci	{1, 0, true, 5},
216362306a36Sopenharmony_ci	{1, 2, true, 5},
216462306a36Sopenharmony_ci	{1, 10, true, 5},
216562306a36Sopenharmony_ci	{1, 15, true, 5}
216662306a36Sopenharmony_ci};
216762306a36Sopenharmony_ci
216862306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8723d[] = {
216962306a36Sopenharmony_ci	{0x0005,
217062306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
217162306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
217262306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
217362306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
217462306a36Sopenharmony_ci	{0x0086,
217562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
217662306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
217762306a36Sopenharmony_ci	 RTW_PWR_ADDR_SDIO,
217862306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
217962306a36Sopenharmony_ci	{0x0086,
218062306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
218162306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
218262306a36Sopenharmony_ci	 RTW_PWR_ADDR_SDIO,
218362306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
218462306a36Sopenharmony_ci	{0x004A,
218562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
218662306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK,
218762306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
218862306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
218962306a36Sopenharmony_ci	{0x0005,
219062306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
219162306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
219262306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
219362306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
219462306a36Sopenharmony_ci	{0x0023,
219562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
219662306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
219762306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
219862306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(4), 0},
219962306a36Sopenharmony_ci	{0x0301,
220062306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
220162306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
220262306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
220362306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0},
220462306a36Sopenharmony_ci	{0xFFFF,
220562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
220662306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
220762306a36Sopenharmony_ci	 0,
220862306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
220962306a36Sopenharmony_ci};
221062306a36Sopenharmony_ci
221162306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
221262306a36Sopenharmony_ci	{0x0020,
221362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
221462306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
221562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
221662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
221762306a36Sopenharmony_ci	{0x0001,
221862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
221962306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
222062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
222162306a36Sopenharmony_ci	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
222262306a36Sopenharmony_ci	{0x0000,
222362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
222462306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
222562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
222662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(5), 0},
222762306a36Sopenharmony_ci	{0x0005,
222862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
222962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
223062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
223162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
223262306a36Sopenharmony_ci	{0x0075,
223362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
223462306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
223562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
223662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
223762306a36Sopenharmony_ci	{0x0006,
223862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
223962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
224062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
224162306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
224262306a36Sopenharmony_ci	{0x0075,
224362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
224462306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
224562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
224662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
224762306a36Sopenharmony_ci	{0x0006,
224862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
224962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
225062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
225162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
225262306a36Sopenharmony_ci	{0x0005,
225362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
225462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
225562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
225662306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, (BIT(1) | BIT(0)), 0},
225762306a36Sopenharmony_ci	{0x0005,
225862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
225962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
226062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
226162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(7), 0},
226262306a36Sopenharmony_ci	{0x0005,
226362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
226462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
226562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
226662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
226762306a36Sopenharmony_ci	{0x0005,
226862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
226962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
227062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
227162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
227262306a36Sopenharmony_ci	{0x0005,
227362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
227462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
227562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
227662306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, BIT(0), 0},
227762306a36Sopenharmony_ci	{0x0010,
227862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
227962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
228062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
228162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
228262306a36Sopenharmony_ci	{0x0049,
228362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
228462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
228562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
228662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
228762306a36Sopenharmony_ci	{0x0063,
228862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
228962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
229062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
229162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
229262306a36Sopenharmony_ci	{0x0062,
229362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
229462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
229562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
229662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), 0},
229762306a36Sopenharmony_ci	{0x0058,
229862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
229962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
230062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
230162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
230262306a36Sopenharmony_ci	{0x005A,
230362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
230462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
230562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
230662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
230762306a36Sopenharmony_ci	{0x0068,
230862306a36Sopenharmony_ci	 RTW_PWR_CUT_TEST_MSK,
230962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
231062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
231162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
231262306a36Sopenharmony_ci	{0x0069,
231362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
231462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
231562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
231662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
231762306a36Sopenharmony_ci	{0x001f,
231862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
231962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
232062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
232162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
232262306a36Sopenharmony_ci	{0x0077,
232362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
232462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
232562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
232662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
232762306a36Sopenharmony_ci	{0x001f,
232862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
232962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
233062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
233162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
233262306a36Sopenharmony_ci	{0x0077,
233362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
233462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
233562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
233662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
233762306a36Sopenharmony_ci	{0xFFFF,
233862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
233962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
234062306a36Sopenharmony_ci	 0,
234162306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
234262306a36Sopenharmony_ci};
234362306a36Sopenharmony_ci
234462306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
234562306a36Sopenharmony_ci	trans_carddis_to_cardemu_8723d,
234662306a36Sopenharmony_ci	trans_cardemu_to_act_8723d,
234762306a36Sopenharmony_ci	NULL
234862306a36Sopenharmony_ci};
234962306a36Sopenharmony_ci
235062306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_act_to_lps_8723d[] = {
235162306a36Sopenharmony_ci	{0x0301,
235262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
235362306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
235462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
235562306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
235662306a36Sopenharmony_ci	{0x0522,
235762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
235862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
235962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
236062306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
236162306a36Sopenharmony_ci	{0x05F8,
236262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
236362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
236462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
236562306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, 0xFF, 0},
236662306a36Sopenharmony_ci	{0x05F9,
236762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
236862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
236962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
237062306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, 0xFF, 0},
237162306a36Sopenharmony_ci	{0x05FA,
237262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
237362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
237462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
237562306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, 0xFF, 0},
237662306a36Sopenharmony_ci	{0x05FB,
237762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
237862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
237962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
238062306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, 0xFF, 0},
238162306a36Sopenharmony_ci	{0x0002,
238262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
238362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
238462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
238562306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
238662306a36Sopenharmony_ci	{0x0002,
238762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
238862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
238962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
239062306a36Sopenharmony_ci	 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
239162306a36Sopenharmony_ci	{0x0002,
239262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
239362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
239462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
239562306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), 0},
239662306a36Sopenharmony_ci	{0x0100,
239762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
239862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
239962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
240062306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x03},
240162306a36Sopenharmony_ci	{0x0101,
240262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
240362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
240462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
240562306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), 0},
240662306a36Sopenharmony_ci	{0x0093,
240762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
240862306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
240962306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
241062306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
241162306a36Sopenharmony_ci	{0x0553,
241262306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
241362306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
241462306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
241562306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
241662306a36Sopenharmony_ci	{0xFFFF,
241762306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
241862306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
241962306a36Sopenharmony_ci	 0,
242062306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
242162306a36Sopenharmony_ci};
242262306a36Sopenharmony_ci
242362306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_act_to_pre_carddis_8723d[] = {
242462306a36Sopenharmony_ci	{0x0003,
242562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
242662306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
242762306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
242862306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(2), 0},
242962306a36Sopenharmony_ci	{0x0080,
243062306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
243162306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
243262306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
243362306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0},
243462306a36Sopenharmony_ci	{0xFFFF,
243562306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
243662306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
243762306a36Sopenharmony_ci	 0,
243862306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
243962306a36Sopenharmony_ci};
244062306a36Sopenharmony_ci
244162306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8723d[] = {
244262306a36Sopenharmony_ci	{0x0002,
244362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
244462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
244562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
244662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
244762306a36Sopenharmony_ci	{0x0049,
244862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
244962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
245062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
245162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), 0},
245262306a36Sopenharmony_ci	{0x0006,
245362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
245462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
245562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
245662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
245762306a36Sopenharmony_ci	{0x0005,
245862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
245962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
246062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
246162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
246262306a36Sopenharmony_ci	{0x0005,
246362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
246462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
246562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
246662306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, BIT(1), 0},
246762306a36Sopenharmony_ci	{0x0010,
246862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
246962306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
247062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
247162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(6), 0},
247262306a36Sopenharmony_ci	{0x0000,
247362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
247462306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
247562306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
247662306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
247762306a36Sopenharmony_ci	{0x0020,
247862306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
247962306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
248062306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
248162306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
248262306a36Sopenharmony_ci	{0xFFFF,
248362306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
248462306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
248562306a36Sopenharmony_ci	 0,
248662306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
248762306a36Sopenharmony_ci};
248862306a36Sopenharmony_ci
248962306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8723d[] = {
249062306a36Sopenharmony_ci	{0x0007,
249162306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
249262306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
249362306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
249462306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
249562306a36Sopenharmony_ci	{0x0005,
249662306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
249762306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
249862306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
249962306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
250062306a36Sopenharmony_ci	{0x0005,
250162306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
250262306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
250362306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
250462306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
250562306a36Sopenharmony_ci	{0x0005,
250662306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
250762306a36Sopenharmony_ci	 RTW_PWR_INTF_PCI_MSK,
250862306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
250962306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},
251062306a36Sopenharmony_ci	{0x004A,
251162306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
251262306a36Sopenharmony_ci	 RTW_PWR_INTF_USB_MSK,
251362306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
251462306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 1},
251562306a36Sopenharmony_ci	{0x0023,
251662306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
251762306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
251862306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
251962306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
252062306a36Sopenharmony_ci	{0x0086,
252162306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
252262306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
252362306a36Sopenharmony_ci	 RTW_PWR_ADDR_SDIO,
252462306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
252562306a36Sopenharmony_ci	{0x0086,
252662306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
252762306a36Sopenharmony_ci	 RTW_PWR_INTF_SDIO_MSK,
252862306a36Sopenharmony_ci	 RTW_PWR_ADDR_SDIO,
252962306a36Sopenharmony_ci	 RTW_PWR_CMD_POLLING, BIT(1), 0},
253062306a36Sopenharmony_ci	{0xFFFF,
253162306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
253262306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
253362306a36Sopenharmony_ci	 0,
253462306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
253562306a36Sopenharmony_ci};
253662306a36Sopenharmony_ci
253762306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
253862306a36Sopenharmony_ci	{0x001D,
253962306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
254062306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
254162306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
254262306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), 0},
254362306a36Sopenharmony_ci	{0x001D,
254462306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
254562306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
254662306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
254762306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
254862306a36Sopenharmony_ci	{0x001C,
254962306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
255062306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
255162306a36Sopenharmony_ci	 RTW_PWR_ADDR_MAC,
255262306a36Sopenharmony_ci	 RTW_PWR_CMD_WRITE, 0xFF, 0x0E},
255362306a36Sopenharmony_ci	{0xFFFF,
255462306a36Sopenharmony_ci	 RTW_PWR_CUT_ALL_MSK,
255562306a36Sopenharmony_ci	 RTW_PWR_INTF_ALL_MSK,
255662306a36Sopenharmony_ci	 0,
255762306a36Sopenharmony_ci	 RTW_PWR_CMD_END, 0, 0},
255862306a36Sopenharmony_ci};
255962306a36Sopenharmony_ci
256062306a36Sopenharmony_cistatic const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
256162306a36Sopenharmony_ci	trans_act_to_lps_8723d,
256262306a36Sopenharmony_ci	trans_act_to_pre_carddis_8723d,
256362306a36Sopenharmony_ci	trans_act_to_cardemu_8723d,
256462306a36Sopenharmony_ci	trans_cardemu_to_carddis_8723d,
256562306a36Sopenharmony_ci	trans_act_to_post_carddis_8723d,
256662306a36Sopenharmony_ci	NULL
256762306a36Sopenharmony_ci};
256862306a36Sopenharmony_ci
256962306a36Sopenharmony_cistatic const struct rtw_page_table page_table_8723d[] = {
257062306a36Sopenharmony_ci	{12, 2, 2, 0, 1},
257162306a36Sopenharmony_ci	{12, 2, 2, 0, 1},
257262306a36Sopenharmony_ci	{12, 2, 2, 0, 1},
257362306a36Sopenharmony_ci	{12, 2, 2, 0, 1},
257462306a36Sopenharmony_ci	{12, 2, 2, 0, 1},
257562306a36Sopenharmony_ci};
257662306a36Sopenharmony_ci
257762306a36Sopenharmony_cistatic const struct rtw_rqpn rqpn_table_8723d[] = {
257862306a36Sopenharmony_ci	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
257962306a36Sopenharmony_ci	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
258062306a36Sopenharmony_ci	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
258162306a36Sopenharmony_ci	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
258262306a36Sopenharmony_ci	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
258362306a36Sopenharmony_ci	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
258462306a36Sopenharmony_ci	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
258562306a36Sopenharmony_ci	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
258662306a36Sopenharmony_ci	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
258762306a36Sopenharmony_ci	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
258862306a36Sopenharmony_ci	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
258962306a36Sopenharmony_ci	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
259062306a36Sopenharmony_ci	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
259162306a36Sopenharmony_ci	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
259262306a36Sopenharmony_ci	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
259362306a36Sopenharmony_ci};
259462306a36Sopenharmony_ci
259562306a36Sopenharmony_cistatic const struct rtw_prioq_addrs prioq_addrs_8723d = {
259662306a36Sopenharmony_ci	.prio[RTW_DMA_MAPPING_EXTRA] = {
259762306a36Sopenharmony_ci		.rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
259862306a36Sopenharmony_ci	},
259962306a36Sopenharmony_ci	.prio[RTW_DMA_MAPPING_LOW] = {
260062306a36Sopenharmony_ci		.rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
260162306a36Sopenharmony_ci	},
260262306a36Sopenharmony_ci	.prio[RTW_DMA_MAPPING_NORMAL] = {
260362306a36Sopenharmony_ci		.rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
260462306a36Sopenharmony_ci	},
260562306a36Sopenharmony_ci	.prio[RTW_DMA_MAPPING_HIGH] = {
260662306a36Sopenharmony_ci		.rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
260762306a36Sopenharmony_ci	},
260862306a36Sopenharmony_ci	.wsize = false,
260962306a36Sopenharmony_ci};
261062306a36Sopenharmony_ci
261162306a36Sopenharmony_cistatic const struct rtw_intf_phy_para pcie_gen1_param_8723d[] = {
261262306a36Sopenharmony_ci	{0x0008, 0x4a22,
261362306a36Sopenharmony_ci	 RTW_IP_SEL_PHY,
261462306a36Sopenharmony_ci	 RTW_INTF_PHY_CUT_ALL,
261562306a36Sopenharmony_ci	 RTW_INTF_PHY_PLATFORM_ALL},
261662306a36Sopenharmony_ci	{0x0009, 0x1000,
261762306a36Sopenharmony_ci	 RTW_IP_SEL_PHY,
261862306a36Sopenharmony_ci	 ~(RTW_INTF_PHY_CUT_A | RTW_INTF_PHY_CUT_B),
261962306a36Sopenharmony_ci	 RTW_INTF_PHY_PLATFORM_ALL},
262062306a36Sopenharmony_ci	{0xFFFF, 0x0000,
262162306a36Sopenharmony_ci	 RTW_IP_SEL_PHY,
262262306a36Sopenharmony_ci	 RTW_INTF_PHY_CUT_ALL,
262362306a36Sopenharmony_ci	 RTW_INTF_PHY_PLATFORM_ALL},
262462306a36Sopenharmony_ci};
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_cistatic const struct rtw_intf_phy_para_table phy_para_table_8723d = {
262762306a36Sopenharmony_ci	.gen1_para	= pcie_gen1_param_8723d,
262862306a36Sopenharmony_ci	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8723d),
262962306a36Sopenharmony_ci};
263062306a36Sopenharmony_ci
263162306a36Sopenharmony_cistatic const struct rtw_hw_reg rtw8723d_dig[] = {
263262306a36Sopenharmony_ci	[0] = { .addr = 0xc50, .mask = 0x7f },
263362306a36Sopenharmony_ci	[1] = { .addr = 0xc50, .mask = 0x7f },
263462306a36Sopenharmony_ci};
263562306a36Sopenharmony_ci
263662306a36Sopenharmony_cistatic const struct rtw_hw_reg rtw8723d_dig_cck[] = {
263762306a36Sopenharmony_ci	[0] = { .addr = 0xa0c, .mask = 0x3f00 },
263862306a36Sopenharmony_ci};
263962306a36Sopenharmony_ci
264062306a36Sopenharmony_cistatic const struct rtw_rf_sipi_addr rtw8723d_rf_sipi_addr[] = {
264162306a36Sopenharmony_ci	[RF_PATH_A] = { .hssi_1 = 0x820, .lssi_read    = 0x8a0,
264262306a36Sopenharmony_ci			.hssi_2 = 0x824, .lssi_read_pi = 0x8b8},
264362306a36Sopenharmony_ci	[RF_PATH_B] = { .hssi_1 = 0x828, .lssi_read    = 0x8a4,
264462306a36Sopenharmony_ci			.hssi_2 = 0x82c, .lssi_read_pi = 0x8bc},
264562306a36Sopenharmony_ci};
264662306a36Sopenharmony_ci
264762306a36Sopenharmony_cistatic const struct rtw_ltecoex_addr rtw8723d_ltecoex_addr = {
264862306a36Sopenharmony_ci	.ctrl = REG_LTECOEX_CTRL,
264962306a36Sopenharmony_ci	.wdata = REG_LTECOEX_WRITE_DATA,
265062306a36Sopenharmony_ci	.rdata = REG_LTECOEX_READ_DATA,
265162306a36Sopenharmony_ci};
265262306a36Sopenharmony_ci
265362306a36Sopenharmony_cistatic const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
265462306a36Sopenharmony_ci	[0] = { .phy_pg_tbl	= &rtw8723d_bb_pg_tbl,
265562306a36Sopenharmony_ci		.txpwr_lmt_tbl	= &rtw8723d_txpwr_lmt_tbl,},
265662306a36Sopenharmony_ci};
265762306a36Sopenharmony_ci
265862306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2gb_n[] = {
265962306a36Sopenharmony_ci	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
266062306a36Sopenharmony_ci	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
266162306a36Sopenharmony_ci};
266262306a36Sopenharmony_ci
266362306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2gb_p[] = {
266462306a36Sopenharmony_ci	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
266562306a36Sopenharmony_ci	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
266662306a36Sopenharmony_ci};
266762306a36Sopenharmony_ci
266862306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2ga_n[] = {
266962306a36Sopenharmony_ci	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
267062306a36Sopenharmony_ci	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
267162306a36Sopenharmony_ci};
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2ga_p[] = {
267462306a36Sopenharmony_ci	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
267562306a36Sopenharmony_ci	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
267662306a36Sopenharmony_ci};
267762306a36Sopenharmony_ci
267862306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2g_cck_b_n[] = {
267962306a36Sopenharmony_ci	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
268062306a36Sopenharmony_ci	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
268162306a36Sopenharmony_ci};
268262306a36Sopenharmony_ci
268362306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2g_cck_b_p[] = {
268462306a36Sopenharmony_ci	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
268562306a36Sopenharmony_ci	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
268662306a36Sopenharmony_ci};
268762306a36Sopenharmony_ci
268862306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2g_cck_a_n[] = {
268962306a36Sopenharmony_ci	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
269062306a36Sopenharmony_ci	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
269162306a36Sopenharmony_ci};
269262306a36Sopenharmony_ci
269362306a36Sopenharmony_cistatic const u8 rtw8723d_pwrtrk_2g_cck_a_p[] = {
269462306a36Sopenharmony_ci	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
269562306a36Sopenharmony_ci	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
269662306a36Sopenharmony_ci};
269762306a36Sopenharmony_ci
269862306a36Sopenharmony_cistatic const s8 rtw8723d_pwrtrk_xtal_n[] = {
269962306a36Sopenharmony_ci	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
270062306a36Sopenharmony_ci	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
270162306a36Sopenharmony_ci};
270262306a36Sopenharmony_ci
270362306a36Sopenharmony_cistatic const s8 rtw8723d_pwrtrk_xtal_p[] = {
270462306a36Sopenharmony_ci	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
270562306a36Sopenharmony_ci	0, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16
270662306a36Sopenharmony_ci};
270762306a36Sopenharmony_ci
270862306a36Sopenharmony_cistatic const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
270962306a36Sopenharmony_ci	.pwrtrk_2gb_n = rtw8723d_pwrtrk_2gb_n,
271062306a36Sopenharmony_ci	.pwrtrk_2gb_p = rtw8723d_pwrtrk_2gb_p,
271162306a36Sopenharmony_ci	.pwrtrk_2ga_n = rtw8723d_pwrtrk_2ga_n,
271262306a36Sopenharmony_ci	.pwrtrk_2ga_p = rtw8723d_pwrtrk_2ga_p,
271362306a36Sopenharmony_ci	.pwrtrk_2g_cckb_n = rtw8723d_pwrtrk_2g_cck_b_n,
271462306a36Sopenharmony_ci	.pwrtrk_2g_cckb_p = rtw8723d_pwrtrk_2g_cck_b_p,
271562306a36Sopenharmony_ci	.pwrtrk_2g_ccka_n = rtw8723d_pwrtrk_2g_cck_a_n,
271662306a36Sopenharmony_ci	.pwrtrk_2g_ccka_p = rtw8723d_pwrtrk_2g_cck_a_p,
271762306a36Sopenharmony_ci	.pwrtrk_xtal_p = rtw8723d_pwrtrk_xtal_p,
271862306a36Sopenharmony_ci	.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
271962306a36Sopenharmony_ci};
272062306a36Sopenharmony_ci
272162306a36Sopenharmony_cistatic const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
272262306a36Sopenharmony_ci	{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
272362306a36Sopenharmony_ci	{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
272462306a36Sopenharmony_ci	{0, 0, RTW_REG_DOMAIN_NL},
272562306a36Sopenharmony_ci	{0x964, BIT(1), RTW_REG_DOMAIN_MAC8},
272662306a36Sopenharmony_ci	{0x864, BIT(0), RTW_REG_DOMAIN_MAC8},
272762306a36Sopenharmony_ci	{0xab7, BIT(5), RTW_REG_DOMAIN_MAC8},
272862306a36Sopenharmony_ci	{0xa01, BIT(7), RTW_REG_DOMAIN_MAC8},
272962306a36Sopenharmony_ci	{0, 0, RTW_REG_DOMAIN_NL},
273062306a36Sopenharmony_ci	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
273162306a36Sopenharmony_ci	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
273262306a36Sopenharmony_ci	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
273362306a36Sopenharmony_ci	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
273462306a36Sopenharmony_ci	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
273562306a36Sopenharmony_ci	{0, 0, RTW_REG_DOMAIN_NL},
273662306a36Sopenharmony_ci	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
273762306a36Sopenharmony_ci	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
273862306a36Sopenharmony_ci	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
273962306a36Sopenharmony_ci	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
274062306a36Sopenharmony_ci	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
274162306a36Sopenharmony_ci};
274262306a36Sopenharmony_ci
274362306a36Sopenharmony_ciconst struct rtw_chip_info rtw8723d_hw_spec = {
274462306a36Sopenharmony_ci	.ops = &rtw8723d_ops,
274562306a36Sopenharmony_ci	.id = RTW_CHIP_TYPE_8723D,
274662306a36Sopenharmony_ci	.fw_name = "rtw88/rtw8723d_fw.bin",
274762306a36Sopenharmony_ci	.wlan_cpu = RTW_WCPU_11N,
274862306a36Sopenharmony_ci	.tx_pkt_desc_sz = 40,
274962306a36Sopenharmony_ci	.tx_buf_desc_sz = 16,
275062306a36Sopenharmony_ci	.rx_pkt_desc_sz = 24,
275162306a36Sopenharmony_ci	.rx_buf_desc_sz = 8,
275262306a36Sopenharmony_ci	.phy_efuse_size = 512,
275362306a36Sopenharmony_ci	.log_efuse_size = 512,
275462306a36Sopenharmony_ci	.ptct_efuse_size = 96 + 1,
275562306a36Sopenharmony_ci	.txff_size = 32768,
275662306a36Sopenharmony_ci	.rxff_size = 16384,
275762306a36Sopenharmony_ci	.rsvd_drv_pg_num = 8,
275862306a36Sopenharmony_ci	.txgi_factor = 1,
275962306a36Sopenharmony_ci	.is_pwr_by_rate_dec = true,
276062306a36Sopenharmony_ci	.max_power_index = 0x3f,
276162306a36Sopenharmony_ci	.csi_buf_pg_num = 0,
276262306a36Sopenharmony_ci	.band = RTW_BAND_2G,
276362306a36Sopenharmony_ci	.page_size = TX_PAGE_SIZE,
276462306a36Sopenharmony_ci	.dig_min = 0x20,
276562306a36Sopenharmony_ci	.ht_supported = true,
276662306a36Sopenharmony_ci	.vht_supported = false,
276762306a36Sopenharmony_ci	.lps_deep_mode_supported = 0,
276862306a36Sopenharmony_ci	.sys_func_en = 0xFD,
276962306a36Sopenharmony_ci	.pwr_on_seq = card_enable_flow_8723d,
277062306a36Sopenharmony_ci	.pwr_off_seq = card_disable_flow_8723d,
277162306a36Sopenharmony_ci	.page_table = page_table_8723d,
277262306a36Sopenharmony_ci	.rqpn_table = rqpn_table_8723d,
277362306a36Sopenharmony_ci	.prioq_addrs = &prioq_addrs_8723d,
277462306a36Sopenharmony_ci	.intf_table = &phy_para_table_8723d,
277562306a36Sopenharmony_ci	.dig = rtw8723d_dig,
277662306a36Sopenharmony_ci	.dig_cck = rtw8723d_dig_cck,
277762306a36Sopenharmony_ci	.rf_sipi_addr = {0x840, 0x844},
277862306a36Sopenharmony_ci	.rf_sipi_read_addr = rtw8723d_rf_sipi_addr,
277962306a36Sopenharmony_ci	.fix_rf_phy_num = 2,
278062306a36Sopenharmony_ci	.ltecoex_addr = &rtw8723d_ltecoex_addr,
278162306a36Sopenharmony_ci	.mac_tbl = &rtw8723d_mac_tbl,
278262306a36Sopenharmony_ci	.agc_tbl = &rtw8723d_agc_tbl,
278362306a36Sopenharmony_ci	.bb_tbl = &rtw8723d_bb_tbl,
278462306a36Sopenharmony_ci	.rf_tbl = {&rtw8723d_rf_a_tbl},
278562306a36Sopenharmony_ci	.rfe_defs = rtw8723d_rfe_defs,
278662306a36Sopenharmony_ci	.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
278762306a36Sopenharmony_ci	.rx_ldpc = false,
278862306a36Sopenharmony_ci	.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
278962306a36Sopenharmony_ci	.iqk_threshold = 8,
279062306a36Sopenharmony_ci	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
279162306a36Sopenharmony_ci	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
279262306a36Sopenharmony_ci
279362306a36Sopenharmony_ci	.coex_para_ver = 0x2007022f,
279462306a36Sopenharmony_ci	.bt_desired_ver = 0x2f,
279562306a36Sopenharmony_ci	.scbd_support = true,
279662306a36Sopenharmony_ci	.new_scbd10_def = true,
279762306a36Sopenharmony_ci	.ble_hid_profile_support = false,
279862306a36Sopenharmony_ci	.wl_mimo_ps_support = false,
279962306a36Sopenharmony_ci	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
280062306a36Sopenharmony_ci	.bt_rssi_type = COEX_BTRSSI_RATIO,
280162306a36Sopenharmony_ci	.ant_isolation = 15,
280262306a36Sopenharmony_ci	.rssi_tolerance = 2,
280362306a36Sopenharmony_ci	.wl_rssi_step = wl_rssi_step_8723d,
280462306a36Sopenharmony_ci	.bt_rssi_step = bt_rssi_step_8723d,
280562306a36Sopenharmony_ci	.table_sant_num = ARRAY_SIZE(table_sant_8723d),
280662306a36Sopenharmony_ci	.table_sant = table_sant_8723d,
280762306a36Sopenharmony_ci	.table_nsant_num = ARRAY_SIZE(table_nsant_8723d),
280862306a36Sopenharmony_ci	.table_nsant = table_nsant_8723d,
280962306a36Sopenharmony_ci	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8723d),
281062306a36Sopenharmony_ci	.tdma_sant = tdma_sant_8723d,
281162306a36Sopenharmony_ci	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8723d),
281262306a36Sopenharmony_ci	.tdma_nsant = tdma_nsant_8723d,
281362306a36Sopenharmony_ci	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8723d),
281462306a36Sopenharmony_ci	.wl_rf_para_tx = rf_para_tx_8723d,
281562306a36Sopenharmony_ci	.wl_rf_para_rx = rf_para_rx_8723d,
281662306a36Sopenharmony_ci	.bt_afh_span_bw20 = 0x20,
281762306a36Sopenharmony_ci	.bt_afh_span_bw40 = 0x30,
281862306a36Sopenharmony_ci	.afh_5g_num = ARRAY_SIZE(afh_5g_8723d),
281962306a36Sopenharmony_ci	.afh_5g = afh_5g_8723d,
282062306a36Sopenharmony_ci	.btg_reg = &btg_reg_8723d,
282162306a36Sopenharmony_ci
282262306a36Sopenharmony_ci	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8723d),
282362306a36Sopenharmony_ci	.coex_info_hw_regs = coex_info_hw_regs_8723d,
282462306a36Sopenharmony_ci};
282562306a36Sopenharmony_ciEXPORT_SYMBOL(rtw8723d_hw_spec);
282662306a36Sopenharmony_ci
282762306a36Sopenharmony_ciMODULE_FIRMWARE("rtw88/rtw8723d_fw.bin");
282862306a36Sopenharmony_ci
282962306a36Sopenharmony_ciMODULE_AUTHOR("Realtek Corporation");
283062306a36Sopenharmony_ciMODULE_DESCRIPTION("Realtek 802.11n wireless 8723d driver");
283162306a36Sopenharmony_ciMODULE_LICENSE("Dual BSD/GPL");
2832