1811853daSPing-Ke Shih // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2811853daSPing-Ke Shih /* Copyright(c) 2018-2019  Realtek Corporation
3811853daSPing-Ke Shih  */
4811853daSPing-Ke Shih 
5f56f0863SZong-Zhe Yang #include <linux/module.h>
6811853daSPing-Ke Shih #include "main.h"
7811853daSPing-Ke Shih #include "coex.h"
8811853daSPing-Ke Shih #include "fw.h"
9811853daSPing-Ke Shih #include "tx.h"
10811853daSPing-Ke Shih #include "rx.h"
11811853daSPing-Ke Shih #include "phy.h"
12811853daSPing-Ke Shih #include "rtw8723d.h"
13811853daSPing-Ke Shih #include "rtw8723d_table.h"
14811853daSPing-Ke Shih #include "mac.h"
15811853daSPing-Ke Shih #include "reg.h"
16811853daSPing-Ke Shih #include "debug.h"
17811853daSPing-Ke Shih 
18ba9f0d1bSPing-Ke Shih static const struct rtw_hw_reg rtw8723d_txagc[] = {
19ba9f0d1bSPing-Ke Shih 	[DESC_RATE1M]	= { .addr = 0xe08, .mask = 0x0000ff00 },
20ba9f0d1bSPing-Ke Shih 	[DESC_RATE2M]	= { .addr = 0x86c, .mask = 0x0000ff00 },
21ba9f0d1bSPing-Ke Shih 	[DESC_RATE5_5M]	= { .addr = 0x86c, .mask = 0x00ff0000 },
22ba9f0d1bSPing-Ke Shih 	[DESC_RATE11M]	= { .addr = 0x86c, .mask = 0xff000000 },
23ba9f0d1bSPing-Ke Shih 	[DESC_RATE6M]	= { .addr = 0xe00, .mask = 0x000000ff },
24ba9f0d1bSPing-Ke Shih 	[DESC_RATE9M]	= { .addr = 0xe00, .mask = 0x0000ff00 },
25ba9f0d1bSPing-Ke Shih 	[DESC_RATE12M]	= { .addr = 0xe00, .mask = 0x00ff0000 },
26ba9f0d1bSPing-Ke Shih 	[DESC_RATE18M]	= { .addr = 0xe00, .mask = 0xff000000 },
27ba9f0d1bSPing-Ke Shih 	[DESC_RATE24M]	= { .addr = 0xe04, .mask = 0x000000ff },
28ba9f0d1bSPing-Ke Shih 	[DESC_RATE36M]	= { .addr = 0xe04, .mask = 0x0000ff00 },
29ba9f0d1bSPing-Ke Shih 	[DESC_RATE48M]	= { .addr = 0xe04, .mask = 0x00ff0000 },
30ba9f0d1bSPing-Ke Shih 	[DESC_RATE54M]	= { .addr = 0xe04, .mask = 0xff000000 },
31ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS0]	= { .addr = 0xe10, .mask = 0x000000ff },
32ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS1]	= { .addr = 0xe10, .mask = 0x0000ff00 },
33ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS2]	= { .addr = 0xe10, .mask = 0x00ff0000 },
34ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS3]	= { .addr = 0xe10, .mask = 0xff000000 },
35ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS4]	= { .addr = 0xe14, .mask = 0x000000ff },
36ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS5]	= { .addr = 0xe14, .mask = 0x0000ff00 },
37ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS6]	= { .addr = 0xe14, .mask = 0x00ff0000 },
38ba9f0d1bSPing-Ke Shih 	[DESC_RATEMCS7]	= { .addr = 0xe14, .mask = 0xff000000 },
39ba9f0d1bSPing-Ke Shih };
40ba9f0d1bSPing-Ke Shih 
4175e69fb1SPing-Ke Shih #define WLAN_TXQ_RPT_EN		0x1F
4275e69fb1SPing-Ke Shih #define WLAN_SLOT_TIME		0x09
4375e69fb1SPing-Ke Shih #define WLAN_RL_VAL		0x3030
4475e69fb1SPing-Ke Shih #define WLAN_BAR_VAL		0x0201ffff
4575e69fb1SPing-Ke Shih #define BIT_MASK_TBTT_HOLD	0x00000fff
4675e69fb1SPing-Ke Shih #define BIT_SHIFT_TBTT_HOLD	8
4775e69fb1SPing-Ke Shih #define BIT_MASK_TBTT_SETUP	0x000000ff
4875e69fb1SPing-Ke Shih #define BIT_SHIFT_TBTT_SETUP	0
4975e69fb1SPing-Ke Shih #define BIT_MASK_TBTT_MASK	((BIT_MASK_TBTT_HOLD << BIT_SHIFT_TBTT_HOLD) | \
5075e69fb1SPing-Ke Shih 				 (BIT_MASK_TBTT_SETUP << BIT_SHIFT_TBTT_SETUP))
5175e69fb1SPing-Ke Shih #define TBTT_TIME(s, h)((((s) & BIT_MASK_TBTT_SETUP) << BIT_SHIFT_TBTT_SETUP) |\
5275e69fb1SPing-Ke Shih 			(((h) & BIT_MASK_TBTT_HOLD) << BIT_SHIFT_TBTT_HOLD))
5375e69fb1SPing-Ke Shih #define WLAN_TBTT_TIME_NORMAL	TBTT_TIME(0x04, 0x80)
5475e69fb1SPing-Ke Shih #define WLAN_TBTT_TIME_STOP_BCN	TBTT_TIME(0x04, 0x64)
5575e69fb1SPing-Ke Shih #define WLAN_PIFS_VAL		0
5675e69fb1SPing-Ke Shih #define WLAN_AGG_BRK_TIME	0x16
5775e69fb1SPing-Ke Shih #define WLAN_NAV_PROT_LEN	0x0040
5875e69fb1SPing-Ke Shih #define WLAN_SPEC_SIFS		0x100a
5975e69fb1SPing-Ke Shih #define WLAN_RX_PKT_LIMIT	0x17
6075e69fb1SPing-Ke Shih #define WLAN_MAX_AGG_NR		0x0A
6175e69fb1SPing-Ke Shih #define WLAN_AMPDU_MAX_TIME	0x1C
6275e69fb1SPing-Ke Shih #define WLAN_ANT_SEL		0x82
636598f32dSChin-Yen Lee #define WLAN_LTR_IDLE_LAT	0x90039003
646598f32dSChin-Yen Lee #define WLAN_LTR_ACT_LAT	0x883c883c
6575e69fb1SPing-Ke Shih #define WLAN_LTR_CTRL1		0xCB004010
6675e69fb1SPing-Ke Shih #define WLAN_LTR_CTRL2		0x01233425
6775e69fb1SPing-Ke Shih 
rtw8723d_lck(struct rtw_dev * rtwdev)68f71eb7f6SPing-Ke Shih static void rtw8723d_lck(struct rtw_dev *rtwdev)
69f71eb7f6SPing-Ke Shih {
70f71eb7f6SPing-Ke Shih 	u32 lc_cal;
71f71eb7f6SPing-Ke Shih 	u8 val_ctx, rf_val;
72f71eb7f6SPing-Ke Shih 	int ret;
73f71eb7f6SPing-Ke Shih 
74f71eb7f6SPing-Ke Shih 	val_ctx = rtw_read8(rtwdev, REG_CTX);
75f71eb7f6SPing-Ke Shih 	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
76f71eb7f6SPing-Ke Shih 		rtw_write8(rtwdev, REG_CTX, val_ctx & ~BIT_MASK_CTX_TYPE);
77f71eb7f6SPing-Ke Shih 	else
78f71eb7f6SPing-Ke Shih 		rtw_write8(rtwdev, REG_TXPAUSE, 0xFF);
79f71eb7f6SPing-Ke Shih 	lc_cal = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
80f71eb7f6SPing-Ke Shih 
81f71eb7f6SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal | BIT_LCK);
82f71eb7f6SPing-Ke Shih 
83f71eb7f6SPing-Ke Shih 	ret = read_poll_timeout(rtw_read_rf, rf_val, rf_val != 0x1,
84f71eb7f6SPing-Ke Shih 				10000, 1000000, false,
85f71eb7f6SPing-Ke Shih 				rtwdev, RF_PATH_A, RF_CFGCH, BIT_LCK);
86f71eb7f6SPing-Ke Shih 	if (ret)
87f71eb7f6SPing-Ke Shih 		rtw_warn(rtwdev, "failed to poll LCK status bit\n");
88f71eb7f6SPing-Ke Shih 
89f71eb7f6SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
90f71eb7f6SPing-Ke Shih 	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
91f71eb7f6SPing-Ke Shih 		rtw_write8(rtwdev, REG_CTX, val_ctx);
92f71eb7f6SPing-Ke Shih 	else
93f71eb7f6SPing-Ke Shih 		rtw_write8(rtwdev, REG_TXPAUSE, 0x00);
94f71eb7f6SPing-Ke Shih }
95f71eb7f6SPing-Ke Shih 
96608d2a08SPing-Ke Shih static const u32 rtw8723d_ofdm_swing_table[] = {
97608d2a08SPing-Ke Shih 	0x0b40002d, 0x0c000030, 0x0cc00033, 0x0d800036, 0x0e400039, 0x0f00003c,
98608d2a08SPing-Ke Shih 	0x10000040, 0x11000044, 0x12000048, 0x1300004c, 0x14400051, 0x15800056,
99608d2a08SPing-Ke Shih 	0x16c0005b, 0x18000060, 0x19800066, 0x1b00006c, 0x1c800072, 0x1e400079,
100608d2a08SPing-Ke Shih 	0x20000080, 0x22000088, 0x24000090, 0x26000098, 0x288000a2, 0x2ac000ab,
101608d2a08SPing-Ke Shih 	0x2d4000b5, 0x300000c0, 0x32c000cb, 0x35c000d7, 0x390000e4, 0x3c8000f2,
102608d2a08SPing-Ke Shih 	0x40000100, 0x43c0010f, 0x47c0011f, 0x4c000130, 0x50800142, 0x55400155,
103608d2a08SPing-Ke Shih 	0x5a400169, 0x5fc0017f, 0x65400195, 0x6b8001ae, 0x71c001c7, 0x788001e2,
104608d2a08SPing-Ke Shih 	0x7f8001fe,
105608d2a08SPing-Ke Shih };
106608d2a08SPing-Ke Shih 
107608d2a08SPing-Ke Shih static const u32 rtw8723d_cck_swing_table[] = {
108608d2a08SPing-Ke Shih 	0x0CD, 0x0D9, 0x0E6, 0x0F3, 0x102, 0x111, 0x121, 0x132, 0x144, 0x158,
109608d2a08SPing-Ke Shih 	0x16C, 0x182, 0x198, 0x1B1, 0x1CA, 0x1E5, 0x202, 0x221, 0x241, 0x263,
110608d2a08SPing-Ke Shih 	0x287, 0x2AE, 0x2D6, 0x301, 0x32F, 0x35F, 0x392, 0x3C9, 0x402, 0x43F,
111608d2a08SPing-Ke Shih 	0x47F, 0x4C3, 0x50C, 0x558, 0x5A9, 0x5FF, 0x65A, 0x6BA, 0x720, 0x78C,
112608d2a08SPing-Ke Shih 	0x7FF,
113608d2a08SPing-Ke Shih };
114608d2a08SPing-Ke Shih 
115608d2a08SPing-Ke Shih #define RTW_OFDM_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_ofdm_swing_table)
116608d2a08SPing-Ke Shih #define RTW_CCK_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_cck_swing_table)
117608d2a08SPing-Ke Shih 
rtw8723d_pwrtrack_init(struct rtw_dev * rtwdev)118608d2a08SPing-Ke Shih static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
119608d2a08SPing-Ke Shih {
120608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
121608d2a08SPing-Ke Shih 	u8 path;
122608d2a08SPing-Ke Shih 
123608d2a08SPing-Ke Shih 	dm_info->default_ofdm_index = RTW_DEF_OFDM_SWING_INDEX;
124608d2a08SPing-Ke Shih 
125608d2a08SPing-Ke Shih 	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
126608d2a08SPing-Ke Shih 		ewma_thermal_init(&dm_info->avg_thermal[path]);
127608d2a08SPing-Ke Shih 		dm_info->delta_power_index[path] = 0;
128608d2a08SPing-Ke Shih 	}
129608d2a08SPing-Ke Shih 	dm_info->pwr_trk_triggered = false;
130608d2a08SPing-Ke Shih 	dm_info->pwr_trk_init_trigger = true;
131608d2a08SPing-Ke Shih 	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
132608d2a08SPing-Ke Shih 	dm_info->txagc_remnant_cck = 0;
133608d2a08SPing-Ke Shih 	dm_info->txagc_remnant_ofdm = 0;
134608d2a08SPing-Ke Shih }
135608d2a08SPing-Ke Shih 
rtw8723d_phy_set_param(struct rtw_dev * rtwdev)13675e69fb1SPing-Ke Shih static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
13775e69fb1SPing-Ke Shih {
13875e69fb1SPing-Ke Shih 	u8 xtal_cap;
13975e69fb1SPing-Ke Shih 	u32 val32;
14075e69fb1SPing-Ke Shih 
14175e69fb1SPing-Ke Shih 	/* power on BB/RF domain */
14275e69fb1SPing-Ke Shih 	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
14375e69fb1SPing-Ke Shih 			BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
14475e69fb1SPing-Ke Shih 	rtw_write8_set(rtwdev, REG_RF_CTRL,
14575e69fb1SPing-Ke Shih 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
14675e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
14775e69fb1SPing-Ke Shih 
14875e69fb1SPing-Ke Shih 	rtw_phy_load_tables(rtwdev);
14975e69fb1SPing-Ke Shih 
15075e69fb1SPing-Ke Shih 	/* post init after header files config */
15175e69fb1SPing-Ke Shih 	rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
15275e69fb1SPing-Ke Shih 	rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, BIT_HIQ_NO_LMT_EN_ROOT);
15375e69fb1SPing-Ke Shih 	rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
15475e69fb1SPing-Ke Shih 
15575e69fb1SPing-Ke Shih 	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
15675e69fb1SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
15775e69fb1SPing-Ke Shih 			 xtal_cap | (xtal_cap << 6));
15875e69fb1SPing-Ke Shih 	rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
15975e69fb1SPing-Ke Shih 	if ((rtwdev->efuse.afe >> 4) == 14) {
16075e69fb1SPing-Ke Shih 		rtw_write32_set(rtwdev, REG_AFE_CTRL3, BIT_XTAL_GMP_BIT4);
16175e69fb1SPing-Ke Shih 		rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BITS_PLL);
16275e69fb1SPing-Ke Shih 		rtw_write32_set(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA1);
16375e69fb1SPing-Ke Shih 		rtw_write32_clr(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA0);
16475e69fb1SPing-Ke Shih 	}
16575e69fb1SPing-Ke Shih 
16675e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
16775e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
16875e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
16975e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
17075e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_ATIMWND, 0x2);
17175e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_BCN_CTRL,
17275e69fb1SPing-Ke Shih 		   BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
17375e69fb1SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_TBTT_PROHIBIT);
17475e69fb1SPing-Ke Shih 	val32 &= ~BIT_MASK_TBTT_MASK;
17575e69fb1SPing-Ke Shih 	val32 |= WLAN_TBTT_TIME_STOP_BCN;
17675e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_TBTT_PROHIBIT, val32);
17775e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
17875e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_AGGR_BREAK_TIME, WLAN_AGG_BRK_TIME);
17975e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_NAV_PROT_LEN, WLAN_NAV_PROT_LEN);
18075e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
18175e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS);
18275e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS);
18375e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
18475e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
18575e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
18675e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
18775e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_LEDCFG2, WLAN_ANT_SEL);
18875e69fb1SPing-Ke Shih 
18975e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTR_IDLE_LATENCY, WLAN_LTR_IDLE_LAT);
19075e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTR_ACTIVE_LATENCY, WLAN_LTR_ACT_LAT);
19175e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC, WLAN_LTR_CTRL1);
19275e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC + 4, WLAN_LTR_CTRL2);
19375e69fb1SPing-Ke Shih 
19475e69fb1SPing-Ke Shih 	rtw_phy_init(rtwdev);
1958f0cb24cSPing-Ke Shih 	rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
19675e69fb1SPing-Ke Shih 
19775e69fb1SPing-Ke Shih 	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
198f71eb7f6SPing-Ke Shih 
199f71eb7f6SPing-Ke Shih 	rtw8723d_lck(rtwdev);
200f71eb7f6SPing-Ke Shih 
20175e69fb1SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
20275e69fb1SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
203608d2a08SPing-Ke Shih 
204608d2a08SPing-Ke Shih 	rtw8723d_pwrtrack_init(rtwdev);
20575e69fb1SPing-Ke Shih }
20675e69fb1SPing-Ke Shih 
rtw8723de_efuse_parsing(struct rtw_efuse * efuse,struct rtw8723d_efuse * map)207ab0a031eSPing-Ke Shih static void rtw8723de_efuse_parsing(struct rtw_efuse *efuse,
208ab0a031eSPing-Ke Shih 				    struct rtw8723d_efuse *map)
209ab0a031eSPing-Ke Shih {
210ab0a031eSPing-Ke Shih 	ether_addr_copy(efuse->addr, map->e.mac_addr);
211ab0a031eSPing-Ke Shih }
212ab0a031eSPing-Ke Shih 
rtw8723du_efuse_parsing(struct rtw_efuse * efuse,struct rtw8723d_efuse * map)21387caeef0SSascha Hauer static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse,
21487caeef0SSascha Hauer 				    struct rtw8723d_efuse *map)
21587caeef0SSascha Hauer {
21687caeef0SSascha Hauer 	ether_addr_copy(efuse->addr, map->u.mac_addr);
21787caeef0SSascha Hauer }
21887caeef0SSascha Hauer 
rtw8723ds_efuse_parsing(struct rtw_efuse * efuse,struct rtw8723d_efuse * map)2199be20a82SMartin Blumenstingl static void rtw8723ds_efuse_parsing(struct rtw_efuse *efuse,
2209be20a82SMartin Blumenstingl 				    struct rtw8723d_efuse *map)
2219be20a82SMartin Blumenstingl {
2229be20a82SMartin Blumenstingl 	ether_addr_copy(efuse->addr, map->s.mac_addr);
2239be20a82SMartin Blumenstingl }
2249be20a82SMartin Blumenstingl 
rtw8723d_read_efuse(struct rtw_dev * rtwdev,u8 * log_map)225ab0a031eSPing-Ke Shih static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
226ab0a031eSPing-Ke Shih {
227ab0a031eSPing-Ke Shih 	struct rtw_efuse *efuse = &rtwdev->efuse;
228ab0a031eSPing-Ke Shih 	struct rtw8723d_efuse *map;
229ab0a031eSPing-Ke Shih 	int i;
230ab0a031eSPing-Ke Shih 
231ab0a031eSPing-Ke Shih 	map = (struct rtw8723d_efuse *)log_map;
232ab0a031eSPing-Ke Shih 
233ab0a031eSPing-Ke Shih 	efuse->rfe_option = 0;
234ab0a031eSPing-Ke Shih 	efuse->rf_board_option = map->rf_board_option;
235ab0a031eSPing-Ke Shih 	efuse->crystal_cap = map->xtal_k;
236ab0a031eSPing-Ke Shih 	efuse->pa_type_2g = map->pa_type;
237ab0a031eSPing-Ke Shih 	efuse->lna_type_2g = map->lna_type_2g[0];
238ab0a031eSPing-Ke Shih 	efuse->channel_plan = map->channel_plan;
239ab0a031eSPing-Ke Shih 	efuse->country_code[0] = map->country_code[0];
240ab0a031eSPing-Ke Shih 	efuse->country_code[1] = map->country_code[1];
241ab0a031eSPing-Ke Shih 	efuse->bt_setting = map->rf_bt_setting;
242ab0a031eSPing-Ke Shih 	efuse->regd = map->rf_board_option & 0x7;
243ab0a031eSPing-Ke Shih 	efuse->thermal_meter[0] = map->thermal_meter;
244ab0a031eSPing-Ke Shih 	efuse->thermal_meter_k = map->thermal_meter;
24575e69fb1SPing-Ke Shih 	efuse->afe = map->afe;
246ab0a031eSPing-Ke Shih 
247ab0a031eSPing-Ke Shih 	for (i = 0; i < 4; i++)
248ab0a031eSPing-Ke Shih 		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
249ab0a031eSPing-Ke Shih 
250ab0a031eSPing-Ke Shih 	switch (rtw_hci_type(rtwdev)) {
251ab0a031eSPing-Ke Shih 	case RTW_HCI_TYPE_PCIE:
252ab0a031eSPing-Ke Shih 		rtw8723de_efuse_parsing(efuse, map);
253ab0a031eSPing-Ke Shih 		break;
25487caeef0SSascha Hauer 	case RTW_HCI_TYPE_USB:
25587caeef0SSascha Hauer 		rtw8723du_efuse_parsing(efuse, map);
25687caeef0SSascha Hauer 		break;
2579be20a82SMartin Blumenstingl 	case RTW_HCI_TYPE_SDIO:
2589be20a82SMartin Blumenstingl 		rtw8723ds_efuse_parsing(efuse, map);
2599be20a82SMartin Blumenstingl 		break;
260ab0a031eSPing-Ke Shih 	default:
261ab0a031eSPing-Ke Shih 		/* unsupported now */
262ab0a031eSPing-Ke Shih 		return -ENOTSUPP;
263ab0a031eSPing-Ke Shih 	}
264ab0a031eSPing-Ke Shih 
265ab0a031eSPing-Ke Shih 	return 0;
266ab0a031eSPing-Ke Shih }
267ab0a031eSPing-Ke Shih 
query_phy_status_page0(struct rtw_dev * rtwdev,u8 * phy_status,struct rtw_rx_pkt_stat * pkt_stat)268158441a2SPing-Ke Shih static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
269158441a2SPing-Ke Shih 				   struct rtw_rx_pkt_stat *pkt_stat)
270158441a2SPing-Ke Shih {
271158441a2SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
272158441a2SPing-Ke Shih 	s8 min_rx_power = -120;
273158441a2SPing-Ke Shih 	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
274158441a2SPing-Ke Shih 
275158441a2SPing-Ke Shih 	pkt_stat->rx_power[RF_PATH_A] = pwdb - 97;
276158441a2SPing-Ke Shih 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
277158441a2SPing-Ke Shih 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
278158441a2SPing-Ke Shih 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
279158441a2SPing-Ke Shih 				     min_rx_power);
280158441a2SPing-Ke Shih 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
281158441a2SPing-Ke Shih }
282158441a2SPing-Ke Shih 
query_phy_status_page1(struct rtw_dev * rtwdev,u8 * phy_status,struct rtw_rx_pkt_stat * pkt_stat)283158441a2SPing-Ke Shih static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
284158441a2SPing-Ke Shih 				   struct rtw_rx_pkt_stat *pkt_stat)
285158441a2SPing-Ke Shih {
286158441a2SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
287158441a2SPing-Ke Shih 	u8 rxsc, bw;
288158441a2SPing-Ke Shih 	s8 min_rx_power = -120;
289158441a2SPing-Ke Shih 	s8 rx_evm;
290158441a2SPing-Ke Shih 
291158441a2SPing-Ke Shih 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
292158441a2SPing-Ke Shih 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
293158441a2SPing-Ke Shih 	else
294158441a2SPing-Ke Shih 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
295158441a2SPing-Ke Shih 
296158441a2SPing-Ke Shih 	if (GET_PHY_STAT_P1_RF_MODE(phy_status) == 0)
297158441a2SPing-Ke Shih 		bw = RTW_CHANNEL_WIDTH_20;
298158441a2SPing-Ke Shih 	else if ((rxsc == 1) || (rxsc == 2))
299158441a2SPing-Ke Shih 		bw = RTW_CHANNEL_WIDTH_20;
300158441a2SPing-Ke Shih 	else
301158441a2SPing-Ke Shih 		bw = RTW_CHANNEL_WIDTH_40;
302158441a2SPing-Ke Shih 
303158441a2SPing-Ke Shih 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
304158441a2SPing-Ke Shih 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
305158441a2SPing-Ke Shih 	pkt_stat->bw = bw;
306158441a2SPing-Ke Shih 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
307158441a2SPing-Ke Shih 				     min_rx_power);
308158441a2SPing-Ke Shih 	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
309158441a2SPing-Ke Shih 	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
310158441a2SPing-Ke Shih 	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
311158441a2SPing-Ke Shih 
312158441a2SPing-Ke Shih 	dm_info->curr_rx_rate = pkt_stat->rate;
313158441a2SPing-Ke Shih 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
314158441a2SPing-Ke Shih 	dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
315158441a2SPing-Ke Shih 	dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
316158441a2SPing-Ke Shih 
317158441a2SPing-Ke Shih 	rx_evm = clamp_t(s8, -pkt_stat->rx_evm[RF_PATH_A] >> 1, 0, 64);
318158441a2SPing-Ke Shih 	rx_evm &= 0x3F;	/* 64->0: second path of 1SS rate is 64 */
319158441a2SPing-Ke Shih 	dm_info->rx_evm_dbm[RF_PATH_A] = rx_evm;
320158441a2SPing-Ke Shih }
321158441a2SPing-Ke Shih 
query_phy_status(struct rtw_dev * rtwdev,u8 * phy_status,struct rtw_rx_pkt_stat * pkt_stat)322158441a2SPing-Ke Shih static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
323158441a2SPing-Ke Shih 			     struct rtw_rx_pkt_stat *pkt_stat)
324158441a2SPing-Ke Shih {
325158441a2SPing-Ke Shih 	u8 page;
326158441a2SPing-Ke Shih 
327158441a2SPing-Ke Shih 	page = *phy_status & 0xf;
328158441a2SPing-Ke Shih 
329158441a2SPing-Ke Shih 	switch (page) {
330158441a2SPing-Ke Shih 	case 0:
331158441a2SPing-Ke Shih 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
332158441a2SPing-Ke Shih 		break;
333158441a2SPing-Ke Shih 	case 1:
334158441a2SPing-Ke Shih 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
335158441a2SPing-Ke Shih 		break;
336158441a2SPing-Ke Shih 	default:
337158441a2SPing-Ke Shih 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
338158441a2SPing-Ke Shih 		return;
339158441a2SPing-Ke Shih 	}
340158441a2SPing-Ke Shih }
341158441a2SPing-Ke Shih 
rtw8723d_query_rx_desc(struct rtw_dev * rtwdev,u8 * rx_desc,struct rtw_rx_pkt_stat * pkt_stat,struct ieee80211_rx_status * rx_status)342158441a2SPing-Ke Shih static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
343158441a2SPing-Ke Shih 				   struct rtw_rx_pkt_stat *pkt_stat,
344158441a2SPing-Ke Shih 				   struct ieee80211_rx_status *rx_status)
345158441a2SPing-Ke Shih {
346158441a2SPing-Ke Shih 	struct ieee80211_hdr *hdr;
347158441a2SPing-Ke Shih 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
348158441a2SPing-Ke Shih 	u8 *phy_status = NULL;
349158441a2SPing-Ke Shih 
350158441a2SPing-Ke Shih 	memset(pkt_stat, 0, sizeof(*pkt_stat));
351158441a2SPing-Ke Shih 
352158441a2SPing-Ke Shih 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
353158441a2SPing-Ke Shih 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
354158441a2SPing-Ke Shih 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
355158441a2SPing-Ke Shih 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
356158441a2SPing-Ke Shih 			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
357158441a2SPing-Ke Shih 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
358158441a2SPing-Ke Shih 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
359158441a2SPing-Ke Shih 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
360158441a2SPing-Ke Shih 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
361158441a2SPing-Ke Shih 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
362158441a2SPing-Ke Shih 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
363158441a2SPing-Ke Shih 	pkt_stat->ppdu_cnt = 0;
364158441a2SPing-Ke Shih 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
365158441a2SPing-Ke Shih 
366158441a2SPing-Ke Shih 	/* drv_info_sz is in unit of 8-bytes */
367158441a2SPing-Ke Shih 	pkt_stat->drv_info_sz *= 8;
368158441a2SPing-Ke Shih 
369158441a2SPing-Ke Shih 	/* c2h cmd pkt's rx/phy status is not interested */
370158441a2SPing-Ke Shih 	if (pkt_stat->is_c2h)
371158441a2SPing-Ke Shih 		return;
372158441a2SPing-Ke Shih 
373158441a2SPing-Ke Shih 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
374158441a2SPing-Ke Shih 				       pkt_stat->drv_info_sz);
375158441a2SPing-Ke Shih 	if (pkt_stat->phy_status) {
376158441a2SPing-Ke Shih 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
377158441a2SPing-Ke Shih 		query_phy_status(rtwdev, phy_status, pkt_stat);
378158441a2SPing-Ke Shih 	}
379158441a2SPing-Ke Shih 
380158441a2SPing-Ke Shih 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
381158441a2SPing-Ke Shih }
382158441a2SPing-Ke Shih 
rtw8723d_check_spur_ov_thres(struct rtw_dev * rtwdev,u8 channel,u32 thres)3835f028a9cSPing-Ke Shih static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
3845f028a9cSPing-Ke Shih 					 u8 channel, u32 thres)
3855f028a9cSPing-Ke Shih {
3865f028a9cSPing-Ke Shih 	u32 freq;
3875f028a9cSPing-Ke Shih 	bool ret = false;
3885f028a9cSPing-Ke Shih 
3895f028a9cSPing-Ke Shih 	if (channel == 13)
3905f028a9cSPing-Ke Shih 		freq = FREQ_CH13;
3915f028a9cSPing-Ke Shih 	else if (channel == 14)
3925f028a9cSPing-Ke Shih 		freq = FREQ_CH14;
3935f028a9cSPing-Ke Shih 	else
3945f028a9cSPing-Ke Shih 		return false;
3955f028a9cSPing-Ke Shih 
3965f028a9cSPing-Ke Shih 	rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
3975f028a9cSPing-Ke Shih 	rtw_write32(rtwdev, REG_PSDFN, freq);
3985f028a9cSPing-Ke Shih 	rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
3995f028a9cSPing-Ke Shih 
4005f028a9cSPing-Ke Shih 	msleep(30);
4015f028a9cSPing-Ke Shih 	if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
4025f028a9cSPing-Ke Shih 		ret = true;
4035f028a9cSPing-Ke Shih 
4045f028a9cSPing-Ke Shih 	rtw_write32(rtwdev, REG_PSDFN, freq);
4055f028a9cSPing-Ke Shih 	rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
4065f028a9cSPing-Ke Shih 
4075f028a9cSPing-Ke Shih 	return ret;
4085f028a9cSPing-Ke Shih }
4095f028a9cSPing-Ke Shih 
rtw8723d_cfg_notch(struct rtw_dev * rtwdev,u8 channel,bool notch)4105f028a9cSPing-Ke Shih static void rtw8723d_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
4115f028a9cSPing-Ke Shih {
4125f028a9cSPing-Ke Shih 	if (!notch) {
4135f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
4145f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
4155f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
4165f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
4175f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
4185f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
4195f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
4205f028a9cSPing-Ke Shih 		return;
4215f028a9cSPing-Ke Shih 	}
4225f028a9cSPing-Ke Shih 
4235f028a9cSPing-Ke Shih 	switch (channel) {
4245f028a9cSPing-Ke Shih 	case 13:
4255f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
4265f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
4275f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x04000000);
4285f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
4295f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
4305f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
4315f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
4325f028a9cSPing-Ke Shih 		break;
4335f028a9cSPing-Ke Shih 	case 14:
4345f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
4355f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
4365f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
4375f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
4385f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
4395f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00080000);
4405f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
4415f028a9cSPing-Ke Shih 		break;
4425f028a9cSPing-Ke Shih 	default:
4435f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
4445f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
4455f028a9cSPing-Ke Shih 		break;
4465f028a9cSPing-Ke Shih 	}
4475f028a9cSPing-Ke Shih }
4485f028a9cSPing-Ke Shih 
rtw8723d_spur_cal(struct rtw_dev * rtwdev,u8 channel)4495f028a9cSPing-Ke Shih static void rtw8723d_spur_cal(struct rtw_dev *rtwdev, u8 channel)
4505f028a9cSPing-Ke Shih {
4515f028a9cSPing-Ke Shih 	bool notch;
4525f028a9cSPing-Ke Shih 
4535f028a9cSPing-Ke Shih 	if (channel < 13) {
4545f028a9cSPing-Ke Shih 		rtw8723d_cfg_notch(rtwdev, channel, false);
4555f028a9cSPing-Ke Shih 		return;
4565f028a9cSPing-Ke Shih 	}
4575f028a9cSPing-Ke Shih 
4585f028a9cSPing-Ke Shih 	notch = rtw8723d_check_spur_ov_thres(rtwdev, channel, SPUR_THRES);
4595f028a9cSPing-Ke Shih 	rtw8723d_cfg_notch(rtwdev, channel, notch);
4605f028a9cSPing-Ke Shih }
4615f028a9cSPing-Ke Shih 
rtw8723d_set_channel_rf(struct rtw_dev * rtwdev,u8 channel,u8 bw)4625f028a9cSPing-Ke Shih static void rtw8723d_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
4635f028a9cSPing-Ke Shih {
4645f028a9cSPing-Ke Shih 	u32 rf_cfgch_a, rf_cfgch_b;
4655f028a9cSPing-Ke Shih 
4665f028a9cSPing-Ke Shih 	rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
4675f028a9cSPing-Ke Shih 	rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
4685f028a9cSPing-Ke Shih 
4695f028a9cSPing-Ke Shih 	rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
4705f028a9cSPing-Ke Shih 	rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
4715f028a9cSPing-Ke Shih 	rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
4725f028a9cSPing-Ke Shih 	rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
4735f028a9cSPing-Ke Shih 
4745f028a9cSPing-Ke Shih 	rf_cfgch_a &= ~RFCFGCH_BW_MASK;
4755f028a9cSPing-Ke Shih 	switch (bw) {
4765f028a9cSPing-Ke Shih 	case RTW_CHANNEL_WIDTH_20:
4775f028a9cSPing-Ke Shih 		rf_cfgch_a |= RFCFGCH_BW_20M;
4785f028a9cSPing-Ke Shih 		break;
4795f028a9cSPing-Ke Shih 	case RTW_CHANNEL_WIDTH_40:
4805f028a9cSPing-Ke Shih 		rf_cfgch_a |= RFCFGCH_BW_40M;
4815f028a9cSPing-Ke Shih 		break;
4825f028a9cSPing-Ke Shih 	default:
4835f028a9cSPing-Ke Shih 		break;
4845f028a9cSPing-Ke Shih 	}
4855f028a9cSPing-Ke Shih 
4865f028a9cSPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
4875f028a9cSPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
4885f028a9cSPing-Ke Shih 
4895f028a9cSPing-Ke Shih 	rtw8723d_spur_cal(rtwdev, channel);
4905f028a9cSPing-Ke Shih }
4915f028a9cSPing-Ke Shih 
4925f028a9cSPing-Ke Shih static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR] = {
4935f028a9cSPing-Ke Shih 	[0] = {
4945f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xA24, .val = 0x64B80C1C },
4955f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xA28, .val = 0x00008810 },
4965f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xAAC, .val = 0x01235667 },
4975f028a9cSPing-Ke Shih 	},
4985f028a9cSPing-Ke Shih 	[1] = {
4995f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xA24, .val = 0x0000B81C },
5005f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xA28, .val = 0x00000000 },
5015f028a9cSPing-Ke Shih 		{ .len = 4, .reg = 0xAAC, .val = 0x00003667 },
5025f028a9cSPing-Ke Shih 	},
5035f028a9cSPing-Ke Shih };
5045f028a9cSPing-Ke Shih 
rtw8723d_set_channel_bb(struct rtw_dev * rtwdev,u8 channel,u8 bw,u8 primary_ch_idx)5055f028a9cSPing-Ke Shih static void rtw8723d_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
5065f028a9cSPing-Ke Shih 				    u8 primary_ch_idx)
5075f028a9cSPing-Ke Shih {
5085f028a9cSPing-Ke Shih 	const struct rtw_backup_info *cck_dfir;
5095f028a9cSPing-Ke Shih 	int i;
5105f028a9cSPing-Ke Shih 
5115f028a9cSPing-Ke Shih 	cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
5125f028a9cSPing-Ke Shih 
5135f028a9cSPing-Ke Shih 	for (i = 0; i < CCK_DFIR_NR; i++, cck_dfir++)
5145f028a9cSPing-Ke Shih 		rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
5155f028a9cSPing-Ke Shih 
5165f028a9cSPing-Ke Shih 	switch (bw) {
5175f028a9cSPing-Ke Shih 	case RTW_CHANNEL_WIDTH_20:
5185f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
5195f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
5205f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 1);
5215f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_MASK_RXBB_DFIR, 0xa);
5225f028a9cSPing-Ke Shih 		break;
5235f028a9cSPing-Ke Shih 	case RTW_CHANNEL_WIDTH_40:
5245f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
5255f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
5265f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 0);
5275f028a9cSPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
5285f028a9cSPing-Ke Shih 				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
5295f028a9cSPing-Ke Shih 		break;
5305f028a9cSPing-Ke Shih 	default:
5315f028a9cSPing-Ke Shih 		break;
5325f028a9cSPing-Ke Shih 	}
5335f028a9cSPing-Ke Shih }
5345f028a9cSPing-Ke Shih 
rtw8723d_set_channel(struct rtw_dev * rtwdev,u8 channel,u8 bw,u8 primary_chan_idx)5355f028a9cSPing-Ke Shih static void rtw8723d_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
5365f028a9cSPing-Ke Shih 				 u8 primary_chan_idx)
5375f028a9cSPing-Ke Shih {
5385f028a9cSPing-Ke Shih 	rtw8723d_set_channel_rf(rtwdev, channel, bw);
5395f028a9cSPing-Ke Shih 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
5405f028a9cSPing-Ke Shih 	rtw8723d_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
5415f028a9cSPing-Ke Shih }
5425f028a9cSPing-Ke Shih 
54375e69fb1SPing-Ke Shih #define BIT_CFENDFORM		BIT(9)
54475e69fb1SPing-Ke Shih #define BIT_WMAC_TCR_ERR0	BIT(12)
54575e69fb1SPing-Ke Shih #define BIT_WMAC_TCR_ERR1	BIT(13)
54675e69fb1SPing-Ke Shih #define BIT_TCR_CFG		(BIT_CFENDFORM | BIT_WMAC_TCR_ERR0 |	       \
54775e69fb1SPing-Ke Shih 				 BIT_WMAC_TCR_ERR1)
54875e69fb1SPing-Ke Shih #define WLAN_RX_FILTER0		0xFFFF
54975e69fb1SPing-Ke Shih #define WLAN_RX_FILTER1		0x400
55075e69fb1SPing-Ke Shih #define WLAN_RX_FILTER2		0xFFFF
55175e69fb1SPing-Ke Shih #define WLAN_RCR_CFG		0x700060CE
55275e69fb1SPing-Ke Shih 
rtw8723d_mac_init(struct rtw_dev * rtwdev)55375e69fb1SPing-Ke Shih static int rtw8723d_mac_init(struct rtw_dev *rtwdev)
55475e69fb1SPing-Ke Shih {
55575e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
55675e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
55775e69fb1SPing-Ke Shih 
55875e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
55975e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_RXFLTMAP1, WLAN_RX_FILTER1);
56075e69fb1SPing-Ke Shih 	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
56175e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
56275e69fb1SPing-Ke Shih 
56375e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_INT_MIG, 0);
56475e69fb1SPing-Ke Shih 	rtw_write32(rtwdev, REG_MCUTST_1, 0x0);
56575e69fb1SPing-Ke Shih 
56675e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA);
56775e69fb1SPing-Ke Shih 	rtw_write8(rtwdev, REG_2ND_CCA_CTRL, 0);
56875e69fb1SPing-Ke Shih 
56975e69fb1SPing-Ke Shih 	return 0;
57075e69fb1SPing-Ke Shih }
57175e69fb1SPing-Ke Shih 
rtw8723d_shutdown(struct rtw_dev * rtwdev)57205202746SPing-Ke Shih static void rtw8723d_shutdown(struct rtw_dev *rtwdev)
57305202746SPing-Ke Shih {
57405202746SPing-Ke Shih 	rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
57505202746SPing-Ke Shih }
57605202746SPing-Ke Shih 
rtw8723d_cfg_ldo25(struct rtw_dev * rtwdev,bool enable)5771afb5eb7SPing-Ke Shih static void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
5781afb5eb7SPing-Ke Shih {
5791afb5eb7SPing-Ke Shih 	u8 ldo_pwr;
5801afb5eb7SPing-Ke Shih 
5811afb5eb7SPing-Ke Shih 	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
5821afb5eb7SPing-Ke Shih 	if (enable) {
5831afb5eb7SPing-Ke Shih 		ldo_pwr &= ~BIT_MASK_LDO25_VOLTAGE;
584c5457559SColin Ian King 		ldo_pwr |= (BIT_LDO25_VOLTAGE_V25 << 4) | BIT_LDO25_EN;
5851afb5eb7SPing-Ke Shih 	} else {
5861afb5eb7SPing-Ke Shih 		ldo_pwr &= ~BIT_LDO25_EN;
5871afb5eb7SPing-Ke Shih 	}
5881afb5eb7SPing-Ke Shih 	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
5891afb5eb7SPing-Ke Shih }
5901afb5eb7SPing-Ke Shih 
591ba9f0d1bSPing-Ke Shih static void
rtw8723d_set_tx_power_index_by_rate(struct rtw_dev * rtwdev,u8 path,u8 rs)592ba9f0d1bSPing-Ke Shih rtw8723d_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
593ba9f0d1bSPing-Ke Shih {
594ba9f0d1bSPing-Ke Shih 	struct rtw_hal *hal = &rtwdev->hal;
595ba9f0d1bSPing-Ke Shih 	const struct rtw_hw_reg *txagc;
596ba9f0d1bSPing-Ke Shih 	u8 rate, pwr_index;
597ba9f0d1bSPing-Ke Shih 	int j;
598ba9f0d1bSPing-Ke Shih 
599ba9f0d1bSPing-Ke Shih 	for (j = 0; j < rtw_rate_size[rs]; j++) {
600ba9f0d1bSPing-Ke Shih 		rate = rtw_rate_section[rs][j];
601ba9f0d1bSPing-Ke Shih 		pwr_index = hal->tx_pwr_tbl[path][rate];
602ba9f0d1bSPing-Ke Shih 
603ba9f0d1bSPing-Ke Shih 		if (rate >= ARRAY_SIZE(rtw8723d_txagc)) {
604ba9f0d1bSPing-Ke Shih 			rtw_warn(rtwdev, "rate 0x%x isn't supported\n", rate);
605ba9f0d1bSPing-Ke Shih 			continue;
606ba9f0d1bSPing-Ke Shih 		}
607ba9f0d1bSPing-Ke Shih 		txagc = &rtw8723d_txagc[rate];
608ba9f0d1bSPing-Ke Shih 		if (!txagc->addr) {
609ba9f0d1bSPing-Ke Shih 			rtw_warn(rtwdev, "rate 0x%x isn't defined\n", rate);
610ba9f0d1bSPing-Ke Shih 			continue;
611ba9f0d1bSPing-Ke Shih 		}
612ba9f0d1bSPing-Ke Shih 
613ba9f0d1bSPing-Ke Shih 		rtw_write32_mask(rtwdev, txagc->addr, txagc->mask, pwr_index);
614ba9f0d1bSPing-Ke Shih 	}
615ba9f0d1bSPing-Ke Shih }
616ba9f0d1bSPing-Ke Shih 
rtw8723d_set_tx_power_index(struct rtw_dev * rtwdev)617ba9f0d1bSPing-Ke Shih static void rtw8723d_set_tx_power_index(struct rtw_dev *rtwdev)
618ba9f0d1bSPing-Ke Shih {
619ba9f0d1bSPing-Ke Shih 	struct rtw_hal *hal = &rtwdev->hal;
620ba9f0d1bSPing-Ke Shih 	int rs, path;
621ba9f0d1bSPing-Ke Shih 
622ba9f0d1bSPing-Ke Shih 	for (path = 0; path < hal->rf_path_num; path++) {
623ba9f0d1bSPing-Ke Shih 		for (rs = 0; rs <= RTW_RATE_SECTION_HT_1S; rs++)
624ba9f0d1bSPing-Ke Shih 			rtw8723d_set_tx_power_index_by_rate(rtwdev, path, rs);
625ba9f0d1bSPing-Ke Shih 	}
626ba9f0d1bSPing-Ke Shih }
627ba9f0d1bSPing-Ke Shih 
rtw8723d_efuse_grant(struct rtw_dev * rtwdev,bool on)62844baa97cSPing-Ke Shih static void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on)
62944baa97cSPing-Ke Shih {
63044baa97cSPing-Ke Shih 	if (on) {
63144baa97cSPing-Ke Shih 		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
63244baa97cSPing-Ke Shih 
63344baa97cSPing-Ke Shih 		rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
63444baa97cSPing-Ke Shih 		rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M);
63544baa97cSPing-Ke Shih 	} else {
63644baa97cSPing-Ke Shih 		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
63744baa97cSPing-Ke Shih 	}
63844baa97cSPing-Ke Shih }
63944baa97cSPing-Ke Shih 
rtw8723d_false_alarm_statistics(struct rtw_dev * rtwdev)640439d4a97SPing-Ke Shih static void rtw8723d_false_alarm_statistics(struct rtw_dev *rtwdev)
641439d4a97SPing-Ke Shih {
642439d4a97SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
643439d4a97SPing-Ke Shih 	u32 cck_fa_cnt;
644439d4a97SPing-Ke Shih 	u32 ofdm_fa_cnt;
645439d4a97SPing-Ke Shih 	u32 crc32_cnt;
646439d4a97SPing-Ke Shih 	u32 val32;
647439d4a97SPing-Ke Shih 
648439d4a97SPing-Ke Shih 	/* hold counter */
649439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 1);
650439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 1);
651439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KEEP, 1);
652439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KEEP, 1);
653439d4a97SPing-Ke Shih 
654439d4a97SPing-Ke Shih 	cck_fa_cnt = rtw_read32_mask(rtwdev, REG_CCK_FA_LSB_11N, MASKBYTE0);
655439d4a97SPing-Ke Shih 	cck_fa_cnt += rtw_read32_mask(rtwdev, REG_CCK_FA_MSB_11N, MASKBYTE3) << 8;
656439d4a97SPing-Ke Shih 
657439d4a97SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE1_11N);
658439d4a97SPing-Ke Shih 	ofdm_fa_cnt = u32_get_bits(val32, BIT_MASK_OFDM_FF_CNT);
659439d4a97SPing-Ke Shih 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_SF_CNT);
660439d4a97SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE2_11N);
661439d4a97SPing-Ke Shih 	dm_info->ofdm_cca_cnt = u32_get_bits(val32, BIT_MASK_OFDM_CCA_CNT);
662439d4a97SPing-Ke Shih 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_PF_CNT);
663439d4a97SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE3_11N);
664439d4a97SPing-Ke Shih 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_RI_CNT);
665439d4a97SPing-Ke Shih 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_CRC_CNT);
666439d4a97SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE4_11N);
667439d4a97SPing-Ke Shih 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_MNS_CNT);
668439d4a97SPing-Ke Shih 
669439d4a97SPing-Ke Shih 	dm_info->cck_fa_cnt = cck_fa_cnt;
670439d4a97SPing-Ke Shih 	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
671439d4a97SPing-Ke Shih 	dm_info->total_fa_cnt = cck_fa_cnt + ofdm_fa_cnt;
672439d4a97SPing-Ke Shih 
673439d4a97SPing-Ke Shih 	dm_info->cck_err_cnt = rtw_read32(rtwdev, REG_IGI_C_11N);
674439d4a97SPing-Ke Shih 	dm_info->cck_ok_cnt = rtw_read32(rtwdev, REG_IGI_D_11N);
675439d4a97SPing-Ke Shih 	crc32_cnt = rtw_read32(rtwdev, REG_OFDM_CRC32_CNT_11N);
676439d4a97SPing-Ke Shih 	dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_ERR);
677439d4a97SPing-Ke Shih 	dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_OK);
678439d4a97SPing-Ke Shih 	crc32_cnt = rtw_read32(rtwdev, REG_HT_CRC32_CNT_11N);
679439d4a97SPing-Ke Shih 	dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_ERR);
680439d4a97SPing-Ke Shih 	dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_OK);
681439d4a97SPing-Ke Shih 	dm_info->vht_err_cnt = 0;
682439d4a97SPing-Ke Shih 	dm_info->vht_ok_cnt = 0;
683439d4a97SPing-Ke Shih 
684439d4a97SPing-Ke Shih 	val32 = rtw_read32(rtwdev, REG_CCK_CCA_CNT_11N);
685439d4a97SPing-Ke Shih 	dm_info->cck_cca_cnt = (u32_get_bits(val32, BIT_MASK_CCK_FA_MSB) << 8) |
686439d4a97SPing-Ke Shih 			       u32_get_bits(val32, BIT_MASK_CCK_FA_LSB);
687439d4a97SPing-Ke Shih 	dm_info->total_cca_cnt = dm_info->cck_cca_cnt + dm_info->ofdm_cca_cnt;
688439d4a97SPing-Ke Shih 
689439d4a97SPing-Ke Shih 	/* reset counter */
690439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 1);
691439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 0);
692439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 1);
693439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 0);
694439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 0);
695439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 0);
696439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 0);
697439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 2);
698439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 0);
699439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 2);
700439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 1);
701439d4a97SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 0);
702439d4a97SPing-Ke Shih }
703439d4a97SPing-Ke Shih 
7041d229e88SPing-Ke Shih static const u32 iqk_adda_regs[] = {
7051d229e88SPing-Ke Shih 	0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
7061d229e88SPing-Ke Shih 	0xed0, 0xed4, 0xed8, 0xedc, 0xee0, 0xeec
7071d229e88SPing-Ke Shih };
7081d229e88SPing-Ke Shih 
7091d229e88SPing-Ke Shih static const u32 iqk_mac8_regs[] = {0x522, 0x550, 0x551};
7101d229e88SPing-Ke Shih static const u32 iqk_mac32_regs[] = {0x40};
7111d229e88SPing-Ke Shih 
7121d229e88SPing-Ke Shih static const u32 iqk_bb_regs[] = {
7131d229e88SPing-Ke Shih 	0xc04, 0xc08, 0x874, 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0xa04
7141d229e88SPing-Ke Shih };
7151d229e88SPing-Ke Shih 
7161d229e88SPing-Ke Shih #define IQK_ADDA_REG_NUM	ARRAY_SIZE(iqk_adda_regs)
7171d229e88SPing-Ke Shih #define IQK_MAC8_REG_NUM	ARRAY_SIZE(iqk_mac8_regs)
7181d229e88SPing-Ke Shih #define IQK_MAC32_REG_NUM	ARRAY_SIZE(iqk_mac32_regs)
7191d229e88SPing-Ke Shih #define IQK_BB_REG_NUM		ARRAY_SIZE(iqk_bb_regs)
7201d229e88SPing-Ke Shih 
7211d229e88SPing-Ke Shih struct iqk_backup_regs {
7221d229e88SPing-Ke Shih 	u32 adda[IQK_ADDA_REG_NUM];
7231d229e88SPing-Ke Shih 	u8 mac8[IQK_MAC8_REG_NUM];
7241d229e88SPing-Ke Shih 	u32 mac32[IQK_MAC32_REG_NUM];
7251d229e88SPing-Ke Shih 	u32 bb[IQK_BB_REG_NUM];
7261d229e88SPing-Ke Shih 
7271d229e88SPing-Ke Shih 	u32 lte_path;
7281d229e88SPing-Ke Shih 	u32 lte_gnt;
7291d229e88SPing-Ke Shih 
7301d229e88SPing-Ke Shih 	u32 bb_sel_btg;
7311d229e88SPing-Ke Shih 	u8 btg_sel;
7321d229e88SPing-Ke Shih 
7331d229e88SPing-Ke Shih 	u8 igia;
7341d229e88SPing-Ke Shih 	u8 igib;
7351d229e88SPing-Ke Shih };
7361d229e88SPing-Ke Shih 
rtw8723d_iqk_backup_regs(struct rtw_dev * rtwdev,struct iqk_backup_regs * backup)7371d229e88SPing-Ke Shih static void rtw8723d_iqk_backup_regs(struct rtw_dev *rtwdev,
7381d229e88SPing-Ke Shih 				     struct iqk_backup_regs *backup)
7391d229e88SPing-Ke Shih {
7401d229e88SPing-Ke Shih 	int i;
7411d229e88SPing-Ke Shih 
7421d229e88SPing-Ke Shih 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
7431d229e88SPing-Ke Shih 		backup->adda[i] = rtw_read32(rtwdev, iqk_adda_regs[i]);
7441d229e88SPing-Ke Shih 
7451d229e88SPing-Ke Shih 	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
7461d229e88SPing-Ke Shih 		backup->mac8[i] = rtw_read8(rtwdev, iqk_mac8_regs[i]);
7471d229e88SPing-Ke Shih 	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
7481d229e88SPing-Ke Shih 		backup->mac32[i] = rtw_read32(rtwdev, iqk_mac32_regs[i]);
7491d229e88SPing-Ke Shih 
7501d229e88SPing-Ke Shih 	for (i = 0; i < IQK_BB_REG_NUM; i++)
7511d229e88SPing-Ke Shih 		backup->bb[i] = rtw_read32(rtwdev, iqk_bb_regs[i]);
7521d229e88SPing-Ke Shih 
7531d229e88SPing-Ke Shih 	backup->igia = rtw_read32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0);
7541d229e88SPing-Ke Shih 	backup->igib = rtw_read32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0);
7551d229e88SPing-Ke Shih 
7561d229e88SPing-Ke Shih 	backup->bb_sel_btg = rtw_read32(rtwdev, REG_BB_SEL_BTG);
7571d229e88SPing-Ke Shih }
7581d229e88SPing-Ke Shih 
rtw8723d_iqk_restore_regs(struct rtw_dev * rtwdev,const struct iqk_backup_regs * backup)7591d229e88SPing-Ke Shih static void rtw8723d_iqk_restore_regs(struct rtw_dev *rtwdev,
7601d229e88SPing-Ke Shih 				      const struct iqk_backup_regs *backup)
7611d229e88SPing-Ke Shih {
7621d229e88SPing-Ke Shih 	int i;
7631d229e88SPing-Ke Shih 
7641d229e88SPing-Ke Shih 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
7651d229e88SPing-Ke Shih 		rtw_write32(rtwdev, iqk_adda_regs[i], backup->adda[i]);
7661d229e88SPing-Ke Shih 
7671d229e88SPing-Ke Shih 	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
7681d229e88SPing-Ke Shih 		rtw_write8(rtwdev, iqk_mac8_regs[i], backup->mac8[i]);
7691d229e88SPing-Ke Shih 	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
7701d229e88SPing-Ke Shih 		rtw_write32(rtwdev, iqk_mac32_regs[i], backup->mac32[i]);
7711d229e88SPing-Ke Shih 
7721d229e88SPing-Ke Shih 	for (i = 0; i < IQK_BB_REG_NUM; i++)
7731d229e88SPing-Ke Shih 		rtw_write32(rtwdev, iqk_bb_regs[i], backup->bb[i]);
7741d229e88SPing-Ke Shih 
7751d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
7761d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, backup->igia);
7771d229e88SPing-Ke Shih 
7781d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, 0x50);
7791d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, backup->igib);
7801d229e88SPing-Ke Shih 
7811d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x01008c00);
7821d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x01008c00);
7831d229e88SPing-Ke Shih }
7841d229e88SPing-Ke Shih 
rtw8723d_iqk_backup_path_ctrl(struct rtw_dev * rtwdev,struct iqk_backup_regs * backup)7851d229e88SPing-Ke Shih static void rtw8723d_iqk_backup_path_ctrl(struct rtw_dev *rtwdev,
7861d229e88SPing-Ke Shih 					  struct iqk_backup_regs *backup)
7871d229e88SPing-Ke Shih {
7881d229e88SPing-Ke Shih 	backup->btg_sel = rtw_read8(rtwdev, REG_BTG_SEL);
7891d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] original 0x67 = 0x%x\n",
7901d229e88SPing-Ke Shih 		backup->btg_sel);
7911d229e88SPing-Ke Shih }
7921d229e88SPing-Ke Shih 
rtw8723d_iqk_config_path_ctrl(struct rtw_dev * rtwdev)7931d229e88SPing-Ke Shih static void rtw8723d_iqk_config_path_ctrl(struct rtw_dev *rtwdev)
7941d229e88SPing-Ke Shih {
7951d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_PAD_CTRL1, BIT_BT_BTG_SEL, 0x1);
7961d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] set 0x67 = 0x%x\n",
7971d229e88SPing-Ke Shih 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
7981d229e88SPing-Ke Shih }
7991d229e88SPing-Ke Shih 
rtw8723d_iqk_restore_path_ctrl(struct rtw_dev * rtwdev,const struct iqk_backup_regs * backup)8001d229e88SPing-Ke Shih static void rtw8723d_iqk_restore_path_ctrl(struct rtw_dev *rtwdev,
8011d229e88SPing-Ke Shih 					   const struct iqk_backup_regs *backup)
8021d229e88SPing-Ke Shih {
8031d229e88SPing-Ke Shih 	rtw_write8(rtwdev, REG_BTG_SEL, backup->btg_sel);
8041d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] restore 0x67 = 0x%x\n",
8051d229e88SPing-Ke Shih 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
8061d229e88SPing-Ke Shih }
8071d229e88SPing-Ke Shih 
rtw8723d_iqk_backup_lte_path_gnt(struct rtw_dev * rtwdev,struct iqk_backup_regs * backup)8081d229e88SPing-Ke Shih static void rtw8723d_iqk_backup_lte_path_gnt(struct rtw_dev *rtwdev,
8091d229e88SPing-Ke Shih 					     struct iqk_backup_regs *backup)
8101d229e88SPing-Ke Shih {
8111d229e88SPing-Ke Shih 	backup->lte_path = rtw_read32(rtwdev, REG_LTECOEX_PATH_CONTROL);
8121d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0038);
8131d229e88SPing-Ke Shih 	mdelay(1);
8141d229e88SPing-Ke Shih 	backup->lte_gnt = rtw_read32(rtwdev, REG_LTECOEX_READ_DATA);
8151d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] OriginalGNT = 0x%x\n",
8161d229e88SPing-Ke Shih 		backup->lte_gnt);
8171d229e88SPing-Ke Shih }
8181d229e88SPing-Ke Shih 
rtw8723d_iqk_config_lte_path_gnt(struct rtw_dev * rtwdev)8191d229e88SPing-Ke Shih static void rtw8723d_iqk_config_lte_path_gnt(struct rtw_dev *rtwdev)
8201d229e88SPing-Ke Shih {
8211d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, 0x0000ff00);
8221d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc0020038);
8231d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_LTECOEX_PATH_CONTROL, BIT_LTE_MUX_CTRL_PATH, 0x1);
8241d229e88SPing-Ke Shih }
8251d229e88SPing-Ke Shih 
rtw8723d_iqk_restore_lte_path_gnt(struct rtw_dev * rtwdev,const struct iqk_backup_regs * bak)8261d229e88SPing-Ke Shih static void rtw8723d_iqk_restore_lte_path_gnt(struct rtw_dev *rtwdev,
8271d229e88SPing-Ke Shih 					      const struct iqk_backup_regs *bak)
8281d229e88SPing-Ke Shih {
8291d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, bak->lte_gnt);
8301d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc00f0038);
8311d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_PATH_CONTROL, bak->lte_path);
8321d229e88SPing-Ke Shih }
8331d229e88SPing-Ke Shih 
8341d229e88SPing-Ke Shih struct rtw_8723d_iqk_cfg {
8351d229e88SPing-Ke Shih 	const char *name;
8361d229e88SPing-Ke Shih 	u32 val_bb_sel_btg;
8371d229e88SPing-Ke Shih 	u32 reg_lutwe;
8381d229e88SPing-Ke Shih 	u32 val_txiqk_pi;
8391d229e88SPing-Ke Shih 	u32 reg_padlut;
8401d229e88SPing-Ke Shih 	u32 reg_gaintx;
8411d229e88SPing-Ke Shih 	u32 reg_bspad;
8421d229e88SPing-Ke Shih 	u32 val_wlint;
8431d229e88SPing-Ke Shih 	u32 val_wlsel;
8441d229e88SPing-Ke Shih 	u32 val_iqkpts;
8451d229e88SPing-Ke Shih };
8461d229e88SPing-Ke Shih 
8471d229e88SPing-Ke Shih static const struct rtw_8723d_iqk_cfg iqk_tx_cfg[PATH_NR] = {
8481d229e88SPing-Ke Shih 	[PATH_S1] = {
8491d229e88SPing-Ke Shih 		.name = "S1",
8501d229e88SPing-Ke Shih 		.val_bb_sel_btg = 0x99000000,
8511d229e88SPing-Ke Shih 		.reg_lutwe = RF_LUTWE,
8521d229e88SPing-Ke Shih 		.val_txiqk_pi = 0x8214019f,
8531d229e88SPing-Ke Shih 		.reg_padlut = RF_LUTDBG,
8541d229e88SPing-Ke Shih 		.reg_gaintx = RF_GAINTX,
8551d229e88SPing-Ke Shih 		.reg_bspad = RF_BSPAD,
8561d229e88SPing-Ke Shih 		.val_wlint = 0xe0d,
8571d229e88SPing-Ke Shih 		.val_wlsel = 0x60d,
8581d229e88SPing-Ke Shih 		.val_iqkpts = 0xfa000000,
8591d229e88SPing-Ke Shih 	},
8601d229e88SPing-Ke Shih 	[PATH_S0] = {
8611d229e88SPing-Ke Shih 		.name = "S0",
8621d229e88SPing-Ke Shih 		.val_bb_sel_btg = 0x99000280,
8631d229e88SPing-Ke Shih 		.reg_lutwe = RF_LUTWE2,
8641d229e88SPing-Ke Shih 		.val_txiqk_pi = 0x8214018a,
8651d229e88SPing-Ke Shih 		.reg_padlut = RF_TXADBG,
8661d229e88SPing-Ke Shih 		.reg_gaintx = RF_TRXIQ,
8671d229e88SPing-Ke Shih 		.reg_bspad = RF_TXATANK,
8681d229e88SPing-Ke Shih 		.val_wlint = 0xe6d,
8691d229e88SPing-Ke Shih 		.val_wlsel = 0x66d,
8701d229e88SPing-Ke Shih 		.val_iqkpts = 0xf9000000,
8711d229e88SPing-Ke Shih 	},
8721d229e88SPing-Ke Shih };
8731d229e88SPing-Ke Shih 
rtw8723d_iqk_check_tx_failed(struct rtw_dev * rtwdev,const struct rtw_8723d_iqk_cfg * iqk_cfg)8741d229e88SPing-Ke Shih static u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
8751d229e88SPing-Ke Shih 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
8761d229e88SPing-Ke Shih {
8771d229e88SPing-Ke Shih 	s32 tx_x, tx_y;
8781d229e88SPing-Ke Shih 	u32 tx_fail;
8791d229e88SPing-Ke Shih 
8801d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
8811d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_IQK_RES_RY));
8821d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
8831d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_IQK_RES_TX),
8841d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_IQK_RES_TY));
8851d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
8861d229e88SPing-Ke Shih 		"[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
8871d229e88SPing-Ke Shih 		rtw_read32(rtwdev, 0xe90),
8881d229e88SPing-Ke Shih 		rtw_read32(rtwdev, 0xe98));
8891d229e88SPing-Ke Shih 
8901d229e88SPing-Ke Shih 	tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
8911d229e88SPing-Ke Shih 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
8921d229e88SPing-Ke Shih 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
8931d229e88SPing-Ke Shih 
8941d229e88SPing-Ke Shih 	if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
8951d229e88SPing-Ke Shih 		return IQK_TX_OK;
8961d229e88SPing-Ke Shih 
8971d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s TXIQK is failed\n",
8981d229e88SPing-Ke Shih 		iqk_cfg->name);
8991d229e88SPing-Ke Shih 
9001d229e88SPing-Ke Shih 	return 0;
9011d229e88SPing-Ke Shih }
9021d229e88SPing-Ke Shih 
rtw8723d_iqk_check_rx_failed(struct rtw_dev * rtwdev,const struct rtw_8723d_iqk_cfg * iqk_cfg)9031d229e88SPing-Ke Shih static u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
9041d229e88SPing-Ke Shih 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
9051d229e88SPing-Ke Shih {
9061d229e88SPing-Ke Shih 	s32 rx_x, rx_y;
9071d229e88SPing-Ke Shih 	u32 rx_fail;
9081d229e88SPing-Ke Shih 
9091d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
9101d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_IQK_RES_RX),
9111d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_IQK_RES_RY));
9121d229e88SPing-Ke Shih 
9131d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
9141d229e88SPing-Ke Shih 		"[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
9151d229e88SPing-Ke Shih 		rtw_read32(rtwdev, 0xea0),
9161d229e88SPing-Ke Shih 		rtw_read32(rtwdev, 0xea8));
9171d229e88SPing-Ke Shih 
9181d229e88SPing-Ke Shih 	rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
9191d229e88SPing-Ke Shih 	rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
9201d229e88SPing-Ke Shih 	rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
9211d229e88SPing-Ke Shih 	rx_y = abs(iqkxy_to_s32(rx_y));
9221d229e88SPing-Ke Shih 
9231d229e88SPing-Ke Shih 	if (!rx_fail && rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
9241d229e88SPing-Ke Shih 	    rx_y < IQK_RX_Y_LMT)
9251d229e88SPing-Ke Shih 		return IQK_RX_OK;
9261d229e88SPing-Ke Shih 
9271d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s RXIQK STEP2 is failed\n",
9281d229e88SPing-Ke Shih 		iqk_cfg->name);
9291d229e88SPing-Ke Shih 
9301d229e88SPing-Ke Shih 	return 0;
9311d229e88SPing-Ke Shih }
9321d229e88SPing-Ke Shih 
rtw8723d_iqk_one_shot(struct rtw_dev * rtwdev,bool tx,const struct rtw_8723d_iqk_cfg * iqk_cfg)9331d229e88SPing-Ke Shih static void rtw8723d_iqk_one_shot(struct rtw_dev *rtwdev, bool tx,
9341d229e88SPing-Ke Shih 				  const struct rtw_8723d_iqk_cfg *iqk_cfg)
9351d229e88SPing-Ke Shih {
9361d229e88SPing-Ke Shih 	u32 pts = (tx ? iqk_cfg->val_iqkpts : 0xf9000000);
9371d229e88SPing-Ke Shih 
9381d229e88SPing-Ke Shih 	/* enter IQK mode */
9391d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
9401d229e88SPing-Ke Shih 	rtw8723d_iqk_config_lte_path_gnt(rtwdev);
9411d229e88SPing-Ke Shih 
9421d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0054);
9431d229e88SPing-Ke Shih 	mdelay(1);
9441d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] GNT_BT @%s %sIQK1 = 0x%x\n",
9451d229e88SPing-Ke Shih 		iqk_cfg->name, tx ? "TX" : "RX",
9461d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_LTECOEX_READ_DATA));
9471d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x948 @%s %sIQK1 = 0x%x\n",
9481d229e88SPing-Ke Shih 		iqk_cfg->name, tx ? "TX" : "RX",
9491d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_BB_SEL_BTG));
9501d229e88SPing-Ke Shih 
9511d229e88SPing-Ke Shih 	/* One shot, LOK & IQK */
9521d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, pts);
9531d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
9541d229e88SPing-Ke Shih 
9551d229e88SPing-Ke Shih 	if (!check_hw_ready(rtwdev, REG_IQK_RES_RY, BIT_IQK_DONE, 1))
9561d229e88SPing-Ke Shih 		rtw_warn(rtwdev, "%s %s IQK isn't done\n", iqk_cfg->name,
9571d229e88SPing-Ke Shih 			 tx ? "TX" : "RX");
9581d229e88SPing-Ke Shih }
9591d229e88SPing-Ke Shih 
rtw8723d_iqk_txrx_path_post(struct rtw_dev * rtwdev,const struct rtw_8723d_iqk_cfg * iqk_cfg,const struct iqk_backup_regs * backup)9601d229e88SPing-Ke Shih static void rtw8723d_iqk_txrx_path_post(struct rtw_dev *rtwdev,
9611d229e88SPing-Ke Shih 					const struct rtw_8723d_iqk_cfg *iqk_cfg,
9621d229e88SPing-Ke Shih 					const struct iqk_backup_regs *backup)
9631d229e88SPing-Ke Shih {
9641d229e88SPing-Ke Shih 	rtw8723d_iqk_restore_lte_path_gnt(rtwdev, backup);
9651d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
9661d229e88SPing-Ke Shih 
9671d229e88SPing-Ke Shih 	/* leave IQK mode */
9681d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
9691d229e88SPing-Ke Shih 	mdelay(1);
9701d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x0);
9711d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, BIT(0), 0x0);
9721d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, BIT(0), 0x0);
9731d229e88SPing-Ke Shih }
9741d229e88SPing-Ke Shih 
rtw8723d_iqk_tx_path(struct rtw_dev * rtwdev,const struct rtw_8723d_iqk_cfg * iqk_cfg,const struct iqk_backup_regs * backup)9751d229e88SPing-Ke Shih static u8 rtw8723d_iqk_tx_path(struct rtw_dev *rtwdev,
9761d229e88SPing-Ke Shih 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
9771d229e88SPing-Ke Shih 			       const struct iqk_backup_regs *backup)
9781d229e88SPing-Ke Shih {
9791d229e88SPing-Ke Shih 	u8 status;
9801d229e88SPing-Ke Shih 
9811d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s TXIQK!!\n", iqk_cfg->name);
9821d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s TXIQK = 0x%x\n",
9831d229e88SPing-Ke Shih 		iqk_cfg->name,
9841d229e88SPing-Ke Shih 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
9851d229e88SPing-Ke Shih 
9861d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
9871d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
9881d229e88SPing-Ke Shih 	mdelay(1);
9891d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
9901d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00004);
9911d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005d);
9921d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xBFFE0);
9931d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
9941d229e88SPing-Ke Shih 
9951d229e88SPing-Ke Shih 	/* IQK setting */
9961d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x08008c0c);
9971d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
9981d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, iqk_cfg->val_txiqk_pi);
9991d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160200);
10001d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
10011d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
10021d229e88SPing-Ke Shih 
10031d229e88SPing-Ke Shih 	/* LOK setting */
10041d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
10051d229e88SPing-Ke Shih 
10061d229e88SPing-Ke Shih 	/* PA, PAD setting */
10071d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
10081d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
10091d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x1E0, 0x3);
10101d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_RXIQGEN, 0x1F, 0xf);
10111d229e88SPing-Ke Shih 
10121d229e88SPing-Ke Shih 	/* LOK setting for 8723D */
10131d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x10, 0x1);
10141d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_bspad, 0x1, 0x1);
10151d229e88SPing-Ke Shih 
10161d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
10171d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
10181d229e88SPing-Ke Shih 
10191d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s TXIQK = 0x%x\n",
10201d229e88SPing-Ke Shih 		iqk_cfg->name,
10211d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
10221d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s TXIQK = 0x%x\n",
10231d229e88SPing-Ke Shih 		iqk_cfg->name,
10241d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
10251d229e88SPing-Ke Shih 
10261d229e88SPing-Ke Shih 	rtw8723d_iqk_one_shot(rtwdev, true, iqk_cfg);
10271d229e88SPing-Ke Shih 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
10281d229e88SPing-Ke Shih 
10291d229e88SPing-Ke Shih 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
10301d229e88SPing-Ke Shih 
10311d229e88SPing-Ke Shih 	return status;
10321d229e88SPing-Ke Shih }
10331d229e88SPing-Ke Shih 
rtw8723d_iqk_rx_path(struct rtw_dev * rtwdev,const struct rtw_8723d_iqk_cfg * iqk_cfg,const struct iqk_backup_regs * backup)10341d229e88SPing-Ke Shih static u8 rtw8723d_iqk_rx_path(struct rtw_dev *rtwdev,
10351d229e88SPing-Ke Shih 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
10361d229e88SPing-Ke Shih 			       const struct iqk_backup_regs *backup)
10371d229e88SPing-Ke Shih {
10381d229e88SPing-Ke Shih 	u32 tx_x, tx_y;
10391d229e88SPing-Ke Shih 	u8 status;
10401d229e88SPing-Ke Shih 
10411d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK Step1!!\n",
10421d229e88SPing-Ke Shih 		iqk_cfg->name);
10431d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK1 = 0x%x\n",
10441d229e88SPing-Ke Shih 		iqk_cfg->name,
10451d229e88SPing-Ke Shih 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
10461d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
10471d229e88SPing-Ke Shih 
10481d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
10491d229e88SPing-Ke Shih 
10501d229e88SPing-Ke Shih 	/* IQK setting */
10511d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
10521d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
10531d229e88SPing-Ke Shih 
10541d229e88SPing-Ke Shih 	/* path IQK setting */
10551d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
10561d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
10571d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
10581d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
10591d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82160000);
10601d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160000);
10611d229e88SPing-Ke Shih 
10621d229e88SPing-Ke Shih 	/* LOK setting */
10631d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
10641d229e88SPing-Ke Shih 
10651d229e88SPing-Ke Shih 	/* RXIQK mode */
10661d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
10671d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00006);
10681d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
10691d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xa7ffb);
10701d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
10711d229e88SPing-Ke Shih 
10721d229e88SPing-Ke Shih 	/* PA/PAD=0 */
10731d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
10741d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
10751d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
10761d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
10771d229e88SPing-Ke Shih 
10781d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1@ path %s RXIQK1 = 0x%x\n",
10791d229e88SPing-Ke Shih 		iqk_cfg->name,
10801d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
10811d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2@ path %s RXIQK1 = 0x%x\n",
10821d229e88SPing-Ke Shih 		iqk_cfg->name,
10831d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
10841d229e88SPing-Ke Shih 
10851d229e88SPing-Ke Shih 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
10861d229e88SPing-Ke Shih 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
10871d229e88SPing-Ke Shih 
10881d229e88SPing-Ke Shih 	if (!status)
10891d229e88SPing-Ke Shih 		goto restore;
10901d229e88SPing-Ke Shih 
10911d229e88SPing-Ke Shih 	/* second round */
10921d229e88SPing-Ke Shih 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
10931d229e88SPing-Ke Shih 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
10941d229e88SPing-Ke Shih 
10951d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
10961d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
10971d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_TXIQK_11N),
10981d229e88SPing-Ke Shih 		BIT_SET_TXIQK_11N(tx_x, tx_y));
10991d229e88SPing-Ke Shih 
11001d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK STEP2!!\n",
11011d229e88SPing-Ke Shih 		iqk_cfg->name);
11021d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK2 = 0x%x\n",
11031d229e88SPing-Ke Shih 		iqk_cfg->name,
11041d229e88SPing-Ke Shih 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
11051d229e88SPing-Ke Shih 
11061d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
11071d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
11081d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
11091d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
11101d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
11111d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82170000);
11121d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28171400);
11131d229e88SPing-Ke Shih 
11141d229e88SPing-Ke Shih 	/* LOK setting */
11151d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
11161d229e88SPing-Ke Shih 
11171d229e88SPing-Ke Shih 	/* RXIQK mode */
11181d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
11191d229e88SPing-Ke Shih 	mdelay(1);
11201d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x80000, 0x1);
11211d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00007);
11221d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
11231d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xb3fdb);
11241d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
11251d229e88SPing-Ke Shih 
11261d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s RXIQK2 = 0x%x\n",
11271d229e88SPing-Ke Shih 		iqk_cfg->name,
11281d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
11291d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s RXIQK2 = 0x%x\n",
11301d229e88SPing-Ke Shih 		iqk_cfg->name,
11311d229e88SPing-Ke Shih 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
11321d229e88SPing-Ke Shih 
11331d229e88SPing-Ke Shih 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
11341d229e88SPing-Ke Shih 	status |= rtw8723d_iqk_check_rx_failed(rtwdev, iqk_cfg);
11351d229e88SPing-Ke Shih 
11361d229e88SPing-Ke Shih restore:
11371d229e88SPing-Ke Shih 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
11381d229e88SPing-Ke Shih 
11391d229e88SPing-Ke Shih 	return status;
11401d229e88SPing-Ke Shih }
11411d229e88SPing-Ke Shih 
11421d229e88SPing-Ke Shih static
rtw8723d_iqk_fill_s1_matrix(struct rtw_dev * rtwdev,const s32 result[])11431d229e88SPing-Ke Shih void rtw8723d_iqk_fill_s1_matrix(struct rtw_dev *rtwdev, const s32 result[])
11441d229e88SPing-Ke Shih {
11451d229e88SPing-Ke Shih 	s32 oldval_1;
11461d229e88SPing-Ke Shih 	s32 x, y;
11471d229e88SPing-Ke Shih 	s32 tx1_a, tx1_a_ext;
11481d229e88SPing-Ke Shih 	s32 tx1_c, tx1_c_ext;
11491d229e88SPing-Ke Shih 
11501d229e88SPing-Ke Shih 	if (result[IQK_S1_TX_X] == 0)
11511d229e88SPing-Ke Shih 		return;
11521d229e88SPing-Ke Shih 
11531d229e88SPing-Ke Shih 	oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
11541d229e88SPing-Ke Shih 				   BIT_MASK_TXIQ_ELM_D);
11551d229e88SPing-Ke Shih 
11561d229e88SPing-Ke Shih 	x = iqkxy_to_s32(result[IQK_S1_TX_X]);
11571d229e88SPing-Ke Shih 	tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
11581d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
11591d229e88SPing-Ke Shih 			 BIT_MASK_TXIQ_ELM_A, tx1_a);
11601d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
11611d229e88SPing-Ke Shih 			 BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
11621d229e88SPing-Ke Shih 
11631d229e88SPing-Ke Shih 	y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
11641d229e88SPing-Ke Shih 	tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
11651d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
11661d229e88SPing-Ke Shih 			 BIT_SET_TXIQ_ELM_C1(tx1_c));
11671d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
11681d229e88SPing-Ke Shih 			 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
11691d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
11701d229e88SPing-Ke Shih 			 BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
11711d229e88SPing-Ke Shih 
11721d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
11731d229e88SPing-Ke Shih 		"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
11741d229e88SPing-Ke Shih 		x, tx1_a, oldval_1);
11751d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
11761d229e88SPing-Ke Shih 		"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
11771d229e88SPing-Ke Shih 
11781d229e88SPing-Ke Shih 	if (result[IQK_S1_RX_X] == 0)
11791d229e88SPing-Ke Shih 		return;
11801d229e88SPing-Ke Shih 
11811d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_X,
11821d229e88SPing-Ke Shih 			 result[IQK_S1_RX_X]);
11831d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_Y1,
11841d229e88SPing-Ke Shih 			 BIT_SET_RXIQ_S1_Y1(result[IQK_S1_RX_Y]));
11851d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
11861d229e88SPing-Ke Shih 			 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
11871d229e88SPing-Ke Shih }
11881d229e88SPing-Ke Shih 
11891d229e88SPing-Ke Shih static
rtw8723d_iqk_fill_s0_matrix(struct rtw_dev * rtwdev,const s32 result[])11901d229e88SPing-Ke Shih void rtw8723d_iqk_fill_s0_matrix(struct rtw_dev *rtwdev, const s32 result[])
11911d229e88SPing-Ke Shih {
11921d229e88SPing-Ke Shih 	s32 oldval_0;
11931d229e88SPing-Ke Shih 	s32 x, y;
11941d229e88SPing-Ke Shih 	s32 tx0_a, tx0_a_ext;
11951d229e88SPing-Ke Shih 	s32 tx0_c, tx0_c_ext;
11961d229e88SPing-Ke Shih 
11971d229e88SPing-Ke Shih 	if (result[IQK_S0_TX_X] == 0)
11981d229e88SPing-Ke Shih 		return;
11991d229e88SPing-Ke Shih 
12001d229e88SPing-Ke Shih 	oldval_0 = rtw_read32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0);
12011d229e88SPing-Ke Shih 
12021d229e88SPing-Ke Shih 	x = iqkxy_to_s32(result[IQK_S0_TX_X]);
12031d229e88SPing-Ke Shih 	tx0_a = iqk_mult(x, oldval_0, &tx0_a_ext);
12041d229e88SPing-Ke Shih 
12051d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, tx0_a);
12061d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, tx0_a_ext);
12071d229e88SPing-Ke Shih 
12081d229e88SPing-Ke Shih 	y = iqkxy_to_s32(result[IQK_S0_TX_Y]);
12091d229e88SPing-Ke Shih 	tx0_c = iqk_mult(y, oldval_0, &tx0_c_ext);
12101d229e88SPing-Ke Shih 
12111d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, tx0_c);
12121d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, tx0_c_ext);
12131d229e88SPing-Ke Shih 
12141d229e88SPing-Ke Shih 	if (result[IQK_S0_RX_X] == 0)
12151d229e88SPing-Ke Shih 		return;
12161d229e88SPing-Ke Shih 
12171d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_X_S0,
12181d229e88SPing-Ke Shih 			 result[IQK_S0_RX_X]);
12191d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_Y_S0,
12201d229e88SPing-Ke Shih 			 result[IQK_S0_RX_Y]);
12211d229e88SPing-Ke Shih }
12221d229e88SPing-Ke Shih 
rtw8723d_iqk_path_adda_on(struct rtw_dev * rtwdev)12231d229e88SPing-Ke Shih static void rtw8723d_iqk_path_adda_on(struct rtw_dev *rtwdev)
12241d229e88SPing-Ke Shih {
12251d229e88SPing-Ke Shih 	int i;
12261d229e88SPing-Ke Shih 
12271d229e88SPing-Ke Shih 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
12281d229e88SPing-Ke Shih 		rtw_write32(rtwdev, iqk_adda_regs[i], 0x03c00016);
12291d229e88SPing-Ke Shih }
12301d229e88SPing-Ke Shih 
rtw8723d_iqk_config_mac(struct rtw_dev * rtwdev)12311d229e88SPing-Ke Shih static void rtw8723d_iqk_config_mac(struct rtw_dev *rtwdev)
12321d229e88SPing-Ke Shih {
12331d229e88SPing-Ke Shih 	rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
12341d229e88SPing-Ke Shih }
12351d229e88SPing-Ke Shih 
12361d229e88SPing-Ke Shih static
rtw8723d_iqk_rf_standby(struct rtw_dev * rtwdev,enum rtw_rf_path path)12371d229e88SPing-Ke Shih void rtw8723d_iqk_rf_standby(struct rtw_dev *rtwdev, enum rtw_rf_path path)
12381d229e88SPing-Ke Shih {
12391d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path-%s standby mode!\n",
12401d229e88SPing-Ke Shih 		path == RF_PATH_A ? "S1" : "S0");
12411d229e88SPing-Ke Shih 
12421d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
12431d229e88SPing-Ke Shih 	mdelay(1);
12441d229e88SPing-Ke Shih 	rtw_write_rf(rtwdev, path, RF_MODE, RFREG_MASK, 0x10000);
12451d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
12461d229e88SPing-Ke Shih }
12471d229e88SPing-Ke Shih 
12481d229e88SPing-Ke Shih static
rtw8723d_iqk_similarity_cmp(struct rtw_dev * rtwdev,s32 result[][IQK_NR],u8 c1,u8 c2)12491d229e88SPing-Ke Shih bool rtw8723d_iqk_similarity_cmp(struct rtw_dev *rtwdev, s32 result[][IQK_NR],
12501d229e88SPing-Ke Shih 				 u8 c1, u8 c2)
12511d229e88SPing-Ke Shih {
12521d229e88SPing-Ke Shih 	u32 i, j, diff;
12531d229e88SPing-Ke Shih 	u32 bitmap = 0;
12541d229e88SPing-Ke Shih 	u8 candidate[PATH_NR] = {IQK_ROUND_INVALID, IQK_ROUND_INVALID};
12551d229e88SPing-Ke Shih 	bool ret = true;
12561d229e88SPing-Ke Shih 
12571d229e88SPing-Ke Shih 	s32 tmp1, tmp2;
12581d229e88SPing-Ke Shih 
12591d229e88SPing-Ke Shih 	for (i = 0; i < IQK_NR; i++) {
12601d229e88SPing-Ke Shih 		tmp1 = iqkxy_to_s32(result[c1][i]);
12611d229e88SPing-Ke Shih 		tmp2 = iqkxy_to_s32(result[c2][i]);
12621d229e88SPing-Ke Shih 
12631d229e88SPing-Ke Shih 		diff = abs(tmp1 - tmp2);
12641d229e88SPing-Ke Shih 
12651d229e88SPing-Ke Shih 		if (diff <= MAX_TOLERANCE)
12661d229e88SPing-Ke Shih 			continue;
12671d229e88SPing-Ke Shih 
12681d229e88SPing-Ke Shih 		if ((i == IQK_S1_RX_X || i == IQK_S0_RX_X) && !bitmap) {
12691d229e88SPing-Ke Shih 			if (result[c1][i] + result[c1][i + 1] == 0)
12701d229e88SPing-Ke Shih 				candidate[i / IQK_SX_NR] = c2;
12711d229e88SPing-Ke Shih 			else if (result[c2][i] + result[c2][i + 1] == 0)
12721d229e88SPing-Ke Shih 				candidate[i / IQK_SX_NR] = c1;
12731d229e88SPing-Ke Shih 			else
12741d229e88SPing-Ke Shih 				bitmap |= BIT(i);
12751d229e88SPing-Ke Shih 		} else {
12761d229e88SPing-Ke Shih 			bitmap |= BIT(i);
12771d229e88SPing-Ke Shih 		}
12781d229e88SPing-Ke Shih 	}
12791d229e88SPing-Ke Shih 
12801d229e88SPing-Ke Shih 	if (bitmap != 0)
12811d229e88SPing-Ke Shih 		goto check_sim;
12821d229e88SPing-Ke Shih 
12831d229e88SPing-Ke Shih 	for (i = 0; i < PATH_NR; i++) {
12841d229e88SPing-Ke Shih 		if (candidate[i] == IQK_ROUND_INVALID)
12851d229e88SPing-Ke Shih 			continue;
12861d229e88SPing-Ke Shih 
12871d229e88SPing-Ke Shih 		for (j = i * IQK_SX_NR; j < i * IQK_SX_NR + 2; j++)
12881d229e88SPing-Ke Shih 			result[IQK_ROUND_HYBRID][j] = result[candidate[i]][j];
12891d229e88SPing-Ke Shih 		ret = false;
12901d229e88SPing-Ke Shih 	}
12911d229e88SPing-Ke Shih 
12921d229e88SPing-Ke Shih 	return ret;
12931d229e88SPing-Ke Shih 
12941d229e88SPing-Ke Shih check_sim:
12951d229e88SPing-Ke Shih 	for (i = 0; i < IQK_NR; i++) {
12961d229e88SPing-Ke Shih 		j = i & ~1;	/* 2 bits are a pair for IQ[X, Y] */
12971d229e88SPing-Ke Shih 		if (bitmap & GENMASK(j + 1, j))
12981d229e88SPing-Ke Shih 			continue;
12991d229e88SPing-Ke Shih 
13001d229e88SPing-Ke Shih 		result[IQK_ROUND_HYBRID][i] = result[c1][i];
13011d229e88SPing-Ke Shih 	}
13021d229e88SPing-Ke Shih 
13031d229e88SPing-Ke Shih 	return false;
13041d229e88SPing-Ke Shih }
13051d229e88SPing-Ke Shih 
13061d229e88SPing-Ke Shih static
rtw8723d_iqk_precfg_path(struct rtw_dev * rtwdev,enum rtw8723d_path path)13071d229e88SPing-Ke Shih void rtw8723d_iqk_precfg_path(struct rtw_dev *rtwdev, enum rtw8723d_path path)
13081d229e88SPing-Ke Shih {
13091d229e88SPing-Ke Shih 	if (path == PATH_S0) {
13101d229e88SPing-Ke Shih 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_A);
13111d229e88SPing-Ke Shih 		rtw8723d_iqk_path_adda_on(rtwdev);
13121d229e88SPing-Ke Shih 	}
13131d229e88SPing-Ke Shih 
13141d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
13151d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
13161d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
13171d229e88SPing-Ke Shih 
13181d229e88SPing-Ke Shih 	if (path == PATH_S1) {
13191d229e88SPing-Ke Shih 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_B);
13201d229e88SPing-Ke Shih 		rtw8723d_iqk_path_adda_on(rtwdev);
13211d229e88SPing-Ke Shih 	}
13221d229e88SPing-Ke Shih }
13231d229e88SPing-Ke Shih 
13241d229e88SPing-Ke Shih static
rtw8723d_iqk_one_round(struct rtw_dev * rtwdev,s32 result[][IQK_NR],u8 t,const struct iqk_backup_regs * backup)13251d229e88SPing-Ke Shih void rtw8723d_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
13261d229e88SPing-Ke Shih 			    const struct iqk_backup_regs *backup)
13271d229e88SPing-Ke Shih {
13281d229e88SPing-Ke Shih 	u32 i;
13291d229e88SPing-Ke Shih 	u8 s1_ok, s0_ok;
13301d229e88SPing-Ke Shih 
13311d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
13321d229e88SPing-Ke Shih 		"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
13331d229e88SPing-Ke Shih 
13341d229e88SPing-Ke Shih 	rtw8723d_iqk_path_adda_on(rtwdev);
13351d229e88SPing-Ke Shih 	rtw8723d_iqk_config_mac(rtwdev);
13361d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
13371d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05611);
13381d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
13391d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204200);
13401d229e88SPing-Ke Shih 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S1);
13411d229e88SPing-Ke Shih 
13421d229e88SPing-Ke Shih 	for (i = 0; i < PATH_IQK_RETRY; i++) {
13431d229e88SPing-Ke Shih 		s1_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
13441d229e88SPing-Ke Shih 		if (s1_ok == IQK_TX_OK) {
13451d229e88SPing-Ke Shih 			rtw_dbg(rtwdev, RTW_DBG_RFK,
13461d229e88SPing-Ke Shih 				"[IQK] path S1 Tx IQK Success!!\n");
13471d229e88SPing-Ke Shih 			result[t][IQK_S1_TX_X] =
13481d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
13491d229e88SPing-Ke Shih 			result[t][IQK_S1_TX_Y] =
13501d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
13511d229e88SPing-Ke Shih 			break;
13521d229e88SPing-Ke Shih 		}
13531d229e88SPing-Ke Shih 
13541d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Tx IQK Fail!!\n");
13551d229e88SPing-Ke Shih 		result[t][IQK_S1_TX_X] = 0x100;
13561d229e88SPing-Ke Shih 		result[t][IQK_S1_TX_Y] = 0x0;
13571d229e88SPing-Ke Shih 	}
13581d229e88SPing-Ke Shih 
13591d229e88SPing-Ke Shih 	for (i = 0; i < PATH_IQK_RETRY; i++) {
13601d229e88SPing-Ke Shih 		s1_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
13611d229e88SPing-Ke Shih 		if (s1_ok == (IQK_TX_OK | IQK_RX_OK)) {
13621d229e88SPing-Ke Shih 			rtw_dbg(rtwdev, RTW_DBG_RFK,
13631d229e88SPing-Ke Shih 				"[IQK] path S1 Rx IQK Success!!\n");
13641d229e88SPing-Ke Shih 			result[t][IQK_S1_RX_X] =
13651d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
13661d229e88SPing-Ke Shih 			result[t][IQK_S1_RX_Y] =
13671d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
13681d229e88SPing-Ke Shih 			break;
13691d229e88SPing-Ke Shih 		}
13701d229e88SPing-Ke Shih 
13711d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Rx IQK Fail!!\n");
13721d229e88SPing-Ke Shih 		result[t][IQK_S1_RX_X] = 0x100;
13731d229e88SPing-Ke Shih 		result[t][IQK_S1_RX_Y] = 0x0;
13741d229e88SPing-Ke Shih 	}
13751d229e88SPing-Ke Shih 
13761d229e88SPing-Ke Shih 	if (s1_ok == 0x0)
13771d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 IQK is failed!!\n");
13781d229e88SPing-Ke Shih 
13791d229e88SPing-Ke Shih 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S0);
13801d229e88SPing-Ke Shih 
13811d229e88SPing-Ke Shih 	for (i = 0; i < PATH_IQK_RETRY; i++) {
13821d229e88SPing-Ke Shih 		s0_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
13831d229e88SPing-Ke Shih 		if (s0_ok == IQK_TX_OK) {
13841d229e88SPing-Ke Shih 			rtw_dbg(rtwdev, RTW_DBG_RFK,
13851d229e88SPing-Ke Shih 				"[IQK] path S0 Tx IQK Success!!\n");
13861d229e88SPing-Ke Shih 			result[t][IQK_S0_TX_X] =
13871d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
13881d229e88SPing-Ke Shih 			result[t][IQK_S0_TX_Y] =
13891d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
13901d229e88SPing-Ke Shih 			break;
13911d229e88SPing-Ke Shih 		}
13921d229e88SPing-Ke Shih 
13931d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Tx IQK Fail!!\n");
13941d229e88SPing-Ke Shih 		result[t][IQK_S0_TX_X] = 0x100;
13951d229e88SPing-Ke Shih 		result[t][IQK_S0_TX_Y] = 0x0;
13961d229e88SPing-Ke Shih 	}
13971d229e88SPing-Ke Shih 
13981d229e88SPing-Ke Shih 	for (i = 0; i < PATH_IQK_RETRY; i++) {
13991d229e88SPing-Ke Shih 		s0_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
14001d229e88SPing-Ke Shih 		if (s0_ok == (IQK_TX_OK | IQK_RX_OK)) {
14011d229e88SPing-Ke Shih 			rtw_dbg(rtwdev, RTW_DBG_RFK,
14021d229e88SPing-Ke Shih 				"[IQK] path S0 Rx IQK Success!!\n");
14031d229e88SPing-Ke Shih 
14041d229e88SPing-Ke Shih 			result[t][IQK_S0_RX_X] =
14051d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
14061d229e88SPing-Ke Shih 			result[t][IQK_S0_RX_Y] =
14071d229e88SPing-Ke Shih 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
14081d229e88SPing-Ke Shih 			break;
14091d229e88SPing-Ke Shih 		}
14101d229e88SPing-Ke Shih 
14111d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Rx IQK Fail!!\n");
14121d229e88SPing-Ke Shih 		result[t][IQK_S0_RX_X] = 0x100;
14131d229e88SPing-Ke Shih 		result[t][IQK_S0_RX_Y] = 0x0;
14141d229e88SPing-Ke Shih 	}
14151d229e88SPing-Ke Shih 
14161d229e88SPing-Ke Shih 	if (s0_ok == 0x0)
14171d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 IQK is failed!!\n");
14181d229e88SPing-Ke Shih 
14191d229e88SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
14201d229e88SPing-Ke Shih 	mdelay(1);
14211d229e88SPing-Ke Shih 
14221d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
14231d229e88SPing-Ke Shih 		"[IQK] back to BB mode, load original value!\n");
14241d229e88SPing-Ke Shih }
14251d229e88SPing-Ke Shih 
rtw8723d_phy_calibration(struct rtw_dev * rtwdev)14261d229e88SPing-Ke Shih static void rtw8723d_phy_calibration(struct rtw_dev *rtwdev)
14271d229e88SPing-Ke Shih {
14281d229e88SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
14291d229e88SPing-Ke Shih 	s32 result[IQK_ROUND_SIZE][IQK_NR];
14301d229e88SPing-Ke Shih 	struct iqk_backup_regs backup;
14311d229e88SPing-Ke Shih 	u8 i, j;
14321d229e88SPing-Ke Shih 	u8 final_candidate = IQK_ROUND_INVALID;
14331d229e88SPing-Ke Shih 	bool good;
14341d229e88SPing-Ke Shih 
14351d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!!!\n");
14361d229e88SPing-Ke Shih 
14371d229e88SPing-Ke Shih 	memset(result, 0, sizeof(result));
14381d229e88SPing-Ke Shih 
14391d229e88SPing-Ke Shih 	rtw8723d_iqk_backup_path_ctrl(rtwdev, &backup);
14401d229e88SPing-Ke Shih 	rtw8723d_iqk_backup_lte_path_gnt(rtwdev, &backup);
14411d229e88SPing-Ke Shih 	rtw8723d_iqk_backup_regs(rtwdev, &backup);
14421d229e88SPing-Ke Shih 
14431d229e88SPing-Ke Shih 	for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
14441d229e88SPing-Ke Shih 		rtw8723d_iqk_config_path_ctrl(rtwdev);
14451d229e88SPing-Ke Shih 		rtw8723d_iqk_config_lte_path_gnt(rtwdev);
14461d229e88SPing-Ke Shih 
14471d229e88SPing-Ke Shih 		rtw8723d_iqk_one_round(rtwdev, result, i, &backup);
14481d229e88SPing-Ke Shih 
14491d229e88SPing-Ke Shih 		if (i > IQK_ROUND_0)
14501d229e88SPing-Ke Shih 			rtw8723d_iqk_restore_regs(rtwdev, &backup);
14511d229e88SPing-Ke Shih 		rtw8723d_iqk_restore_lte_path_gnt(rtwdev, &backup);
14521d229e88SPing-Ke Shih 		rtw8723d_iqk_restore_path_ctrl(rtwdev, &backup);
14531d229e88SPing-Ke Shih 
14541d229e88SPing-Ke Shih 		for (j = IQK_ROUND_0; j < i; j++) {
14551d229e88SPing-Ke Shih 			good = rtw8723d_iqk_similarity_cmp(rtwdev, result, j, i);
14561d229e88SPing-Ke Shih 
14571d229e88SPing-Ke Shih 			if (good) {
14581d229e88SPing-Ke Shih 				final_candidate = j;
14591d229e88SPing-Ke Shih 				rtw_dbg(rtwdev, RTW_DBG_RFK,
14601d229e88SPing-Ke Shih 					"[IQK] cmp %d:%d final_candidate is %x\n",
14611d229e88SPing-Ke Shih 					j, i, final_candidate);
14621d229e88SPing-Ke Shih 				goto iqk_done;
14631d229e88SPing-Ke Shih 			}
14641d229e88SPing-Ke Shih 		}
14651d229e88SPing-Ke Shih 	}
14661d229e88SPing-Ke Shih 
14671d229e88SPing-Ke Shih 	if (final_candidate == IQK_ROUND_INVALID) {
14681d229e88SPing-Ke Shih 		s32 reg_tmp = 0;
14691d229e88SPing-Ke Shih 
14701d229e88SPing-Ke Shih 		for (i = 0; i < IQK_NR; i++)
14711d229e88SPing-Ke Shih 			reg_tmp += result[IQK_ROUND_HYBRID][i];
14721d229e88SPing-Ke Shih 
14731d229e88SPing-Ke Shih 		if (reg_tmp != 0) {
14741d229e88SPing-Ke Shih 			final_candidate = IQK_ROUND_HYBRID;
14751d229e88SPing-Ke Shih 		} else {
14761d229e88SPing-Ke Shih 			WARN(1, "IQK is failed\n");
14771d229e88SPing-Ke Shih 			goto out;
14781d229e88SPing-Ke Shih 		}
14791d229e88SPing-Ke Shih 	}
14801d229e88SPing-Ke Shih 
14811d229e88SPing-Ke Shih iqk_done:
14821d229e88SPing-Ke Shih 	rtw8723d_iqk_fill_s1_matrix(rtwdev, result[final_candidate]);
14831d229e88SPing-Ke Shih 	rtw8723d_iqk_fill_s0_matrix(rtwdev, result[final_candidate]);
14841d229e88SPing-Ke Shih 
14851d229e88SPing-Ke Shih 	dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
14861d229e88SPing-Ke Shih 	dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
14871d229e88SPing-Ke Shih 	dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
14881d229e88SPing-Ke Shih 	dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
14891d229e88SPing-Ke Shih 	dm_info->iqk.done = true;
14901d229e88SPing-Ke Shih 
14911d229e88SPing-Ke Shih out:
14921d229e88SPing-Ke Shih 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
14931d229e88SPing-Ke Shih 
14941d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
14951d229e88SPing-Ke Shih 		final_candidate);
14961d229e88SPing-Ke Shih 
14971d229e88SPing-Ke Shih 	for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
14981d229e88SPing-Ke Shih 		rtw_dbg(rtwdev, RTW_DBG_RFK,
14991d229e88SPing-Ke Shih 			"[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",
15001d229e88SPing-Ke Shih 			i,
15011d229e88SPing-Ke Shih 			result[i][0], result[i][1], result[i][2], result[i][3],
15021d229e88SPing-Ke Shih 			result[i][4], result[i][5], result[i][6], result[i][7],
15031d229e88SPing-Ke Shih 			final_candidate == i ? "(final candidate)" : "");
15041d229e88SPing-Ke Shih 
15051d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
15061d229e88SPing-Ke Shih 		"[IQK]0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
15071d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
15081d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
15091d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_A_RXIQI),
15101d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
15111d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK,
15121d229e88SPing-Ke Shih 		"[IQK]0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
15131d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_TXIQ_AB_S0),
15141d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_TXIQ_CD_S0),
15151d229e88SPing-Ke Shih 		rtw_read32(rtwdev, REG_RXIQ_AB_S0));
15161d229e88SPing-Ke Shih 
15171d229e88SPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] finished\n");
15181d229e88SPing-Ke Shih }
15191d229e88SPing-Ke Shih 
rtw8723d_phy_cck_pd_set(struct rtw_dev * rtwdev,u8 new_lvl)15208f0cb24cSPing-Ke Shih static void rtw8723d_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
15218f0cb24cSPing-Ke Shih {
15228f0cb24cSPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
15238f0cb24cSPing-Ke Shih 	u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
1524760bb2abSPing-Ke Shih 	u8 cck_n_rx;
1525760bb2abSPing-Ke Shih 
1526760bb2abSPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
1527760bb2abSPing-Ke Shih 		dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
15288f0cb24cSPing-Ke Shih 
15298f0cb24cSPing-Ke Shih 	if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
15308f0cb24cSPing-Ke Shih 		return;
15318f0cb24cSPing-Ke Shih 
1532760bb2abSPing-Ke Shih 	cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
1533760bb2abSPing-Ke Shih 		    rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
1534760bb2abSPing-Ke Shih 	rtw_dbg(rtwdev, RTW_DBG_PHY,
1535760bb2abSPing-Ke Shih 		"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
1536760bb2abSPing-Ke Shih 		rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
1537760bb2abSPing-Ke Shih 		dm_info->cck_pd_default + new_lvl * 2,
1538760bb2abSPing-Ke Shih 		pd[new_lvl], dm_info->cck_fa_avg);
1539760bb2abSPing-Ke Shih 
15408f0cb24cSPing-Ke Shih 	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
15418f0cb24cSPing-Ke Shih 
15428f0cb24cSPing-Ke Shih 	dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
15438f0cb24cSPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
15448f0cb24cSPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
15458f0cb24cSPing-Ke Shih 			 dm_info->cck_pd_default + new_lvl * 2);
15468f0cb24cSPing-Ke Shih }
15478f0cb24cSPing-Ke Shih 
1548d1391c49SPing-Ke Shih /* for coex */
rtw8723d_coex_cfg_init(struct rtw_dev * rtwdev)1549d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_init(struct rtw_dev *rtwdev)
1550d1391c49SPing-Ke Shih {
1551d1391c49SPing-Ke Shih 	/* enable TBTT nterrupt */
1552d1391c49SPing-Ke Shih 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1553d1391c49SPing-Ke Shih 
1554d1391c49SPing-Ke Shih 	/* BT report packet sample rate	 */
1555d1391c49SPing-Ke Shih 	/* 0x790[5:0]=0x5 */
15563f3fef5fSChing-Te Ku 	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
1557d1391c49SPing-Ke Shih 
1558d1391c49SPing-Ke Shih 	/* enable BT counter statistics */
1559d1391c49SPing-Ke Shih 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1560d1391c49SPing-Ke Shih 
1561d1391c49SPing-Ke Shih 	/* enable PTA (3-wire function form BT side) */
1562d1391c49SPing-Ke Shih 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
15633f3fef5fSChing-Te Ku 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
1564d1391c49SPing-Ke Shih 
1565d1391c49SPing-Ke Shih 	/* enable PTA (tx/rx signal form WiFi side) */
1566d1391c49SPing-Ke Shih 	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1567d1391c49SPing-Ke Shih }
1568d1391c49SPing-Ke Shih 
rtw8723d_coex_cfg_gnt_fix(struct rtw_dev * rtwdev)1569d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1570d1391c49SPing-Ke Shih {
1571d1391c49SPing-Ke Shih }
1572d1391c49SPing-Ke Shih 
rtw8723d_coex_cfg_gnt_debug(struct rtw_dev * rtwdev)1573d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1574d1391c49SPing-Ke Shih {
1575d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_LEDCFG2, BIT(6), 0);
1576d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(0), 0);
1577d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_GPIO_INTM + 2, BIT(4), 0);
1578d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT(1), 0);
1579d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(1), 0);
1580d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT(7), 0);
1581d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_SYS_CLKR + 1, BIT(1), 0);
1582d1391c49SPing-Ke Shih 	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT(3), 0);
1583d1391c49SPing-Ke Shih }
1584d1391c49SPing-Ke Shih 
rtw8723d_coex_cfg_rfe_type(struct rtw_dev * rtwdev)1585d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1586d1391c49SPing-Ke Shih {
1587d1391c49SPing-Ke Shih 	struct rtw_efuse *efuse = &rtwdev->efuse;
1588d1391c49SPing-Ke Shih 	struct rtw_coex *coex = &rtwdev->coex;
1589d1391c49SPing-Ke Shih 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1590d1391c49SPing-Ke Shih 	bool aux = efuse->bt_setting & BIT(6);
1591d1391c49SPing-Ke Shih 
1592d1391c49SPing-Ke Shih 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1593d1391c49SPing-Ke Shih 	coex_rfe->ant_switch_polarity = 0;
1594d1391c49SPing-Ke Shih 	coex_rfe->ant_switch_exist = false;
1595d1391c49SPing-Ke Shih 	coex_rfe->ant_switch_with_bt = false;
1596d1391c49SPing-Ke Shih 	coex_rfe->ant_switch_diversity = false;
1597d1391c49SPing-Ke Shih 	coex_rfe->wlg_at_btg = true;
1598d1391c49SPing-Ke Shih 
1599d1391c49SPing-Ke Shih 	/* decide antenna at main or aux */
1600d1391c49SPing-Ke Shih 	if (efuse->share_ant) {
1601d1391c49SPing-Ke Shih 		if (aux)
1602d1391c49SPing-Ke Shih 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x80);
1603d1391c49SPing-Ke Shih 		else
1604d1391c49SPing-Ke Shih 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x200);
1605d1391c49SPing-Ke Shih 	} else {
1606d1391c49SPing-Ke Shih 		if (aux)
1607d1391c49SPing-Ke Shih 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x280);
1608d1391c49SPing-Ke Shih 		else
1609d1391c49SPing-Ke Shih 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x0);
1610d1391c49SPing-Ke Shih 	}
1611d1391c49SPing-Ke Shih 
1612d1391c49SPing-Ke Shih 	/* disable LTE coex in wifi side */
1613d1391c49SPing-Ke Shih 	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
1614d1391c49SPing-Ke Shih 	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1615d1391c49SPing-Ke Shih 	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1616d1391c49SPing-Ke Shih }
1617d1391c49SPing-Ke Shih 
rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev * rtwdev,u8 wl_pwr)1618d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1619d1391c49SPing-Ke Shih {
1620d1391c49SPing-Ke Shih 	struct rtw_coex *coex = &rtwdev->coex;
1621d1391c49SPing-Ke Shih 	struct rtw_coex_dm *coex_dm = &coex->dm;
1622d1391c49SPing-Ke Shih 	static const u8	wl_tx_power[] = {0xb2, 0x90};
1623d1391c49SPing-Ke Shih 	u8 pwr;
1624d1391c49SPing-Ke Shih 
1625d1391c49SPing-Ke Shih 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1626d1391c49SPing-Ke Shih 		return;
1627d1391c49SPing-Ke Shih 
1628d1391c49SPing-Ke Shih 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
1629d1391c49SPing-Ke Shih 
1630d1391c49SPing-Ke Shih 	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1631d1391c49SPing-Ke Shih 		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1632d1391c49SPing-Ke Shih 
1633d1391c49SPing-Ke Shih 	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1634d1391c49SPing-Ke Shih 
1635d1391c49SPing-Ke Shih 	rtw_write8(rtwdev, REG_ANA_PARAM1 + 3, pwr);
1636d1391c49SPing-Ke Shih }
1637d1391c49SPing-Ke Shih 
rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev * rtwdev,bool low_gain)1638d1391c49SPing-Ke Shih static void rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1639d1391c49SPing-Ke Shih {
1640d1391c49SPing-Ke Shih 	struct rtw_coex *coex = &rtwdev->coex;
1641d1391c49SPing-Ke Shih 	struct rtw_coex_dm *coex_dm = &coex->dm;
1642d1391c49SPing-Ke Shih 	/* WL Rx Low gain on */
1643d1391c49SPing-Ke Shih 	static const u32 wl_rx_low_gain_on[] = {
1644d1391c49SPing-Ke Shih 		0xec120101, 0xeb130101, 0xce140101, 0xcd150101, 0xcc160101,
1645d1391c49SPing-Ke Shih 		0xcb170101, 0xca180101, 0x8d190101, 0x8c1a0101, 0x8b1b0101,
1646d1391c49SPing-Ke Shih 		0x4f1c0101, 0x4e1d0101, 0x4d1e0101, 0x4c1f0101, 0x0e200101,
1647d1391c49SPing-Ke Shih 		0x0d210101, 0x0c220101, 0x0b230101, 0xcf240001, 0xce250001,
1648d1391c49SPing-Ke Shih 		0xcd260001, 0xcc270001, 0x8f280001
1649d1391c49SPing-Ke Shih 	};
1650d1391c49SPing-Ke Shih 	/* WL Rx Low gain off */
1651d1391c49SPing-Ke Shih 	static const u32 wl_rx_low_gain_off[] = {
1652d1391c49SPing-Ke Shih 		0xec120101, 0xeb130101, 0xea140101, 0xe9150101, 0xe8160101,
1653d1391c49SPing-Ke Shih 		0xe7170101, 0xe6180101, 0xe5190101, 0xe41a0101, 0xe31b0101,
1654d1391c49SPing-Ke Shih 		0xe21c0101, 0xe11d0101, 0xe01e0101, 0x861f0101, 0x85200101,
1655d1391c49SPing-Ke Shih 		0x84210101, 0x83220101, 0x82230101, 0x81240101, 0x80250101,
1656d1391c49SPing-Ke Shih 		0x44260101, 0x43270101, 0x42280101
1657d1391c49SPing-Ke Shih 	};
1658d1391c49SPing-Ke Shih 	u8 i;
1659d1391c49SPing-Ke Shih 
1660d1391c49SPing-Ke Shih 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1661d1391c49SPing-Ke Shih 		return;
1662d1391c49SPing-Ke Shih 
1663d1391c49SPing-Ke Shih 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
1664d1391c49SPing-Ke Shih 
1665d1391c49SPing-Ke Shih 	if (coex_dm->cur_wl_rx_low_gain_en) {
1666d1391c49SPing-Ke Shih 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1667d1391c49SPing-Ke Shih 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_on[i]);
1668d1391c49SPing-Ke Shih 	} else {
1669d1391c49SPing-Ke Shih 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1670d1391c49SPing-Ke Shih 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_off[i]);
1671d1391c49SPing-Ke Shih 	}
1672d1391c49SPing-Ke Shih }
1673d1391c49SPing-Ke Shih 
rtw8723d_pwrtrack_get_limit_ofdm(struct rtw_dev * rtwdev)1674608d2a08SPing-Ke Shih static u8 rtw8723d_pwrtrack_get_limit_ofdm(struct rtw_dev *rtwdev)
1675608d2a08SPing-Ke Shih {
1676608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1677608d2a08SPing-Ke Shih 	u8 tx_rate = dm_info->tx_rate;
1678608d2a08SPing-Ke Shih 	u8 limit_ofdm = 30;
1679608d2a08SPing-Ke Shih 
1680608d2a08SPing-Ke Shih 	switch (tx_rate) {
1681608d2a08SPing-Ke Shih 	case DESC_RATE1M...DESC_RATE5_5M:
1682608d2a08SPing-Ke Shih 	case DESC_RATE11M:
1683608d2a08SPing-Ke Shih 		break;
1684608d2a08SPing-Ke Shih 	case DESC_RATE6M...DESC_RATE48M:
1685608d2a08SPing-Ke Shih 		limit_ofdm = 36;
1686608d2a08SPing-Ke Shih 		break;
1687608d2a08SPing-Ke Shih 	case DESC_RATE54M:
1688608d2a08SPing-Ke Shih 		limit_ofdm = 34;
1689608d2a08SPing-Ke Shih 		break;
1690608d2a08SPing-Ke Shih 	case DESC_RATEMCS0...DESC_RATEMCS2:
1691608d2a08SPing-Ke Shih 		limit_ofdm = 38;
1692608d2a08SPing-Ke Shih 		break;
1693608d2a08SPing-Ke Shih 	case DESC_RATEMCS3...DESC_RATEMCS4:
1694608d2a08SPing-Ke Shih 		limit_ofdm = 36;
1695608d2a08SPing-Ke Shih 		break;
1696608d2a08SPing-Ke Shih 	case DESC_RATEMCS5...DESC_RATEMCS7:
1697608d2a08SPing-Ke Shih 		limit_ofdm = 34;
1698608d2a08SPing-Ke Shih 		break;
1699608d2a08SPing-Ke Shih 	default:
1700608d2a08SPing-Ke Shih 		rtw_warn(rtwdev, "pwrtrack unhandled tx_rate 0x%x\n", tx_rate);
1701608d2a08SPing-Ke Shih 		break;
1702608d2a08SPing-Ke Shih 	}
1703608d2a08SPing-Ke Shih 
1704608d2a08SPing-Ke Shih 	return limit_ofdm;
1705608d2a08SPing-Ke Shih }
1706608d2a08SPing-Ke Shih 
rtw8723d_set_iqk_matrix_by_result(struct rtw_dev * rtwdev,u32 ofdm_swing,u8 rf_path)1707608d2a08SPing-Ke Shih static void rtw8723d_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
1708608d2a08SPing-Ke Shih 					      u32 ofdm_swing, u8 rf_path)
1709608d2a08SPing-Ke Shih {
1710608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1711608d2a08SPing-Ke Shih 	s32 ele_A, ele_D, ele_C;
1712608d2a08SPing-Ke Shih 	s32 ele_A_ext, ele_C_ext, ele_D_ext;
1713608d2a08SPing-Ke Shih 	s32 iqk_result_x;
1714608d2a08SPing-Ke Shih 	s32 iqk_result_y;
1715608d2a08SPing-Ke Shih 	s32 value32;
1716608d2a08SPing-Ke Shih 
1717608d2a08SPing-Ke Shih 	switch (rf_path) {
1718608d2a08SPing-Ke Shih 	default:
1719608d2a08SPing-Ke Shih 	case RF_PATH_A:
1720608d2a08SPing-Ke Shih 		iqk_result_x = dm_info->iqk.result.s1_x;
1721608d2a08SPing-Ke Shih 		iqk_result_y = dm_info->iqk.result.s1_y;
1722608d2a08SPing-Ke Shih 		break;
1723608d2a08SPing-Ke Shih 	case RF_PATH_B:
1724608d2a08SPing-Ke Shih 		iqk_result_x = dm_info->iqk.result.s0_x;
1725608d2a08SPing-Ke Shih 		iqk_result_y = dm_info->iqk.result.s0_y;
1726608d2a08SPing-Ke Shih 		break;
1727608d2a08SPing-Ke Shih 	}
1728608d2a08SPing-Ke Shih 
1729608d2a08SPing-Ke Shih 	/* new element D */
1730608d2a08SPing-Ke Shih 	ele_D = OFDM_SWING_D(ofdm_swing);
1731608d2a08SPing-Ke Shih 	iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
1732608d2a08SPing-Ke Shih 	/* new element A */
1733608d2a08SPing-Ke Shih 	iqk_result_x = iqkxy_to_s32(iqk_result_x);
1734608d2a08SPing-Ke Shih 	ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
1735608d2a08SPing-Ke Shih 	/* new element C */
1736608d2a08SPing-Ke Shih 	iqk_result_y = iqkxy_to_s32(iqk_result_y);
1737608d2a08SPing-Ke Shih 	ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
1738608d2a08SPing-Ke Shih 
1739608d2a08SPing-Ke Shih 	switch (rf_path) {
1740608d2a08SPing-Ke Shih 	case RF_PATH_A:
1741608d2a08SPing-Ke Shih 	default:
1742608d2a08SPing-Ke Shih 		/* write new elements A, C, D, and element B is always 0 */
1743608d2a08SPing-Ke Shih 		value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
1744608d2a08SPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
1745608d2a08SPing-Ke Shih 		value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
1746608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1747608d2a08SPing-Ke Shih 				 value32);
1748608d2a08SPing-Ke Shih 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1749608d2a08SPing-Ke Shih 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1750608d2a08SPing-Ke Shih 		value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
1751608d2a08SPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1752608d2a08SPing-Ke Shih 		break;
1753608d2a08SPing-Ke Shih 
1754608d2a08SPing-Ke Shih 	case RF_PATH_B:
1755608d2a08SPing-Ke Shih 		/* write new elements A, C, D, and element B is always 0 */
1756608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0, ele_D);
1757608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, ele_C);
1758608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, ele_A);
1759608d2a08SPing-Ke Shih 
1760608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0,
1761608d2a08SPing-Ke Shih 				 ele_D_ext);
1762608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0,
1763608d2a08SPing-Ke Shih 				 ele_A_ext);
1764608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0,
1765608d2a08SPing-Ke Shih 				 ele_C_ext);
1766608d2a08SPing-Ke Shih 		break;
1767608d2a08SPing-Ke Shih 	}
1768608d2a08SPing-Ke Shih }
1769608d2a08SPing-Ke Shih 
rtw8723d_set_iqk_matrix(struct rtw_dev * rtwdev,s8 ofdm_index,u8 rf_path)1770608d2a08SPing-Ke Shih static void rtw8723d_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
1771608d2a08SPing-Ke Shih 				    u8 rf_path)
1772608d2a08SPing-Ke Shih {
1773608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1774608d2a08SPing-Ke Shih 	s32 value32;
1775608d2a08SPing-Ke Shih 	u32 ofdm_swing;
1776608d2a08SPing-Ke Shih 
1777608d2a08SPing-Ke Shih 	if (ofdm_index >= RTW_OFDM_SWING_TABLE_SIZE)
1778608d2a08SPing-Ke Shih 		ofdm_index = RTW_OFDM_SWING_TABLE_SIZE - 1;
1779608d2a08SPing-Ke Shih 	else if (ofdm_index < 0)
1780608d2a08SPing-Ke Shih 		ofdm_index = 0;
1781608d2a08SPing-Ke Shih 
1782608d2a08SPing-Ke Shih 	ofdm_swing = rtw8723d_ofdm_swing_table[ofdm_index];
1783608d2a08SPing-Ke Shih 
1784608d2a08SPing-Ke Shih 	if (dm_info->iqk.done) {
1785608d2a08SPing-Ke Shih 		rtw8723d_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
1786608d2a08SPing-Ke Shih 		return;
1787608d2a08SPing-Ke Shih 	}
1788608d2a08SPing-Ke Shih 
1789608d2a08SPing-Ke Shih 	switch (rf_path) {
1790608d2a08SPing-Ke Shih 	case RF_PATH_A:
1791608d2a08SPing-Ke Shih 	default:
1792608d2a08SPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
1793608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1794608d2a08SPing-Ke Shih 				 0x00);
1795608d2a08SPing-Ke Shih 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1796608d2a08SPing-Ke Shih 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1797608d2a08SPing-Ke Shih 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1798608d2a08SPing-Ke Shih 		break;
1799608d2a08SPing-Ke Shih 
1800608d2a08SPing-Ke Shih 	case RF_PATH_B:
1801608d2a08SPing-Ke Shih 		/* image S1:c80 to S0:Cd0 and Cd4 */
1802608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0,
1803608d2a08SPing-Ke Shih 				 OFDM_SWING_A(ofdm_swing));
1804608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_B_S0,
1805608d2a08SPing-Ke Shih 				 OFDM_SWING_B(ofdm_swing));
1806608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0,
1807608d2a08SPing-Ke Shih 				 OFDM_SWING_C(ofdm_swing));
1808608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0,
1809608d2a08SPing-Ke Shih 				 OFDM_SWING_D(ofdm_swing));
1810608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0, 0x0);
1811608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, 0x0);
1812608d2a08SPing-Ke Shih 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, 0x0);
1813608d2a08SPing-Ke Shih 		break;
1814608d2a08SPing-Ke Shih 	}
1815608d2a08SPing-Ke Shih }
1816608d2a08SPing-Ke Shih 
rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev * rtwdev,s8 swing_idx,s8 txagc_idx)1817608d2a08SPing-Ke Shih static void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1818608d2a08SPing-Ke Shih 					   s8 txagc_idx)
1819608d2a08SPing-Ke Shih {
1820608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1821608d2a08SPing-Ke Shih 
1822608d2a08SPing-Ke Shih 	dm_info->txagc_remnant_ofdm = txagc_idx;
1823608d2a08SPing-Ke Shih 
1824608d2a08SPing-Ke Shih 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
1825608d2a08SPing-Ke Shih 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
1826608d2a08SPing-Ke Shih }
1827608d2a08SPing-Ke Shih 
rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev * rtwdev,s8 swing_idx,s8 txagc_idx)1828608d2a08SPing-Ke Shih static void rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1829608d2a08SPing-Ke Shih 					  s8 txagc_idx)
1830608d2a08SPing-Ke Shih {
1831608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1832608d2a08SPing-Ke Shih 
1833608d2a08SPing-Ke Shih 	dm_info->txagc_remnant_cck = txagc_idx;
1834608d2a08SPing-Ke Shih 
1835608d2a08SPing-Ke Shih 	rtw_write32_mask(rtwdev, 0xab4, 0x000007FF,
1836608d2a08SPing-Ke Shih 			 rtw8723d_cck_swing_table[swing_idx]);
1837608d2a08SPing-Ke Shih }
1838608d2a08SPing-Ke Shih 
rtw8723d_pwrtrack_set(struct rtw_dev * rtwdev,u8 path)1839608d2a08SPing-Ke Shih static void rtw8723d_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1840608d2a08SPing-Ke Shih {
1841608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1842608d2a08SPing-Ke Shih 	struct rtw_hal *hal = &rtwdev->hal;
1843608d2a08SPing-Ke Shih 	u8 limit_ofdm;
1844608d2a08SPing-Ke Shih 	u8 limit_cck = 40;
1845608d2a08SPing-Ke Shih 	s8 final_ofdm_swing_index;
1846608d2a08SPing-Ke Shih 	s8 final_cck_swing_index;
1847608d2a08SPing-Ke Shih 
1848608d2a08SPing-Ke Shih 	limit_ofdm = rtw8723d_pwrtrack_get_limit_ofdm(rtwdev);
1849608d2a08SPing-Ke Shih 
1850608d2a08SPing-Ke Shih 	final_ofdm_swing_index = RTW_DEF_OFDM_SWING_INDEX +
1851608d2a08SPing-Ke Shih 				 dm_info->delta_power_index[path];
1852608d2a08SPing-Ke Shih 	final_cck_swing_index = RTW_DEF_CCK_SWING_INDEX +
1853608d2a08SPing-Ke Shih 				dm_info->delta_power_index[path];
1854608d2a08SPing-Ke Shih 
1855608d2a08SPing-Ke Shih 	if (final_ofdm_swing_index > limit_ofdm)
1856608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
1857608d2a08SPing-Ke Shih 					       final_ofdm_swing_index - limit_ofdm);
1858608d2a08SPing-Ke Shih 	else if (final_ofdm_swing_index < 0)
1859608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, 0,
1860608d2a08SPing-Ke Shih 					       final_ofdm_swing_index);
1861608d2a08SPing-Ke Shih 	else
1862608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
1863608d2a08SPing-Ke Shih 
1864608d2a08SPing-Ke Shih 	if (final_cck_swing_index > limit_cck)
1865608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
1866608d2a08SPing-Ke Shih 					      final_cck_swing_index - limit_cck);
1867608d2a08SPing-Ke Shih 	else if (final_cck_swing_index < 0)
1868608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, 0,
1869608d2a08SPing-Ke Shih 					      final_cck_swing_index);
1870608d2a08SPing-Ke Shih 	else
1871608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
1872608d2a08SPing-Ke Shih 
1873608d2a08SPing-Ke Shih 	rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
1874608d2a08SPing-Ke Shih }
1875608d2a08SPing-Ke Shih 
rtw8723d_pwrtrack_set_xtal(struct rtw_dev * rtwdev,u8 therm_path,u8 delta)1876608d2a08SPing-Ke Shih static void rtw8723d_pwrtrack_set_xtal(struct rtw_dev *rtwdev, u8 therm_path,
1877608d2a08SPing-Ke Shih 				       u8 delta)
1878608d2a08SPing-Ke Shih {
1879608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1880608d2a08SPing-Ke Shih 	const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
1881608d2a08SPing-Ke Shih 	const s8 *pwrtrk_xtal;
1882608d2a08SPing-Ke Shih 	s8 xtal_cap;
1883608d2a08SPing-Ke Shih 
1884608d2a08SPing-Ke Shih 	if (dm_info->thermal_avg[therm_path] >
1885608d2a08SPing-Ke Shih 	    rtwdev->efuse.thermal_meter[therm_path])
1886608d2a08SPing-Ke Shih 		pwrtrk_xtal = tbl->pwrtrk_xtal_p;
1887608d2a08SPing-Ke Shih 	else
1888608d2a08SPing-Ke Shih 		pwrtrk_xtal = tbl->pwrtrk_xtal_n;
1889608d2a08SPing-Ke Shih 
1890608d2a08SPing-Ke Shih 	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
1891608d2a08SPing-Ke Shih 	xtal_cap = clamp_t(s8, xtal_cap + pwrtrk_xtal[delta], 0, 0x3F);
1892608d2a08SPing-Ke Shih 	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
1893608d2a08SPing-Ke Shih 			 xtal_cap | (xtal_cap << 6));
1894608d2a08SPing-Ke Shih }
1895608d2a08SPing-Ke Shih 
rtw8723d_phy_pwrtrack(struct rtw_dev * rtwdev)1896608d2a08SPing-Ke Shih static void rtw8723d_phy_pwrtrack(struct rtw_dev *rtwdev)
1897608d2a08SPing-Ke Shih {
1898608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1899608d2a08SPing-Ke Shih 	struct rtw_swing_table swing_table;
1900608d2a08SPing-Ke Shih 	u8 thermal_value, delta, path;
1901608d2a08SPing-Ke Shih 	bool do_iqk = false;
1902608d2a08SPing-Ke Shih 
1903608d2a08SPing-Ke Shih 	rtw_phy_config_swing_table(rtwdev, &swing_table);
1904608d2a08SPing-Ke Shih 
1905608d2a08SPing-Ke Shih 	if (rtwdev->efuse.thermal_meter[0] == 0xff)
1906608d2a08SPing-Ke Shih 		return;
1907608d2a08SPing-Ke Shih 
1908608d2a08SPing-Ke Shih 	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1909608d2a08SPing-Ke Shih 
1910608d2a08SPing-Ke Shih 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1911608d2a08SPing-Ke Shih 
1912608d2a08SPing-Ke Shih 	do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
1913608d2a08SPing-Ke Shih 
1914608d2a08SPing-Ke Shih 	if (do_iqk)
1915608d2a08SPing-Ke Shih 		rtw8723d_lck(rtwdev);
1916608d2a08SPing-Ke Shih 
1917608d2a08SPing-Ke Shih 	if (dm_info->pwr_trk_init_trigger)
1918608d2a08SPing-Ke Shih 		dm_info->pwr_trk_init_trigger = false;
1919608d2a08SPing-Ke Shih 	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1920608d2a08SPing-Ke Shih 						   RF_PATH_A))
1921608d2a08SPing-Ke Shih 		goto iqk;
1922608d2a08SPing-Ke Shih 
1923608d2a08SPing-Ke Shih 	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1924608d2a08SPing-Ke Shih 
1925608d2a08SPing-Ke Shih 	delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
1926608d2a08SPing-Ke Shih 
1927608d2a08SPing-Ke Shih 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1928608d2a08SPing-Ke Shih 		s8 delta_cur, delta_last;
1929608d2a08SPing-Ke Shih 
1930608d2a08SPing-Ke Shih 		delta_last = dm_info->delta_power_index[path];
1931608d2a08SPing-Ke Shih 		delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
1932608d2a08SPing-Ke Shih 							path, RF_PATH_A, delta);
1933608d2a08SPing-Ke Shih 		if (delta_last == delta_cur)
1934608d2a08SPing-Ke Shih 			continue;
1935608d2a08SPing-Ke Shih 
1936608d2a08SPing-Ke Shih 		dm_info->delta_power_index[path] = delta_cur;
1937608d2a08SPing-Ke Shih 		rtw8723d_pwrtrack_set(rtwdev, path);
1938608d2a08SPing-Ke Shih 	}
1939608d2a08SPing-Ke Shih 
1940608d2a08SPing-Ke Shih 	rtw8723d_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
1941608d2a08SPing-Ke Shih 
1942608d2a08SPing-Ke Shih iqk:
1943608d2a08SPing-Ke Shih 	if (do_iqk)
1944608d2a08SPing-Ke Shih 		rtw8723d_phy_calibration(rtwdev);
1945608d2a08SPing-Ke Shih }
1946608d2a08SPing-Ke Shih 
rtw8723d_pwr_track(struct rtw_dev * rtwdev)19470c440238SYan-Hsuan Chuang static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
1948608d2a08SPing-Ke Shih {
1949608d2a08SPing-Ke Shih 	struct rtw_efuse *efuse = &rtwdev->efuse;
1950608d2a08SPing-Ke Shih 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1951608d2a08SPing-Ke Shih 
1952608d2a08SPing-Ke Shih 	if (efuse->power_track_type != 0)
1953608d2a08SPing-Ke Shih 		return;
1954608d2a08SPing-Ke Shih 
1955608d2a08SPing-Ke Shih 	if (!dm_info->pwr_trk_triggered) {
1956608d2a08SPing-Ke Shih 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1957608d2a08SPing-Ke Shih 			     GENMASK(17, 16), 0x03);
1958608d2a08SPing-Ke Shih 		dm_info->pwr_trk_triggered = true;
1959608d2a08SPing-Ke Shih 		return;
1960608d2a08SPing-Ke Shih 	}
1961608d2a08SPing-Ke Shih 
1962608d2a08SPing-Ke Shih 	rtw8723d_phy_pwrtrack(rtwdev);
1963608d2a08SPing-Ke Shih 	dm_info->pwr_trk_triggered = false;
1964608d2a08SPing-Ke Shih }
1965608d2a08SPing-Ke Shih 
rtw8723d_fill_txdesc_checksum(struct rtw_dev * rtwdev,struct rtw_tx_pkt_info * pkt_info,u8 * txdesc)196687caeef0SSascha Hauer static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev,
196787caeef0SSascha Hauer 					  struct rtw_tx_pkt_info *pkt_info,
196887caeef0SSascha Hauer 					  u8 *txdesc)
196987caeef0SSascha Hauer {
197087caeef0SSascha Hauer 	size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
197187caeef0SSascha Hauer 	__le16 chksum = 0;
197287caeef0SSascha Hauer 	__le16 *data = (__le16 *)(txdesc);
1973*88b9d8e6SPo-Hao Huang 	struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)txdesc;
197487caeef0SSascha Hauer 
1975*88b9d8e6SPo-Hao Huang 	le32p_replace_bits(&tx_desc->w7, 0, RTW_TX_DESC_W7_TXDESC_CHECKSUM);
197687caeef0SSascha Hauer 
197787caeef0SSascha Hauer 	while (words--)
197887caeef0SSascha Hauer 		chksum ^= *data++;
197987caeef0SSascha Hauer 
198087caeef0SSascha Hauer 	chksum = ~chksum;
198187caeef0SSascha Hauer 
1982*88b9d8e6SPo-Hao Huang 	le32p_replace_bits(&tx_desc->w7, __le16_to_cpu(chksum),
1983*88b9d8e6SPo-Hao Huang 			   RTW_TX_DESC_W7_TXDESC_CHECKSUM);
198487caeef0SSascha Hauer }
198587caeef0SSascha Hauer 
1986811853daSPing-Ke Shih static struct rtw_chip_ops rtw8723d_ops = {
198775e69fb1SPing-Ke Shih 	.phy_set_param		= rtw8723d_phy_set_param,
1988ab0a031eSPing-Ke Shih 	.read_efuse		= rtw8723d_read_efuse,
1989158441a2SPing-Ke Shih 	.query_rx_desc		= rtw8723d_query_rx_desc,
19905f028a9cSPing-Ke Shih 	.set_channel		= rtw8723d_set_channel,
199175e69fb1SPing-Ke Shih 	.mac_init		= rtw8723d_mac_init,
199205202746SPing-Ke Shih 	.shutdown		= rtw8723d_shutdown,
1993e0c27cdbSPing-Ke Shih 	.read_rf		= rtw_phy_read_rf_sipi,
1994e0c27cdbSPing-Ke Shih 	.write_rf		= rtw_phy_write_rf_reg_sipi,
1995ba9f0d1bSPing-Ke Shih 	.set_tx_power_index	= rtw8723d_set_tx_power_index,
1996811853daSPing-Ke Shih 	.set_antenna		= NULL,
19971afb5eb7SPing-Ke Shih 	.cfg_ldo25		= rtw8723d_cfg_ldo25,
199844baa97cSPing-Ke Shih 	.efuse_grant		= rtw8723d_efuse_grant,
1999439d4a97SPing-Ke Shih 	.false_alarm_statistics	= rtw8723d_false_alarm_statistics,
20001d229e88SPing-Ke Shih 	.phy_calibration	= rtw8723d_phy_calibration,
20018f0cb24cSPing-Ke Shih 	.cck_pd_set		= rtw8723d_phy_cck_pd_set,
2002608d2a08SPing-Ke Shih 	.pwr_track		= rtw8723d_pwr_track,
200393ae973fSPing-Ke Shih 	.config_bfee		= NULL,
200493ae973fSPing-Ke Shih 	.set_gid_table		= NULL,
200593ae973fSPing-Ke Shih 	.cfg_csi_rate		= NULL,
200687caeef0SSascha Hauer 	.fill_txdesc_checksum	= rtw8723d_fill_txdesc_checksum,
2007d1391c49SPing-Ke Shih 
2008d1391c49SPing-Ke Shih 	.coex_set_init		= rtw8723d_coex_cfg_init,
2009d1391c49SPing-Ke Shih 	.coex_set_ant_switch	= NULL,
2010d1391c49SPing-Ke Shih 	.coex_set_gnt_fix	= rtw8723d_coex_cfg_gnt_fix,
2011d1391c49SPing-Ke Shih 	.coex_set_gnt_debug	= rtw8723d_coex_cfg_gnt_debug,
2012d1391c49SPing-Ke Shih 	.coex_set_rfe_type	= rtw8723d_coex_cfg_rfe_type,
2013d1391c49SPing-Ke Shih 	.coex_set_wl_tx_power	= rtw8723d_coex_cfg_wl_tx_power,
2014d1391c49SPing-Ke Shih 	.coex_set_wl_rx_gain	= rtw8723d_coex_cfg_wl_rx_gain,
2015d1391c49SPing-Ke Shih };
2016d1391c49SPing-Ke Shih 
2017d1391c49SPing-Ke Shih /* Shared-Antenna Coex Table */
2018d1391c49SPing-Ke Shih static const struct coex_table_para table_sant_8723d[] = {
2019d1391c49SPing-Ke Shih 	{0xffffffff, 0xffffffff}, /* case-0 */
2020d1391c49SPing-Ke Shih 	{0x55555555, 0x55555555},
202119ecd61dSChing-Te Ku 	{0x66555555, 0x66555555},
2022d1391c49SPing-Ke Shih 	{0xaaaaaaaa, 0xaaaaaaaa},
2023d1391c49SPing-Ke Shih 	{0x5a5a5a5a, 0x5a5a5a5a},
2024d1391c49SPing-Ke Shih 	{0xfafafafa, 0xfafafafa}, /* case-5 */
202519ecd61dSChing-Te Ku 	{0x6a5a5555, 0xaaaaaaaa},
202619ecd61dSChing-Te Ku 	{0x6a5a56aa, 0x6a5a56aa},
2027d1391c49SPing-Ke Shih 	{0x6a5a5a5a, 0x6a5a5a5a},
2028001a3c90SZong-Zhe Yang 	{0x66555555, 0x5a5a5a5a},
202919ecd61dSChing-Te Ku 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
203019ecd61dSChing-Te Ku 	{0x66555555, 0x6a5a5aaa},
2031001a3c90SZong-Zhe Yang 	{0x66555555, 0x5a5a5aaa},
203219ecd61dSChing-Te Ku 	{0x66555555, 0x6aaa5aaa},
203319ecd61dSChing-Te Ku 	{0x66555555, 0xaaaa5aaa},
2034001a3c90SZong-Zhe Yang 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
2035d1391c49SPing-Ke Shih 	{0xffff55ff, 0xfafafafa},
2036d1391c49SPing-Ke Shih 	{0xffff55ff, 0x6afa5afa},
2037d1391c49SPing-Ke Shih 	{0xaaffffaa, 0xfafafafa},
2038d1391c49SPing-Ke Shih 	{0xaa5555aa, 0x5a5a5a5a},
2039d1391c49SPing-Ke Shih 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
2040d1391c49SPing-Ke Shih 	{0xaa5555aa, 0xaaaaaaaa},
2041d1391c49SPing-Ke Shih 	{0xffffffff, 0x5a5a5a5a},
204219ecd61dSChing-Te Ku 	{0xffffffff, 0x5a5a5a5a},
2043d1391c49SPing-Ke Shih 	{0xffffffff, 0x55555555},
204419ecd61dSChing-Te Ku 	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
2045d1391c49SPing-Ke Shih 	{0x55555555, 0x5a5a5a5a},
2046d1391c49SPing-Ke Shih 	{0x55555555, 0xaaaaaaaa},
204719ecd61dSChing-Te Ku 	{0x55555555, 0x6a5a6a5a},
204819ecd61dSChing-Te Ku 	{0x66556655, 0x66556655},
2049842280daSChing-Te Ku 	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
2050842280daSChing-Te Ku 	{0xffffffff, 0x5aaa5aaa},
2051842280daSChing-Te Ku 	{0x56555555, 0x5a5a5aaa},
2052d1391c49SPing-Ke Shih };
2053d1391c49SPing-Ke Shih 
2054d1391c49SPing-Ke Shih /* Non-Shared-Antenna Coex Table */
2055d1391c49SPing-Ke Shih static const struct coex_table_para table_nsant_8723d[] = {
2056d1391c49SPing-Ke Shih 	{0xffffffff, 0xffffffff}, /* case-100 */
2057d1391c49SPing-Ke Shih 	{0x55555555, 0x55555555},
205819ecd61dSChing-Te Ku 	{0x66555555, 0x66555555},
2059d1391c49SPing-Ke Shih 	{0xaaaaaaaa, 0xaaaaaaaa},
2060d1391c49SPing-Ke Shih 	{0x5a5a5a5a, 0x5a5a5a5a},
2061d1391c49SPing-Ke Shih 	{0xfafafafa, 0xfafafafa}, /* case-105 */
2062d1391c49SPing-Ke Shih 	{0x5afa5afa, 0x5afa5afa},
2063d1391c49SPing-Ke Shih 	{0x55555555, 0xfafafafa},
206419ecd61dSChing-Te Ku 	{0x66555555, 0xfafafafa},
206519ecd61dSChing-Te Ku 	{0x66555555, 0x5a5a5a5a},
206619ecd61dSChing-Te Ku 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
206719ecd61dSChing-Te Ku 	{0x66555555, 0xaaaaaaaa},
2068d1391c49SPing-Ke Shih 	{0xffff55ff, 0xfafafafa},
2069d1391c49SPing-Ke Shih 	{0xffff55ff, 0x5afa5afa},
2070d1391c49SPing-Ke Shih 	{0xffff55ff, 0xaaaaaaaa},
207119ecd61dSChing-Te Ku 	{0xffff55ff, 0xffff55ff}, /* case-115 */
2072d1391c49SPing-Ke Shih 	{0xaaffffaa, 0x5afa5afa},
2073d1391c49SPing-Ke Shih 	{0xaaffffaa, 0xaaaaaaaa},
2074d1391c49SPing-Ke Shih 	{0xffffffff, 0xfafafafa},
2075d1391c49SPing-Ke Shih 	{0xffffffff, 0x5afa5afa},
2076d1391c49SPing-Ke Shih 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
2077d1391c49SPing-Ke Shih 	{0x55ff55ff, 0x5afa5afa},
2078d1391c49SPing-Ke Shih 	{0x55ff55ff, 0xaaaaaaaa},
2079d1391c49SPing-Ke Shih 	{0x55ff55ff, 0x55ff55ff}
2080d1391c49SPing-Ke Shih };
2081d1391c49SPing-Ke Shih 
2082d1391c49SPing-Ke Shih /* Shared-Antenna TDMA */
2083d1391c49SPing-Ke Shih static const struct coex_tdma_para tdma_sant_8723d[] = {
208419ecd61dSChing-Te Ku 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
2085d1391c49SPing-Ke Shih 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
2086d1391c49SPing-Ke Shih 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
2087d1391c49SPing-Ke Shih 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
208819ecd61dSChing-Te Ku 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
2089d1391c49SPing-Ke Shih 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
209019ecd61dSChing-Te Ku 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
2091d1391c49SPing-Ke Shih 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
2092d1391c49SPing-Ke Shih 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
2093d1391c49SPing-Ke Shih 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
2094d1391c49SPing-Ke Shih 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
209519ecd61dSChing-Te Ku 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
2096d1391c49SPing-Ke Shih 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
209719ecd61dSChing-Te Ku 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
209819ecd61dSChing-Te Ku 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
209919ecd61dSChing-Te Ku 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
2100d1391c49SPing-Ke Shih 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
2101d1391c49SPing-Ke Shih 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
2102d1391c49SPing-Ke Shih 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
2103d1391c49SPing-Ke Shih 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
210419ecd61dSChing-Te Ku 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
2105d1391c49SPing-Ke Shih 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
2106d1391c49SPing-Ke Shih 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
2107d1391c49SPing-Ke Shih 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
210819ecd61dSChing-Te Ku 	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
2109001a3c90SZong-Zhe Yang 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
2110001a3c90SZong-Zhe Yang 	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
2111001a3c90SZong-Zhe Yang 	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
2112d1391c49SPing-Ke Shih };
2113d1391c49SPing-Ke Shih 
2114d1391c49SPing-Ke Shih /* Non-Shared-Antenna TDMA */
2115d1391c49SPing-Ke Shih static const struct coex_tdma_para tdma_nsant_8723d[] = {
211619ecd61dSChing-Te Ku 	{ {0x00, 0x00, 0x00, 0x00, 0x01} }, /* case-100 */
2117d1391c49SPing-Ke Shih 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
2118d1391c49SPing-Ke Shih 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
2119d1391c49SPing-Ke Shih 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
2120d1391c49SPing-Ke Shih 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
2121d1391c49SPing-Ke Shih 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
2122d1391c49SPing-Ke Shih 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
2123d1391c49SPing-Ke Shih 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
2124d1391c49SPing-Ke Shih 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
2125d1391c49SPing-Ke Shih 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
2126d1391c49SPing-Ke Shih 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
2127d1391c49SPing-Ke Shih 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
2128d1391c49SPing-Ke Shih 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
2129d1391c49SPing-Ke Shih 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
2130d1391c49SPing-Ke Shih 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
2131d1391c49SPing-Ke Shih 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
2132d1391c49SPing-Ke Shih 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
2133d1391c49SPing-Ke Shih 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
2134d1391c49SPing-Ke Shih 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
2135d1391c49SPing-Ke Shih 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
21362647d282SPing-Ke Shih 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
213719ecd61dSChing-Te Ku 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
2138d1391c49SPing-Ke Shih };
2139d1391c49SPing-Ke Shih 
2140d1391c49SPing-Ke Shih /* rssi in percentage % (dbm = % - 100) */
2141d1391c49SPing-Ke Shih static const u8 wl_rssi_step_8723d[] = {60, 50, 44, 30};
2142d1391c49SPing-Ke Shih static const u8 bt_rssi_step_8723d[] = {30, 30, 30, 30};
2143d1391c49SPing-Ke Shih static const struct coex_5g_afh_map afh_5g_8723d[] = { {0, 0, 0} };
2144d1391c49SPing-Ke Shih 
2145efad6611SPing-Ke Shih static const struct rtw_hw_reg btg_reg_8723d = {
2146efad6611SPing-Ke Shih 	.addr = REG_BTG_SEL, .mask = BIT_MASK_BTG_WL,
2147efad6611SPing-Ke Shih };
2148efad6611SPing-Ke Shih 
2149d1391c49SPing-Ke Shih /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
2150d1391c49SPing-Ke Shih static const struct coex_rf_para rf_para_tx_8723d[] = {
2151d1391c49SPing-Ke Shih 	{0, 0, false, 7},  /* for normal */
2152d1391c49SPing-Ke Shih 	{0, 10, false, 7}, /* for WL-CPT */
2153d1391c49SPing-Ke Shih 	{1, 0, true, 4},
2154d1391c49SPing-Ke Shih 	{1, 2, true, 4},
2155d1391c49SPing-Ke Shih 	{1, 10, true, 4},
2156d1391c49SPing-Ke Shih 	{1, 15, true, 4}
2157d1391c49SPing-Ke Shih };
2158d1391c49SPing-Ke Shih 
2159d1391c49SPing-Ke Shih static const struct coex_rf_para rf_para_rx_8723d[] = {
2160d1391c49SPing-Ke Shih 	{0, 0, false, 7},  /* for normal */
2161d1391c49SPing-Ke Shih 	{0, 10, false, 7}, /* for WL-CPT */
2162d1391c49SPing-Ke Shih 	{1, 0, true, 5},
2163d1391c49SPing-Ke Shih 	{1, 2, true, 5},
2164d1391c49SPing-Ke Shih 	{1, 10, true, 5},
2165d1391c49SPing-Ke Shih 	{1, 15, true, 5}
2166811853daSPing-Ke Shih };
2167811853daSPing-Ke Shih 
2168c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8723d[] = {
2169c57bd7c3SPing-Ke Shih 	{0x0005,
2170c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2171c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2172c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2173c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
2174dba5a189SYan-Hsuan Chuang 	{0x0086,
2175dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2176dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2177dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_SDIO,
2178dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2179dba5a189SYan-Hsuan Chuang 	{0x0086,
2180dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2181dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2182dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_SDIO,
2183dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
2184c57bd7c3SPing-Ke Shih 	{0x004A,
2185c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2186c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK,
2187c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2188c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2189c57bd7c3SPing-Ke Shih 	{0x0005,
2190c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2191c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2192c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2193c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
2194dba5a189SYan-Hsuan Chuang 	{0x0023,
2195dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2196dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2197dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_MAC,
2198dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
2199c57bd7c3SPing-Ke Shih 	{0x0301,
2200c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2201c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2202c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2203c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
2204c57bd7c3SPing-Ke Shih 	{0xFFFF,
2205c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2206c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2207c57bd7c3SPing-Ke Shih 	 0,
2208c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2209c57bd7c3SPing-Ke Shih };
2210c57bd7c3SPing-Ke Shih 
2211c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
2212c57bd7c3SPing-Ke Shih 	{0x0020,
2213c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2214c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2215c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2216c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2217c57bd7c3SPing-Ke Shih 	{0x0001,
2218c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2219c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2220c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2221c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
2222c57bd7c3SPing-Ke Shih 	{0x0000,
2223c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2224c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2225c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2226c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
2227c57bd7c3SPing-Ke Shih 	{0x0005,
2228c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2229c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2230c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2231c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
2232c57bd7c3SPing-Ke Shih 	{0x0075,
2233c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2234c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2235c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2236c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2237c57bd7c3SPing-Ke Shih 	{0x0006,
2238c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2239c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2240c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2241c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
2242c57bd7c3SPing-Ke Shih 	{0x0075,
2243c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2244c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2245c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2246c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2247c57bd7c3SPing-Ke Shih 	{0x0006,
2248c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2249c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2250c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2251c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2252c57bd7c3SPing-Ke Shih 	{0x0005,
2253c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2254c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2255c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2256c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, (BIT(1) | BIT(0)), 0},
2257c57bd7c3SPing-Ke Shih 	{0x0005,
2258c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2259c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2260c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2261c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
2262c57bd7c3SPing-Ke Shih 	{0x0005,
2263c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2264c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2265c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2266c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
2267c57bd7c3SPing-Ke Shih 	{0x0005,
2268c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2269c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2270c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2271c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2272c57bd7c3SPing-Ke Shih 	{0x0005,
2273c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2274c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2275c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2276c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
2277c57bd7c3SPing-Ke Shih 	{0x0010,
2278c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2279c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2280c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2281c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
2282c57bd7c3SPing-Ke Shih 	{0x0049,
2283c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2284c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2285c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2286c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2287c57bd7c3SPing-Ke Shih 	{0x0063,
2288c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2289c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2290c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2291c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2292c57bd7c3SPing-Ke Shih 	{0x0062,
2293c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2294c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2295c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2296c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2297c57bd7c3SPing-Ke Shih 	{0x0058,
2298c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2299c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2300c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2301c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2302c57bd7c3SPing-Ke Shih 	{0x005A,
2303c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2304c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2305c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2306c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2307c57bd7c3SPing-Ke Shih 	{0x0068,
2308c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_TEST_MSK,
2309c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2310c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2311c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
2312c57bd7c3SPing-Ke Shih 	{0x0069,
2313c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2314c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2315c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2316c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
2317c57bd7c3SPing-Ke Shih 	{0x001f,
2318c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2319c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2320c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2321c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2322c57bd7c3SPing-Ke Shih 	{0x0077,
2323c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2324c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2325c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2326c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2327c57bd7c3SPing-Ke Shih 	{0x001f,
2328c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2329c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2330c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2331c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
2332c57bd7c3SPing-Ke Shih 	{0x0077,
2333c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2334c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2335c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2336c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
2337c57bd7c3SPing-Ke Shih 	{0xFFFF,
2338c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2339c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2340c57bd7c3SPing-Ke Shih 	 0,
2341c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2342c57bd7c3SPing-Ke Shih };
2343c57bd7c3SPing-Ke Shih 
2344c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
2345c57bd7c3SPing-Ke Shih 	trans_carddis_to_cardemu_8723d,
2346c57bd7c3SPing-Ke Shih 	trans_cardemu_to_act_8723d,
2347c57bd7c3SPing-Ke Shih 	NULL
2348c57bd7c3SPing-Ke Shih };
2349c57bd7c3SPing-Ke Shih 
2350c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_act_to_lps_8723d[] = {
2351c57bd7c3SPing-Ke Shih 	{0x0301,
2352c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2353c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2354c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2355c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
2356c57bd7c3SPing-Ke Shih 	{0x0522,
2357c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2358c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2359c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2360c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
2361c57bd7c3SPing-Ke Shih 	{0x05F8,
2362c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2363c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2364c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2365c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2366c57bd7c3SPing-Ke Shih 	{0x05F9,
2367c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2368c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2369c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2370c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2371c57bd7c3SPing-Ke Shih 	{0x05FA,
2372c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2373c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2374c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2375c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2376c57bd7c3SPing-Ke Shih 	{0x05FB,
2377c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2378c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2379c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2380c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2381c57bd7c3SPing-Ke Shih 	{0x0002,
2382c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2383c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2384c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2385c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2386c57bd7c3SPing-Ke Shih 	{0x0002,
2387c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2388c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2389c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2390c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
2391c57bd7c3SPing-Ke Shih 	{0x0002,
2392c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2393c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2394c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2395c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2396c57bd7c3SPing-Ke Shih 	{0x0100,
2397c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2398c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2399c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2400c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x03},
2401c57bd7c3SPing-Ke Shih 	{0x0101,
2402c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2403c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2404c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2405c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2406dba5a189SYan-Hsuan Chuang 	{0x0093,
2407dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2408dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2409dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_MAC,
2410dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2411c57bd7c3SPing-Ke Shih 	{0x0553,
2412c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2413c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2414c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2415c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
2416c57bd7c3SPing-Ke Shih 	{0xFFFF,
2417c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2418c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2419c57bd7c3SPing-Ke Shih 	 0,
2420c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2421c57bd7c3SPing-Ke Shih };
2422c57bd7c3SPing-Ke Shih 
2423c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_act_to_pre_carddis_8723d[] = {
2424c57bd7c3SPing-Ke Shih 	{0x0003,
2425c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2426c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2427c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2428c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
2429c57bd7c3SPing-Ke Shih 	{0x0080,
2430c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2431c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2432c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2433c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
2434c57bd7c3SPing-Ke Shih 	{0xFFFF,
2435c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2436c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2437c57bd7c3SPing-Ke Shih 	 0,
2438c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2439c57bd7c3SPing-Ke Shih };
2440c57bd7c3SPing-Ke Shih 
2441c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8723d[] = {
2442c57bd7c3SPing-Ke Shih 	{0x0002,
2443c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2444c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2445c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2446c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2447c57bd7c3SPing-Ke Shih 	{0x0049,
2448c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2449c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2450c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2451c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2452c57bd7c3SPing-Ke Shih 	{0x0006,
2453c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2454c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2455c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2456c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2457c57bd7c3SPing-Ke Shih 	{0x0005,
2458c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2459c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2460c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2461c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2462c57bd7c3SPing-Ke Shih 	{0x0005,
2463c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2464c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2465c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2466c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
2467c57bd7c3SPing-Ke Shih 	{0x0010,
2468c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2469c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2470c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2471c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(6), 0},
2472c57bd7c3SPing-Ke Shih 	{0x0000,
2473c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2474c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2475c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2476c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
2477c57bd7c3SPing-Ke Shih 	{0x0020,
2478c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2479c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2480c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2481c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2482c57bd7c3SPing-Ke Shih 	{0xFFFF,
2483c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2484c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2485c57bd7c3SPing-Ke Shih 	 0,
2486c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2487c57bd7c3SPing-Ke Shih };
2488c57bd7c3SPing-Ke Shih 
2489c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8723d[] = {
2490dba5a189SYan-Hsuan Chuang 	{0x0007,
2491dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2492dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2493dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_MAC,
2494dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
2495c57bd7c3SPing-Ke Shih 	{0x0005,
2496c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2497c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2498c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2499c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
2500c57bd7c3SPing-Ke Shih 	{0x0005,
2501c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2502c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2503c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2504c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
2505c57bd7c3SPing-Ke Shih 	{0x0005,
2506c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2507c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_PCI_MSK,
2508c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2509c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},
2510c57bd7c3SPing-Ke Shih 	{0x004A,
2511c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2512c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_USB_MSK,
2513c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2514c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 1},
2515dba5a189SYan-Hsuan Chuang 	{0x0023,
2516dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2517dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2518dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_MAC,
2519dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
2520dba5a189SYan-Hsuan Chuang 	{0x0086,
2521dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2522dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2523dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_SDIO,
2524dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2525dba5a189SYan-Hsuan Chuang 	{0x0086,
2526dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CUT_ALL_MSK,
2527dba5a189SYan-Hsuan Chuang 	 RTW_PWR_INTF_SDIO_MSK,
2528dba5a189SYan-Hsuan Chuang 	 RTW_PWR_ADDR_SDIO,
2529dba5a189SYan-Hsuan Chuang 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
2530c57bd7c3SPing-Ke Shih 	{0xFFFF,
2531c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2532c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2533c57bd7c3SPing-Ke Shih 	 0,
2534c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2535c57bd7c3SPing-Ke Shih };
2536c57bd7c3SPing-Ke Shih 
2537c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
2538c57bd7c3SPing-Ke Shih 	{0x001D,
2539c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2540c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2541c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2542c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2543c57bd7c3SPing-Ke Shih 	{0x001D,
2544c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2545c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2546c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2547c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2548c57bd7c3SPing-Ke Shih 	{0x001C,
2549c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2550c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2551c57bd7c3SPing-Ke Shih 	 RTW_PWR_ADDR_MAC,
2552c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_WRITE, 0xFF, 0x0E},
2553c57bd7c3SPing-Ke Shih 	{0xFFFF,
2554c57bd7c3SPing-Ke Shih 	 RTW_PWR_CUT_ALL_MSK,
2555c57bd7c3SPing-Ke Shih 	 RTW_PWR_INTF_ALL_MSK,
2556c57bd7c3SPing-Ke Shih 	 0,
2557c57bd7c3SPing-Ke Shih 	 RTW_PWR_CMD_END, 0, 0},
2558c57bd7c3SPing-Ke Shih };
2559c57bd7c3SPing-Ke Shih 
2560c57bd7c3SPing-Ke Shih static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
2561c57bd7c3SPing-Ke Shih 	trans_act_to_lps_8723d,
2562c57bd7c3SPing-Ke Shih 	trans_act_to_pre_carddis_8723d,
2563c57bd7c3SPing-Ke Shih 	trans_act_to_cardemu_8723d,
2564c57bd7c3SPing-Ke Shih 	trans_cardemu_to_carddis_8723d,
2565c57bd7c3SPing-Ke Shih 	trans_act_to_post_carddis_8723d,
2566c57bd7c3SPing-Ke Shih 	NULL
2567c57bd7c3SPing-Ke Shih };
2568c57bd7c3SPing-Ke Shih 
2569d91277deSPing-Ke Shih static const struct rtw_page_table page_table_8723d[] = {
2570d91277deSPing-Ke Shih 	{12, 2, 2, 0, 1},
2571d91277deSPing-Ke Shih 	{12, 2, 2, 0, 1},
2572d91277deSPing-Ke Shih 	{12, 2, 2, 0, 1},
2573d91277deSPing-Ke Shih 	{12, 2, 2, 0, 1},
2574d91277deSPing-Ke Shih 	{12, 2, 2, 0, 1},
2575d91277deSPing-Ke Shih };
2576d91277deSPing-Ke Shih 
2577d91277deSPing-Ke Shih static const struct rtw_rqpn rqpn_table_8723d[] = {
2578d91277deSPing-Ke Shih 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2579d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2580d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2581d91277deSPing-Ke Shih 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2582d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2583d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2584d91277deSPing-Ke Shih 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2585d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
2586d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2587d91277deSPing-Ke Shih 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2588d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2589d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2590d91277deSPing-Ke Shih 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2591d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2592d91277deSPing-Ke Shih 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2593d91277deSPing-Ke Shih };
2594d91277deSPing-Ke Shih 
25957d754f97SPing-Ke Shih static const struct rtw_prioq_addrs prioq_addrs_8723d = {
25967d754f97SPing-Ke Shih 	.prio[RTW_DMA_MAPPING_EXTRA] = {
25977d754f97SPing-Ke Shih 		.rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
25987d754f97SPing-Ke Shih 	},
25997d754f97SPing-Ke Shih 	.prio[RTW_DMA_MAPPING_LOW] = {
26007d754f97SPing-Ke Shih 		.rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
26017d754f97SPing-Ke Shih 	},
26027d754f97SPing-Ke Shih 	.prio[RTW_DMA_MAPPING_NORMAL] = {
26037d754f97SPing-Ke Shih 		.rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
26047d754f97SPing-Ke Shih 	},
26057d754f97SPing-Ke Shih 	.prio[RTW_DMA_MAPPING_HIGH] = {
26067d754f97SPing-Ke Shih 		.rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
26077d754f97SPing-Ke Shih 	},
26087d754f97SPing-Ke Shih 	.wsize = false,
26097d754f97SPing-Ke Shih };
26107d754f97SPing-Ke Shih 
261117579404SPing-Ke Shih static const struct rtw_intf_phy_para pcie_gen1_param_8723d[] = {
261217579404SPing-Ke Shih 	{0x0008, 0x4a22,
261317579404SPing-Ke Shih 	 RTW_IP_SEL_PHY,
261417579404SPing-Ke Shih 	 RTW_INTF_PHY_CUT_ALL,
261517579404SPing-Ke Shih 	 RTW_INTF_PHY_PLATFORM_ALL},
261617579404SPing-Ke Shih 	{0x0009, 0x1000,
261717579404SPing-Ke Shih 	 RTW_IP_SEL_PHY,
261817579404SPing-Ke Shih 	 ~(RTW_INTF_PHY_CUT_A | RTW_INTF_PHY_CUT_B),
261917579404SPing-Ke Shih 	 RTW_INTF_PHY_PLATFORM_ALL},
262017579404SPing-Ke Shih 	{0xFFFF, 0x0000,
262117579404SPing-Ke Shih 	 RTW_IP_SEL_PHY,
262217579404SPing-Ke Shih 	 RTW_INTF_PHY_CUT_ALL,
262317579404SPing-Ke Shih 	 RTW_INTF_PHY_PLATFORM_ALL},
262417579404SPing-Ke Shih };
262517579404SPing-Ke Shih 
262617579404SPing-Ke Shih static const struct rtw_intf_phy_para_table phy_para_table_8723d = {
262717579404SPing-Ke Shih 	.gen1_para	= pcie_gen1_param_8723d,
262817579404SPing-Ke Shih 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8723d),
262917579404SPing-Ke Shih };
263017579404SPing-Ke Shih 
2631db39a9ddSPing-Ke Shih static const struct rtw_hw_reg rtw8723d_dig[] = {
2632db39a9ddSPing-Ke Shih 	[0] = { .addr = 0xc50, .mask = 0x7f },
2633db39a9ddSPing-Ke Shih 	[1] = { .addr = 0xc50, .mask = 0x7f },
2634db39a9ddSPing-Ke Shih };
2635db39a9ddSPing-Ke Shih 
2636fc637a86SPing-Ke Shih static const struct rtw_hw_reg rtw8723d_dig_cck[] = {
2637fc637a86SPing-Ke Shih 	[0] = { .addr = 0xa0c, .mask = 0x3f00 },
2638fc637a86SPing-Ke Shih };
2639fc637a86SPing-Ke Shih 
2640e0c27cdbSPing-Ke Shih static const struct rtw_rf_sipi_addr rtw8723d_rf_sipi_addr[] = {
2641e0c27cdbSPing-Ke Shih 	[RF_PATH_A] = { .hssi_1 = 0x820, .lssi_read    = 0x8a0,
2642e0c27cdbSPing-Ke Shih 			.hssi_2 = 0x824, .lssi_read_pi = 0x8b8},
2643e0c27cdbSPing-Ke Shih 	[RF_PATH_B] = { .hssi_1 = 0x828, .lssi_read    = 0x8a4,
2644e0c27cdbSPing-Ke Shih 			.hssi_2 = 0x82c, .lssi_read_pi = 0x8bc},
2645e0c27cdbSPing-Ke Shih };
2646e0c27cdbSPing-Ke Shih 
26477e149368SPing-Ke Shih static const struct rtw_ltecoex_addr rtw8723d_ltecoex_addr = {
26487e149368SPing-Ke Shih 	.ctrl = REG_LTECOEX_CTRL,
26497e149368SPing-Ke Shih 	.wdata = REG_LTECOEX_WRITE_DATA,
26507e149368SPing-Ke Shih 	.rdata = REG_LTECOEX_READ_DATA,
26517e149368SPing-Ke Shih };
26527e149368SPing-Ke Shih 
26539874f685SPing-Ke Shih static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
26549874f685SPing-Ke Shih 	[0] = { .phy_pg_tbl	= &rtw8723d_bb_pg_tbl,
26559874f685SPing-Ke Shih 		.txpwr_lmt_tbl	= &rtw8723d_txpwr_lmt_tbl,},
26569874f685SPing-Ke Shih };
26579874f685SPing-Ke Shih 
2658608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2gb_n[] = {
2659608d2a08SPing-Ke Shih 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2660608d2a08SPing-Ke Shih 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2661608d2a08SPing-Ke Shih };
2662608d2a08SPing-Ke Shih 
2663608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2gb_p[] = {
2664608d2a08SPing-Ke Shih 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2665608d2a08SPing-Ke Shih 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2666608d2a08SPing-Ke Shih };
2667608d2a08SPing-Ke Shih 
2668608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2ga_n[] = {
2669608d2a08SPing-Ke Shih 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2670608d2a08SPing-Ke Shih 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2671608d2a08SPing-Ke Shih };
2672608d2a08SPing-Ke Shih 
2673608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2ga_p[] = {
2674608d2a08SPing-Ke Shih 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2675608d2a08SPing-Ke Shih 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2676608d2a08SPing-Ke Shih };
2677608d2a08SPing-Ke Shih 
2678608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2g_cck_b_n[] = {
2679608d2a08SPing-Ke Shih 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2680608d2a08SPing-Ke Shih 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2681608d2a08SPing-Ke Shih };
2682608d2a08SPing-Ke Shih 
2683608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2g_cck_b_p[] = {
2684608d2a08SPing-Ke Shih 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2685608d2a08SPing-Ke Shih 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2686608d2a08SPing-Ke Shih };
2687608d2a08SPing-Ke Shih 
2688608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2g_cck_a_n[] = {
2689608d2a08SPing-Ke Shih 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2690608d2a08SPing-Ke Shih 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2691608d2a08SPing-Ke Shih };
2692608d2a08SPing-Ke Shih 
2693608d2a08SPing-Ke Shih static const u8 rtw8723d_pwrtrk_2g_cck_a_p[] = {
2694608d2a08SPing-Ke Shih 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2695608d2a08SPing-Ke Shih 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2696608d2a08SPing-Ke Shih };
2697608d2a08SPing-Ke Shih 
2698608d2a08SPing-Ke Shih static const s8 rtw8723d_pwrtrk_xtal_n[] = {
2699608d2a08SPing-Ke Shih 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2700608d2a08SPing-Ke Shih 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2701608d2a08SPing-Ke Shih };
2702608d2a08SPing-Ke Shih 
2703608d2a08SPing-Ke Shih static const s8 rtw8723d_pwrtrk_xtal_p[] = {
2704608d2a08SPing-Ke Shih 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2705608d2a08SPing-Ke Shih 	0, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16
2706608d2a08SPing-Ke Shih };
2707608d2a08SPing-Ke Shih 
2708608d2a08SPing-Ke Shih static const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
2709608d2a08SPing-Ke Shih 	.pwrtrk_2gb_n = rtw8723d_pwrtrk_2gb_n,
2710608d2a08SPing-Ke Shih 	.pwrtrk_2gb_p = rtw8723d_pwrtrk_2gb_p,
2711608d2a08SPing-Ke Shih 	.pwrtrk_2ga_n = rtw8723d_pwrtrk_2ga_n,
2712608d2a08SPing-Ke Shih 	.pwrtrk_2ga_p = rtw8723d_pwrtrk_2ga_p,
2713608d2a08SPing-Ke Shih 	.pwrtrk_2g_cckb_n = rtw8723d_pwrtrk_2g_cck_b_n,
2714608d2a08SPing-Ke Shih 	.pwrtrk_2g_cckb_p = rtw8723d_pwrtrk_2g_cck_b_p,
2715608d2a08SPing-Ke Shih 	.pwrtrk_2g_ccka_n = rtw8723d_pwrtrk_2g_cck_a_n,
2716608d2a08SPing-Ke Shih 	.pwrtrk_2g_ccka_p = rtw8723d_pwrtrk_2g_cck_a_p,
2717608d2a08SPing-Ke Shih 	.pwrtrk_xtal_p = rtw8723d_pwrtrk_xtal_p,
2718608d2a08SPing-Ke Shih 	.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
2719608d2a08SPing-Ke Shih };
2720608d2a08SPing-Ke Shih 
2721d1391c49SPing-Ke Shih static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
2722d1391c49SPing-Ke Shih 	{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2723d1391c49SPing-Ke Shih 	{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
2724d1391c49SPing-Ke Shih 	{0, 0, RTW_REG_DOMAIN_NL},
2725d1391c49SPing-Ke Shih 	{0x964, BIT(1), RTW_REG_DOMAIN_MAC8},
2726d1391c49SPing-Ke Shih 	{0x864, BIT(0), RTW_REG_DOMAIN_MAC8},
2727d1391c49SPing-Ke Shih 	{0xab7, BIT(5), RTW_REG_DOMAIN_MAC8},
2728d1391c49SPing-Ke Shih 	{0xa01, BIT(7), RTW_REG_DOMAIN_MAC8},
2729d1391c49SPing-Ke Shih 	{0, 0, RTW_REG_DOMAIN_NL},
2730d1391c49SPing-Ke Shih 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2731d1391c49SPing-Ke Shih 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2732d1391c49SPing-Ke Shih 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2733d1391c49SPing-Ke Shih 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2734d1391c49SPing-Ke Shih 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
2735d1391c49SPing-Ke Shih 	{0, 0, RTW_REG_DOMAIN_NL},
2736d1391c49SPing-Ke Shih 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
2737d1391c49SPing-Ke Shih 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
2738d1391c49SPing-Ke Shih 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2739d1391c49SPing-Ke Shih 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2740d1391c49SPing-Ke Shih 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
2741d1391c49SPing-Ke Shih };
2742d1391c49SPing-Ke Shih 
2743e36db29cSLarry Finger const struct rtw_chip_info rtw8723d_hw_spec = {
2744811853daSPing-Ke Shih 	.ops = &rtw8723d_ops,
2745811853daSPing-Ke Shih 	.id = RTW_CHIP_TYPE_8723D,
2746811853daSPing-Ke Shih 	.fw_name = "rtw88/rtw8723d_fw.bin",
274715d2fcc6SPing-Ke Shih 	.wlan_cpu = RTW_WCPU_11N,
2748811853daSPing-Ke Shih 	.tx_pkt_desc_sz = 40,
2749811853daSPing-Ke Shih 	.tx_buf_desc_sz = 16,
2750811853daSPing-Ke Shih 	.rx_pkt_desc_sz = 24,
2751811853daSPing-Ke Shih 	.rx_buf_desc_sz = 8,
2752811853daSPing-Ke Shih 	.phy_efuse_size = 512,
2753811853daSPing-Ke Shih 	.log_efuse_size = 512,
2754811853daSPing-Ke Shih 	.ptct_efuse_size = 96 + 1,
2755d91277deSPing-Ke Shih 	.txff_size = 32768,
2756d91277deSPing-Ke Shih 	.rxff_size = 16384,
2757ffa71c54SPo-Hao Huang 	.rsvd_drv_pg_num = 8,
2758811853daSPing-Ke Shih 	.txgi_factor = 1,
2759811853daSPing-Ke Shih 	.is_pwr_by_rate_dec = true,
2760811853daSPing-Ke Shih 	.max_power_index = 0x3f,
2761811853daSPing-Ke Shih 	.csi_buf_pg_num = 0,
2762811853daSPing-Ke Shih 	.band = RTW_BAND_2G,
2763d2eb7cb9SPo-Hao Huang 	.page_size = TX_PAGE_SIZE,
2764db39a9ddSPing-Ke Shih 	.dig_min = 0x20,
2765811853daSPing-Ke Shih 	.ht_supported = true,
2766811853daSPing-Ke Shih 	.vht_supported = false,
2767811853daSPing-Ke Shih 	.lps_deep_mode_supported = 0,
2768811853daSPing-Ke Shih 	.sys_func_en = 0xFD,
2769c57bd7c3SPing-Ke Shih 	.pwr_on_seq = card_enable_flow_8723d,
2770c57bd7c3SPing-Ke Shih 	.pwr_off_seq = card_disable_flow_8723d,
2771d91277deSPing-Ke Shih 	.page_table = page_table_8723d,
2772d91277deSPing-Ke Shih 	.rqpn_table = rqpn_table_8723d,
27737d754f97SPing-Ke Shih 	.prioq_addrs = &prioq_addrs_8723d,
277417579404SPing-Ke Shih 	.intf_table = &phy_para_table_8723d,
2775db39a9ddSPing-Ke Shih 	.dig = rtw8723d_dig,
2776fc637a86SPing-Ke Shih 	.dig_cck = rtw8723d_dig_cck,
2777e0c27cdbSPing-Ke Shih 	.rf_sipi_addr = {0x840, 0x844},
2778e0c27cdbSPing-Ke Shih 	.rf_sipi_read_addr = rtw8723d_rf_sipi_addr,
2779e0c27cdbSPing-Ke Shih 	.fix_rf_phy_num = 2,
27807e149368SPing-Ke Shih 	.ltecoex_addr = &rtw8723d_ltecoex_addr,
27819874f685SPing-Ke Shih 	.mac_tbl = &rtw8723d_mac_tbl,
27829874f685SPing-Ke Shih 	.agc_tbl = &rtw8723d_agc_tbl,
27839874f685SPing-Ke Shih 	.bb_tbl = &rtw8723d_bb_tbl,
27849874f685SPing-Ke Shih 	.rf_tbl = {&rtw8723d_rf_a_tbl},
27859874f685SPing-Ke Shih 	.rfe_defs = rtw8723d_rfe_defs,
27869874f685SPing-Ke Shih 	.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
27873ac14439SPing-Ke Shih 	.rx_ldpc = false,
2788608d2a08SPing-Ke Shih 	.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
2789608d2a08SPing-Ke Shih 	.iqk_threshold = 8,
27901d6d131dSChih-Kang Chang 	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
2791d2eb7cb9SPo-Hao Huang 	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
2792d1391c49SPing-Ke Shih 
2793001a3c90SZong-Zhe Yang 	.coex_para_ver = 0x2007022f,
2794d1391c49SPing-Ke Shih 	.bt_desired_ver = 0x2f,
2795d1391c49SPing-Ke Shih 	.scbd_support = true,
2796d1391c49SPing-Ke Shih 	.new_scbd10_def = true,
27971a74daedSChing-Te Ku 	.ble_hid_profile_support = false,
27980c496a7dSChing-Te Ku 	.wl_mimo_ps_support = false,
2799d1391c49SPing-Ke Shih 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2800d1391c49SPing-Ke Shih 	.bt_rssi_type = COEX_BTRSSI_RATIO,
2801d1391c49SPing-Ke Shih 	.ant_isolation = 15,
2802d1391c49SPing-Ke Shih 	.rssi_tolerance = 2,
2803d1391c49SPing-Ke Shih 	.wl_rssi_step = wl_rssi_step_8723d,
2804d1391c49SPing-Ke Shih 	.bt_rssi_step = bt_rssi_step_8723d,
2805d1391c49SPing-Ke Shih 	.table_sant_num = ARRAY_SIZE(table_sant_8723d),
2806d1391c49SPing-Ke Shih 	.table_sant = table_sant_8723d,
2807d1391c49SPing-Ke Shih 	.table_nsant_num = ARRAY_SIZE(table_nsant_8723d),
2808d1391c49SPing-Ke Shih 	.table_nsant = table_nsant_8723d,
2809d1391c49SPing-Ke Shih 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8723d),
2810d1391c49SPing-Ke Shih 	.tdma_sant = tdma_sant_8723d,
2811d1391c49SPing-Ke Shih 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8723d),
2812d1391c49SPing-Ke Shih 	.tdma_nsant = tdma_nsant_8723d,
2813d1391c49SPing-Ke Shih 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8723d),
2814d1391c49SPing-Ke Shih 	.wl_rf_para_tx = rf_para_tx_8723d,
2815d1391c49SPing-Ke Shih 	.wl_rf_para_rx = rf_para_rx_8723d,
2816d1391c49SPing-Ke Shih 	.bt_afh_span_bw20 = 0x20,
2817d1391c49SPing-Ke Shih 	.bt_afh_span_bw40 = 0x30,
2818d1391c49SPing-Ke Shih 	.afh_5g_num = ARRAY_SIZE(afh_5g_8723d),
2819d1391c49SPing-Ke Shih 	.afh_5g = afh_5g_8723d,
2820efad6611SPing-Ke Shih 	.btg_reg = &btg_reg_8723d,
2821d1391c49SPing-Ke Shih 
2822d1391c49SPing-Ke Shih 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8723d),
2823d1391c49SPing-Ke Shih 	.coex_info_hw_regs = coex_info_hw_regs_8723d,
2824811853daSPing-Ke Shih };
2825811853daSPing-Ke Shih EXPORT_SYMBOL(rtw8723d_hw_spec);
2826811853daSPing-Ke Shih 
2827811853daSPing-Ke Shih MODULE_FIRMWARE("rtw88/rtw8723d_fw.bin");
2828f56f0863SZong-Zhe Yang 
2829f56f0863SZong-Zhe Yang MODULE_AUTHOR("Realtek Corporation");
2830f56f0863SZong-Zhe Yang MODULE_DESCRIPTION("Realtek 802.11n wireless 8723d driver");
2831f56f0863SZong-Zhe Yang MODULE_LICENSE("Dual BSD/GPL");
2832