xref: /linux/drivers/net/wireless/realtek/rtw88/rtw8723d.c (revision 1c07425e902cd3137961c3d45b4271bf8a9b8eb9)
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2018-2019  Realtek Corporation
3  */
4 
5 #include <linux/module.h>
6 #include "main.h"
7 #include "coex.h"
8 #include "fw.h"
9 #include "tx.h"
10 #include "rx.h"
11 #include "phy.h"
12 #include "rtw8723d.h"
13 #include "rtw8723d_table.h"
14 #include "mac.h"
15 #include "reg.h"
16 #include "debug.h"
17 
18 static const struct rtw_hw_reg rtw8723d_txagc[] = {
19 	[DESC_RATE1M]	= { .addr = 0xe08, .mask = 0x0000ff00 },
20 	[DESC_RATE2M]	= { .addr = 0x86c, .mask = 0x0000ff00 },
21 	[DESC_RATE5_5M]	= { .addr = 0x86c, .mask = 0x00ff0000 },
22 	[DESC_RATE11M]	= { .addr = 0x86c, .mask = 0xff000000 },
23 	[DESC_RATE6M]	= { .addr = 0xe00, .mask = 0x000000ff },
24 	[DESC_RATE9M]	= { .addr = 0xe00, .mask = 0x0000ff00 },
25 	[DESC_RATE12M]	= { .addr = 0xe00, .mask = 0x00ff0000 },
26 	[DESC_RATE18M]	= { .addr = 0xe00, .mask = 0xff000000 },
27 	[DESC_RATE24M]	= { .addr = 0xe04, .mask = 0x000000ff },
28 	[DESC_RATE36M]	= { .addr = 0xe04, .mask = 0x0000ff00 },
29 	[DESC_RATE48M]	= { .addr = 0xe04, .mask = 0x00ff0000 },
30 	[DESC_RATE54M]	= { .addr = 0xe04, .mask = 0xff000000 },
31 	[DESC_RATEMCS0]	= { .addr = 0xe10, .mask = 0x000000ff },
32 	[DESC_RATEMCS1]	= { .addr = 0xe10, .mask = 0x0000ff00 },
33 	[DESC_RATEMCS2]	= { .addr = 0xe10, .mask = 0x00ff0000 },
34 	[DESC_RATEMCS3]	= { .addr = 0xe10, .mask = 0xff000000 },
35 	[DESC_RATEMCS4]	= { .addr = 0xe14, .mask = 0x000000ff },
36 	[DESC_RATEMCS5]	= { .addr = 0xe14, .mask = 0x0000ff00 },
37 	[DESC_RATEMCS6]	= { .addr = 0xe14, .mask = 0x00ff0000 },
38 	[DESC_RATEMCS7]	= { .addr = 0xe14, .mask = 0xff000000 },
39 };
40 
41 #define WLAN_TXQ_RPT_EN		0x1F
42 #define WLAN_SLOT_TIME		0x09
43 #define WLAN_RL_VAL		0x3030
44 #define WLAN_BAR_VAL		0x0201ffff
45 #define BIT_MASK_TBTT_HOLD	0x00000fff
46 #define BIT_SHIFT_TBTT_HOLD	8
47 #define BIT_MASK_TBTT_SETUP	0x000000ff
48 #define BIT_SHIFT_TBTT_SETUP	0
49 #define BIT_MASK_TBTT_MASK	((BIT_MASK_TBTT_HOLD << BIT_SHIFT_TBTT_HOLD) | \
50 				 (BIT_MASK_TBTT_SETUP << BIT_SHIFT_TBTT_SETUP))
51 #define TBTT_TIME(s, h)((((s) & BIT_MASK_TBTT_SETUP) << BIT_SHIFT_TBTT_SETUP) |\
52 			(((h) & BIT_MASK_TBTT_HOLD) << BIT_SHIFT_TBTT_HOLD))
53 #define WLAN_TBTT_TIME_NORMAL	TBTT_TIME(0x04, 0x80)
54 #define WLAN_TBTT_TIME_STOP_BCN	TBTT_TIME(0x04, 0x64)
55 #define WLAN_PIFS_VAL		0
56 #define WLAN_AGG_BRK_TIME	0x16
57 #define WLAN_NAV_PROT_LEN	0x0040
58 #define WLAN_SPEC_SIFS		0x100a
59 #define WLAN_RX_PKT_LIMIT	0x17
60 #define WLAN_MAX_AGG_NR		0x0A
61 #define WLAN_AMPDU_MAX_TIME	0x1C
62 #define WLAN_ANT_SEL		0x82
63 #define WLAN_LTR_IDLE_LAT	0x90039003
64 #define WLAN_LTR_ACT_LAT	0x883c883c
65 #define WLAN_LTR_CTRL1		0xCB004010
66 #define WLAN_LTR_CTRL2		0x01233425
67 
68 static void rtw8723d_lck(struct rtw_dev *rtwdev)
69 {
70 	u32 lc_cal;
71 	u8 val_ctx, rf_val;
72 	int ret;
73 
74 	val_ctx = rtw_read8(rtwdev, REG_CTX);
75 	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
76 		rtw_write8(rtwdev, REG_CTX, val_ctx & ~BIT_MASK_CTX_TYPE);
77 	else
78 		rtw_write8(rtwdev, REG_TXPAUSE, 0xFF);
79 	lc_cal = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
80 
81 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal | BIT_LCK);
82 
83 	ret = read_poll_timeout(rtw_read_rf, rf_val, rf_val != 0x1,
84 				10000, 1000000, false,
85 				rtwdev, RF_PATH_A, RF_CFGCH, BIT_LCK);
86 	if (ret)
87 		rtw_warn(rtwdev, "failed to poll LCK status bit\n");
88 
89 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, lc_cal);
90 	if ((val_ctx & BIT_MASK_CTX_TYPE) != 0)
91 		rtw_write8(rtwdev, REG_CTX, val_ctx);
92 	else
93 		rtw_write8(rtwdev, REG_TXPAUSE, 0x00);
94 }
95 
96 static const u32 rtw8723d_ofdm_swing_table[] = {
97 	0x0b40002d, 0x0c000030, 0x0cc00033, 0x0d800036, 0x0e400039, 0x0f00003c,
98 	0x10000040, 0x11000044, 0x12000048, 0x1300004c, 0x14400051, 0x15800056,
99 	0x16c0005b, 0x18000060, 0x19800066, 0x1b00006c, 0x1c800072, 0x1e400079,
100 	0x20000080, 0x22000088, 0x24000090, 0x26000098, 0x288000a2, 0x2ac000ab,
101 	0x2d4000b5, 0x300000c0, 0x32c000cb, 0x35c000d7, 0x390000e4, 0x3c8000f2,
102 	0x40000100, 0x43c0010f, 0x47c0011f, 0x4c000130, 0x50800142, 0x55400155,
103 	0x5a400169, 0x5fc0017f, 0x65400195, 0x6b8001ae, 0x71c001c7, 0x788001e2,
104 	0x7f8001fe,
105 };
106 
107 static const u32 rtw8723d_cck_swing_table[] = {
108 	0x0CD, 0x0D9, 0x0E6, 0x0F3, 0x102, 0x111, 0x121, 0x132, 0x144, 0x158,
109 	0x16C, 0x182, 0x198, 0x1B1, 0x1CA, 0x1E5, 0x202, 0x221, 0x241, 0x263,
110 	0x287, 0x2AE, 0x2D6, 0x301, 0x32F, 0x35F, 0x392, 0x3C9, 0x402, 0x43F,
111 	0x47F, 0x4C3, 0x50C, 0x558, 0x5A9, 0x5FF, 0x65A, 0x6BA, 0x720, 0x78C,
112 	0x7FF,
113 };
114 
115 #define RTW_OFDM_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_ofdm_swing_table)
116 #define RTW_CCK_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_cck_swing_table)
117 
118 static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
119 {
120 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
121 	u8 path;
122 
123 	dm_info->default_ofdm_index = RTW_DEF_OFDM_SWING_INDEX;
124 
125 	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
126 		ewma_thermal_init(&dm_info->avg_thermal[path]);
127 		dm_info->delta_power_index[path] = 0;
128 	}
129 	dm_info->pwr_trk_triggered = false;
130 	dm_info->pwr_trk_init_trigger = true;
131 	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
132 	dm_info->txagc_remnant_cck = 0;
133 	dm_info->txagc_remnant_ofdm = 0;
134 }
135 
136 static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
137 {
138 	u8 xtal_cap;
139 	u32 val32;
140 
141 	/* power on BB/RF domain */
142 	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
143 			BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
144 	rtw_write8_set(rtwdev, REG_RF_CTRL,
145 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
146 	rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
147 
148 	rtw_phy_load_tables(rtwdev);
149 
150 	/* post init after header files config */
151 	rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
152 	rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, BIT_HIQ_NO_LMT_EN_ROOT);
153 	rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
154 
155 	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
156 	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
157 			 xtal_cap | (xtal_cap << 6));
158 	rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
159 	if ((rtwdev->efuse.afe >> 4) == 14) {
160 		rtw_write32_set(rtwdev, REG_AFE_CTRL3, BIT_XTAL_GMP_BIT4);
161 		rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BITS_PLL);
162 		rtw_write32_set(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA1);
163 		rtw_write32_clr(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA0);
164 	}
165 
166 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
167 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
168 	rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
169 	rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
170 	rtw_write8(rtwdev, REG_ATIMWND, 0x2);
171 	rtw_write8(rtwdev, REG_BCN_CTRL,
172 		   BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
173 	val32 = rtw_read32(rtwdev, REG_TBTT_PROHIBIT);
174 	val32 &= ~BIT_MASK_TBTT_MASK;
175 	val32 |= WLAN_TBTT_TIME_STOP_BCN;
176 	rtw_write8(rtwdev, REG_TBTT_PROHIBIT, val32);
177 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
178 	rtw_write8(rtwdev, REG_AGGR_BREAK_TIME, WLAN_AGG_BRK_TIME);
179 	rtw_write16(rtwdev, REG_NAV_PROT_LEN, WLAN_NAV_PROT_LEN);
180 	rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
181 	rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS);
182 	rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS);
183 	rtw_write8(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
184 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
185 	rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
186 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
187 	rtw_write8(rtwdev, REG_LEDCFG2, WLAN_ANT_SEL);
188 
189 	rtw_write32(rtwdev, REG_LTR_IDLE_LATENCY, WLAN_LTR_IDLE_LAT);
190 	rtw_write32(rtwdev, REG_LTR_ACTIVE_LATENCY, WLAN_LTR_ACT_LAT);
191 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC, WLAN_LTR_CTRL1);
192 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC + 4, WLAN_LTR_CTRL2);
193 
194 	rtw_phy_init(rtwdev);
195 	rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
196 
197 	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
198 
199 	rtw8723d_lck(rtwdev);
200 
201 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
202 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
203 
204 	rtw8723d_pwrtrack_init(rtwdev);
205 }
206 
207 static void rtw8723de_efuse_parsing(struct rtw_efuse *efuse,
208 				    struct rtw8723d_efuse *map)
209 {
210 	ether_addr_copy(efuse->addr, map->e.mac_addr);
211 }
212 
213 static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse,
214 				    struct rtw8723d_efuse *map)
215 {
216 	ether_addr_copy(efuse->addr, map->u.mac_addr);
217 }
218 
219 static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
220 {
221 	struct rtw_efuse *efuse = &rtwdev->efuse;
222 	struct rtw8723d_efuse *map;
223 	int i;
224 
225 	map = (struct rtw8723d_efuse *)log_map;
226 
227 	efuse->rfe_option = 0;
228 	efuse->rf_board_option = map->rf_board_option;
229 	efuse->crystal_cap = map->xtal_k;
230 	efuse->pa_type_2g = map->pa_type;
231 	efuse->lna_type_2g = map->lna_type_2g[0];
232 	efuse->channel_plan = map->channel_plan;
233 	efuse->country_code[0] = map->country_code[0];
234 	efuse->country_code[1] = map->country_code[1];
235 	efuse->bt_setting = map->rf_bt_setting;
236 	efuse->regd = map->rf_board_option & 0x7;
237 	efuse->thermal_meter[0] = map->thermal_meter;
238 	efuse->thermal_meter_k = map->thermal_meter;
239 	efuse->afe = map->afe;
240 
241 	for (i = 0; i < 4; i++)
242 		efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i];
243 
244 	switch (rtw_hci_type(rtwdev)) {
245 	case RTW_HCI_TYPE_PCIE:
246 		rtw8723de_efuse_parsing(efuse, map);
247 		break;
248 	case RTW_HCI_TYPE_USB:
249 		rtw8723du_efuse_parsing(efuse, map);
250 		break;
251 	default:
252 		/* unsupported now */
253 		return -ENOTSUPP;
254 	}
255 
256 	return 0;
257 }
258 
259 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
260 				   struct rtw_rx_pkt_stat *pkt_stat)
261 {
262 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
263 	s8 min_rx_power = -120;
264 	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
265 
266 	pkt_stat->rx_power[RF_PATH_A] = pwdb - 97;
267 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
268 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
269 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
270 				     min_rx_power);
271 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
272 }
273 
274 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
275 				   struct rtw_rx_pkt_stat *pkt_stat)
276 {
277 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
278 	u8 rxsc, bw;
279 	s8 min_rx_power = -120;
280 	s8 rx_evm;
281 
282 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
283 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
284 	else
285 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
286 
287 	if (GET_PHY_STAT_P1_RF_MODE(phy_status) == 0)
288 		bw = RTW_CHANNEL_WIDTH_20;
289 	else if ((rxsc == 1) || (rxsc == 2))
290 		bw = RTW_CHANNEL_WIDTH_20;
291 	else
292 		bw = RTW_CHANNEL_WIDTH_40;
293 
294 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
295 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
296 	pkt_stat->bw = bw;
297 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
298 				     min_rx_power);
299 	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
300 	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
301 	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
302 
303 	dm_info->curr_rx_rate = pkt_stat->rate;
304 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
305 	dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
306 	dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
307 
308 	rx_evm = clamp_t(s8, -pkt_stat->rx_evm[RF_PATH_A] >> 1, 0, 64);
309 	rx_evm &= 0x3F;	/* 64->0: second path of 1SS rate is 64 */
310 	dm_info->rx_evm_dbm[RF_PATH_A] = rx_evm;
311 }
312 
313 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
314 			     struct rtw_rx_pkt_stat *pkt_stat)
315 {
316 	u8 page;
317 
318 	page = *phy_status & 0xf;
319 
320 	switch (page) {
321 	case 0:
322 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
323 		break;
324 	case 1:
325 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
326 		break;
327 	default:
328 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
329 		return;
330 	}
331 }
332 
333 static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
334 				   struct rtw_rx_pkt_stat *pkt_stat,
335 				   struct ieee80211_rx_status *rx_status)
336 {
337 	struct ieee80211_hdr *hdr;
338 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
339 	u8 *phy_status = NULL;
340 
341 	memset(pkt_stat, 0, sizeof(*pkt_stat));
342 
343 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
344 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
345 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
346 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
347 			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
348 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
349 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
350 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
351 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
352 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
353 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
354 	pkt_stat->ppdu_cnt = 0;
355 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
356 
357 	/* drv_info_sz is in unit of 8-bytes */
358 	pkt_stat->drv_info_sz *= 8;
359 
360 	/* c2h cmd pkt's rx/phy status is not interested */
361 	if (pkt_stat->is_c2h)
362 		return;
363 
364 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
365 				       pkt_stat->drv_info_sz);
366 	if (pkt_stat->phy_status) {
367 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
368 		query_phy_status(rtwdev, phy_status, pkt_stat);
369 	}
370 
371 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
372 }
373 
374 static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
375 					 u8 channel, u32 thres)
376 {
377 	u32 freq;
378 	bool ret = false;
379 
380 	if (channel == 13)
381 		freq = FREQ_CH13;
382 	else if (channel == 14)
383 		freq = FREQ_CH14;
384 	else
385 		return false;
386 
387 	rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
388 	rtw_write32(rtwdev, REG_PSDFN, freq);
389 	rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
390 
391 	msleep(30);
392 	if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
393 		ret = true;
394 
395 	rtw_write32(rtwdev, REG_PSDFN, freq);
396 	rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
397 
398 	return ret;
399 }
400 
401 static void rtw8723d_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
402 {
403 	if (!notch) {
404 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
405 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
406 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
407 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
408 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
409 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
410 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
411 		return;
412 	}
413 
414 	switch (channel) {
415 	case 13:
416 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
417 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
418 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x04000000);
419 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
420 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
421 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
422 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
423 		break;
424 	case 14:
425 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
426 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
427 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
428 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
429 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
430 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00080000);
431 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
432 		break;
433 	default:
434 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
435 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
436 		break;
437 	}
438 }
439 
440 static void rtw8723d_spur_cal(struct rtw_dev *rtwdev, u8 channel)
441 {
442 	bool notch;
443 
444 	if (channel < 13) {
445 		rtw8723d_cfg_notch(rtwdev, channel, false);
446 		return;
447 	}
448 
449 	notch = rtw8723d_check_spur_ov_thres(rtwdev, channel, SPUR_THRES);
450 	rtw8723d_cfg_notch(rtwdev, channel, notch);
451 }
452 
453 static void rtw8723d_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
454 {
455 	u32 rf_cfgch_a, rf_cfgch_b;
456 
457 	rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
458 	rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
459 
460 	rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
461 	rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
462 	rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
463 	rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
464 
465 	rf_cfgch_a &= ~RFCFGCH_BW_MASK;
466 	switch (bw) {
467 	case RTW_CHANNEL_WIDTH_20:
468 		rf_cfgch_a |= RFCFGCH_BW_20M;
469 		break;
470 	case RTW_CHANNEL_WIDTH_40:
471 		rf_cfgch_a |= RFCFGCH_BW_40M;
472 		break;
473 	default:
474 		break;
475 	}
476 
477 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
478 	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
479 
480 	rtw8723d_spur_cal(rtwdev, channel);
481 }
482 
483 static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR] = {
484 	[0] = {
485 		{ .len = 4, .reg = 0xA24, .val = 0x64B80C1C },
486 		{ .len = 4, .reg = 0xA28, .val = 0x00008810 },
487 		{ .len = 4, .reg = 0xAAC, .val = 0x01235667 },
488 	},
489 	[1] = {
490 		{ .len = 4, .reg = 0xA24, .val = 0x0000B81C },
491 		{ .len = 4, .reg = 0xA28, .val = 0x00000000 },
492 		{ .len = 4, .reg = 0xAAC, .val = 0x00003667 },
493 	},
494 };
495 
496 static void rtw8723d_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
497 				    u8 primary_ch_idx)
498 {
499 	const struct rtw_backup_info *cck_dfir;
500 	int i;
501 
502 	cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
503 
504 	for (i = 0; i < CCK_DFIR_NR; i++, cck_dfir++)
505 		rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
506 
507 	switch (bw) {
508 	case RTW_CHANNEL_WIDTH_20:
509 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
510 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
511 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 1);
512 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_MASK_RXBB_DFIR, 0xa);
513 		break;
514 	case RTW_CHANNEL_WIDTH_40:
515 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
516 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
517 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 0);
518 		rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
519 				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
520 		break;
521 	default:
522 		break;
523 	}
524 }
525 
526 static void rtw8723d_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
527 				 u8 primary_chan_idx)
528 {
529 	rtw8723d_set_channel_rf(rtwdev, channel, bw);
530 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
531 	rtw8723d_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
532 }
533 
534 #define BIT_CFENDFORM		BIT(9)
535 #define BIT_WMAC_TCR_ERR0	BIT(12)
536 #define BIT_WMAC_TCR_ERR1	BIT(13)
537 #define BIT_TCR_CFG		(BIT_CFENDFORM | BIT_WMAC_TCR_ERR0 |	       \
538 				 BIT_WMAC_TCR_ERR1)
539 #define WLAN_RX_FILTER0		0xFFFF
540 #define WLAN_RX_FILTER1		0x400
541 #define WLAN_RX_FILTER2		0xFFFF
542 #define WLAN_RCR_CFG		0x700060CE
543 
544 static int rtw8723d_mac_init(struct rtw_dev *rtwdev)
545 {
546 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
547 	rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
548 
549 	rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
550 	rtw_write16(rtwdev, REG_RXFLTMAP1, WLAN_RX_FILTER1);
551 	rtw_write16(rtwdev, REG_RXFLTMAP2, WLAN_RX_FILTER2);
552 	rtw_write32(rtwdev, REG_RCR, WLAN_RCR_CFG);
553 
554 	rtw_write32(rtwdev, REG_INT_MIG, 0);
555 	rtw_write32(rtwdev, REG_MCUTST_1, 0x0);
556 
557 	rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA);
558 	rtw_write8(rtwdev, REG_2ND_CCA_CTRL, 0);
559 
560 	return 0;
561 }
562 
563 static void rtw8723d_shutdown(struct rtw_dev *rtwdev)
564 {
565 	rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
566 }
567 
568 static void rtw8723d_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
569 {
570 	u8 ldo_pwr;
571 
572 	ldo_pwr = rtw_read8(rtwdev, REG_LDO_EFUSE_CTRL + 3);
573 	if (enable) {
574 		ldo_pwr &= ~BIT_MASK_LDO25_VOLTAGE;
575 		ldo_pwr |= (BIT_LDO25_VOLTAGE_V25 << 4) | BIT_LDO25_EN;
576 	} else {
577 		ldo_pwr &= ~BIT_LDO25_EN;
578 	}
579 	rtw_write8(rtwdev, REG_LDO_EFUSE_CTRL + 3, ldo_pwr);
580 }
581 
582 static void
583 rtw8723d_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
584 {
585 	struct rtw_hal *hal = &rtwdev->hal;
586 	const struct rtw_hw_reg *txagc;
587 	u8 rate, pwr_index;
588 	int j;
589 
590 	for (j = 0; j < rtw_rate_size[rs]; j++) {
591 		rate = rtw_rate_section[rs][j];
592 		pwr_index = hal->tx_pwr_tbl[path][rate];
593 
594 		if (rate >= ARRAY_SIZE(rtw8723d_txagc)) {
595 			rtw_warn(rtwdev, "rate 0x%x isn't supported\n", rate);
596 			continue;
597 		}
598 		txagc = &rtw8723d_txagc[rate];
599 		if (!txagc->addr) {
600 			rtw_warn(rtwdev, "rate 0x%x isn't defined\n", rate);
601 			continue;
602 		}
603 
604 		rtw_write32_mask(rtwdev, txagc->addr, txagc->mask, pwr_index);
605 	}
606 }
607 
608 static void rtw8723d_set_tx_power_index(struct rtw_dev *rtwdev)
609 {
610 	struct rtw_hal *hal = &rtwdev->hal;
611 	int rs, path;
612 
613 	for (path = 0; path < hal->rf_path_num; path++) {
614 		for (rs = 0; rs <= RTW_RATE_SECTION_HT_1S; rs++)
615 			rtw8723d_set_tx_power_index_by_rate(rtwdev, path, rs);
616 	}
617 }
618 
619 static void rtw8723d_efuse_grant(struct rtw_dev *rtwdev, bool on)
620 {
621 	if (on) {
622 		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON);
623 
624 		rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR);
625 		rtw_write16_set(rtwdev, REG_SYS_CLKR, BIT_LOADER_CLK_EN | BIT_ANA8M);
626 	} else {
627 		rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF);
628 	}
629 }
630 
631 static void rtw8723d_false_alarm_statistics(struct rtw_dev *rtwdev)
632 {
633 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
634 	u32 cck_fa_cnt;
635 	u32 ofdm_fa_cnt;
636 	u32 crc32_cnt;
637 	u32 val32;
638 
639 	/* hold counter */
640 	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 1);
641 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 1);
642 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KEEP, 1);
643 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KEEP, 1);
644 
645 	cck_fa_cnt = rtw_read32_mask(rtwdev, REG_CCK_FA_LSB_11N, MASKBYTE0);
646 	cck_fa_cnt += rtw_read32_mask(rtwdev, REG_CCK_FA_MSB_11N, MASKBYTE3) << 8;
647 
648 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE1_11N);
649 	ofdm_fa_cnt = u32_get_bits(val32, BIT_MASK_OFDM_FF_CNT);
650 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_SF_CNT);
651 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE2_11N);
652 	dm_info->ofdm_cca_cnt = u32_get_bits(val32, BIT_MASK_OFDM_CCA_CNT);
653 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_PF_CNT);
654 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE3_11N);
655 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_RI_CNT);
656 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_CRC_CNT);
657 	val32 = rtw_read32(rtwdev, REG_OFDM_FA_TYPE4_11N);
658 	ofdm_fa_cnt += u32_get_bits(val32, BIT_MASK_OFDM_MNS_CNT);
659 
660 	dm_info->cck_fa_cnt = cck_fa_cnt;
661 	dm_info->ofdm_fa_cnt = ofdm_fa_cnt;
662 	dm_info->total_fa_cnt = cck_fa_cnt + ofdm_fa_cnt;
663 
664 	dm_info->cck_err_cnt = rtw_read32(rtwdev, REG_IGI_C_11N);
665 	dm_info->cck_ok_cnt = rtw_read32(rtwdev, REG_IGI_D_11N);
666 	crc32_cnt = rtw_read32(rtwdev, REG_OFDM_CRC32_CNT_11N);
667 	dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_ERR);
668 	dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_OFDM_LCRC_OK);
669 	crc32_cnt = rtw_read32(rtwdev, REG_HT_CRC32_CNT_11N);
670 	dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_ERR);
671 	dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, BIT_MASK_HT_CRC_OK);
672 	dm_info->vht_err_cnt = 0;
673 	dm_info->vht_ok_cnt = 0;
674 
675 	val32 = rtw_read32(rtwdev, REG_CCK_CCA_CNT_11N);
676 	dm_info->cck_cca_cnt = (u32_get_bits(val32, BIT_MASK_CCK_FA_MSB) << 8) |
677 			       u32_get_bits(val32, BIT_MASK_CCK_FA_LSB);
678 	dm_info->total_cca_cnt = dm_info->cck_cca_cnt + dm_info->ofdm_cca_cnt;
679 
680 	/* reset counter */
681 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 1);
682 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTC_11N, BIT_MASK_OFDM_FA_RST, 0);
683 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 1);
684 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_RST1, 0);
685 	rtw_write32_mask(rtwdev, REG_OFDM_FA_HOLDC_11N, BIT_MASK_OFDM_FA_KEEP, 0);
686 	rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, BIT_MASK_OFDM_FA_KEEP1, 0);
687 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 0);
688 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_CNT_KPEN, 2);
689 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 0);
690 	rtw_write32_mask(rtwdev, REG_CCK_FA_RST_11N, BIT_MASK_CCK_FA_KPEN, 2);
691 	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 1);
692 	rtw_write32_mask(rtwdev, REG_PAGE_F_RST_11N, BIT_MASK_F_RST_ALL, 0);
693 }
694 
695 static const u32 iqk_adda_regs[] = {
696 	0x85c, 0xe6c, 0xe70, 0xe74, 0xe78, 0xe7c, 0xe80, 0xe84, 0xe88, 0xe8c,
697 	0xed0, 0xed4, 0xed8, 0xedc, 0xee0, 0xeec
698 };
699 
700 static const u32 iqk_mac8_regs[] = {0x522, 0x550, 0x551};
701 static const u32 iqk_mac32_regs[] = {0x40};
702 
703 static const u32 iqk_bb_regs[] = {
704 	0xc04, 0xc08, 0x874, 0xb68, 0xb6c, 0x870, 0x860, 0x864, 0xa04
705 };
706 
707 #define IQK_ADDA_REG_NUM	ARRAY_SIZE(iqk_adda_regs)
708 #define IQK_MAC8_REG_NUM	ARRAY_SIZE(iqk_mac8_regs)
709 #define IQK_MAC32_REG_NUM	ARRAY_SIZE(iqk_mac32_regs)
710 #define IQK_BB_REG_NUM		ARRAY_SIZE(iqk_bb_regs)
711 
712 struct iqk_backup_regs {
713 	u32 adda[IQK_ADDA_REG_NUM];
714 	u8 mac8[IQK_MAC8_REG_NUM];
715 	u32 mac32[IQK_MAC32_REG_NUM];
716 	u32 bb[IQK_BB_REG_NUM];
717 
718 	u32 lte_path;
719 	u32 lte_gnt;
720 
721 	u32 bb_sel_btg;
722 	u8 btg_sel;
723 
724 	u8 igia;
725 	u8 igib;
726 };
727 
728 static void rtw8723d_iqk_backup_regs(struct rtw_dev *rtwdev,
729 				     struct iqk_backup_regs *backup)
730 {
731 	int i;
732 
733 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
734 		backup->adda[i] = rtw_read32(rtwdev, iqk_adda_regs[i]);
735 
736 	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
737 		backup->mac8[i] = rtw_read8(rtwdev, iqk_mac8_regs[i]);
738 	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
739 		backup->mac32[i] = rtw_read32(rtwdev, iqk_mac32_regs[i]);
740 
741 	for (i = 0; i < IQK_BB_REG_NUM; i++)
742 		backup->bb[i] = rtw_read32(rtwdev, iqk_bb_regs[i]);
743 
744 	backup->igia = rtw_read32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0);
745 	backup->igib = rtw_read32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0);
746 
747 	backup->bb_sel_btg = rtw_read32(rtwdev, REG_BB_SEL_BTG);
748 }
749 
750 static void rtw8723d_iqk_restore_regs(struct rtw_dev *rtwdev,
751 				      const struct iqk_backup_regs *backup)
752 {
753 	int i;
754 
755 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
756 		rtw_write32(rtwdev, iqk_adda_regs[i], backup->adda[i]);
757 
758 	for (i = 0; i < IQK_MAC8_REG_NUM; i++)
759 		rtw_write8(rtwdev, iqk_mac8_regs[i], backup->mac8[i]);
760 	for (i = 0; i < IQK_MAC32_REG_NUM; i++)
761 		rtw_write32(rtwdev, iqk_mac32_regs[i], backup->mac32[i]);
762 
763 	for (i = 0; i < IQK_BB_REG_NUM; i++)
764 		rtw_write32(rtwdev, iqk_bb_regs[i], backup->bb[i]);
765 
766 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
767 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, backup->igia);
768 
769 	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, 0x50);
770 	rtw_write32_mask(rtwdev, REG_OFDM0_XBAGC1, MASKBYTE0, backup->igib);
771 
772 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x01008c00);
773 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x01008c00);
774 }
775 
776 static void rtw8723d_iqk_backup_path_ctrl(struct rtw_dev *rtwdev,
777 					  struct iqk_backup_regs *backup)
778 {
779 	backup->btg_sel = rtw_read8(rtwdev, REG_BTG_SEL);
780 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] original 0x67 = 0x%x\n",
781 		backup->btg_sel);
782 }
783 
784 static void rtw8723d_iqk_config_path_ctrl(struct rtw_dev *rtwdev)
785 {
786 	rtw_write32_mask(rtwdev, REG_PAD_CTRL1, BIT_BT_BTG_SEL, 0x1);
787 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] set 0x67 = 0x%x\n",
788 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
789 }
790 
791 static void rtw8723d_iqk_restore_path_ctrl(struct rtw_dev *rtwdev,
792 					   const struct iqk_backup_regs *backup)
793 {
794 	rtw_write8(rtwdev, REG_BTG_SEL, backup->btg_sel);
795 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] restore 0x67 = 0x%x\n",
796 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
797 }
798 
799 static void rtw8723d_iqk_backup_lte_path_gnt(struct rtw_dev *rtwdev,
800 					     struct iqk_backup_regs *backup)
801 {
802 	backup->lte_path = rtw_read32(rtwdev, REG_LTECOEX_PATH_CONTROL);
803 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0038);
804 	mdelay(1);
805 	backup->lte_gnt = rtw_read32(rtwdev, REG_LTECOEX_READ_DATA);
806 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] OriginalGNT = 0x%x\n",
807 		backup->lte_gnt);
808 }
809 
810 static void rtw8723d_iqk_config_lte_path_gnt(struct rtw_dev *rtwdev)
811 {
812 	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, 0x0000ff00);
813 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc0020038);
814 	rtw_write32_mask(rtwdev, REG_LTECOEX_PATH_CONTROL, BIT_LTE_MUX_CTRL_PATH, 0x1);
815 }
816 
817 static void rtw8723d_iqk_restore_lte_path_gnt(struct rtw_dev *rtwdev,
818 					      const struct iqk_backup_regs *bak)
819 {
820 	rtw_write32(rtwdev, REG_LTECOEX_WRITE_DATA, bak->lte_gnt);
821 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0xc00f0038);
822 	rtw_write32(rtwdev, REG_LTECOEX_PATH_CONTROL, bak->lte_path);
823 }
824 
825 struct rtw_8723d_iqk_cfg {
826 	const char *name;
827 	u32 val_bb_sel_btg;
828 	u32 reg_lutwe;
829 	u32 val_txiqk_pi;
830 	u32 reg_padlut;
831 	u32 reg_gaintx;
832 	u32 reg_bspad;
833 	u32 val_wlint;
834 	u32 val_wlsel;
835 	u32 val_iqkpts;
836 };
837 
838 static const struct rtw_8723d_iqk_cfg iqk_tx_cfg[PATH_NR] = {
839 	[PATH_S1] = {
840 		.name = "S1",
841 		.val_bb_sel_btg = 0x99000000,
842 		.reg_lutwe = RF_LUTWE,
843 		.val_txiqk_pi = 0x8214019f,
844 		.reg_padlut = RF_LUTDBG,
845 		.reg_gaintx = RF_GAINTX,
846 		.reg_bspad = RF_BSPAD,
847 		.val_wlint = 0xe0d,
848 		.val_wlsel = 0x60d,
849 		.val_iqkpts = 0xfa000000,
850 	},
851 	[PATH_S0] = {
852 		.name = "S0",
853 		.val_bb_sel_btg = 0x99000280,
854 		.reg_lutwe = RF_LUTWE2,
855 		.val_txiqk_pi = 0x8214018a,
856 		.reg_padlut = RF_TXADBG,
857 		.reg_gaintx = RF_TRXIQ,
858 		.reg_bspad = RF_TXATANK,
859 		.val_wlint = 0xe6d,
860 		.val_wlsel = 0x66d,
861 		.val_iqkpts = 0xf9000000,
862 	},
863 };
864 
865 static u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
866 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
867 {
868 	s32 tx_x, tx_y;
869 	u32 tx_fail;
870 
871 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
872 		rtw_read32(rtwdev, REG_IQK_RES_RY));
873 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
874 		rtw_read32(rtwdev, REG_IQK_RES_TX),
875 		rtw_read32(rtwdev, REG_IQK_RES_TY));
876 	rtw_dbg(rtwdev, RTW_DBG_RFK,
877 		"[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
878 		rtw_read32(rtwdev, 0xe90),
879 		rtw_read32(rtwdev, 0xe98));
880 
881 	tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
882 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
883 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
884 
885 	if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
886 		return IQK_TX_OK;
887 
888 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s TXIQK is failed\n",
889 		iqk_cfg->name);
890 
891 	return 0;
892 }
893 
894 static u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
895 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
896 {
897 	s32 rx_x, rx_y;
898 	u32 rx_fail;
899 
900 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
901 		rtw_read32(rtwdev, REG_IQK_RES_RX),
902 		rtw_read32(rtwdev, REG_IQK_RES_RY));
903 
904 	rtw_dbg(rtwdev, RTW_DBG_RFK,
905 		"[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
906 		rtw_read32(rtwdev, 0xea0),
907 		rtw_read32(rtwdev, 0xea8));
908 
909 	rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
910 	rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
911 	rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
912 	rx_y = abs(iqkxy_to_s32(rx_y));
913 
914 	if (!rx_fail && rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
915 	    rx_y < IQK_RX_Y_LMT)
916 		return IQK_RX_OK;
917 
918 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s RXIQK STEP2 is failed\n",
919 		iqk_cfg->name);
920 
921 	return 0;
922 }
923 
924 static void rtw8723d_iqk_one_shot(struct rtw_dev *rtwdev, bool tx,
925 				  const struct rtw_8723d_iqk_cfg *iqk_cfg)
926 {
927 	u32 pts = (tx ? iqk_cfg->val_iqkpts : 0xf9000000);
928 
929 	/* enter IQK mode */
930 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
931 	rtw8723d_iqk_config_lte_path_gnt(rtwdev);
932 
933 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0054);
934 	mdelay(1);
935 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] GNT_BT @%s %sIQK1 = 0x%x\n",
936 		iqk_cfg->name, tx ? "TX" : "RX",
937 		rtw_read32(rtwdev, REG_LTECOEX_READ_DATA));
938 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x948 @%s %sIQK1 = 0x%x\n",
939 		iqk_cfg->name, tx ? "TX" : "RX",
940 		rtw_read32(rtwdev, REG_BB_SEL_BTG));
941 
942 	/* One shot, LOK & IQK */
943 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, pts);
944 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
945 
946 	if (!check_hw_ready(rtwdev, REG_IQK_RES_RY, BIT_IQK_DONE, 1))
947 		rtw_warn(rtwdev, "%s %s IQK isn't done\n", iqk_cfg->name,
948 			 tx ? "TX" : "RX");
949 }
950 
951 static void rtw8723d_iqk_txrx_path_post(struct rtw_dev *rtwdev,
952 					const struct rtw_8723d_iqk_cfg *iqk_cfg,
953 					const struct iqk_backup_regs *backup)
954 {
955 	rtw8723d_iqk_restore_lte_path_gnt(rtwdev, backup);
956 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
957 
958 	/* leave IQK mode */
959 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
960 	mdelay(1);
961 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x0);
962 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, BIT(0), 0x0);
963 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, BIT(0), 0x0);
964 }
965 
966 static u8 rtw8723d_iqk_tx_path(struct rtw_dev *rtwdev,
967 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
968 			       const struct iqk_backup_regs *backup)
969 {
970 	u8 status;
971 
972 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s TXIQK!!\n", iqk_cfg->name);
973 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s TXIQK = 0x%x\n",
974 		iqk_cfg->name,
975 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
976 
977 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
978 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
979 	mdelay(1);
980 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
981 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00004);
982 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005d);
983 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xBFFE0);
984 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
985 
986 	/* IQK setting */
987 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x08008c0c);
988 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
989 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, iqk_cfg->val_txiqk_pi);
990 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160200);
991 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
992 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
993 
994 	/* LOK setting */
995 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
996 
997 	/* PA, PAD setting */
998 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
999 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
1000 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x1E0, 0x3);
1001 	rtw_write_rf(rtwdev, RF_PATH_A, RF_RXIQGEN, 0x1F, 0xf);
1002 
1003 	/* LOK setting for 8723D */
1004 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x10, 0x1);
1005 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_bspad, 0x1, 0x1);
1006 
1007 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
1008 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
1009 
1010 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s TXIQK = 0x%x\n",
1011 		iqk_cfg->name,
1012 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
1013 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s TXIQK = 0x%x\n",
1014 		iqk_cfg->name,
1015 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
1016 
1017 	rtw8723d_iqk_one_shot(rtwdev, true, iqk_cfg);
1018 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
1019 
1020 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
1021 
1022 	return status;
1023 }
1024 
1025 static u8 rtw8723d_iqk_rx_path(struct rtw_dev *rtwdev,
1026 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
1027 			       const struct iqk_backup_regs *backup)
1028 {
1029 	u32 tx_x, tx_y;
1030 	u8 status;
1031 
1032 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK Step1!!\n",
1033 		iqk_cfg->name);
1034 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK1 = 0x%x\n",
1035 		iqk_cfg->name,
1036 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
1037 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
1038 
1039 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1040 
1041 	/* IQK setting */
1042 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
1043 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1044 
1045 	/* path IQK setting */
1046 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
1047 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
1048 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
1049 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
1050 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82160000);
1051 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160000);
1052 
1053 	/* LOK setting */
1054 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
1055 
1056 	/* RXIQK mode */
1057 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
1058 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00006);
1059 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
1060 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xa7ffb);
1061 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
1062 
1063 	/* PA/PAD=0 */
1064 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
1065 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
1066 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
1067 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
1068 
1069 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1@ path %s RXIQK1 = 0x%x\n",
1070 		iqk_cfg->name,
1071 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
1072 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2@ path %s RXIQK1 = 0x%x\n",
1073 		iqk_cfg->name,
1074 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
1075 
1076 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
1077 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
1078 
1079 	if (!status)
1080 		goto restore;
1081 
1082 	/* second round */
1083 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
1084 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
1085 
1086 	rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
1087 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
1088 		rtw_read32(rtwdev, REG_TXIQK_11N),
1089 		BIT_SET_TXIQK_11N(tx_x, tx_y));
1090 
1091 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK STEP2!!\n",
1092 		iqk_cfg->name);
1093 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK2 = 0x%x\n",
1094 		iqk_cfg->name,
1095 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
1096 
1097 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1098 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
1099 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
1100 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
1101 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
1102 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82170000);
1103 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28171400);
1104 
1105 	/* LOK setting */
1106 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
1107 
1108 	/* RXIQK mode */
1109 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1110 	mdelay(1);
1111 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x80000, 0x1);
1112 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00007);
1113 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
1114 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xb3fdb);
1115 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
1116 
1117 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s RXIQK2 = 0x%x\n",
1118 		iqk_cfg->name,
1119 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
1120 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s RXIQK2 = 0x%x\n",
1121 		iqk_cfg->name,
1122 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
1123 
1124 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
1125 	status |= rtw8723d_iqk_check_rx_failed(rtwdev, iqk_cfg);
1126 
1127 restore:
1128 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
1129 
1130 	return status;
1131 }
1132 
1133 static
1134 void rtw8723d_iqk_fill_s1_matrix(struct rtw_dev *rtwdev, const s32 result[])
1135 {
1136 	s32 oldval_1;
1137 	s32 x, y;
1138 	s32 tx1_a, tx1_a_ext;
1139 	s32 tx1_c, tx1_c_ext;
1140 
1141 	if (result[IQK_S1_TX_X] == 0)
1142 		return;
1143 
1144 	oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1145 				   BIT_MASK_TXIQ_ELM_D);
1146 
1147 	x = iqkxy_to_s32(result[IQK_S1_TX_X]);
1148 	tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
1149 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1150 			 BIT_MASK_TXIQ_ELM_A, tx1_a);
1151 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
1152 			 BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
1153 
1154 	y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
1155 	tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
1156 	rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1157 			 BIT_SET_TXIQ_ELM_C1(tx1_c));
1158 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1159 			 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
1160 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
1161 			 BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
1162 
1163 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1164 		"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
1165 		x, tx1_a, oldval_1);
1166 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1167 		"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
1168 
1169 	if (result[IQK_S1_RX_X] == 0)
1170 		return;
1171 
1172 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_X,
1173 			 result[IQK_S1_RX_X]);
1174 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_Y1,
1175 			 BIT_SET_RXIQ_S1_Y1(result[IQK_S1_RX_Y]));
1176 	rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
1177 			 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
1178 }
1179 
1180 static
1181 void rtw8723d_iqk_fill_s0_matrix(struct rtw_dev *rtwdev, const s32 result[])
1182 {
1183 	s32 oldval_0;
1184 	s32 x, y;
1185 	s32 tx0_a, tx0_a_ext;
1186 	s32 tx0_c, tx0_c_ext;
1187 
1188 	if (result[IQK_S0_TX_X] == 0)
1189 		return;
1190 
1191 	oldval_0 = rtw_read32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0);
1192 
1193 	x = iqkxy_to_s32(result[IQK_S0_TX_X]);
1194 	tx0_a = iqk_mult(x, oldval_0, &tx0_a_ext);
1195 
1196 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, tx0_a);
1197 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, tx0_a_ext);
1198 
1199 	y = iqkxy_to_s32(result[IQK_S0_TX_Y]);
1200 	tx0_c = iqk_mult(y, oldval_0, &tx0_c_ext);
1201 
1202 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, tx0_c);
1203 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, tx0_c_ext);
1204 
1205 	if (result[IQK_S0_RX_X] == 0)
1206 		return;
1207 
1208 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_X_S0,
1209 			 result[IQK_S0_RX_X]);
1210 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_Y_S0,
1211 			 result[IQK_S0_RX_Y]);
1212 }
1213 
1214 static void rtw8723d_iqk_path_adda_on(struct rtw_dev *rtwdev)
1215 {
1216 	int i;
1217 
1218 	for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1219 		rtw_write32(rtwdev, iqk_adda_regs[i], 0x03c00016);
1220 }
1221 
1222 static void rtw8723d_iqk_config_mac(struct rtw_dev *rtwdev)
1223 {
1224 	rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
1225 }
1226 
1227 static
1228 void rtw8723d_iqk_rf_standby(struct rtw_dev *rtwdev, enum rtw_rf_path path)
1229 {
1230 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path-%s standby mode!\n",
1231 		path == RF_PATH_A ? "S1" : "S0");
1232 
1233 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1234 	mdelay(1);
1235 	rtw_write_rf(rtwdev, path, RF_MODE, RFREG_MASK, 0x10000);
1236 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
1237 }
1238 
1239 static
1240 bool rtw8723d_iqk_similarity_cmp(struct rtw_dev *rtwdev, s32 result[][IQK_NR],
1241 				 u8 c1, u8 c2)
1242 {
1243 	u32 i, j, diff;
1244 	u32 bitmap = 0;
1245 	u8 candidate[PATH_NR] = {IQK_ROUND_INVALID, IQK_ROUND_INVALID};
1246 	bool ret = true;
1247 
1248 	s32 tmp1, tmp2;
1249 
1250 	for (i = 0; i < IQK_NR; i++) {
1251 		tmp1 = iqkxy_to_s32(result[c1][i]);
1252 		tmp2 = iqkxy_to_s32(result[c2][i]);
1253 
1254 		diff = abs(tmp1 - tmp2);
1255 
1256 		if (diff <= MAX_TOLERANCE)
1257 			continue;
1258 
1259 		if ((i == IQK_S1_RX_X || i == IQK_S0_RX_X) && !bitmap) {
1260 			if (result[c1][i] + result[c1][i + 1] == 0)
1261 				candidate[i / IQK_SX_NR] = c2;
1262 			else if (result[c2][i] + result[c2][i + 1] == 0)
1263 				candidate[i / IQK_SX_NR] = c1;
1264 			else
1265 				bitmap |= BIT(i);
1266 		} else {
1267 			bitmap |= BIT(i);
1268 		}
1269 	}
1270 
1271 	if (bitmap != 0)
1272 		goto check_sim;
1273 
1274 	for (i = 0; i < PATH_NR; i++) {
1275 		if (candidate[i] == IQK_ROUND_INVALID)
1276 			continue;
1277 
1278 		for (j = i * IQK_SX_NR; j < i * IQK_SX_NR + 2; j++)
1279 			result[IQK_ROUND_HYBRID][j] = result[candidate[i]][j];
1280 		ret = false;
1281 	}
1282 
1283 	return ret;
1284 
1285 check_sim:
1286 	for (i = 0; i < IQK_NR; i++) {
1287 		j = i & ~1;	/* 2 bits are a pair for IQ[X, Y] */
1288 		if (bitmap & GENMASK(j + 1, j))
1289 			continue;
1290 
1291 		result[IQK_ROUND_HYBRID][i] = result[c1][i];
1292 	}
1293 
1294 	return false;
1295 }
1296 
1297 static
1298 void rtw8723d_iqk_precfg_path(struct rtw_dev *rtwdev, enum rtw8723d_path path)
1299 {
1300 	if (path == PATH_S0) {
1301 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_A);
1302 		rtw8723d_iqk_path_adda_on(rtwdev);
1303 	}
1304 
1305 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
1306 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
1307 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1308 
1309 	if (path == PATH_S1) {
1310 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_B);
1311 		rtw8723d_iqk_path_adda_on(rtwdev);
1312 	}
1313 }
1314 
1315 static
1316 void rtw8723d_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
1317 			    const struct iqk_backup_regs *backup)
1318 {
1319 	u32 i;
1320 	u8 s1_ok, s0_ok;
1321 
1322 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1323 		"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
1324 
1325 	rtw8723d_iqk_path_adda_on(rtwdev);
1326 	rtw8723d_iqk_config_mac(rtwdev);
1327 	rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
1328 	rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05611);
1329 	rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
1330 	rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204200);
1331 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S1);
1332 
1333 	for (i = 0; i < PATH_IQK_RETRY; i++) {
1334 		s1_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
1335 		if (s1_ok == IQK_TX_OK) {
1336 			rtw_dbg(rtwdev, RTW_DBG_RFK,
1337 				"[IQK] path S1 Tx IQK Success!!\n");
1338 			result[t][IQK_S1_TX_X] =
1339 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
1340 			result[t][IQK_S1_TX_Y] =
1341 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
1342 			break;
1343 		}
1344 
1345 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Tx IQK Fail!!\n");
1346 		result[t][IQK_S1_TX_X] = 0x100;
1347 		result[t][IQK_S1_TX_Y] = 0x0;
1348 	}
1349 
1350 	for (i = 0; i < PATH_IQK_RETRY; i++) {
1351 		s1_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
1352 		if (s1_ok == (IQK_TX_OK | IQK_RX_OK)) {
1353 			rtw_dbg(rtwdev, RTW_DBG_RFK,
1354 				"[IQK] path S1 Rx IQK Success!!\n");
1355 			result[t][IQK_S1_RX_X] =
1356 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
1357 			result[t][IQK_S1_RX_Y] =
1358 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
1359 			break;
1360 		}
1361 
1362 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Rx IQK Fail!!\n");
1363 		result[t][IQK_S1_RX_X] = 0x100;
1364 		result[t][IQK_S1_RX_Y] = 0x0;
1365 	}
1366 
1367 	if (s1_ok == 0x0)
1368 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 IQK is failed!!\n");
1369 
1370 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S0);
1371 
1372 	for (i = 0; i < PATH_IQK_RETRY; i++) {
1373 		s0_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
1374 		if (s0_ok == IQK_TX_OK) {
1375 			rtw_dbg(rtwdev, RTW_DBG_RFK,
1376 				"[IQK] path S0 Tx IQK Success!!\n");
1377 			result[t][IQK_S0_TX_X] =
1378 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
1379 			result[t][IQK_S0_TX_Y] =
1380 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
1381 			break;
1382 		}
1383 
1384 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Tx IQK Fail!!\n");
1385 		result[t][IQK_S0_TX_X] = 0x100;
1386 		result[t][IQK_S0_TX_Y] = 0x0;
1387 	}
1388 
1389 	for (i = 0; i < PATH_IQK_RETRY; i++) {
1390 		s0_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
1391 		if (s0_ok == (IQK_TX_OK | IQK_RX_OK)) {
1392 			rtw_dbg(rtwdev, RTW_DBG_RFK,
1393 				"[IQK] path S0 Rx IQK Success!!\n");
1394 
1395 			result[t][IQK_S0_RX_X] =
1396 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
1397 			result[t][IQK_S0_RX_Y] =
1398 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
1399 			break;
1400 		}
1401 
1402 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Rx IQK Fail!!\n");
1403 		result[t][IQK_S0_RX_X] = 0x100;
1404 		result[t][IQK_S0_RX_Y] = 0x0;
1405 	}
1406 
1407 	if (s0_ok == 0x0)
1408 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 IQK is failed!!\n");
1409 
1410 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1411 	mdelay(1);
1412 
1413 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1414 		"[IQK] back to BB mode, load original value!\n");
1415 }
1416 
1417 static void rtw8723d_phy_calibration(struct rtw_dev *rtwdev)
1418 {
1419 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1420 	s32 result[IQK_ROUND_SIZE][IQK_NR];
1421 	struct iqk_backup_regs backup;
1422 	u8 i, j;
1423 	u8 final_candidate = IQK_ROUND_INVALID;
1424 	bool good;
1425 
1426 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!!!\n");
1427 
1428 	memset(result, 0, sizeof(result));
1429 
1430 	rtw8723d_iqk_backup_path_ctrl(rtwdev, &backup);
1431 	rtw8723d_iqk_backup_lte_path_gnt(rtwdev, &backup);
1432 	rtw8723d_iqk_backup_regs(rtwdev, &backup);
1433 
1434 	for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
1435 		rtw8723d_iqk_config_path_ctrl(rtwdev);
1436 		rtw8723d_iqk_config_lte_path_gnt(rtwdev);
1437 
1438 		rtw8723d_iqk_one_round(rtwdev, result, i, &backup);
1439 
1440 		if (i > IQK_ROUND_0)
1441 			rtw8723d_iqk_restore_regs(rtwdev, &backup);
1442 		rtw8723d_iqk_restore_lte_path_gnt(rtwdev, &backup);
1443 		rtw8723d_iqk_restore_path_ctrl(rtwdev, &backup);
1444 
1445 		for (j = IQK_ROUND_0; j < i; j++) {
1446 			good = rtw8723d_iqk_similarity_cmp(rtwdev, result, j, i);
1447 
1448 			if (good) {
1449 				final_candidate = j;
1450 				rtw_dbg(rtwdev, RTW_DBG_RFK,
1451 					"[IQK] cmp %d:%d final_candidate is %x\n",
1452 					j, i, final_candidate);
1453 				goto iqk_done;
1454 			}
1455 		}
1456 	}
1457 
1458 	if (final_candidate == IQK_ROUND_INVALID) {
1459 		s32 reg_tmp = 0;
1460 
1461 		for (i = 0; i < IQK_NR; i++)
1462 			reg_tmp += result[IQK_ROUND_HYBRID][i];
1463 
1464 		if (reg_tmp != 0) {
1465 			final_candidate = IQK_ROUND_HYBRID;
1466 		} else {
1467 			WARN(1, "IQK is failed\n");
1468 			goto out;
1469 		}
1470 	}
1471 
1472 iqk_done:
1473 	rtw8723d_iqk_fill_s1_matrix(rtwdev, result[final_candidate]);
1474 	rtw8723d_iqk_fill_s0_matrix(rtwdev, result[final_candidate]);
1475 
1476 	dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
1477 	dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
1478 	dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
1479 	dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
1480 	dm_info->iqk.done = true;
1481 
1482 out:
1483 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
1484 
1485 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
1486 		final_candidate);
1487 
1488 	for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
1489 		rtw_dbg(rtwdev, RTW_DBG_RFK,
1490 			"[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",
1491 			i,
1492 			result[i][0], result[i][1], result[i][2], result[i][3],
1493 			result[i][4], result[i][5], result[i][6], result[i][7],
1494 			final_candidate == i ? "(final candidate)" : "");
1495 
1496 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1497 		"[IQK]0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
1498 		rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
1499 		rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
1500 		rtw_read32(rtwdev, REG_A_RXIQI),
1501 		rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
1502 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1503 		"[IQK]0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
1504 		rtw_read32(rtwdev, REG_TXIQ_AB_S0),
1505 		rtw_read32(rtwdev, REG_TXIQ_CD_S0),
1506 		rtw_read32(rtwdev, REG_RXIQ_AB_S0));
1507 
1508 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] finished\n");
1509 }
1510 
1511 static void rtw8723d_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
1512 {
1513 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1514 	u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
1515 	u8 cck_n_rx;
1516 
1517 	rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
1518 		dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
1519 
1520 	if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
1521 		return;
1522 
1523 	cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
1524 		    rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
1525 	rtw_dbg(rtwdev, RTW_DBG_PHY,
1526 		"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
1527 		rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
1528 		dm_info->cck_pd_default + new_lvl * 2,
1529 		pd[new_lvl], dm_info->cck_fa_avg);
1530 
1531 	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
1532 
1533 	dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
1534 	rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
1535 	rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
1536 			 dm_info->cck_pd_default + new_lvl * 2);
1537 }
1538 
1539 /* for coex */
1540 static void rtw8723d_coex_cfg_init(struct rtw_dev *rtwdev)
1541 {
1542 	/* enable TBTT nterrupt */
1543 	rtw_write8_set(rtwdev, REG_BCN_CTRL, BIT_EN_BCN_FUNCTION);
1544 
1545 	/* BT report packet sample rate	 */
1546 	/* 0x790[5:0]=0x5 */
1547 	rtw_write8_mask(rtwdev, REG_BT_TDMA_TIME, BIT_MASK_SAMPLE_RATE, 0x5);
1548 
1549 	/* enable BT counter statistics */
1550 	rtw_write8(rtwdev, REG_BT_STAT_CTRL, 0x1);
1551 
1552 	/* enable PTA (3-wire function form BT side) */
1553 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_BT_PTA_EN);
1554 	rtw_write32_set(rtwdev, REG_GPIO_MUXCFG, BIT_PO_BT_PTA_PINS);
1555 
1556 	/* enable PTA (tx/rx signal form WiFi side) */
1557 	rtw_write8_set(rtwdev, REG_QUEUE_CTRL, BIT_PTA_WL_TX_EN);
1558 }
1559 
1560 static void rtw8723d_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1561 {
1562 }
1563 
1564 static void rtw8723d_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1565 {
1566 	rtw_write8_mask(rtwdev, REG_LEDCFG2, BIT(6), 0);
1567 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(0), 0);
1568 	rtw_write8_mask(rtwdev, REG_GPIO_INTM + 2, BIT(4), 0);
1569 	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT(1), 0);
1570 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(1), 0);
1571 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT(7), 0);
1572 	rtw_write8_mask(rtwdev, REG_SYS_CLKR + 1, BIT(1), 0);
1573 	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT(3), 0);
1574 }
1575 
1576 static void rtw8723d_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1577 {
1578 	struct rtw_efuse *efuse = &rtwdev->efuse;
1579 	struct rtw_coex *coex = &rtwdev->coex;
1580 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1581 	bool aux = efuse->bt_setting & BIT(6);
1582 
1583 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1584 	coex_rfe->ant_switch_polarity = 0;
1585 	coex_rfe->ant_switch_exist = false;
1586 	coex_rfe->ant_switch_with_bt = false;
1587 	coex_rfe->ant_switch_diversity = false;
1588 	coex_rfe->wlg_at_btg = true;
1589 
1590 	/* decide antenna at main or aux */
1591 	if (efuse->share_ant) {
1592 		if (aux)
1593 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x80);
1594 		else
1595 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x200);
1596 	} else {
1597 		if (aux)
1598 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x280);
1599 		else
1600 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x0);
1601 	}
1602 
1603 	/* disable LTE coex in wifi side */
1604 	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
1605 	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1606 	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1607 }
1608 
1609 static void rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1610 {
1611 	struct rtw_coex *coex = &rtwdev->coex;
1612 	struct rtw_coex_dm *coex_dm = &coex->dm;
1613 	static const u8	wl_tx_power[] = {0xb2, 0x90};
1614 	u8 pwr;
1615 
1616 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1617 		return;
1618 
1619 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
1620 
1621 	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1622 		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1623 
1624 	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1625 
1626 	rtw_write8(rtwdev, REG_ANA_PARAM1 + 3, pwr);
1627 }
1628 
1629 static void rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1630 {
1631 	struct rtw_coex *coex = &rtwdev->coex;
1632 	struct rtw_coex_dm *coex_dm = &coex->dm;
1633 	/* WL Rx Low gain on */
1634 	static const u32 wl_rx_low_gain_on[] = {
1635 		0xec120101, 0xeb130101, 0xce140101, 0xcd150101, 0xcc160101,
1636 		0xcb170101, 0xca180101, 0x8d190101, 0x8c1a0101, 0x8b1b0101,
1637 		0x4f1c0101, 0x4e1d0101, 0x4d1e0101, 0x4c1f0101, 0x0e200101,
1638 		0x0d210101, 0x0c220101, 0x0b230101, 0xcf240001, 0xce250001,
1639 		0xcd260001, 0xcc270001, 0x8f280001
1640 	};
1641 	/* WL Rx Low gain off */
1642 	static const u32 wl_rx_low_gain_off[] = {
1643 		0xec120101, 0xeb130101, 0xea140101, 0xe9150101, 0xe8160101,
1644 		0xe7170101, 0xe6180101, 0xe5190101, 0xe41a0101, 0xe31b0101,
1645 		0xe21c0101, 0xe11d0101, 0xe01e0101, 0x861f0101, 0x85200101,
1646 		0x84210101, 0x83220101, 0x82230101, 0x81240101, 0x80250101,
1647 		0x44260101, 0x43270101, 0x42280101
1648 	};
1649 	u8 i;
1650 
1651 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1652 		return;
1653 
1654 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
1655 
1656 	if (coex_dm->cur_wl_rx_low_gain_en) {
1657 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1658 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_on[i]);
1659 	} else {
1660 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1661 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_off[i]);
1662 	}
1663 }
1664 
1665 static u8 rtw8723d_pwrtrack_get_limit_ofdm(struct rtw_dev *rtwdev)
1666 {
1667 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1668 	u8 tx_rate = dm_info->tx_rate;
1669 	u8 limit_ofdm = 30;
1670 
1671 	switch (tx_rate) {
1672 	case DESC_RATE1M...DESC_RATE5_5M:
1673 	case DESC_RATE11M:
1674 		break;
1675 	case DESC_RATE6M...DESC_RATE48M:
1676 		limit_ofdm = 36;
1677 		break;
1678 	case DESC_RATE54M:
1679 		limit_ofdm = 34;
1680 		break;
1681 	case DESC_RATEMCS0...DESC_RATEMCS2:
1682 		limit_ofdm = 38;
1683 		break;
1684 	case DESC_RATEMCS3...DESC_RATEMCS4:
1685 		limit_ofdm = 36;
1686 		break;
1687 	case DESC_RATEMCS5...DESC_RATEMCS7:
1688 		limit_ofdm = 34;
1689 		break;
1690 	default:
1691 		rtw_warn(rtwdev, "pwrtrack unhandled tx_rate 0x%x\n", tx_rate);
1692 		break;
1693 	}
1694 
1695 	return limit_ofdm;
1696 }
1697 
1698 static void rtw8723d_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
1699 					      u32 ofdm_swing, u8 rf_path)
1700 {
1701 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1702 	s32 ele_A, ele_D, ele_C;
1703 	s32 ele_A_ext, ele_C_ext, ele_D_ext;
1704 	s32 iqk_result_x;
1705 	s32 iqk_result_y;
1706 	s32 value32;
1707 
1708 	switch (rf_path) {
1709 	default:
1710 	case RF_PATH_A:
1711 		iqk_result_x = dm_info->iqk.result.s1_x;
1712 		iqk_result_y = dm_info->iqk.result.s1_y;
1713 		break;
1714 	case RF_PATH_B:
1715 		iqk_result_x = dm_info->iqk.result.s0_x;
1716 		iqk_result_y = dm_info->iqk.result.s0_y;
1717 		break;
1718 	}
1719 
1720 	/* new element D */
1721 	ele_D = OFDM_SWING_D(ofdm_swing);
1722 	iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
1723 	/* new element A */
1724 	iqk_result_x = iqkxy_to_s32(iqk_result_x);
1725 	ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
1726 	/* new element C */
1727 	iqk_result_y = iqkxy_to_s32(iqk_result_y);
1728 	ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
1729 
1730 	switch (rf_path) {
1731 	case RF_PATH_A:
1732 	default:
1733 		/* write new elements A, C, D, and element B is always 0 */
1734 		value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
1735 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
1736 		value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
1737 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1738 				 value32);
1739 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1740 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1741 		value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
1742 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1743 		break;
1744 
1745 	case RF_PATH_B:
1746 		/* write new elements A, C, D, and element B is always 0 */
1747 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0, ele_D);
1748 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, ele_C);
1749 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, ele_A);
1750 
1751 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0,
1752 				 ele_D_ext);
1753 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0,
1754 				 ele_A_ext);
1755 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0,
1756 				 ele_C_ext);
1757 		break;
1758 	}
1759 }
1760 
1761 static void rtw8723d_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
1762 				    u8 rf_path)
1763 {
1764 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1765 	s32 value32;
1766 	u32 ofdm_swing;
1767 
1768 	if (ofdm_index >= RTW_OFDM_SWING_TABLE_SIZE)
1769 		ofdm_index = RTW_OFDM_SWING_TABLE_SIZE - 1;
1770 	else if (ofdm_index < 0)
1771 		ofdm_index = 0;
1772 
1773 	ofdm_swing = rtw8723d_ofdm_swing_table[ofdm_index];
1774 
1775 	if (dm_info->iqk.done) {
1776 		rtw8723d_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
1777 		return;
1778 	}
1779 
1780 	switch (rf_path) {
1781 	case RF_PATH_A:
1782 	default:
1783 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
1784 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1785 				 0x00);
1786 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1787 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1788 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1789 		break;
1790 
1791 	case RF_PATH_B:
1792 		/* image S1:c80 to S0:Cd0 and Cd4 */
1793 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0,
1794 				 OFDM_SWING_A(ofdm_swing));
1795 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_B_S0,
1796 				 OFDM_SWING_B(ofdm_swing));
1797 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0,
1798 				 OFDM_SWING_C(ofdm_swing));
1799 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0,
1800 				 OFDM_SWING_D(ofdm_swing));
1801 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0, 0x0);
1802 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, 0x0);
1803 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, 0x0);
1804 		break;
1805 	}
1806 }
1807 
1808 static void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1809 					   s8 txagc_idx)
1810 {
1811 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1812 
1813 	dm_info->txagc_remnant_ofdm = txagc_idx;
1814 
1815 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
1816 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
1817 }
1818 
1819 static void rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1820 					  s8 txagc_idx)
1821 {
1822 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1823 
1824 	dm_info->txagc_remnant_cck = txagc_idx;
1825 
1826 	rtw_write32_mask(rtwdev, 0xab4, 0x000007FF,
1827 			 rtw8723d_cck_swing_table[swing_idx]);
1828 }
1829 
1830 static void rtw8723d_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1831 {
1832 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1833 	struct rtw_hal *hal = &rtwdev->hal;
1834 	u8 limit_ofdm;
1835 	u8 limit_cck = 40;
1836 	s8 final_ofdm_swing_index;
1837 	s8 final_cck_swing_index;
1838 
1839 	limit_ofdm = rtw8723d_pwrtrack_get_limit_ofdm(rtwdev);
1840 
1841 	final_ofdm_swing_index = RTW_DEF_OFDM_SWING_INDEX +
1842 				 dm_info->delta_power_index[path];
1843 	final_cck_swing_index = RTW_DEF_CCK_SWING_INDEX +
1844 				dm_info->delta_power_index[path];
1845 
1846 	if (final_ofdm_swing_index > limit_ofdm)
1847 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
1848 					       final_ofdm_swing_index - limit_ofdm);
1849 	else if (final_ofdm_swing_index < 0)
1850 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, 0,
1851 					       final_ofdm_swing_index);
1852 	else
1853 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
1854 
1855 	if (final_cck_swing_index > limit_cck)
1856 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
1857 					      final_cck_swing_index - limit_cck);
1858 	else if (final_cck_swing_index < 0)
1859 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, 0,
1860 					      final_cck_swing_index);
1861 	else
1862 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
1863 
1864 	rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
1865 }
1866 
1867 static void rtw8723d_pwrtrack_set_xtal(struct rtw_dev *rtwdev, u8 therm_path,
1868 				       u8 delta)
1869 {
1870 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1871 	const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
1872 	const s8 *pwrtrk_xtal;
1873 	s8 xtal_cap;
1874 
1875 	if (dm_info->thermal_avg[therm_path] >
1876 	    rtwdev->efuse.thermal_meter[therm_path])
1877 		pwrtrk_xtal = tbl->pwrtrk_xtal_p;
1878 	else
1879 		pwrtrk_xtal = tbl->pwrtrk_xtal_n;
1880 
1881 	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
1882 	xtal_cap = clamp_t(s8, xtal_cap + pwrtrk_xtal[delta], 0, 0x3F);
1883 	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
1884 			 xtal_cap | (xtal_cap << 6));
1885 }
1886 
1887 static void rtw8723d_phy_pwrtrack(struct rtw_dev *rtwdev)
1888 {
1889 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1890 	struct rtw_swing_table swing_table;
1891 	u8 thermal_value, delta, path;
1892 	bool do_iqk = false;
1893 
1894 	rtw_phy_config_swing_table(rtwdev, &swing_table);
1895 
1896 	if (rtwdev->efuse.thermal_meter[0] == 0xff)
1897 		return;
1898 
1899 	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1900 
1901 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1902 
1903 	do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
1904 
1905 	if (do_iqk)
1906 		rtw8723d_lck(rtwdev);
1907 
1908 	if (dm_info->pwr_trk_init_trigger)
1909 		dm_info->pwr_trk_init_trigger = false;
1910 	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1911 						   RF_PATH_A))
1912 		goto iqk;
1913 
1914 	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1915 
1916 	delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
1917 
1918 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1919 		s8 delta_cur, delta_last;
1920 
1921 		delta_last = dm_info->delta_power_index[path];
1922 		delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
1923 							path, RF_PATH_A, delta);
1924 		if (delta_last == delta_cur)
1925 			continue;
1926 
1927 		dm_info->delta_power_index[path] = delta_cur;
1928 		rtw8723d_pwrtrack_set(rtwdev, path);
1929 	}
1930 
1931 	rtw8723d_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
1932 
1933 iqk:
1934 	if (do_iqk)
1935 		rtw8723d_phy_calibration(rtwdev);
1936 }
1937 
1938 static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
1939 {
1940 	struct rtw_efuse *efuse = &rtwdev->efuse;
1941 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1942 
1943 	if (efuse->power_track_type != 0)
1944 		return;
1945 
1946 	if (!dm_info->pwr_trk_triggered) {
1947 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1948 			     GENMASK(17, 16), 0x03);
1949 		dm_info->pwr_trk_triggered = true;
1950 		return;
1951 	}
1952 
1953 	rtw8723d_phy_pwrtrack(rtwdev);
1954 	dm_info->pwr_trk_triggered = false;
1955 }
1956 
1957 static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev,
1958 					  struct rtw_tx_pkt_info *pkt_info,
1959 					  u8 *txdesc)
1960 {
1961 	size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */
1962 	__le16 chksum = 0;
1963 	__le16 *data = (__le16 *)(txdesc);
1964 
1965 	SET_TX_DESC_TXDESC_CHECKSUM(txdesc, 0x0000);
1966 
1967 	while (words--)
1968 		chksum ^= *data++;
1969 
1970 	chksum = ~chksum;
1971 
1972 	SET_TX_DESC_TXDESC_CHECKSUM(txdesc, __le16_to_cpu(chksum));
1973 }
1974 
1975 static struct rtw_chip_ops rtw8723d_ops = {
1976 	.phy_set_param		= rtw8723d_phy_set_param,
1977 	.read_efuse		= rtw8723d_read_efuse,
1978 	.query_rx_desc		= rtw8723d_query_rx_desc,
1979 	.set_channel		= rtw8723d_set_channel,
1980 	.mac_init		= rtw8723d_mac_init,
1981 	.shutdown		= rtw8723d_shutdown,
1982 	.read_rf		= rtw_phy_read_rf_sipi,
1983 	.write_rf		= rtw_phy_write_rf_reg_sipi,
1984 	.set_tx_power_index	= rtw8723d_set_tx_power_index,
1985 	.set_antenna		= NULL,
1986 	.cfg_ldo25		= rtw8723d_cfg_ldo25,
1987 	.efuse_grant		= rtw8723d_efuse_grant,
1988 	.false_alarm_statistics	= rtw8723d_false_alarm_statistics,
1989 	.phy_calibration	= rtw8723d_phy_calibration,
1990 	.cck_pd_set		= rtw8723d_phy_cck_pd_set,
1991 	.pwr_track		= rtw8723d_pwr_track,
1992 	.config_bfee		= NULL,
1993 	.set_gid_table		= NULL,
1994 	.cfg_csi_rate		= NULL,
1995 	.fill_txdesc_checksum	= rtw8723d_fill_txdesc_checksum,
1996 
1997 	.coex_set_init		= rtw8723d_coex_cfg_init,
1998 	.coex_set_ant_switch	= NULL,
1999 	.coex_set_gnt_fix	= rtw8723d_coex_cfg_gnt_fix,
2000 	.coex_set_gnt_debug	= rtw8723d_coex_cfg_gnt_debug,
2001 	.coex_set_rfe_type	= rtw8723d_coex_cfg_rfe_type,
2002 	.coex_set_wl_tx_power	= rtw8723d_coex_cfg_wl_tx_power,
2003 	.coex_set_wl_rx_gain	= rtw8723d_coex_cfg_wl_rx_gain,
2004 };
2005 
2006 /* Shared-Antenna Coex Table */
2007 static const struct coex_table_para table_sant_8723d[] = {
2008 	{0xffffffff, 0xffffffff}, /* case-0 */
2009 	{0x55555555, 0x55555555},
2010 	{0x66555555, 0x66555555},
2011 	{0xaaaaaaaa, 0xaaaaaaaa},
2012 	{0x5a5a5a5a, 0x5a5a5a5a},
2013 	{0xfafafafa, 0xfafafafa}, /* case-5 */
2014 	{0x6a5a5555, 0xaaaaaaaa},
2015 	{0x6a5a56aa, 0x6a5a56aa},
2016 	{0x6a5a5a5a, 0x6a5a5a5a},
2017 	{0x66555555, 0x5a5a5a5a},
2018 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
2019 	{0x66555555, 0x6a5a5aaa},
2020 	{0x66555555, 0x5a5a5aaa},
2021 	{0x66555555, 0x6aaa5aaa},
2022 	{0x66555555, 0xaaaa5aaa},
2023 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
2024 	{0xffff55ff, 0xfafafafa},
2025 	{0xffff55ff, 0x6afa5afa},
2026 	{0xaaffffaa, 0xfafafafa},
2027 	{0xaa5555aa, 0x5a5a5a5a},
2028 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
2029 	{0xaa5555aa, 0xaaaaaaaa},
2030 	{0xffffffff, 0x5a5a5a5a},
2031 	{0xffffffff, 0x5a5a5a5a},
2032 	{0xffffffff, 0x55555555},
2033 	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
2034 	{0x55555555, 0x5a5a5a5a},
2035 	{0x55555555, 0xaaaaaaaa},
2036 	{0x55555555, 0x6a5a6a5a},
2037 	{0x66556655, 0x66556655},
2038 	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
2039 	{0xffffffff, 0x5aaa5aaa},
2040 	{0x56555555, 0x5a5a5aaa},
2041 };
2042 
2043 /* Non-Shared-Antenna Coex Table */
2044 static const struct coex_table_para table_nsant_8723d[] = {
2045 	{0xffffffff, 0xffffffff}, /* case-100 */
2046 	{0x55555555, 0x55555555},
2047 	{0x66555555, 0x66555555},
2048 	{0xaaaaaaaa, 0xaaaaaaaa},
2049 	{0x5a5a5a5a, 0x5a5a5a5a},
2050 	{0xfafafafa, 0xfafafafa}, /* case-105 */
2051 	{0x5afa5afa, 0x5afa5afa},
2052 	{0x55555555, 0xfafafafa},
2053 	{0x66555555, 0xfafafafa},
2054 	{0x66555555, 0x5a5a5a5a},
2055 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
2056 	{0x66555555, 0xaaaaaaaa},
2057 	{0xffff55ff, 0xfafafafa},
2058 	{0xffff55ff, 0x5afa5afa},
2059 	{0xffff55ff, 0xaaaaaaaa},
2060 	{0xffff55ff, 0xffff55ff}, /* case-115 */
2061 	{0xaaffffaa, 0x5afa5afa},
2062 	{0xaaffffaa, 0xaaaaaaaa},
2063 	{0xffffffff, 0xfafafafa},
2064 	{0xffffffff, 0x5afa5afa},
2065 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
2066 	{0x55ff55ff, 0x5afa5afa},
2067 	{0x55ff55ff, 0xaaaaaaaa},
2068 	{0x55ff55ff, 0x55ff55ff}
2069 };
2070 
2071 /* Shared-Antenna TDMA */
2072 static const struct coex_tdma_para tdma_sant_8723d[] = {
2073 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
2074 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
2075 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
2076 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
2077 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
2078 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
2079 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
2080 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
2081 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
2082 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
2083 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
2084 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
2085 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
2086 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
2087 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
2088 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
2089 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
2090 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
2091 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
2092 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
2093 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
2094 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
2095 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
2096 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
2097 	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
2098 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
2099 	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
2100 	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
2101 };
2102 
2103 /* Non-Shared-Antenna TDMA */
2104 static const struct coex_tdma_para tdma_nsant_8723d[] = {
2105 	{ {0x00, 0x00, 0x00, 0x00, 0x01} }, /* case-100 */
2106 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
2107 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
2108 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
2109 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
2110 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
2111 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
2112 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
2113 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
2114 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
2115 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
2116 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
2117 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
2118 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
2119 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
2120 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
2121 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
2122 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
2123 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
2124 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
2125 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
2126 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
2127 };
2128 
2129 /* rssi in percentage % (dbm = % - 100) */
2130 static const u8 wl_rssi_step_8723d[] = {60, 50, 44, 30};
2131 static const u8 bt_rssi_step_8723d[] = {30, 30, 30, 30};
2132 static const struct coex_5g_afh_map afh_5g_8723d[] = { {0, 0, 0} };
2133 
2134 static const struct rtw_hw_reg btg_reg_8723d = {
2135 	.addr = REG_BTG_SEL, .mask = BIT_MASK_BTG_WL,
2136 };
2137 
2138 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
2139 static const struct coex_rf_para rf_para_tx_8723d[] = {
2140 	{0, 0, false, 7},  /* for normal */
2141 	{0, 10, false, 7}, /* for WL-CPT */
2142 	{1, 0, true, 4},
2143 	{1, 2, true, 4},
2144 	{1, 10, true, 4},
2145 	{1, 15, true, 4}
2146 };
2147 
2148 static const struct coex_rf_para rf_para_rx_8723d[] = {
2149 	{0, 0, false, 7},  /* for normal */
2150 	{0, 10, false, 7}, /* for WL-CPT */
2151 	{1, 0, true, 5},
2152 	{1, 2, true, 5},
2153 	{1, 10, true, 5},
2154 	{1, 15, true, 5}
2155 };
2156 
2157 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8723d[] = {
2158 	{0x0005,
2159 	 RTW_PWR_CUT_ALL_MSK,
2160 	 RTW_PWR_INTF_ALL_MSK,
2161 	 RTW_PWR_ADDR_MAC,
2162 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
2163 	{0x0086,
2164 	 RTW_PWR_CUT_ALL_MSK,
2165 	 RTW_PWR_INTF_SDIO_MSK,
2166 	 RTW_PWR_ADDR_SDIO,
2167 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2168 	{0x0086,
2169 	 RTW_PWR_CUT_ALL_MSK,
2170 	 RTW_PWR_INTF_SDIO_MSK,
2171 	 RTW_PWR_ADDR_SDIO,
2172 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
2173 	{0x004A,
2174 	 RTW_PWR_CUT_ALL_MSK,
2175 	 RTW_PWR_INTF_USB_MSK,
2176 	 RTW_PWR_ADDR_MAC,
2177 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2178 	{0x0005,
2179 	 RTW_PWR_CUT_ALL_MSK,
2180 	 RTW_PWR_INTF_ALL_MSK,
2181 	 RTW_PWR_ADDR_MAC,
2182 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
2183 	{0x0023,
2184 	 RTW_PWR_CUT_ALL_MSK,
2185 	 RTW_PWR_INTF_SDIO_MSK,
2186 	 RTW_PWR_ADDR_MAC,
2187 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
2188 	{0x0301,
2189 	 RTW_PWR_CUT_ALL_MSK,
2190 	 RTW_PWR_INTF_PCI_MSK,
2191 	 RTW_PWR_ADDR_MAC,
2192 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
2193 	{0xFFFF,
2194 	 RTW_PWR_CUT_ALL_MSK,
2195 	 RTW_PWR_INTF_ALL_MSK,
2196 	 0,
2197 	 RTW_PWR_CMD_END, 0, 0},
2198 };
2199 
2200 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
2201 	{0x0020,
2202 	 RTW_PWR_CUT_ALL_MSK,
2203 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2204 	 RTW_PWR_ADDR_MAC,
2205 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2206 	{0x0001,
2207 	 RTW_PWR_CUT_ALL_MSK,
2208 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2209 	 RTW_PWR_ADDR_MAC,
2210 	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
2211 	{0x0000,
2212 	 RTW_PWR_CUT_ALL_MSK,
2213 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2214 	 RTW_PWR_ADDR_MAC,
2215 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
2216 	{0x0005,
2217 	 RTW_PWR_CUT_ALL_MSK,
2218 	 RTW_PWR_INTF_ALL_MSK,
2219 	 RTW_PWR_ADDR_MAC,
2220 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
2221 	{0x0075,
2222 	 RTW_PWR_CUT_ALL_MSK,
2223 	 RTW_PWR_INTF_PCI_MSK,
2224 	 RTW_PWR_ADDR_MAC,
2225 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2226 	{0x0006,
2227 	 RTW_PWR_CUT_ALL_MSK,
2228 	 RTW_PWR_INTF_ALL_MSK,
2229 	 RTW_PWR_ADDR_MAC,
2230 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
2231 	{0x0075,
2232 	 RTW_PWR_CUT_ALL_MSK,
2233 	 RTW_PWR_INTF_PCI_MSK,
2234 	 RTW_PWR_ADDR_MAC,
2235 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2236 	{0x0006,
2237 	 RTW_PWR_CUT_ALL_MSK,
2238 	 RTW_PWR_INTF_ALL_MSK,
2239 	 RTW_PWR_ADDR_MAC,
2240 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2241 	{0x0005,
2242 	 RTW_PWR_CUT_ALL_MSK,
2243 	 RTW_PWR_INTF_ALL_MSK,
2244 	 RTW_PWR_ADDR_MAC,
2245 	 RTW_PWR_CMD_POLLING, (BIT(1) | BIT(0)), 0},
2246 	{0x0005,
2247 	 RTW_PWR_CUT_ALL_MSK,
2248 	 RTW_PWR_INTF_ALL_MSK,
2249 	 RTW_PWR_ADDR_MAC,
2250 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
2251 	{0x0005,
2252 	 RTW_PWR_CUT_ALL_MSK,
2253 	 RTW_PWR_INTF_ALL_MSK,
2254 	 RTW_PWR_ADDR_MAC,
2255 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
2256 	{0x0005,
2257 	 RTW_PWR_CUT_ALL_MSK,
2258 	 RTW_PWR_INTF_ALL_MSK,
2259 	 RTW_PWR_ADDR_MAC,
2260 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2261 	{0x0005,
2262 	 RTW_PWR_CUT_ALL_MSK,
2263 	 RTW_PWR_INTF_ALL_MSK,
2264 	 RTW_PWR_ADDR_MAC,
2265 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
2266 	{0x0010,
2267 	 RTW_PWR_CUT_ALL_MSK,
2268 	 RTW_PWR_INTF_ALL_MSK,
2269 	 RTW_PWR_ADDR_MAC,
2270 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
2271 	{0x0049,
2272 	 RTW_PWR_CUT_ALL_MSK,
2273 	 RTW_PWR_INTF_ALL_MSK,
2274 	 RTW_PWR_ADDR_MAC,
2275 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2276 	{0x0063,
2277 	 RTW_PWR_CUT_ALL_MSK,
2278 	 RTW_PWR_INTF_ALL_MSK,
2279 	 RTW_PWR_ADDR_MAC,
2280 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2281 	{0x0062,
2282 	 RTW_PWR_CUT_ALL_MSK,
2283 	 RTW_PWR_INTF_ALL_MSK,
2284 	 RTW_PWR_ADDR_MAC,
2285 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2286 	{0x0058,
2287 	 RTW_PWR_CUT_ALL_MSK,
2288 	 RTW_PWR_INTF_ALL_MSK,
2289 	 RTW_PWR_ADDR_MAC,
2290 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2291 	{0x005A,
2292 	 RTW_PWR_CUT_ALL_MSK,
2293 	 RTW_PWR_INTF_ALL_MSK,
2294 	 RTW_PWR_ADDR_MAC,
2295 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2296 	{0x0068,
2297 	 RTW_PWR_CUT_TEST_MSK,
2298 	 RTW_PWR_INTF_ALL_MSK,
2299 	 RTW_PWR_ADDR_MAC,
2300 	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
2301 	{0x0069,
2302 	 RTW_PWR_CUT_ALL_MSK,
2303 	 RTW_PWR_INTF_ALL_MSK,
2304 	 RTW_PWR_ADDR_MAC,
2305 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
2306 	{0x001f,
2307 	 RTW_PWR_CUT_ALL_MSK,
2308 	 RTW_PWR_INTF_ALL_MSK,
2309 	 RTW_PWR_ADDR_MAC,
2310 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2311 	{0x0077,
2312 	 RTW_PWR_CUT_ALL_MSK,
2313 	 RTW_PWR_INTF_ALL_MSK,
2314 	 RTW_PWR_ADDR_MAC,
2315 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2316 	{0x001f,
2317 	 RTW_PWR_CUT_ALL_MSK,
2318 	 RTW_PWR_INTF_ALL_MSK,
2319 	 RTW_PWR_ADDR_MAC,
2320 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
2321 	{0x0077,
2322 	 RTW_PWR_CUT_ALL_MSK,
2323 	 RTW_PWR_INTF_ALL_MSK,
2324 	 RTW_PWR_ADDR_MAC,
2325 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
2326 	{0xFFFF,
2327 	 RTW_PWR_CUT_ALL_MSK,
2328 	 RTW_PWR_INTF_ALL_MSK,
2329 	 0,
2330 	 RTW_PWR_CMD_END, 0, 0},
2331 };
2332 
2333 static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
2334 	trans_carddis_to_cardemu_8723d,
2335 	trans_cardemu_to_act_8723d,
2336 	NULL
2337 };
2338 
2339 static const struct rtw_pwr_seq_cmd trans_act_to_lps_8723d[] = {
2340 	{0x0301,
2341 	 RTW_PWR_CUT_ALL_MSK,
2342 	 RTW_PWR_INTF_PCI_MSK,
2343 	 RTW_PWR_ADDR_MAC,
2344 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
2345 	{0x0522,
2346 	 RTW_PWR_CUT_ALL_MSK,
2347 	 RTW_PWR_INTF_ALL_MSK,
2348 	 RTW_PWR_ADDR_MAC,
2349 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
2350 	{0x05F8,
2351 	 RTW_PWR_CUT_ALL_MSK,
2352 	 RTW_PWR_INTF_ALL_MSK,
2353 	 RTW_PWR_ADDR_MAC,
2354 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2355 	{0x05F9,
2356 	 RTW_PWR_CUT_ALL_MSK,
2357 	 RTW_PWR_INTF_ALL_MSK,
2358 	 RTW_PWR_ADDR_MAC,
2359 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2360 	{0x05FA,
2361 	 RTW_PWR_CUT_ALL_MSK,
2362 	 RTW_PWR_INTF_ALL_MSK,
2363 	 RTW_PWR_ADDR_MAC,
2364 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2365 	{0x05FB,
2366 	 RTW_PWR_CUT_ALL_MSK,
2367 	 RTW_PWR_INTF_ALL_MSK,
2368 	 RTW_PWR_ADDR_MAC,
2369 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
2370 	{0x0002,
2371 	 RTW_PWR_CUT_ALL_MSK,
2372 	 RTW_PWR_INTF_ALL_MSK,
2373 	 RTW_PWR_ADDR_MAC,
2374 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2375 	{0x0002,
2376 	 RTW_PWR_CUT_ALL_MSK,
2377 	 RTW_PWR_INTF_ALL_MSK,
2378 	 RTW_PWR_ADDR_MAC,
2379 	 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
2380 	{0x0002,
2381 	 RTW_PWR_CUT_ALL_MSK,
2382 	 RTW_PWR_INTF_ALL_MSK,
2383 	 RTW_PWR_ADDR_MAC,
2384 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2385 	{0x0100,
2386 	 RTW_PWR_CUT_ALL_MSK,
2387 	 RTW_PWR_INTF_ALL_MSK,
2388 	 RTW_PWR_ADDR_MAC,
2389 	 RTW_PWR_CMD_WRITE, 0xFF, 0x03},
2390 	{0x0101,
2391 	 RTW_PWR_CUT_ALL_MSK,
2392 	 RTW_PWR_INTF_ALL_MSK,
2393 	 RTW_PWR_ADDR_MAC,
2394 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2395 	{0x0093,
2396 	 RTW_PWR_CUT_ALL_MSK,
2397 	 RTW_PWR_INTF_SDIO_MSK,
2398 	 RTW_PWR_ADDR_MAC,
2399 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
2400 	{0x0553,
2401 	 RTW_PWR_CUT_ALL_MSK,
2402 	 RTW_PWR_INTF_ALL_MSK,
2403 	 RTW_PWR_ADDR_MAC,
2404 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
2405 	{0xFFFF,
2406 	 RTW_PWR_CUT_ALL_MSK,
2407 	 RTW_PWR_INTF_ALL_MSK,
2408 	 0,
2409 	 RTW_PWR_CMD_END, 0, 0},
2410 };
2411 
2412 static const struct rtw_pwr_seq_cmd trans_act_to_pre_carddis_8723d[] = {
2413 	{0x0003,
2414 	 RTW_PWR_CUT_ALL_MSK,
2415 	 RTW_PWR_INTF_ALL_MSK,
2416 	 RTW_PWR_ADDR_MAC,
2417 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
2418 	{0x0080,
2419 	 RTW_PWR_CUT_ALL_MSK,
2420 	 RTW_PWR_INTF_ALL_MSK,
2421 	 RTW_PWR_ADDR_MAC,
2422 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
2423 	{0xFFFF,
2424 	 RTW_PWR_CUT_ALL_MSK,
2425 	 RTW_PWR_INTF_ALL_MSK,
2426 	 0,
2427 	 RTW_PWR_CMD_END, 0, 0},
2428 };
2429 
2430 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8723d[] = {
2431 	{0x0002,
2432 	 RTW_PWR_CUT_ALL_MSK,
2433 	 RTW_PWR_INTF_ALL_MSK,
2434 	 RTW_PWR_ADDR_MAC,
2435 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2436 	{0x0049,
2437 	 RTW_PWR_CUT_ALL_MSK,
2438 	 RTW_PWR_INTF_ALL_MSK,
2439 	 RTW_PWR_ADDR_MAC,
2440 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
2441 	{0x0006,
2442 	 RTW_PWR_CUT_ALL_MSK,
2443 	 RTW_PWR_INTF_ALL_MSK,
2444 	 RTW_PWR_ADDR_MAC,
2445 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2446 	{0x0005,
2447 	 RTW_PWR_CUT_ALL_MSK,
2448 	 RTW_PWR_INTF_ALL_MSK,
2449 	 RTW_PWR_ADDR_MAC,
2450 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
2451 	{0x0005,
2452 	 RTW_PWR_CUT_ALL_MSK,
2453 	 RTW_PWR_INTF_ALL_MSK,
2454 	 RTW_PWR_ADDR_MAC,
2455 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
2456 	{0x0010,
2457 	 RTW_PWR_CUT_ALL_MSK,
2458 	 RTW_PWR_INTF_ALL_MSK,
2459 	 RTW_PWR_ADDR_MAC,
2460 	 RTW_PWR_CMD_WRITE, BIT(6), 0},
2461 	{0x0000,
2462 	 RTW_PWR_CUT_ALL_MSK,
2463 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2464 	 RTW_PWR_ADDR_MAC,
2465 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
2466 	{0x0020,
2467 	 RTW_PWR_CUT_ALL_MSK,
2468 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2469 	 RTW_PWR_ADDR_MAC,
2470 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2471 	{0xFFFF,
2472 	 RTW_PWR_CUT_ALL_MSK,
2473 	 RTW_PWR_INTF_ALL_MSK,
2474 	 0,
2475 	 RTW_PWR_CMD_END, 0, 0},
2476 };
2477 
2478 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8723d[] = {
2479 	{0x0007,
2480 	 RTW_PWR_CUT_ALL_MSK,
2481 	 RTW_PWR_INTF_SDIO_MSK,
2482 	 RTW_PWR_ADDR_MAC,
2483 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
2484 	{0x0005,
2485 	 RTW_PWR_CUT_ALL_MSK,
2486 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
2487 	 RTW_PWR_ADDR_MAC,
2488 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
2489 	{0x0005,
2490 	 RTW_PWR_CUT_ALL_MSK,
2491 	 RTW_PWR_INTF_PCI_MSK,
2492 	 RTW_PWR_ADDR_MAC,
2493 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
2494 	{0x0005,
2495 	 RTW_PWR_CUT_ALL_MSK,
2496 	 RTW_PWR_INTF_PCI_MSK,
2497 	 RTW_PWR_ADDR_MAC,
2498 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},
2499 	{0x004A,
2500 	 RTW_PWR_CUT_ALL_MSK,
2501 	 RTW_PWR_INTF_USB_MSK,
2502 	 RTW_PWR_ADDR_MAC,
2503 	 RTW_PWR_CMD_WRITE, BIT(0), 1},
2504 	{0x0023,
2505 	 RTW_PWR_CUT_ALL_MSK,
2506 	 RTW_PWR_INTF_SDIO_MSK,
2507 	 RTW_PWR_ADDR_MAC,
2508 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
2509 	{0x0086,
2510 	 RTW_PWR_CUT_ALL_MSK,
2511 	 RTW_PWR_INTF_SDIO_MSK,
2512 	 RTW_PWR_ADDR_SDIO,
2513 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2514 	{0x0086,
2515 	 RTW_PWR_CUT_ALL_MSK,
2516 	 RTW_PWR_INTF_SDIO_MSK,
2517 	 RTW_PWR_ADDR_SDIO,
2518 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
2519 	{0xFFFF,
2520 	 RTW_PWR_CUT_ALL_MSK,
2521 	 RTW_PWR_INTF_ALL_MSK,
2522 	 0,
2523 	 RTW_PWR_CMD_END, 0, 0},
2524 };
2525 
2526 static const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
2527 	{0x001D,
2528 	 RTW_PWR_CUT_ALL_MSK,
2529 	 RTW_PWR_INTF_ALL_MSK,
2530 	 RTW_PWR_ADDR_MAC,
2531 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
2532 	{0x001D,
2533 	 RTW_PWR_CUT_ALL_MSK,
2534 	 RTW_PWR_INTF_ALL_MSK,
2535 	 RTW_PWR_ADDR_MAC,
2536 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
2537 	{0x001C,
2538 	 RTW_PWR_CUT_ALL_MSK,
2539 	 RTW_PWR_INTF_ALL_MSK,
2540 	 RTW_PWR_ADDR_MAC,
2541 	 RTW_PWR_CMD_WRITE, 0xFF, 0x0E},
2542 	{0xFFFF,
2543 	 RTW_PWR_CUT_ALL_MSK,
2544 	 RTW_PWR_INTF_ALL_MSK,
2545 	 0,
2546 	 RTW_PWR_CMD_END, 0, 0},
2547 };
2548 
2549 static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
2550 	trans_act_to_lps_8723d,
2551 	trans_act_to_pre_carddis_8723d,
2552 	trans_act_to_cardemu_8723d,
2553 	trans_cardemu_to_carddis_8723d,
2554 	trans_act_to_post_carddis_8723d,
2555 	NULL
2556 };
2557 
2558 static const struct rtw_page_table page_table_8723d[] = {
2559 	{12, 2, 2, 0, 1},
2560 	{12, 2, 2, 0, 1},
2561 	{12, 2, 2, 0, 1},
2562 	{12, 2, 2, 0, 1},
2563 	{12, 2, 2, 0, 1},
2564 };
2565 
2566 static const struct rtw_rqpn rqpn_table_8723d[] = {
2567 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2568 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2569 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2570 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2571 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2572 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2573 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2574 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
2575 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2576 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2577 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2578 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2579 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2580 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2581 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2582 };
2583 
2584 static const struct rtw_prioq_addrs prioq_addrs_8723d = {
2585 	.prio[RTW_DMA_MAPPING_EXTRA] = {
2586 		.rsvd = REG_RQPN_NPQ + 2, .avail = REG_RQPN_NPQ + 3,
2587 	},
2588 	.prio[RTW_DMA_MAPPING_LOW] = {
2589 		.rsvd = REG_RQPN + 1, .avail = REG_FIFOPAGE_CTRL_2 + 1,
2590 	},
2591 	.prio[RTW_DMA_MAPPING_NORMAL] = {
2592 		.rsvd = REG_RQPN_NPQ, .avail = REG_RQPN_NPQ + 1,
2593 	},
2594 	.prio[RTW_DMA_MAPPING_HIGH] = {
2595 		.rsvd = REG_RQPN, .avail = REG_FIFOPAGE_CTRL_2,
2596 	},
2597 	.wsize = false,
2598 };
2599 
2600 static const struct rtw_intf_phy_para pcie_gen1_param_8723d[] = {
2601 	{0x0008, 0x4a22,
2602 	 RTW_IP_SEL_PHY,
2603 	 RTW_INTF_PHY_CUT_ALL,
2604 	 RTW_INTF_PHY_PLATFORM_ALL},
2605 	{0x0009, 0x1000,
2606 	 RTW_IP_SEL_PHY,
2607 	 ~(RTW_INTF_PHY_CUT_A | RTW_INTF_PHY_CUT_B),
2608 	 RTW_INTF_PHY_PLATFORM_ALL},
2609 	{0xFFFF, 0x0000,
2610 	 RTW_IP_SEL_PHY,
2611 	 RTW_INTF_PHY_CUT_ALL,
2612 	 RTW_INTF_PHY_PLATFORM_ALL},
2613 };
2614 
2615 static const struct rtw_intf_phy_para_table phy_para_table_8723d = {
2616 	.gen1_para	= pcie_gen1_param_8723d,
2617 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8723d),
2618 };
2619 
2620 static const struct rtw_hw_reg rtw8723d_dig[] = {
2621 	[0] = { .addr = 0xc50, .mask = 0x7f },
2622 	[1] = { .addr = 0xc50, .mask = 0x7f },
2623 };
2624 
2625 static const struct rtw_hw_reg rtw8723d_dig_cck[] = {
2626 	[0] = { .addr = 0xa0c, .mask = 0x3f00 },
2627 };
2628 
2629 static const struct rtw_rf_sipi_addr rtw8723d_rf_sipi_addr[] = {
2630 	[RF_PATH_A] = { .hssi_1 = 0x820, .lssi_read    = 0x8a0,
2631 			.hssi_2 = 0x824, .lssi_read_pi = 0x8b8},
2632 	[RF_PATH_B] = { .hssi_1 = 0x828, .lssi_read    = 0x8a4,
2633 			.hssi_2 = 0x82c, .lssi_read_pi = 0x8bc},
2634 };
2635 
2636 static const struct rtw_ltecoex_addr rtw8723d_ltecoex_addr = {
2637 	.ctrl = REG_LTECOEX_CTRL,
2638 	.wdata = REG_LTECOEX_WRITE_DATA,
2639 	.rdata = REG_LTECOEX_READ_DATA,
2640 };
2641 
2642 static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
2643 	[0] = { .phy_pg_tbl	= &rtw8723d_bb_pg_tbl,
2644 		.txpwr_lmt_tbl	= &rtw8723d_txpwr_lmt_tbl,},
2645 };
2646 
2647 static const u8 rtw8723d_pwrtrk_2gb_n[] = {
2648 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2649 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2650 };
2651 
2652 static const u8 rtw8723d_pwrtrk_2gb_p[] = {
2653 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2654 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2655 };
2656 
2657 static const u8 rtw8723d_pwrtrk_2ga_n[] = {
2658 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2659 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2660 };
2661 
2662 static const u8 rtw8723d_pwrtrk_2ga_p[] = {
2663 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2664 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2665 };
2666 
2667 static const u8 rtw8723d_pwrtrk_2g_cck_b_n[] = {
2668 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2669 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2670 };
2671 
2672 static const u8 rtw8723d_pwrtrk_2g_cck_b_p[] = {
2673 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2674 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2675 };
2676 
2677 static const u8 rtw8723d_pwrtrk_2g_cck_a_n[] = {
2678 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2679 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2680 };
2681 
2682 static const u8 rtw8723d_pwrtrk_2g_cck_a_p[] = {
2683 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2684 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2685 };
2686 
2687 static const s8 rtw8723d_pwrtrk_xtal_n[] = {
2688 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2689 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2690 };
2691 
2692 static const s8 rtw8723d_pwrtrk_xtal_p[] = {
2693 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2694 	0, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16
2695 };
2696 
2697 static const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
2698 	.pwrtrk_2gb_n = rtw8723d_pwrtrk_2gb_n,
2699 	.pwrtrk_2gb_p = rtw8723d_pwrtrk_2gb_p,
2700 	.pwrtrk_2ga_n = rtw8723d_pwrtrk_2ga_n,
2701 	.pwrtrk_2ga_p = rtw8723d_pwrtrk_2ga_p,
2702 	.pwrtrk_2g_cckb_n = rtw8723d_pwrtrk_2g_cck_b_n,
2703 	.pwrtrk_2g_cckb_p = rtw8723d_pwrtrk_2g_cck_b_p,
2704 	.pwrtrk_2g_ccka_n = rtw8723d_pwrtrk_2g_cck_a_n,
2705 	.pwrtrk_2g_ccka_p = rtw8723d_pwrtrk_2g_cck_a_p,
2706 	.pwrtrk_xtal_p = rtw8723d_pwrtrk_xtal_p,
2707 	.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
2708 };
2709 
2710 static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
2711 	{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2712 	{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
2713 	{0, 0, RTW_REG_DOMAIN_NL},
2714 	{0x964, BIT(1), RTW_REG_DOMAIN_MAC8},
2715 	{0x864, BIT(0), RTW_REG_DOMAIN_MAC8},
2716 	{0xab7, BIT(5), RTW_REG_DOMAIN_MAC8},
2717 	{0xa01, BIT(7), RTW_REG_DOMAIN_MAC8},
2718 	{0, 0, RTW_REG_DOMAIN_NL},
2719 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2720 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2721 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2722 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2723 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
2724 	{0, 0, RTW_REG_DOMAIN_NL},
2725 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
2726 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
2727 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2728 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2729 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
2730 };
2731 
2732 const struct rtw_chip_info rtw8723d_hw_spec = {
2733 	.ops = &rtw8723d_ops,
2734 	.id = RTW_CHIP_TYPE_8723D,
2735 	.fw_name = "rtw88/rtw8723d_fw.bin",
2736 	.wlan_cpu = RTW_WCPU_11N,
2737 	.tx_pkt_desc_sz = 40,
2738 	.tx_buf_desc_sz = 16,
2739 	.rx_pkt_desc_sz = 24,
2740 	.rx_buf_desc_sz = 8,
2741 	.phy_efuse_size = 512,
2742 	.log_efuse_size = 512,
2743 	.ptct_efuse_size = 96 + 1,
2744 	.txff_size = 32768,
2745 	.rxff_size = 16384,
2746 	.txgi_factor = 1,
2747 	.is_pwr_by_rate_dec = true,
2748 	.max_power_index = 0x3f,
2749 	.csi_buf_pg_num = 0,
2750 	.band = RTW_BAND_2G,
2751 	.page_size = TX_PAGE_SIZE,
2752 	.dig_min = 0x20,
2753 	.ht_supported = true,
2754 	.vht_supported = false,
2755 	.lps_deep_mode_supported = 0,
2756 	.sys_func_en = 0xFD,
2757 	.pwr_on_seq = card_enable_flow_8723d,
2758 	.pwr_off_seq = card_disable_flow_8723d,
2759 	.page_table = page_table_8723d,
2760 	.rqpn_table = rqpn_table_8723d,
2761 	.prioq_addrs = &prioq_addrs_8723d,
2762 	.intf_table = &phy_para_table_8723d,
2763 	.dig = rtw8723d_dig,
2764 	.dig_cck = rtw8723d_dig_cck,
2765 	.rf_sipi_addr = {0x840, 0x844},
2766 	.rf_sipi_read_addr = rtw8723d_rf_sipi_addr,
2767 	.fix_rf_phy_num = 2,
2768 	.ltecoex_addr = &rtw8723d_ltecoex_addr,
2769 	.mac_tbl = &rtw8723d_mac_tbl,
2770 	.agc_tbl = &rtw8723d_agc_tbl,
2771 	.bb_tbl = &rtw8723d_bb_tbl,
2772 	.rf_tbl = {&rtw8723d_rf_a_tbl},
2773 	.rfe_defs = rtw8723d_rfe_defs,
2774 	.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
2775 	.rx_ldpc = false,
2776 	.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
2777 	.iqk_threshold = 8,
2778 	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
2779 	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
2780 
2781 	.coex_para_ver = 0x2007022f,
2782 	.bt_desired_ver = 0x2f,
2783 	.scbd_support = true,
2784 	.new_scbd10_def = true,
2785 	.ble_hid_profile_support = false,
2786 	.wl_mimo_ps_support = false,
2787 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2788 	.bt_rssi_type = COEX_BTRSSI_RATIO,
2789 	.ant_isolation = 15,
2790 	.rssi_tolerance = 2,
2791 	.wl_rssi_step = wl_rssi_step_8723d,
2792 	.bt_rssi_step = bt_rssi_step_8723d,
2793 	.table_sant_num = ARRAY_SIZE(table_sant_8723d),
2794 	.table_sant = table_sant_8723d,
2795 	.table_nsant_num = ARRAY_SIZE(table_nsant_8723d),
2796 	.table_nsant = table_nsant_8723d,
2797 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8723d),
2798 	.tdma_sant = tdma_sant_8723d,
2799 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8723d),
2800 	.tdma_nsant = tdma_nsant_8723d,
2801 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8723d),
2802 	.wl_rf_para_tx = rf_para_tx_8723d,
2803 	.wl_rf_para_rx = rf_para_rx_8723d,
2804 	.bt_afh_span_bw20 = 0x20,
2805 	.bt_afh_span_bw40 = 0x30,
2806 	.afh_5g_num = ARRAY_SIZE(afh_5g_8723d),
2807 	.afh_5g = afh_5g_8723d,
2808 	.btg_reg = &btg_reg_8723d,
2809 
2810 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8723d),
2811 	.coex_info_hw_regs = coex_info_hw_regs_8723d,
2812 };
2813 EXPORT_SYMBOL(rtw8723d_hw_spec);
2814 
2815 MODULE_FIRMWARE("rtw88/rtw8723d_fw.bin");
2816 
2817 MODULE_AUTHOR("Realtek Corporation");
2818 MODULE_DESCRIPTION("Realtek 802.11n wireless 8723d driver");
2819 MODULE_LICENSE("Dual BSD/GPL");
2820