xref: /linux/drivers/net/wireless/realtek/rtw88/rtw8723d.c (revision ed7171ff9fabc49ae6ed42fbd082a576473836fc)
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 "rtw8723x.h"
13 #include "rtw8723d.h"
14 #include "rtw8723d_table.h"
15 #include "mac.h"
16 #include "reg.h"
17 #include "debug.h"
18 
19 #define WLAN_SLOT_TIME		0x09
20 #define WLAN_RL_VAL		0x3030
21 #define WLAN_BAR_VAL		0x0201ffff
22 #define BIT_MASK_TBTT_HOLD	0x00000fff
23 #define BIT_SHIFT_TBTT_HOLD	8
24 #define BIT_MASK_TBTT_SETUP	0x000000ff
25 #define BIT_SHIFT_TBTT_SETUP	0
26 #define BIT_MASK_TBTT_MASK	((BIT_MASK_TBTT_HOLD << BIT_SHIFT_TBTT_HOLD) | \
27 				 (BIT_MASK_TBTT_SETUP << BIT_SHIFT_TBTT_SETUP))
28 #define TBTT_TIME(s, h)((((s) & BIT_MASK_TBTT_SETUP) << BIT_SHIFT_TBTT_SETUP) |\
29 			(((h) & BIT_MASK_TBTT_HOLD) << BIT_SHIFT_TBTT_HOLD))
30 #define WLAN_TBTT_TIME_NORMAL	TBTT_TIME(0x04, 0x80)
31 #define WLAN_TBTT_TIME_STOP_BCN	TBTT_TIME(0x04, 0x64)
32 #define WLAN_PIFS_VAL		0
33 #define WLAN_AGG_BRK_TIME	0x16
34 #define WLAN_NAV_PROT_LEN	0x0040
35 #define WLAN_SPEC_SIFS		0x100a
36 #define WLAN_RX_PKT_LIMIT	0x17
37 #define WLAN_MAX_AGG_NR		0x0A
38 #define WLAN_AMPDU_MAX_TIME	0x1C
39 #define WLAN_ANT_SEL		0x82
40 #define WLAN_LTR_IDLE_LAT	0x90039003
41 #define WLAN_LTR_ACT_LAT	0x883c883c
42 #define WLAN_LTR_CTRL1		0xCB004010
43 #define WLAN_LTR_CTRL2		0x01233425
44 
45 static const u32 rtw8723d_ofdm_swing_table[] = {
46 	0x0b40002d, 0x0c000030, 0x0cc00033, 0x0d800036, 0x0e400039, 0x0f00003c,
47 	0x10000040, 0x11000044, 0x12000048, 0x1300004c, 0x14400051, 0x15800056,
48 	0x16c0005b, 0x18000060, 0x19800066, 0x1b00006c, 0x1c800072, 0x1e400079,
49 	0x20000080, 0x22000088, 0x24000090, 0x26000098, 0x288000a2, 0x2ac000ab,
50 	0x2d4000b5, 0x300000c0, 0x32c000cb, 0x35c000d7, 0x390000e4, 0x3c8000f2,
51 	0x40000100, 0x43c0010f, 0x47c0011f, 0x4c000130, 0x50800142, 0x55400155,
52 	0x5a400169, 0x5fc0017f, 0x65400195, 0x6b8001ae, 0x71c001c7, 0x788001e2,
53 	0x7f8001fe,
54 };
55 
56 static const u32 rtw8723d_cck_swing_table[] = {
57 	0x0CD, 0x0D9, 0x0E6, 0x0F3, 0x102, 0x111, 0x121, 0x132, 0x144, 0x158,
58 	0x16C, 0x182, 0x198, 0x1B1, 0x1CA, 0x1E5, 0x202, 0x221, 0x241, 0x263,
59 	0x287, 0x2AE, 0x2D6, 0x301, 0x32F, 0x35F, 0x392, 0x3C9, 0x402, 0x43F,
60 	0x47F, 0x4C3, 0x50C, 0x558, 0x5A9, 0x5FF, 0x65A, 0x6BA, 0x720, 0x78C,
61 	0x7FF,
62 };
63 
64 #define RTW_OFDM_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_ofdm_swing_table)
65 #define RTW_CCK_SWING_TABLE_SIZE	ARRAY_SIZE(rtw8723d_cck_swing_table)
66 
67 static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
68 {
69 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
70 	u8 path;
71 
72 	dm_info->default_ofdm_index = RTW_DEF_OFDM_SWING_INDEX;
73 
74 	for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
75 		ewma_thermal_init(&dm_info->avg_thermal[path]);
76 		dm_info->delta_power_index[path] = 0;
77 	}
78 	dm_info->pwr_trk_triggered = false;
79 	dm_info->pwr_trk_init_trigger = true;
80 	dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
81 	dm_info->txagc_remnant_cck = 0;
82 	dm_info->txagc_remnant_ofdm = 0;
83 }
84 
85 static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
86 {
87 	u8 xtal_cap;
88 	u32 val32;
89 
90 	/* power on BB/RF domain */
91 	rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
92 			BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
93 	rtw_write8_set(rtwdev, REG_RF_CTRL,
94 		       BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
95 	rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
96 
97 	rtw_phy_load_tables(rtwdev);
98 
99 	/* post init after header files config */
100 	rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
101 	rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, BIT_HIQ_NO_LMT_EN_ROOT);
102 	rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
103 
104 	xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
105 	rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
106 			 xtal_cap | (xtal_cap << 6));
107 	rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
108 	if ((rtwdev->efuse.afe >> 4) == 14) {
109 		rtw_write32_set(rtwdev, REG_AFE_CTRL3, BIT_XTAL_GMP_BIT4);
110 		rtw_write32_clr(rtwdev, REG_AFE_CTRL1, BITS_PLL);
111 		rtw_write32_set(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA1);
112 		rtw_write32_clr(rtwdev, REG_LDO_SWR_CTRL, BIT_XTA0);
113 	}
114 
115 	rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
116 	rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
117 	rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
118 	rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
119 	rtw_write8(rtwdev, REG_ATIMWND, 0x2);
120 	rtw_write8(rtwdev, REG_BCN_CTRL,
121 		   BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
122 	val32 = rtw_read32(rtwdev, REG_TBTT_PROHIBIT);
123 	val32 &= ~BIT_MASK_TBTT_MASK;
124 	val32 |= WLAN_TBTT_TIME_STOP_BCN;
125 	rtw_write8(rtwdev, REG_TBTT_PROHIBIT, val32);
126 	rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
127 	rtw_write8(rtwdev, REG_AGGR_BREAK_TIME, WLAN_AGG_BRK_TIME);
128 	rtw_write16(rtwdev, REG_NAV_PROT_LEN, WLAN_NAV_PROT_LEN);
129 	rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
130 	rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS);
131 	rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS);
132 	rtw_write8(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
133 	rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
134 	rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
135 	rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
136 	rtw_write8(rtwdev, REG_LEDCFG2, WLAN_ANT_SEL);
137 
138 	rtw_write32(rtwdev, REG_LTR_IDLE_LATENCY, WLAN_LTR_IDLE_LAT);
139 	rtw_write32(rtwdev, REG_LTR_ACTIVE_LATENCY, WLAN_LTR_ACT_LAT);
140 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC, WLAN_LTR_CTRL1);
141 	rtw_write32(rtwdev, REG_LTR_CTRL_BASIC + 4, WLAN_LTR_CTRL2);
142 
143 	rtw_phy_init(rtwdev);
144 	rtwdev->dm_info.cck_pd_default = rtw_read8(rtwdev, REG_CSRATIO) & 0x1f;
145 
146 	rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
147 
148 	rtw8723x_lck(rtwdev);
149 
150 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
151 	rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
152 
153 	rtw8723d_pwrtrack_init(rtwdev);
154 }
155 
156 static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
157 				   struct rtw_rx_pkt_stat *pkt_stat)
158 {
159 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
160 	s8 min_rx_power = -120;
161 	u8 pwdb = GET_PHY_STAT_P0_PWDB(phy_status);
162 
163 	pkt_stat->rx_power[RF_PATH_A] = pwdb - 97;
164 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
165 	pkt_stat->bw = RTW_CHANNEL_WIDTH_20;
166 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
167 				     min_rx_power);
168 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
169 }
170 
171 static void query_phy_status_page1(struct rtw_dev *rtwdev, u8 *phy_status,
172 				   struct rtw_rx_pkt_stat *pkt_stat)
173 {
174 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
175 	u8 rxsc, bw;
176 	s8 min_rx_power = -120;
177 	s8 rx_evm;
178 
179 	if (pkt_stat->rate > DESC_RATE11M && pkt_stat->rate < DESC_RATEMCS0)
180 		rxsc = GET_PHY_STAT_P1_L_RXSC(phy_status);
181 	else
182 		rxsc = GET_PHY_STAT_P1_HT_RXSC(phy_status);
183 
184 	if (GET_PHY_STAT_P1_RF_MODE(phy_status) == 0)
185 		bw = RTW_CHANNEL_WIDTH_20;
186 	else if ((rxsc == 1) || (rxsc == 2))
187 		bw = RTW_CHANNEL_WIDTH_20;
188 	else
189 		bw = RTW_CHANNEL_WIDTH_40;
190 
191 	pkt_stat->rx_power[RF_PATH_A] = GET_PHY_STAT_P1_PWDB_A(phy_status) - 110;
192 	pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
193 	pkt_stat->bw = bw;
194 	pkt_stat->signal_power = max(pkt_stat->rx_power[RF_PATH_A],
195 				     min_rx_power);
196 	pkt_stat->rx_evm[RF_PATH_A] = GET_PHY_STAT_P1_RXEVM_A(phy_status);
197 	pkt_stat->rx_snr[RF_PATH_A] = GET_PHY_STAT_P1_RXSNR_A(phy_status);
198 	pkt_stat->cfo_tail[RF_PATH_A] = GET_PHY_STAT_P1_CFO_TAIL_A(phy_status);
199 
200 	dm_info->curr_rx_rate = pkt_stat->rate;
201 	dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
202 	dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
203 	dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
204 
205 	rx_evm = clamp_t(s8, -pkt_stat->rx_evm[RF_PATH_A] >> 1, 0, 64);
206 	rx_evm &= 0x3F;	/* 64->0: second path of 1SS rate is 64 */
207 	dm_info->rx_evm_dbm[RF_PATH_A] = rx_evm;
208 }
209 
210 static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
211 			     struct rtw_rx_pkt_stat *pkt_stat)
212 {
213 	u8 page;
214 
215 	page = *phy_status & 0xf;
216 
217 	switch (page) {
218 	case 0:
219 		query_phy_status_page0(rtwdev, phy_status, pkt_stat);
220 		break;
221 	case 1:
222 		query_phy_status_page1(rtwdev, phy_status, pkt_stat);
223 		break;
224 	default:
225 		rtw_warn(rtwdev, "unused phy status page (%d)\n", page);
226 		return;
227 	}
228 }
229 
230 static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
231 				   struct rtw_rx_pkt_stat *pkt_stat,
232 				   struct ieee80211_rx_status *rx_status)
233 {
234 	struct ieee80211_hdr *hdr;
235 	u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
236 	u8 *phy_status = NULL;
237 
238 	memset(pkt_stat, 0, sizeof(*pkt_stat));
239 
240 	pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
241 	pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
242 	pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
243 	pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
244 			      GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
245 	pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
246 	pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
247 	pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
248 	pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
249 	pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
250 	pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
251 	pkt_stat->ppdu_cnt = 0;
252 	pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
253 
254 	/* drv_info_sz is in unit of 8-bytes */
255 	pkt_stat->drv_info_sz *= 8;
256 
257 	/* c2h cmd pkt's rx/phy status is not interested */
258 	if (pkt_stat->is_c2h)
259 		return;
260 
261 	hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
262 				       pkt_stat->drv_info_sz);
263 	if (pkt_stat->phy_status) {
264 		phy_status = rx_desc + desc_sz + pkt_stat->shift;
265 		query_phy_status(rtwdev, phy_status, pkt_stat);
266 	}
267 
268 	rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
269 }
270 
271 static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
272 					 u8 channel, u32 thres)
273 {
274 	u32 freq;
275 	bool ret = false;
276 
277 	if (channel == 13)
278 		freq = FREQ_CH13;
279 	else if (channel == 14)
280 		freq = FREQ_CH14;
281 	else
282 		return false;
283 
284 	rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
285 	rtw_write32(rtwdev, REG_PSDFN, freq);
286 	rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
287 
288 	msleep(30);
289 	if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
290 		ret = true;
291 
292 	rtw_write32(rtwdev, REG_PSDFN, freq);
293 	rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
294 
295 	return ret;
296 }
297 
298 static void rtw8723d_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
299 {
300 	if (!notch) {
301 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
302 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
303 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
304 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
305 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
306 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
307 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
308 		return;
309 	}
310 
311 	switch (channel) {
312 	case 13:
313 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
314 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
315 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x04000000);
316 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
317 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
318 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
319 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
320 		break;
321 	case 14:
322 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
323 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
324 		rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
325 		rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
326 		rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
327 		rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00080000);
328 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
329 		break;
330 	default:
331 		rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
332 		rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
333 		break;
334 	}
335 }
336 
337 static void rtw8723d_spur_cal(struct rtw_dev *rtwdev, u8 channel)
338 {
339 	bool notch;
340 
341 	if (channel < 13) {
342 		rtw8723d_cfg_notch(rtwdev, channel, false);
343 		return;
344 	}
345 
346 	notch = rtw8723d_check_spur_ov_thres(rtwdev, channel, SPUR_THRES);
347 	rtw8723d_cfg_notch(rtwdev, channel, notch);
348 }
349 
350 static void rtw8723d_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
351 {
352 	u32 rf_cfgch_a, rf_cfgch_b;
353 
354 	rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
355 	rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
356 
357 	rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
358 	rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
359 	rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
360 	rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
361 
362 	rf_cfgch_a &= ~RFCFGCH_BW_MASK;
363 	switch (bw) {
364 	case RTW_CHANNEL_WIDTH_20:
365 		rf_cfgch_a |= RFCFGCH_BW_20M;
366 		break;
367 	case RTW_CHANNEL_WIDTH_40:
368 		rf_cfgch_a |= RFCFGCH_BW_40M;
369 		break;
370 	default:
371 		break;
372 	}
373 
374 	rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
375 	rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
376 
377 	rtw8723d_spur_cal(rtwdev, channel);
378 }
379 
380 static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR] = {
381 	[0] = {
382 		{ .len = 4, .reg = 0xA24, .val = 0x64B80C1C },
383 		{ .len = 4, .reg = 0xA28, .val = 0x00008810 },
384 		{ .len = 4, .reg = 0xAAC, .val = 0x01235667 },
385 	},
386 	[1] = {
387 		{ .len = 4, .reg = 0xA24, .val = 0x0000B81C },
388 		{ .len = 4, .reg = 0xA28, .val = 0x00000000 },
389 		{ .len = 4, .reg = 0xAAC, .val = 0x00003667 },
390 	},
391 };
392 
393 static void rtw8723d_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
394 				    u8 primary_ch_idx)
395 {
396 	const struct rtw_backup_info *cck_dfir;
397 	int i;
398 
399 	cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
400 
401 	for (i = 0; i < CCK_DFIR_NR; i++, cck_dfir++)
402 		rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
403 
404 	switch (bw) {
405 	case RTW_CHANNEL_WIDTH_20:
406 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
407 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
408 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 1);
409 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_MASK_RXBB_DFIR, 0xa);
410 		break;
411 	case RTW_CHANNEL_WIDTH_40:
412 		rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
413 		rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
414 		rtw_write32_mask(rtwdev, REG_BBRX_DFIR, BIT_RXBB_DFIR_EN, 0);
415 		rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
416 				 (primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0));
417 		break;
418 	default:
419 		break;
420 	}
421 }
422 
423 static void rtw8723d_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw,
424 				 u8 primary_chan_idx)
425 {
426 	rtw8723d_set_channel_rf(rtwdev, channel, bw);
427 	rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
428 	rtw8723d_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
429 }
430 
431 static void rtw8723d_shutdown(struct rtw_dev *rtwdev)
432 {
433 	rtw_write16_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
434 }
435 
436 struct rtw_8723d_iqk_cfg {
437 	const char *name;
438 	u32 val_bb_sel_btg;
439 	u32 reg_lutwe;
440 	u32 val_txiqk_pi;
441 	u32 reg_padlut;
442 	u32 reg_gaintx;
443 	u32 reg_bspad;
444 	u32 val_wlint;
445 	u32 val_wlsel;
446 	u32 val_iqkpts;
447 };
448 
449 static const struct rtw_8723d_iqk_cfg iqk_tx_cfg[PATH_NR] = {
450 	[PATH_S1] = {
451 		.name = "S1",
452 		.val_bb_sel_btg = 0x99000000,
453 		.reg_lutwe = RF_LUTWE,
454 		.val_txiqk_pi = 0x8214019f,
455 		.reg_padlut = RF_LUTDBG,
456 		.reg_gaintx = RF_GAINTX,
457 		.reg_bspad = RF_BSPAD,
458 		.val_wlint = 0xe0d,
459 		.val_wlsel = 0x60d,
460 		.val_iqkpts = 0xfa000000,
461 	},
462 	[PATH_S0] = {
463 		.name = "S0",
464 		.val_bb_sel_btg = 0x99000280,
465 		.reg_lutwe = RF_LUTWE2,
466 		.val_txiqk_pi = 0x8214018a,
467 		.reg_padlut = RF_TXADBG,
468 		.reg_gaintx = RF_TRXIQ,
469 		.reg_bspad = RF_TXATANK,
470 		.val_wlint = 0xe6d,
471 		.val_wlsel = 0x66d,
472 		.val_iqkpts = 0xf9000000,
473 	},
474 };
475 
476 static u8 rtw8723d_iqk_check_tx_failed(struct rtw_dev *rtwdev,
477 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
478 {
479 	s32 tx_x, tx_y;
480 	u32 tx_fail;
481 
482 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
483 		rtw_read32(rtwdev, REG_IQK_RES_RY));
484 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
485 		rtw_read32(rtwdev, REG_IQK_RES_TX),
486 		rtw_read32(rtwdev, REG_IQK_RES_TY));
487 	rtw_dbg(rtwdev, RTW_DBG_RFK,
488 		"[IQK] 0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
489 		rtw_read32(rtwdev, 0xe90),
490 		rtw_read32(rtwdev, 0xe98));
491 
492 	tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
493 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
494 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
495 
496 	if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
497 		return IQK_TX_OK;
498 
499 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s TXIQK is failed\n",
500 		iqk_cfg->name);
501 
502 	return 0;
503 }
504 
505 static u8 rtw8723d_iqk_check_rx_failed(struct rtw_dev *rtwdev,
506 				       const struct rtw_8723d_iqk_cfg *iqk_cfg)
507 {
508 	s32 rx_x, rx_y;
509 	u32 rx_fail;
510 
511 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
512 		rtw_read32(rtwdev, REG_IQK_RES_RX),
513 		rtw_read32(rtwdev, REG_IQK_RES_RY));
514 
515 	rtw_dbg(rtwdev, RTW_DBG_RFK,
516 		"[IQK] 0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
517 		rtw_read32(rtwdev, 0xea0),
518 		rtw_read32(rtwdev, 0xea8));
519 
520 	rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
521 	rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
522 	rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
523 	rx_y = abs(iqkxy_to_s32(rx_y));
524 
525 	if (!rx_fail && rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
526 	    rx_y < IQK_RX_Y_LMT)
527 		return IQK_RX_OK;
528 
529 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] %s RXIQK STEP2 is failed\n",
530 		iqk_cfg->name);
531 
532 	return 0;
533 }
534 
535 #define IQK_LTE_WRITE_VAL_8723D 0x0000ff00
536 
537 static void rtw8723d_iqk_one_shot(struct rtw_dev *rtwdev, bool tx,
538 				  const struct rtw_8723d_iqk_cfg *iqk_cfg)
539 {
540 	u32 pts = (tx ? iqk_cfg->val_iqkpts : 0xf9000000);
541 
542 	/* enter IQK mode */
543 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
544 	rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8723D);
545 
546 	rtw_write32(rtwdev, REG_LTECOEX_CTRL, 0x800f0054);
547 	mdelay(1);
548 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] GNT_BT @%s %sIQK1 = 0x%x\n",
549 		iqk_cfg->name, tx ? "TX" : "RX",
550 		rtw_read32(rtwdev, REG_LTECOEX_READ_DATA));
551 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x948 @%s %sIQK1 = 0x%x\n",
552 		iqk_cfg->name, tx ? "TX" : "RX",
553 		rtw_read32(rtwdev, REG_BB_SEL_BTG));
554 
555 	/* One shot, LOK & IQK */
556 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, pts);
557 	rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
558 
559 	if (!check_hw_ready(rtwdev, REG_IQK_RES_RY, BIT_IQK_DONE, 1))
560 		rtw_warn(rtwdev, "%s %s IQK isn't done\n", iqk_cfg->name,
561 			 tx ? "TX" : "RX");
562 }
563 
564 static void rtw8723d_iqk_txrx_path_post(struct rtw_dev *rtwdev,
565 					const struct rtw_8723d_iqk_cfg *iqk_cfg,
566 					const struct rtw8723x_iqk_backup_regs *backup)
567 {
568 	rtw8723x_iqk_restore_lte_path_gnt(rtwdev, backup);
569 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
570 
571 	/* leave IQK mode */
572 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
573 	mdelay(1);
574 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x0);
575 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, BIT(0), 0x0);
576 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, BIT(0), 0x0);
577 }
578 
579 static u8 rtw8723d_iqk_tx_path(struct rtw_dev *rtwdev,
580 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
581 			       const struct rtw8723x_iqk_backup_regs *backup)
582 {
583 	u8 status;
584 
585 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s TXIQK!!\n", iqk_cfg->name);
586 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s TXIQK = 0x%x\n",
587 		iqk_cfg->name,
588 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
589 
590 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
591 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
592 	mdelay(1);
593 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
594 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00004);
595 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005d);
596 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xBFFE0);
597 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
598 
599 	/* IQK setting */
600 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x08008c0c);
601 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
602 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, iqk_cfg->val_txiqk_pi);
603 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160200);
604 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
605 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
606 
607 	/* LOK setting */
608 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
609 
610 	/* PA, PAD setting */
611 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
612 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
613 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x1E0, 0x3);
614 	rtw_write_rf(rtwdev, RF_PATH_A, RF_RXIQGEN, 0x1F, 0xf);
615 
616 	/* LOK setting for 8723D */
617 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x10, 0x1);
618 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_bspad, 0x1, 0x1);
619 
620 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
621 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
622 
623 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s TXIQK = 0x%x\n",
624 		iqk_cfg->name,
625 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
626 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s TXIQK = 0x%x\n",
627 		iqk_cfg->name,
628 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
629 
630 	rtw8723d_iqk_one_shot(rtwdev, true, iqk_cfg);
631 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
632 
633 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
634 
635 	return status;
636 }
637 
638 static u8 rtw8723d_iqk_rx_path(struct rtw_dev *rtwdev,
639 			       const struct rtw_8723d_iqk_cfg *iqk_cfg,
640 			       const struct rtw8723x_iqk_backup_regs *backup)
641 {
642 	u32 tx_x, tx_y;
643 	u8 status;
644 
645 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK Step1!!\n",
646 		iqk_cfg->name);
647 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK1 = 0x%x\n",
648 		iqk_cfg->name,
649 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
650 	rtw_write32(rtwdev, REG_BB_SEL_BTG, iqk_cfg->val_bb_sel_btg);
651 
652 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
653 
654 	/* IQK setting */
655 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
656 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
657 
658 	/* path IQK setting */
659 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
660 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
661 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
662 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
663 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82160000);
664 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160000);
665 
666 	/* LOK setting */
667 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
668 
669 	/* RXIQK mode */
670 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x80000);
671 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00006);
672 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
673 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xa7ffb);
674 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
675 
676 	/* PA/PAD=0 */
677 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_padlut, 0x800, 0x1);
678 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_gaintx, 0x600, 0x0);
679 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, iqk_cfg->val_wlint);
680 	rtw_write_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK, iqk_cfg->val_wlsel);
681 
682 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1@ path %s RXIQK1 = 0x%x\n",
683 		iqk_cfg->name,
684 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
685 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2@ path %s RXIQK1 = 0x%x\n",
686 		iqk_cfg->name,
687 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
688 
689 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
690 	status = rtw8723d_iqk_check_tx_failed(rtwdev, iqk_cfg);
691 
692 	if (!status)
693 		goto restore;
694 
695 	/* second round */
696 	tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
697 	tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
698 
699 	rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
700 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
701 		rtw_read32(rtwdev, REG_TXIQK_11N),
702 		BIT_SET_TXIQK_11N(tx_x, tx_y));
703 
704 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path %s RXIQK STEP2!!\n",
705 		iqk_cfg->name);
706 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @%s RXIQK2 = 0x%x\n",
707 		iqk_cfg->name,
708 		rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
709 
710 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
711 	rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
712 	rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
713 	rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
714 	rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
715 	rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82170000);
716 	rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28171400);
717 
718 	/* LOK setting */
719 	rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
720 
721 	/* RXIQK mode */
722 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
723 	mdelay(1);
724 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, 0x80000, 0x1);
725 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x00007);
726 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD1, RFREG_MASK, 0x0005f);
727 	rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0xb3fdb);
728 	rtw_write_rf(rtwdev, RF_PATH_A, iqk_cfg->reg_lutwe, RFREG_MASK, 0x00000);
729 
730 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x1 @%s RXIQK2 = 0x%x\n",
731 		iqk_cfg->name,
732 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK));
733 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] RF0x2 @%s RXIQK2 = 0x%x\n",
734 		iqk_cfg->name,
735 		rtw_read_rf(rtwdev, RF_PATH_A, RF_WLSEL, RFREG_MASK));
736 
737 	rtw8723d_iqk_one_shot(rtwdev, false, iqk_cfg);
738 	status |= rtw8723d_iqk_check_rx_failed(rtwdev, iqk_cfg);
739 
740 restore:
741 	rtw8723d_iqk_txrx_path_post(rtwdev, iqk_cfg, backup);
742 
743 	return status;
744 }
745 
746 static
747 void rtw8723d_iqk_fill_s1_matrix(struct rtw_dev *rtwdev, const s32 result[])
748 {
749 	s32 oldval_1;
750 	s32 x, y;
751 	s32 tx1_a, tx1_a_ext;
752 	s32 tx1_c, tx1_c_ext;
753 
754 	if (result[IQK_S1_TX_X] == 0)
755 		return;
756 
757 	oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
758 				   BIT_MASK_TXIQ_ELM_D);
759 
760 	x = iqkxy_to_s32(result[IQK_S1_TX_X]);
761 	tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
762 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
763 			 BIT_MASK_TXIQ_ELM_A, tx1_a);
764 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
765 			 BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
766 
767 	y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
768 	tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
769 	rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
770 			 BIT_SET_TXIQ_ELM_C1(tx1_c));
771 	rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
772 			 BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
773 	rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
774 			 BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
775 
776 	rtw_dbg(rtwdev, RTW_DBG_RFK,
777 		"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
778 		x, tx1_a, oldval_1);
779 	rtw_dbg(rtwdev, RTW_DBG_RFK,
780 		"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
781 
782 	if (result[IQK_S1_RX_X] == 0)
783 		return;
784 
785 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_X,
786 			 result[IQK_S1_RX_X]);
787 	rtw_write32_mask(rtwdev, REG_A_RXIQI, BIT_MASK_RXIQ_S1_Y1,
788 			 BIT_SET_RXIQ_S1_Y1(result[IQK_S1_RX_Y]));
789 	rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
790 			 BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
791 }
792 
793 static
794 void rtw8723d_iqk_fill_s0_matrix(struct rtw_dev *rtwdev, const s32 result[])
795 {
796 	s32 oldval_0;
797 	s32 x, y;
798 	s32 tx0_a, tx0_a_ext;
799 	s32 tx0_c, tx0_c_ext;
800 
801 	if (result[IQK_S0_TX_X] == 0)
802 		return;
803 
804 	oldval_0 = rtw_read32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0);
805 
806 	x = iqkxy_to_s32(result[IQK_S0_TX_X]);
807 	tx0_a = iqk_mult(x, oldval_0, &tx0_a_ext);
808 
809 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, tx0_a);
810 	rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, tx0_a_ext);
811 
812 	y = iqkxy_to_s32(result[IQK_S0_TX_Y]);
813 	tx0_c = iqk_mult(y, oldval_0, &tx0_c_ext);
814 
815 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, tx0_c);
816 	rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, tx0_c_ext);
817 
818 	if (result[IQK_S0_RX_X] == 0)
819 		return;
820 
821 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_X_S0,
822 			 result[IQK_S0_RX_X]);
823 	rtw_write32_mask(rtwdev, REG_RXIQ_AB_S0, BIT_MASK_RXIQ_Y_S0,
824 			 result[IQK_S0_RX_Y]);
825 }
826 
827 static void rtw8723d_iqk_config_mac(struct rtw_dev *rtwdev)
828 {
829 	rtw_write8(rtwdev, REG_TXPAUSE, 0xff);
830 }
831 
832 static
833 void rtw8723d_iqk_rf_standby(struct rtw_dev *rtwdev, enum rtw_rf_path path)
834 {
835 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path-%s standby mode!\n",
836 		path == RF_PATH_A ? "S1" : "S0");
837 
838 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
839 	mdelay(1);
840 	rtw_write_rf(rtwdev, path, RF_MODE, RFREG_MASK, 0x10000);
841 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
842 }
843 
844 #define ADDA_ON_VAL_8723D 0x03c00016
845 
846 static
847 void rtw8723d_iqk_precfg_path(struct rtw_dev *rtwdev, enum rtw8723x_path path)
848 {
849 	if (path == PATH_S0) {
850 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_A);
851 		rtw8723x_iqk_path_adda_on(rtwdev, ADDA_ON_VAL_8723D);
852 	}
853 
854 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
855 	rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
856 	rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
857 
858 	if (path == PATH_S1) {
859 		rtw8723d_iqk_rf_standby(rtwdev, RF_PATH_B);
860 		rtw8723x_iqk_path_adda_on(rtwdev, ADDA_ON_VAL_8723D);
861 	}
862 }
863 
864 static
865 void rtw8723d_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
866 			    const struct rtw8723x_iqk_backup_regs *backup)
867 {
868 	u32 i;
869 	u8 s1_ok, s0_ok;
870 
871 	rtw_dbg(rtwdev, RTW_DBG_RFK,
872 		"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
873 
874 	rtw8723x_iqk_path_adda_on(rtwdev, ADDA_ON_VAL_8723D);
875 	rtw8723d_iqk_config_mac(rtwdev);
876 	rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
877 	rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05611);
878 	rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
879 	rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204200);
880 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S1);
881 
882 	for (i = 0; i < PATH_IQK_RETRY; i++) {
883 		s1_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
884 		if (s1_ok == IQK_TX_OK) {
885 			rtw_dbg(rtwdev, RTW_DBG_RFK,
886 				"[IQK] path S1 Tx IQK Success!!\n");
887 			result[t][IQK_S1_TX_X] =
888 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
889 			result[t][IQK_S1_TX_Y] =
890 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
891 			break;
892 		}
893 
894 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Tx IQK Fail!!\n");
895 		result[t][IQK_S1_TX_X] = 0x100;
896 		result[t][IQK_S1_TX_Y] = 0x0;
897 	}
898 
899 	for (i = 0; i < PATH_IQK_RETRY; i++) {
900 		s1_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S1], backup);
901 		if (s1_ok == (IQK_TX_OK | IQK_RX_OK)) {
902 			rtw_dbg(rtwdev, RTW_DBG_RFK,
903 				"[IQK] path S1 Rx IQK Success!!\n");
904 			result[t][IQK_S1_RX_X] =
905 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
906 			result[t][IQK_S1_RX_Y] =
907 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
908 			break;
909 		}
910 
911 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 Rx IQK Fail!!\n");
912 		result[t][IQK_S1_RX_X] = 0x100;
913 		result[t][IQK_S1_RX_Y] = 0x0;
914 	}
915 
916 	if (s1_ok == 0x0)
917 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S1 IQK is failed!!\n");
918 
919 	rtw8723d_iqk_precfg_path(rtwdev, PATH_S0);
920 
921 	for (i = 0; i < PATH_IQK_RETRY; i++) {
922 		s0_ok = rtw8723d_iqk_tx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
923 		if (s0_ok == IQK_TX_OK) {
924 			rtw_dbg(rtwdev, RTW_DBG_RFK,
925 				"[IQK] path S0 Tx IQK Success!!\n");
926 			result[t][IQK_S0_TX_X] =
927 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
928 			result[t][IQK_S0_TX_Y] =
929 			  rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
930 			break;
931 		}
932 
933 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Tx IQK Fail!!\n");
934 		result[t][IQK_S0_TX_X] = 0x100;
935 		result[t][IQK_S0_TX_Y] = 0x0;
936 	}
937 
938 	for (i = 0; i < PATH_IQK_RETRY; i++) {
939 		s0_ok = rtw8723d_iqk_rx_path(rtwdev, &iqk_tx_cfg[PATH_S0], backup);
940 		if (s0_ok == (IQK_TX_OK | IQK_RX_OK)) {
941 			rtw_dbg(rtwdev, RTW_DBG_RFK,
942 				"[IQK] path S0 Rx IQK Success!!\n");
943 
944 			result[t][IQK_S0_RX_X] =
945 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
946 			result[t][IQK_S0_RX_Y] =
947 			  rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
948 			break;
949 		}
950 
951 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 Rx IQK Fail!!\n");
952 		result[t][IQK_S0_RX_X] = 0x100;
953 		result[t][IQK_S0_RX_Y] = 0x0;
954 	}
955 
956 	if (s0_ok == 0x0)
957 		rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path S0 IQK is failed!!\n");
958 
959 	rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
960 	mdelay(1);
961 
962 	rtw_dbg(rtwdev, RTW_DBG_RFK,
963 		"[IQK] back to BB mode, load original value!\n");
964 }
965 
966 static void rtw8723d_phy_calibration(struct rtw_dev *rtwdev)
967 {
968 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
969 	s32 result[IQK_ROUND_SIZE][IQK_NR];
970 	struct rtw8723x_iqk_backup_regs backup;
971 	u8 i, j;
972 	u8 final_candidate = IQK_ROUND_INVALID;
973 	bool good;
974 
975 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!!!\n");
976 
977 	memset(result, 0, sizeof(result));
978 
979 	rtw8723x_iqk_backup_path_ctrl(rtwdev, &backup);
980 	rtw8723x_iqk_backup_lte_path_gnt(rtwdev, &backup);
981 	rtw8723x_iqk_backup_regs(rtwdev, &backup);
982 
983 	for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
984 		rtw8723x_iqk_config_path_ctrl(rtwdev);
985 		rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8723D);
986 
987 		rtw8723d_iqk_one_round(rtwdev, result, i, &backup);
988 
989 		if (i > IQK_ROUND_0)
990 			rtw8723x_iqk_restore_regs(rtwdev, &backup);
991 		rtw8723x_iqk_restore_lte_path_gnt(rtwdev, &backup);
992 		rtw8723x_iqk_restore_path_ctrl(rtwdev, &backup);
993 
994 		for (j = IQK_ROUND_0; j < i; j++) {
995 			good = rtw8723x_iqk_similarity_cmp(rtwdev, result, j, i);
996 
997 			if (good) {
998 				final_candidate = j;
999 				rtw_dbg(rtwdev, RTW_DBG_RFK,
1000 					"[IQK] cmp %d:%d final_candidate is %x\n",
1001 					j, i, final_candidate);
1002 				goto iqk_done;
1003 			}
1004 		}
1005 	}
1006 
1007 	if (final_candidate == IQK_ROUND_INVALID) {
1008 		s32 reg_tmp = 0;
1009 
1010 		for (i = 0; i < IQK_NR; i++)
1011 			reg_tmp += result[IQK_ROUND_HYBRID][i];
1012 
1013 		if (reg_tmp != 0) {
1014 			final_candidate = IQK_ROUND_HYBRID;
1015 		} else {
1016 			WARN(1, "IQK is failed\n");
1017 			goto out;
1018 		}
1019 	}
1020 
1021 iqk_done:
1022 	rtw8723d_iqk_fill_s1_matrix(rtwdev, result[final_candidate]);
1023 	rtw8723d_iqk_fill_s0_matrix(rtwdev, result[final_candidate]);
1024 
1025 	dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
1026 	dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
1027 	dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
1028 	dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
1029 	dm_info->iqk.done = true;
1030 
1031 out:
1032 	rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
1033 
1034 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
1035 		final_candidate);
1036 
1037 	for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
1038 		rtw_dbg(rtwdev, RTW_DBG_RFK,
1039 			"[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",
1040 			i,
1041 			result[i][0], result[i][1], result[i][2], result[i][3],
1042 			result[i][4], result[i][5], result[i][6], result[i][7],
1043 			final_candidate == i ? "(final candidate)" : "");
1044 
1045 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1046 		"[IQK]0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
1047 		rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
1048 		rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
1049 		rtw_read32(rtwdev, REG_A_RXIQI),
1050 		rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
1051 	rtw_dbg(rtwdev, RTW_DBG_RFK,
1052 		"[IQK]0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
1053 		rtw_read32(rtwdev, REG_TXIQ_AB_S0),
1054 		rtw_read32(rtwdev, REG_TXIQ_CD_S0),
1055 		rtw_read32(rtwdev, REG_RXIQ_AB_S0));
1056 
1057 	rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] finished\n");
1058 }
1059 
1060 static void rtw8723d_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
1061 {
1062 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1063 	u8 pd[CCK_PD_LV_MAX] = {3, 7, 13, 13, 13};
1064 	u8 cck_n_rx;
1065 
1066 	rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n",
1067 		dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl);
1068 
1069 	if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl)
1070 		return;
1071 
1072 	cck_n_rx = (rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_2RX) &&
1073 		    rtw_read8_mask(rtwdev, REG_CCK0_FAREPORT, BIT_CCK0_MRC)) ? 2 : 1;
1074 	rtw_dbg(rtwdev, RTW_DBG_PHY,
1075 		"is_linked=%d, lv=%d, n_rx=%d, cs_ratio=0x%x, pd_th=0x%x, cck_fa_avg=%d\n",
1076 		rtw_is_assoc(rtwdev), new_lvl, cck_n_rx,
1077 		dm_info->cck_pd_default + new_lvl * 2,
1078 		pd[new_lvl], dm_info->cck_fa_avg);
1079 
1080 	dm_info->cck_fa_avg = CCK_FA_AVG_RESET;
1081 
1082 	dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl;
1083 	rtw_write32_mask(rtwdev, REG_PWRTH, 0x3f0000, pd[new_lvl]);
1084 	rtw_write32_mask(rtwdev, REG_PWRTH2, 0x1f0000,
1085 			 dm_info->cck_pd_default + new_lvl * 2);
1086 }
1087 
1088 /* for coex */
1089 static void rtw8723d_coex_cfg_gnt_fix(struct rtw_dev *rtwdev)
1090 {
1091 }
1092 
1093 static void rtw8723d_coex_cfg_gnt_debug(struct rtw_dev *rtwdev)
1094 {
1095 	rtw_write8_mask(rtwdev, REG_LEDCFG2, BIT(6), 0);
1096 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(0), 0);
1097 	rtw_write8_mask(rtwdev, REG_GPIO_INTM + 2, BIT(4), 0);
1098 	rtw_write8_mask(rtwdev, REG_GPIO_MUXCFG + 2, BIT(1), 0);
1099 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 3, BIT(1), 0);
1100 	rtw_write8_mask(rtwdev, REG_PAD_CTRL1 + 2, BIT(7), 0);
1101 	rtw_write8_mask(rtwdev, REG_SYS_CLKR + 1, BIT(1), 0);
1102 	rtw_write8_mask(rtwdev, REG_SYS_SDIO_CTRL + 3, BIT(3), 0);
1103 }
1104 
1105 static void rtw8723d_coex_cfg_rfe_type(struct rtw_dev *rtwdev)
1106 {
1107 	struct rtw_efuse *efuse = &rtwdev->efuse;
1108 	struct rtw_coex *coex = &rtwdev->coex;
1109 	struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1110 	bool aux = efuse->bt_setting & BIT(6);
1111 
1112 	coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1113 	coex_rfe->ant_switch_polarity = 0;
1114 	coex_rfe->ant_switch_exist = false;
1115 	coex_rfe->ant_switch_with_bt = false;
1116 	coex_rfe->ant_switch_diversity = false;
1117 	coex_rfe->wlg_at_btg = true;
1118 
1119 	/* decide antenna at main or aux */
1120 	if (efuse->share_ant) {
1121 		if (aux)
1122 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x80);
1123 		else
1124 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x200);
1125 	} else {
1126 		if (aux)
1127 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x280);
1128 		else
1129 			rtw_write16(rtwdev, REG_BB_SEL_BTG, 0x0);
1130 	}
1131 
1132 	/* disable LTE coex in wifi side */
1133 	rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
1134 	rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1135 	rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1136 }
1137 
1138 static void rtw8723d_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1139 {
1140 	struct rtw_coex *coex = &rtwdev->coex;
1141 	struct rtw_coex_dm *coex_dm = &coex->dm;
1142 	static const u8	wl_tx_power[] = {0xb2, 0x90};
1143 	u8 pwr;
1144 
1145 	if (wl_pwr == coex_dm->cur_wl_pwr_lvl)
1146 		return;
1147 
1148 	coex_dm->cur_wl_pwr_lvl = wl_pwr;
1149 
1150 	if (coex_dm->cur_wl_pwr_lvl >= ARRAY_SIZE(wl_tx_power))
1151 		coex_dm->cur_wl_pwr_lvl = ARRAY_SIZE(wl_tx_power) - 1;
1152 
1153 	pwr = wl_tx_power[coex_dm->cur_wl_pwr_lvl];
1154 
1155 	rtw_write8(rtwdev, REG_ANA_PARAM1 + 3, pwr);
1156 }
1157 
1158 static void rtw8723d_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1159 {
1160 	struct rtw_coex *coex = &rtwdev->coex;
1161 	struct rtw_coex_dm *coex_dm = &coex->dm;
1162 	/* WL Rx Low gain on */
1163 	static const u32 wl_rx_low_gain_on[] = {
1164 		0xec120101, 0xeb130101, 0xce140101, 0xcd150101, 0xcc160101,
1165 		0xcb170101, 0xca180101, 0x8d190101, 0x8c1a0101, 0x8b1b0101,
1166 		0x4f1c0101, 0x4e1d0101, 0x4d1e0101, 0x4c1f0101, 0x0e200101,
1167 		0x0d210101, 0x0c220101, 0x0b230101, 0xcf240001, 0xce250001,
1168 		0xcd260001, 0xcc270001, 0x8f280001
1169 	};
1170 	/* WL Rx Low gain off */
1171 	static const u32 wl_rx_low_gain_off[] = {
1172 		0xec120101, 0xeb130101, 0xea140101, 0xe9150101, 0xe8160101,
1173 		0xe7170101, 0xe6180101, 0xe5190101, 0xe41a0101, 0xe31b0101,
1174 		0xe21c0101, 0xe11d0101, 0xe01e0101, 0x861f0101, 0x85200101,
1175 		0x84210101, 0x83220101, 0x82230101, 0x81240101, 0x80250101,
1176 		0x44260101, 0x43270101, 0x42280101
1177 	};
1178 	u8 i;
1179 
1180 	if (low_gain == coex_dm->cur_wl_rx_low_gain_en)
1181 		return;
1182 
1183 	coex_dm->cur_wl_rx_low_gain_en = low_gain;
1184 
1185 	if (coex_dm->cur_wl_rx_low_gain_en) {
1186 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_on); i++)
1187 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_on[i]);
1188 	} else {
1189 		for (i = 0; i < ARRAY_SIZE(wl_rx_low_gain_off); i++)
1190 			rtw_write32(rtwdev, REG_AGCRSSI, wl_rx_low_gain_off[i]);
1191 	}
1192 }
1193 
1194 static void rtw8723d_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
1195 					      u32 ofdm_swing, u8 rf_path)
1196 {
1197 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1198 	s32 ele_A, ele_D, ele_C;
1199 	s32 ele_A_ext, ele_C_ext, ele_D_ext;
1200 	s32 iqk_result_x;
1201 	s32 iqk_result_y;
1202 	s32 value32;
1203 
1204 	switch (rf_path) {
1205 	default:
1206 	case RF_PATH_A:
1207 		iqk_result_x = dm_info->iqk.result.s1_x;
1208 		iqk_result_y = dm_info->iqk.result.s1_y;
1209 		break;
1210 	case RF_PATH_B:
1211 		iqk_result_x = dm_info->iqk.result.s0_x;
1212 		iqk_result_y = dm_info->iqk.result.s0_y;
1213 		break;
1214 	}
1215 
1216 	/* new element D */
1217 	ele_D = OFDM_SWING_D(ofdm_swing);
1218 	iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
1219 	/* new element A */
1220 	iqk_result_x = iqkxy_to_s32(iqk_result_x);
1221 	ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
1222 	/* new element C */
1223 	iqk_result_y = iqkxy_to_s32(iqk_result_y);
1224 	ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
1225 
1226 	switch (rf_path) {
1227 	case RF_PATH_A:
1228 	default:
1229 		/* write new elements A, C, D, and element B is always 0 */
1230 		value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
1231 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
1232 		value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
1233 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1234 				 value32);
1235 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1236 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1237 		value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
1238 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1239 		break;
1240 
1241 	case RF_PATH_B:
1242 		/* write new elements A, C, D, and element B is always 0 */
1243 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0, ele_D);
1244 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0, ele_C);
1245 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0, ele_A);
1246 
1247 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0,
1248 				 ele_D_ext);
1249 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0,
1250 				 ele_A_ext);
1251 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0,
1252 				 ele_C_ext);
1253 		break;
1254 	}
1255 }
1256 
1257 static void rtw8723d_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
1258 				    u8 rf_path)
1259 {
1260 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1261 	s32 value32;
1262 	u32 ofdm_swing;
1263 
1264 	if (ofdm_index >= RTW_OFDM_SWING_TABLE_SIZE)
1265 		ofdm_index = RTW_OFDM_SWING_TABLE_SIZE - 1;
1266 	else if (ofdm_index < 0)
1267 		ofdm_index = 0;
1268 
1269 	ofdm_swing = rtw8723d_ofdm_swing_table[ofdm_index];
1270 
1271 	if (dm_info->iqk.done) {
1272 		rtw8723d_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
1273 		return;
1274 	}
1275 
1276 	switch (rf_path) {
1277 	case RF_PATH_A:
1278 	default:
1279 		rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
1280 		rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1281 				 0x00);
1282 		value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1283 		value32 &= ~BIT_MASK_OFDM0_EXTS;
1284 		rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1285 		break;
1286 
1287 	case RF_PATH_B:
1288 		/* image S1:c80 to S0:Cd0 and Cd4 */
1289 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_S0,
1290 				 OFDM_SWING_A(ofdm_swing));
1291 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_B_S0,
1292 				 OFDM_SWING_B(ofdm_swing));
1293 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_S0,
1294 				 OFDM_SWING_C(ofdm_swing));
1295 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_S0,
1296 				 OFDM_SWING_D(ofdm_swing));
1297 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_D_EXT_S0, 0x0);
1298 		rtw_write32_mask(rtwdev, REG_TXIQ_CD_S0, BIT_MASK_TXIQ_C_EXT_S0, 0x0);
1299 		rtw_write32_mask(rtwdev, REG_TXIQ_AB_S0, BIT_MASK_TXIQ_A_EXT_S0, 0x0);
1300 		break;
1301 	}
1302 }
1303 
1304 static void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1305 					   s8 txagc_idx)
1306 {
1307 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1308 
1309 	dm_info->txagc_remnant_ofdm = txagc_idx;
1310 
1311 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
1312 	rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
1313 }
1314 
1315 static void rtw8723d_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1316 					  s8 txagc_idx)
1317 {
1318 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1319 
1320 	dm_info->txagc_remnant_cck = txagc_idx;
1321 
1322 	rtw_write32_mask(rtwdev, 0xab4, 0x000007FF,
1323 			 rtw8723d_cck_swing_table[swing_idx]);
1324 }
1325 
1326 static void rtw8723d_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1327 {
1328 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1329 	struct rtw_hal *hal = &rtwdev->hal;
1330 	u8 limit_ofdm;
1331 	u8 limit_cck = 40;
1332 	s8 final_ofdm_swing_index;
1333 	s8 final_cck_swing_index;
1334 
1335 	limit_ofdm = rtw8723x_pwrtrack_get_limit_ofdm(rtwdev);
1336 
1337 	final_ofdm_swing_index = RTW_DEF_OFDM_SWING_INDEX +
1338 				 dm_info->delta_power_index[path];
1339 	final_cck_swing_index = RTW_DEF_CCK_SWING_INDEX +
1340 				dm_info->delta_power_index[path];
1341 
1342 	if (final_ofdm_swing_index > limit_ofdm)
1343 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
1344 					       final_ofdm_swing_index - limit_ofdm);
1345 	else if (final_ofdm_swing_index < 0)
1346 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, 0,
1347 					       final_ofdm_swing_index);
1348 	else
1349 		rtw8723d_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
1350 
1351 	if (final_cck_swing_index > limit_cck)
1352 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
1353 					      final_cck_swing_index - limit_cck);
1354 	else if (final_cck_swing_index < 0)
1355 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, 0,
1356 					      final_cck_swing_index);
1357 	else
1358 		rtw8723d_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
1359 
1360 	rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
1361 }
1362 
1363 static void rtw8723d_phy_pwrtrack(struct rtw_dev *rtwdev)
1364 {
1365 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1366 	struct rtw_swing_table swing_table;
1367 	u8 thermal_value, delta, path;
1368 	bool do_iqk = false;
1369 
1370 	rtw_phy_config_swing_table(rtwdev, &swing_table);
1371 
1372 	if (rtwdev->efuse.thermal_meter[0] == 0xff)
1373 		return;
1374 
1375 	thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1376 
1377 	rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1378 
1379 	do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
1380 
1381 	if (do_iqk)
1382 		rtw8723x_lck(rtwdev);
1383 
1384 	if (dm_info->pwr_trk_init_trigger)
1385 		dm_info->pwr_trk_init_trigger = false;
1386 	else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1387 						   RF_PATH_A))
1388 		goto iqk;
1389 
1390 	delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1391 
1392 	delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
1393 
1394 	for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1395 		s8 delta_cur, delta_last;
1396 
1397 		delta_last = dm_info->delta_power_index[path];
1398 		delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
1399 							path, RF_PATH_A, delta);
1400 		if (delta_last == delta_cur)
1401 			continue;
1402 
1403 		dm_info->delta_power_index[path] = delta_cur;
1404 		rtw8723d_pwrtrack_set(rtwdev, path);
1405 	}
1406 
1407 	rtw8723x_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
1408 
1409 iqk:
1410 	if (do_iqk)
1411 		rtw8723d_phy_calibration(rtwdev);
1412 }
1413 
1414 static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
1415 {
1416 	struct rtw_efuse *efuse = &rtwdev->efuse;
1417 	struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1418 
1419 	if (efuse->power_track_type != 0)
1420 		return;
1421 
1422 	if (!dm_info->pwr_trk_triggered) {
1423 		rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1424 			     GENMASK(17, 16), 0x03);
1425 		dm_info->pwr_trk_triggered = true;
1426 		return;
1427 	}
1428 
1429 	rtw8723d_phy_pwrtrack(rtwdev);
1430 	dm_info->pwr_trk_triggered = false;
1431 }
1432 
1433 static struct rtw_chip_ops rtw8723d_ops = {
1434 	.phy_set_param		= rtw8723d_phy_set_param,
1435 	.read_efuse		= rtw8723x_read_efuse,
1436 	.query_rx_desc		= rtw8723d_query_rx_desc,
1437 	.set_channel		= rtw8723d_set_channel,
1438 	.mac_init		= rtw8723x_mac_init,
1439 	.shutdown		= rtw8723d_shutdown,
1440 	.read_rf		= rtw_phy_read_rf_sipi,
1441 	.write_rf		= rtw_phy_write_rf_reg_sipi,
1442 	.set_tx_power_index	= rtw8723x_set_tx_power_index,
1443 	.set_antenna		= NULL,
1444 	.cfg_ldo25		= rtw8723x_cfg_ldo25,
1445 	.efuse_grant		= rtw8723x_efuse_grant,
1446 	.false_alarm_statistics	= rtw8723x_false_alarm_statistics,
1447 	.phy_calibration	= rtw8723d_phy_calibration,
1448 	.cck_pd_set		= rtw8723d_phy_cck_pd_set,
1449 	.pwr_track		= rtw8723d_pwr_track,
1450 	.config_bfee		= NULL,
1451 	.set_gid_table		= NULL,
1452 	.cfg_csi_rate		= NULL,
1453 	.fill_txdesc_checksum	= rtw8723x_fill_txdesc_checksum,
1454 
1455 	.coex_set_init		= rtw8723x_coex_cfg_init,
1456 	.coex_set_ant_switch	= NULL,
1457 	.coex_set_gnt_fix	= rtw8723d_coex_cfg_gnt_fix,
1458 	.coex_set_gnt_debug	= rtw8723d_coex_cfg_gnt_debug,
1459 	.coex_set_rfe_type	= rtw8723d_coex_cfg_rfe_type,
1460 	.coex_set_wl_tx_power	= rtw8723d_coex_cfg_wl_tx_power,
1461 	.coex_set_wl_rx_gain	= rtw8723d_coex_cfg_wl_rx_gain,
1462 };
1463 
1464 /* Shared-Antenna Coex Table */
1465 static const struct coex_table_para table_sant_8723d[] = {
1466 	{0xffffffff, 0xffffffff}, /* case-0 */
1467 	{0x55555555, 0x55555555},
1468 	{0x66555555, 0x66555555},
1469 	{0xaaaaaaaa, 0xaaaaaaaa},
1470 	{0x5a5a5a5a, 0x5a5a5a5a},
1471 	{0xfafafafa, 0xfafafafa}, /* case-5 */
1472 	{0x6a5a5555, 0xaaaaaaaa},
1473 	{0x6a5a56aa, 0x6a5a56aa},
1474 	{0x6a5a5a5a, 0x6a5a5a5a},
1475 	{0x66555555, 0x5a5a5a5a},
1476 	{0x66555555, 0x6a5a5a5a}, /* case-10 */
1477 	{0x66555555, 0x6a5a5aaa},
1478 	{0x66555555, 0x5a5a5aaa},
1479 	{0x66555555, 0x6aaa5aaa},
1480 	{0x66555555, 0xaaaa5aaa},
1481 	{0x66555555, 0xaaaaaaaa}, /* case-15 */
1482 	{0xffff55ff, 0xfafafafa},
1483 	{0xffff55ff, 0x6afa5afa},
1484 	{0xaaffffaa, 0xfafafafa},
1485 	{0xaa5555aa, 0x5a5a5a5a},
1486 	{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
1487 	{0xaa5555aa, 0xaaaaaaaa},
1488 	{0xffffffff, 0x5a5a5a5a},
1489 	{0xffffffff, 0x5a5a5a5a},
1490 	{0xffffffff, 0x55555555},
1491 	{0xffffffff, 0x5a5a5aaa}, /* case-25 */
1492 	{0x55555555, 0x5a5a5a5a},
1493 	{0x55555555, 0xaaaaaaaa},
1494 	{0x55555555, 0x6a5a6a5a},
1495 	{0x66556655, 0x66556655},
1496 	{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
1497 	{0xffffffff, 0x5aaa5aaa},
1498 	{0x56555555, 0x5a5a5aaa},
1499 };
1500 
1501 /* Non-Shared-Antenna Coex Table */
1502 static const struct coex_table_para table_nsant_8723d[] = {
1503 	{0xffffffff, 0xffffffff}, /* case-100 */
1504 	{0x55555555, 0x55555555},
1505 	{0x66555555, 0x66555555},
1506 	{0xaaaaaaaa, 0xaaaaaaaa},
1507 	{0x5a5a5a5a, 0x5a5a5a5a},
1508 	{0xfafafafa, 0xfafafafa}, /* case-105 */
1509 	{0x5afa5afa, 0x5afa5afa},
1510 	{0x55555555, 0xfafafafa},
1511 	{0x66555555, 0xfafafafa},
1512 	{0x66555555, 0x5a5a5a5a},
1513 	{0x66555555, 0x6a5a5a5a}, /* case-110 */
1514 	{0x66555555, 0xaaaaaaaa},
1515 	{0xffff55ff, 0xfafafafa},
1516 	{0xffff55ff, 0x5afa5afa},
1517 	{0xffff55ff, 0xaaaaaaaa},
1518 	{0xffff55ff, 0xffff55ff}, /* case-115 */
1519 	{0xaaffffaa, 0x5afa5afa},
1520 	{0xaaffffaa, 0xaaaaaaaa},
1521 	{0xffffffff, 0xfafafafa},
1522 	{0xffffffff, 0x5afa5afa},
1523 	{0xffffffff, 0xaaaaaaaa}, /* case-120 */
1524 	{0x55ff55ff, 0x5afa5afa},
1525 	{0x55ff55ff, 0xaaaaaaaa},
1526 	{0x55ff55ff, 0x55ff55ff}
1527 };
1528 
1529 /* Shared-Antenna TDMA */
1530 static const struct coex_tdma_para tdma_sant_8723d[] = {
1531 	{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
1532 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
1533 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1534 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
1535 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1536 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
1537 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1538 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
1539 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1540 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1541 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
1542 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
1543 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1544 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1545 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1546 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
1547 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1548 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1549 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1550 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
1551 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
1552 	{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
1553 	{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
1554 	{ {0x55, 0x08, 0x03, 0x10, 0x54} },
1555 	{ {0x65, 0x10, 0x03, 0x11, 0x10} },
1556 	{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
1557 	{ {0x51, 0x08, 0x03, 0x10, 0x50} },
1558 	{ {0x61, 0x08, 0x03, 0x11, 0x11} }
1559 };
1560 
1561 /* Non-Shared-Antenna TDMA */
1562 static const struct coex_tdma_para tdma_nsant_8723d[] = {
1563 	{ {0x00, 0x00, 0x00, 0x00, 0x01} }, /* case-100 */
1564 	{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-101 */
1565 	{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1566 	{ {0x61, 0x30, 0x03, 0x11, 0x11} },
1567 	{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1568 	{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-105 */
1569 	{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1570 	{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
1571 	{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1572 	{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1573 	{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-110 */
1574 	{ {0x61, 0x08, 0x03, 0x11, 0x14} },
1575 	{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1576 	{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1577 	{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1578 	{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-115 */
1579 	{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1580 	{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1581 	{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1582 	{ {0x51, 0x20, 0x03, 0x10, 0x50} },
1583 	{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-120 */
1584 	{ {0x51, 0x08, 0x03, 0x10, 0x50} }
1585 };
1586 
1587 /* rssi in percentage % (dbm = % - 100) */
1588 static const u8 wl_rssi_step_8723d[] = {60, 50, 44, 30};
1589 static const u8 bt_rssi_step_8723d[] = {30, 30, 30, 30};
1590 static const struct coex_5g_afh_map afh_5g_8723d[] = { {0, 0, 0} };
1591 
1592 static const struct rtw_hw_reg btg_reg_8723d = {
1593 	.addr = REG_BTG_SEL, .mask = BIT_MASK_BTG_WL,
1594 };
1595 
1596 /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */
1597 static const struct coex_rf_para rf_para_tx_8723d[] = {
1598 	{0, 0, false, 7},  /* for normal */
1599 	{0, 10, false, 7}, /* for WL-CPT */
1600 	{1, 0, true, 4},
1601 	{1, 2, true, 4},
1602 	{1, 10, true, 4},
1603 	{1, 15, true, 4}
1604 };
1605 
1606 static const struct coex_rf_para rf_para_rx_8723d[] = {
1607 	{0, 0, false, 7},  /* for normal */
1608 	{0, 10, false, 7}, /* for WL-CPT */
1609 	{1, 0, true, 5},
1610 	{1, 2, true, 5},
1611 	{1, 10, true, 5},
1612 	{1, 15, true, 5}
1613 };
1614 
1615 static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8723d[] = {
1616 	{0x0005,
1617 	 RTW_PWR_CUT_ALL_MSK,
1618 	 RTW_PWR_INTF_ALL_MSK,
1619 	 RTW_PWR_ADDR_MAC,
1620 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(7), 0},
1621 	{0x0086,
1622 	 RTW_PWR_CUT_ALL_MSK,
1623 	 RTW_PWR_INTF_SDIO_MSK,
1624 	 RTW_PWR_ADDR_SDIO,
1625 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1626 	{0x0086,
1627 	 RTW_PWR_CUT_ALL_MSK,
1628 	 RTW_PWR_INTF_SDIO_MSK,
1629 	 RTW_PWR_ADDR_SDIO,
1630 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1631 	{0x004A,
1632 	 RTW_PWR_CUT_ALL_MSK,
1633 	 RTW_PWR_INTF_USB_MSK,
1634 	 RTW_PWR_ADDR_MAC,
1635 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1636 	{0x0005,
1637 	 RTW_PWR_CUT_ALL_MSK,
1638 	 RTW_PWR_INTF_ALL_MSK,
1639 	 RTW_PWR_ADDR_MAC,
1640 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), 0},
1641 	{0x0023,
1642 	 RTW_PWR_CUT_ALL_MSK,
1643 	 RTW_PWR_INTF_SDIO_MSK,
1644 	 RTW_PWR_ADDR_MAC,
1645 	 RTW_PWR_CMD_WRITE, BIT(4), 0},
1646 	{0x0301,
1647 	 RTW_PWR_CUT_ALL_MSK,
1648 	 RTW_PWR_INTF_PCI_MSK,
1649 	 RTW_PWR_ADDR_MAC,
1650 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1651 	{0xFFFF,
1652 	 RTW_PWR_CUT_ALL_MSK,
1653 	 RTW_PWR_INTF_ALL_MSK,
1654 	 0,
1655 	 RTW_PWR_CMD_END, 0, 0},
1656 };
1657 
1658 static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
1659 	{0x0020,
1660 	 RTW_PWR_CUT_ALL_MSK,
1661 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1662 	 RTW_PWR_ADDR_MAC,
1663 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1664 	{0x0001,
1665 	 RTW_PWR_CUT_ALL_MSK,
1666 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1667 	 RTW_PWR_ADDR_MAC,
1668 	 RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
1669 	{0x0000,
1670 	 RTW_PWR_CUT_ALL_MSK,
1671 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1672 	 RTW_PWR_ADDR_MAC,
1673 	 RTW_PWR_CMD_WRITE, BIT(5), 0},
1674 	{0x0005,
1675 	 RTW_PWR_CUT_ALL_MSK,
1676 	 RTW_PWR_INTF_ALL_MSK,
1677 	 RTW_PWR_ADDR_MAC,
1678 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
1679 	{0x0075,
1680 	 RTW_PWR_CUT_ALL_MSK,
1681 	 RTW_PWR_INTF_PCI_MSK,
1682 	 RTW_PWR_ADDR_MAC,
1683 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1684 	{0x0006,
1685 	 RTW_PWR_CUT_ALL_MSK,
1686 	 RTW_PWR_INTF_ALL_MSK,
1687 	 RTW_PWR_ADDR_MAC,
1688 	 RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
1689 	{0x0075,
1690 	 RTW_PWR_CUT_ALL_MSK,
1691 	 RTW_PWR_INTF_PCI_MSK,
1692 	 RTW_PWR_ADDR_MAC,
1693 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1694 	{0x0006,
1695 	 RTW_PWR_CUT_ALL_MSK,
1696 	 RTW_PWR_INTF_ALL_MSK,
1697 	 RTW_PWR_ADDR_MAC,
1698 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1699 	{0x0005,
1700 	 RTW_PWR_CUT_ALL_MSK,
1701 	 RTW_PWR_INTF_ALL_MSK,
1702 	 RTW_PWR_ADDR_MAC,
1703 	 RTW_PWR_CMD_POLLING, (BIT(1) | BIT(0)), 0},
1704 	{0x0005,
1705 	 RTW_PWR_CUT_ALL_MSK,
1706 	 RTW_PWR_INTF_ALL_MSK,
1707 	 RTW_PWR_ADDR_MAC,
1708 	 RTW_PWR_CMD_WRITE, BIT(7), 0},
1709 	{0x0005,
1710 	 RTW_PWR_CUT_ALL_MSK,
1711 	 RTW_PWR_INTF_ALL_MSK,
1712 	 RTW_PWR_ADDR_MAC,
1713 	 RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
1714 	{0x0005,
1715 	 RTW_PWR_CUT_ALL_MSK,
1716 	 RTW_PWR_INTF_ALL_MSK,
1717 	 RTW_PWR_ADDR_MAC,
1718 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1719 	{0x0005,
1720 	 RTW_PWR_CUT_ALL_MSK,
1721 	 RTW_PWR_INTF_ALL_MSK,
1722 	 RTW_PWR_ADDR_MAC,
1723 	 RTW_PWR_CMD_POLLING, BIT(0), 0},
1724 	{0x0010,
1725 	 RTW_PWR_CUT_ALL_MSK,
1726 	 RTW_PWR_INTF_ALL_MSK,
1727 	 RTW_PWR_ADDR_MAC,
1728 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1729 	{0x0049,
1730 	 RTW_PWR_CUT_ALL_MSK,
1731 	 RTW_PWR_INTF_ALL_MSK,
1732 	 RTW_PWR_ADDR_MAC,
1733 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1734 	{0x0063,
1735 	 RTW_PWR_CUT_ALL_MSK,
1736 	 RTW_PWR_INTF_ALL_MSK,
1737 	 RTW_PWR_ADDR_MAC,
1738 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1739 	{0x0062,
1740 	 RTW_PWR_CUT_ALL_MSK,
1741 	 RTW_PWR_INTF_ALL_MSK,
1742 	 RTW_PWR_ADDR_MAC,
1743 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1744 	{0x0058,
1745 	 RTW_PWR_CUT_ALL_MSK,
1746 	 RTW_PWR_INTF_ALL_MSK,
1747 	 RTW_PWR_ADDR_MAC,
1748 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1749 	{0x005A,
1750 	 RTW_PWR_CUT_ALL_MSK,
1751 	 RTW_PWR_INTF_ALL_MSK,
1752 	 RTW_PWR_ADDR_MAC,
1753 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1754 	{0x0068,
1755 	 RTW_PWR_CUT_TEST_MSK,
1756 	 RTW_PWR_INTF_ALL_MSK,
1757 	 RTW_PWR_ADDR_MAC,
1758 	 RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
1759 	{0x0069,
1760 	 RTW_PWR_CUT_ALL_MSK,
1761 	 RTW_PWR_INTF_ALL_MSK,
1762 	 RTW_PWR_ADDR_MAC,
1763 	 RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
1764 	{0x001f,
1765 	 RTW_PWR_CUT_ALL_MSK,
1766 	 RTW_PWR_INTF_ALL_MSK,
1767 	 RTW_PWR_ADDR_MAC,
1768 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1769 	{0x0077,
1770 	 RTW_PWR_CUT_ALL_MSK,
1771 	 RTW_PWR_INTF_ALL_MSK,
1772 	 RTW_PWR_ADDR_MAC,
1773 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1774 	{0x001f,
1775 	 RTW_PWR_CUT_ALL_MSK,
1776 	 RTW_PWR_INTF_ALL_MSK,
1777 	 RTW_PWR_ADDR_MAC,
1778 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
1779 	{0x0077,
1780 	 RTW_PWR_CUT_ALL_MSK,
1781 	 RTW_PWR_INTF_ALL_MSK,
1782 	 RTW_PWR_ADDR_MAC,
1783 	 RTW_PWR_CMD_WRITE, 0xFF, 0x07},
1784 	{0xFFFF,
1785 	 RTW_PWR_CUT_ALL_MSK,
1786 	 RTW_PWR_INTF_ALL_MSK,
1787 	 0,
1788 	 RTW_PWR_CMD_END, 0, 0},
1789 };
1790 
1791 static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
1792 	trans_carddis_to_cardemu_8723d,
1793 	trans_cardemu_to_act_8723d,
1794 	NULL
1795 };
1796 
1797 static const struct rtw_pwr_seq_cmd trans_act_to_lps_8723d[] = {
1798 	{0x0301,
1799 	 RTW_PWR_CUT_ALL_MSK,
1800 	 RTW_PWR_INTF_PCI_MSK,
1801 	 RTW_PWR_ADDR_MAC,
1802 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
1803 	{0x0522,
1804 	 RTW_PWR_CUT_ALL_MSK,
1805 	 RTW_PWR_INTF_ALL_MSK,
1806 	 RTW_PWR_ADDR_MAC,
1807 	 RTW_PWR_CMD_WRITE, 0xFF, 0xFF},
1808 	{0x05F8,
1809 	 RTW_PWR_CUT_ALL_MSK,
1810 	 RTW_PWR_INTF_ALL_MSK,
1811 	 RTW_PWR_ADDR_MAC,
1812 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
1813 	{0x05F9,
1814 	 RTW_PWR_CUT_ALL_MSK,
1815 	 RTW_PWR_INTF_ALL_MSK,
1816 	 RTW_PWR_ADDR_MAC,
1817 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
1818 	{0x05FA,
1819 	 RTW_PWR_CUT_ALL_MSK,
1820 	 RTW_PWR_INTF_ALL_MSK,
1821 	 RTW_PWR_ADDR_MAC,
1822 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
1823 	{0x05FB,
1824 	 RTW_PWR_CUT_ALL_MSK,
1825 	 RTW_PWR_INTF_ALL_MSK,
1826 	 RTW_PWR_ADDR_MAC,
1827 	 RTW_PWR_CMD_POLLING, 0xFF, 0},
1828 	{0x0002,
1829 	 RTW_PWR_CUT_ALL_MSK,
1830 	 RTW_PWR_INTF_ALL_MSK,
1831 	 RTW_PWR_ADDR_MAC,
1832 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1833 	{0x0002,
1834 	 RTW_PWR_CUT_ALL_MSK,
1835 	 RTW_PWR_INTF_ALL_MSK,
1836 	 RTW_PWR_ADDR_MAC,
1837 	 RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
1838 	{0x0002,
1839 	 RTW_PWR_CUT_ALL_MSK,
1840 	 RTW_PWR_INTF_ALL_MSK,
1841 	 RTW_PWR_ADDR_MAC,
1842 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1843 	{0x0100,
1844 	 RTW_PWR_CUT_ALL_MSK,
1845 	 RTW_PWR_INTF_ALL_MSK,
1846 	 RTW_PWR_ADDR_MAC,
1847 	 RTW_PWR_CMD_WRITE, 0xFF, 0x03},
1848 	{0x0101,
1849 	 RTW_PWR_CUT_ALL_MSK,
1850 	 RTW_PWR_INTF_ALL_MSK,
1851 	 RTW_PWR_ADDR_MAC,
1852 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1853 	{0x0093,
1854 	 RTW_PWR_CUT_ALL_MSK,
1855 	 RTW_PWR_INTF_SDIO_MSK,
1856 	 RTW_PWR_ADDR_MAC,
1857 	 RTW_PWR_CMD_WRITE, 0xFF, 0x00},
1858 	{0x0553,
1859 	 RTW_PWR_CUT_ALL_MSK,
1860 	 RTW_PWR_INTF_ALL_MSK,
1861 	 RTW_PWR_ADDR_MAC,
1862 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1863 	{0xFFFF,
1864 	 RTW_PWR_CUT_ALL_MSK,
1865 	 RTW_PWR_INTF_ALL_MSK,
1866 	 0,
1867 	 RTW_PWR_CMD_END, 0, 0},
1868 };
1869 
1870 static const struct rtw_pwr_seq_cmd trans_act_to_pre_carddis_8723d[] = {
1871 	{0x0003,
1872 	 RTW_PWR_CUT_ALL_MSK,
1873 	 RTW_PWR_INTF_ALL_MSK,
1874 	 RTW_PWR_ADDR_MAC,
1875 	 RTW_PWR_CMD_WRITE, BIT(2), 0},
1876 	{0x0080,
1877 	 RTW_PWR_CUT_ALL_MSK,
1878 	 RTW_PWR_INTF_ALL_MSK,
1879 	 RTW_PWR_ADDR_MAC,
1880 	 RTW_PWR_CMD_WRITE, 0xFF, 0},
1881 	{0xFFFF,
1882 	 RTW_PWR_CUT_ALL_MSK,
1883 	 RTW_PWR_INTF_ALL_MSK,
1884 	 0,
1885 	 RTW_PWR_CMD_END, 0, 0},
1886 };
1887 
1888 static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8723d[] = {
1889 	{0x0002,
1890 	 RTW_PWR_CUT_ALL_MSK,
1891 	 RTW_PWR_INTF_ALL_MSK,
1892 	 RTW_PWR_ADDR_MAC,
1893 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1894 	{0x0049,
1895 	 RTW_PWR_CUT_ALL_MSK,
1896 	 RTW_PWR_INTF_ALL_MSK,
1897 	 RTW_PWR_ADDR_MAC,
1898 	 RTW_PWR_CMD_WRITE, BIT(1), 0},
1899 	{0x0006,
1900 	 RTW_PWR_CUT_ALL_MSK,
1901 	 RTW_PWR_INTF_ALL_MSK,
1902 	 RTW_PWR_ADDR_MAC,
1903 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1904 	{0x0005,
1905 	 RTW_PWR_CUT_ALL_MSK,
1906 	 RTW_PWR_INTF_ALL_MSK,
1907 	 RTW_PWR_ADDR_MAC,
1908 	 RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
1909 	{0x0005,
1910 	 RTW_PWR_CUT_ALL_MSK,
1911 	 RTW_PWR_INTF_ALL_MSK,
1912 	 RTW_PWR_ADDR_MAC,
1913 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
1914 	{0x0010,
1915 	 RTW_PWR_CUT_ALL_MSK,
1916 	 RTW_PWR_INTF_ALL_MSK,
1917 	 RTW_PWR_ADDR_MAC,
1918 	 RTW_PWR_CMD_WRITE, BIT(6), 0},
1919 	{0x0000,
1920 	 RTW_PWR_CUT_ALL_MSK,
1921 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1922 	 RTW_PWR_ADDR_MAC,
1923 	 RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
1924 	{0x0020,
1925 	 RTW_PWR_CUT_ALL_MSK,
1926 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1927 	 RTW_PWR_ADDR_MAC,
1928 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1929 	{0xFFFF,
1930 	 RTW_PWR_CUT_ALL_MSK,
1931 	 RTW_PWR_INTF_ALL_MSK,
1932 	 0,
1933 	 RTW_PWR_CMD_END, 0, 0},
1934 };
1935 
1936 static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8723d[] = {
1937 	{0x0007,
1938 	 RTW_PWR_CUT_ALL_MSK,
1939 	 RTW_PWR_INTF_SDIO_MSK,
1940 	 RTW_PWR_ADDR_MAC,
1941 	 RTW_PWR_CMD_WRITE, 0xFF, 0x20},
1942 	{0x0005,
1943 	 RTW_PWR_CUT_ALL_MSK,
1944 	 RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
1945 	 RTW_PWR_ADDR_MAC,
1946 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3)},
1947 	{0x0005,
1948 	 RTW_PWR_CUT_ALL_MSK,
1949 	 RTW_PWR_INTF_PCI_MSK,
1950 	 RTW_PWR_ADDR_MAC,
1951 	 RTW_PWR_CMD_WRITE, BIT(2), BIT(2)},
1952 	{0x0005,
1953 	 RTW_PWR_CUT_ALL_MSK,
1954 	 RTW_PWR_INTF_PCI_MSK,
1955 	 RTW_PWR_ADDR_MAC,
1956 	 RTW_PWR_CMD_WRITE, BIT(3) | BIT(4), BIT(3) | BIT(4)},
1957 	{0x004A,
1958 	 RTW_PWR_CUT_ALL_MSK,
1959 	 RTW_PWR_INTF_USB_MSK,
1960 	 RTW_PWR_ADDR_MAC,
1961 	 RTW_PWR_CMD_WRITE, BIT(0), 1},
1962 	{0x0023,
1963 	 RTW_PWR_CUT_ALL_MSK,
1964 	 RTW_PWR_INTF_SDIO_MSK,
1965 	 RTW_PWR_ADDR_MAC,
1966 	 RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
1967 	{0x0086,
1968 	 RTW_PWR_CUT_ALL_MSK,
1969 	 RTW_PWR_INTF_SDIO_MSK,
1970 	 RTW_PWR_ADDR_SDIO,
1971 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1972 	{0x0086,
1973 	 RTW_PWR_CUT_ALL_MSK,
1974 	 RTW_PWR_INTF_SDIO_MSK,
1975 	 RTW_PWR_ADDR_SDIO,
1976 	 RTW_PWR_CMD_POLLING, BIT(1), 0},
1977 	{0xFFFF,
1978 	 RTW_PWR_CUT_ALL_MSK,
1979 	 RTW_PWR_INTF_ALL_MSK,
1980 	 0,
1981 	 RTW_PWR_CMD_END, 0, 0},
1982 };
1983 
1984 static const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
1985 	{0x001D,
1986 	 RTW_PWR_CUT_ALL_MSK,
1987 	 RTW_PWR_INTF_ALL_MSK,
1988 	 RTW_PWR_ADDR_MAC,
1989 	 RTW_PWR_CMD_WRITE, BIT(0), 0},
1990 	{0x001D,
1991 	 RTW_PWR_CUT_ALL_MSK,
1992 	 RTW_PWR_INTF_ALL_MSK,
1993 	 RTW_PWR_ADDR_MAC,
1994 	 RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
1995 	{0x001C,
1996 	 RTW_PWR_CUT_ALL_MSK,
1997 	 RTW_PWR_INTF_ALL_MSK,
1998 	 RTW_PWR_ADDR_MAC,
1999 	 RTW_PWR_CMD_WRITE, 0xFF, 0x0E},
2000 	{0xFFFF,
2001 	 RTW_PWR_CUT_ALL_MSK,
2002 	 RTW_PWR_INTF_ALL_MSK,
2003 	 0,
2004 	 RTW_PWR_CMD_END, 0, 0},
2005 };
2006 
2007 static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
2008 	trans_act_to_lps_8723d,
2009 	trans_act_to_pre_carddis_8723d,
2010 	trans_act_to_cardemu_8723d,
2011 	trans_cardemu_to_carddis_8723d,
2012 	trans_act_to_post_carddis_8723d,
2013 	NULL
2014 };
2015 
2016 static const struct rtw_page_table page_table_8723d[] = {
2017 	{12, 2, 2, 0, 1},
2018 	{12, 2, 2, 0, 1},
2019 	{12, 2, 2, 0, 1},
2020 	{12, 2, 2, 0, 1},
2021 	{12, 2, 2, 0, 1},
2022 };
2023 
2024 static const struct rtw_rqpn rqpn_table_8723d[] = {
2025 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2026 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2027 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2028 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2029 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2030 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2031 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2032 	 RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
2033 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2034 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2035 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2036 	 RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
2037 	{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
2038 	 RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
2039 	 RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
2040 };
2041 
2042 static const struct rtw_intf_phy_para pcie_gen1_param_8723d[] = {
2043 	{0x0008, 0x4a22,
2044 	 RTW_IP_SEL_PHY,
2045 	 RTW_INTF_PHY_CUT_ALL,
2046 	 RTW_INTF_PHY_PLATFORM_ALL},
2047 	{0x0009, 0x1000,
2048 	 RTW_IP_SEL_PHY,
2049 	 ~(RTW_INTF_PHY_CUT_A | RTW_INTF_PHY_CUT_B),
2050 	 RTW_INTF_PHY_PLATFORM_ALL},
2051 	{0xFFFF, 0x0000,
2052 	 RTW_IP_SEL_PHY,
2053 	 RTW_INTF_PHY_CUT_ALL,
2054 	 RTW_INTF_PHY_PLATFORM_ALL},
2055 };
2056 
2057 static const struct rtw_intf_phy_para_table phy_para_table_8723d = {
2058 	.gen1_para	= pcie_gen1_param_8723d,
2059 	.n_gen1_para	= ARRAY_SIZE(pcie_gen1_param_8723d),
2060 };
2061 
2062 static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
2063 	[0] = { .phy_pg_tbl	= &rtw8723d_bb_pg_tbl,
2064 		.txpwr_lmt_tbl	= &rtw8723d_txpwr_lmt_tbl,},
2065 };
2066 
2067 static const u8 rtw8723d_pwrtrk_2gb_n[] = {
2068 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2069 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2070 };
2071 
2072 static const u8 rtw8723d_pwrtrk_2gb_p[] = {
2073 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2074 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2075 };
2076 
2077 static const u8 rtw8723d_pwrtrk_2ga_n[] = {
2078 	0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
2079 	6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
2080 };
2081 
2082 static const u8 rtw8723d_pwrtrk_2ga_p[] = {
2083 	0, 0, 1, 1, 2, 2, 2, 3, 3, 4, 4, 5, 5, 6, 7,
2084 	7, 8, 8, 8, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10
2085 };
2086 
2087 static const u8 rtw8723d_pwrtrk_2g_cck_b_n[] = {
2088 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2089 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2090 };
2091 
2092 static const u8 rtw8723d_pwrtrk_2g_cck_b_p[] = {
2093 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2094 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2095 };
2096 
2097 static const u8 rtw8723d_pwrtrk_2g_cck_a_n[] = {
2098 	0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
2099 	6, 7, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11
2100 };
2101 
2102 static const u8 rtw8723d_pwrtrk_2g_cck_a_p[] = {
2103 	0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7,
2104 	7, 8, 9, 9, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11
2105 };
2106 
2107 static const s8 rtw8723d_pwrtrk_xtal_n[] = {
2108 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2109 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
2110 };
2111 
2112 static const s8 rtw8723d_pwrtrk_xtal_p[] = {
2113 	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2114 	0, -10, -12, -14, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16
2115 };
2116 
2117 static const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
2118 	.pwrtrk_2gb_n = rtw8723d_pwrtrk_2gb_n,
2119 	.pwrtrk_2gb_p = rtw8723d_pwrtrk_2gb_p,
2120 	.pwrtrk_2ga_n = rtw8723d_pwrtrk_2ga_n,
2121 	.pwrtrk_2ga_p = rtw8723d_pwrtrk_2ga_p,
2122 	.pwrtrk_2g_cckb_n = rtw8723d_pwrtrk_2g_cck_b_n,
2123 	.pwrtrk_2g_cckb_p = rtw8723d_pwrtrk_2g_cck_b_p,
2124 	.pwrtrk_2g_ccka_n = rtw8723d_pwrtrk_2g_cck_a_n,
2125 	.pwrtrk_2g_ccka_p = rtw8723d_pwrtrk_2g_cck_a_p,
2126 	.pwrtrk_xtal_p = rtw8723d_pwrtrk_xtal_p,
2127 	.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
2128 };
2129 
2130 static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
2131 	{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2132 	{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
2133 	{0, 0, RTW_REG_DOMAIN_NL},
2134 	{0x964, BIT(1), RTW_REG_DOMAIN_MAC8},
2135 	{0x864, BIT(0), RTW_REG_DOMAIN_MAC8},
2136 	{0xab7, BIT(5), RTW_REG_DOMAIN_MAC8},
2137 	{0xa01, BIT(7), RTW_REG_DOMAIN_MAC8},
2138 	{0, 0, RTW_REG_DOMAIN_NL},
2139 	{0x430, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2140 	{0x434, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2141 	{0x42a, MASKLWORD, RTW_REG_DOMAIN_MAC16},
2142 	{0x426, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2143 	{0x45e, BIT(3), RTW_REG_DOMAIN_MAC8},
2144 	{0, 0, RTW_REG_DOMAIN_NL},
2145 	{0x4c6, BIT(4), RTW_REG_DOMAIN_MAC8},
2146 	{0x40, BIT(5), RTW_REG_DOMAIN_MAC8},
2147 	{0x550, MASKDWORD, RTW_REG_DOMAIN_MAC32},
2148 	{0x522, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
2149 	{0x953, BIT(1), RTW_REG_DOMAIN_MAC8},
2150 };
2151 
2152 const struct rtw_chip_info rtw8723d_hw_spec = {
2153 	.ops = &rtw8723d_ops,
2154 	.id = RTW_CHIP_TYPE_8723D,
2155 	.fw_name = "rtw88/rtw8723d_fw.bin",
2156 	.wlan_cpu = RTW_WCPU_11N,
2157 	.tx_pkt_desc_sz = 40,
2158 	.tx_buf_desc_sz = 16,
2159 	.rx_pkt_desc_sz = 24,
2160 	.rx_buf_desc_sz = 8,
2161 	.phy_efuse_size = 512,
2162 	.log_efuse_size = 512,
2163 	.ptct_efuse_size = 96 + 1,
2164 	.txff_size = 32768,
2165 	.rxff_size = 16384,
2166 	.rsvd_drv_pg_num = 8,
2167 	.txgi_factor = 1,
2168 	.is_pwr_by_rate_dec = true,
2169 	.max_power_index = 0x3f,
2170 	.csi_buf_pg_num = 0,
2171 	.band = RTW_BAND_2G,
2172 	.page_size = TX_PAGE_SIZE,
2173 	.dig_min = 0x20,
2174 	.usb_tx_agg_desc_num = 1,
2175 	.ht_supported = true,
2176 	.vht_supported = false,
2177 	.lps_deep_mode_supported = 0,
2178 	.sys_func_en = 0xFD,
2179 	.pwr_on_seq = card_enable_flow_8723d,
2180 	.pwr_off_seq = card_disable_flow_8723d,
2181 	.page_table = page_table_8723d,
2182 	.rqpn_table = rqpn_table_8723d,
2183 	.prioq_addrs = &rtw8723x_common.prioq_addrs,
2184 	.intf_table = &phy_para_table_8723d,
2185 	.dig = rtw8723x_common.dig,
2186 	.dig_cck = rtw8723x_common.dig_cck,
2187 	.rf_sipi_addr = {0x840, 0x844},
2188 	.rf_sipi_read_addr = rtw8723x_common.rf_sipi_addr,
2189 	.fix_rf_phy_num = 2,
2190 	.ltecoex_addr = &rtw8723x_common.ltecoex_addr,
2191 	.mac_tbl = &rtw8723d_mac_tbl,
2192 	.agc_tbl = &rtw8723d_agc_tbl,
2193 	.bb_tbl = &rtw8723d_bb_tbl,
2194 	.rf_tbl = {&rtw8723d_rf_a_tbl},
2195 	.rfe_defs = rtw8723d_rfe_defs,
2196 	.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
2197 	.rx_ldpc = false,
2198 	.pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
2199 	.iqk_threshold = 8,
2200 	.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
2201 	.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
2202 
2203 	.coex_para_ver = 0x2007022f,
2204 	.bt_desired_ver = 0x2f,
2205 	.scbd_support = true,
2206 	.new_scbd10_def = true,
2207 	.ble_hid_profile_support = false,
2208 	.wl_mimo_ps_support = false,
2209 	.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
2210 	.bt_rssi_type = COEX_BTRSSI_RATIO,
2211 	.ant_isolation = 15,
2212 	.rssi_tolerance = 2,
2213 	.wl_rssi_step = wl_rssi_step_8723d,
2214 	.bt_rssi_step = bt_rssi_step_8723d,
2215 	.table_sant_num = ARRAY_SIZE(table_sant_8723d),
2216 	.table_sant = table_sant_8723d,
2217 	.table_nsant_num = ARRAY_SIZE(table_nsant_8723d),
2218 	.table_nsant = table_nsant_8723d,
2219 	.tdma_sant_num = ARRAY_SIZE(tdma_sant_8723d),
2220 	.tdma_sant = tdma_sant_8723d,
2221 	.tdma_nsant_num = ARRAY_SIZE(tdma_nsant_8723d),
2222 	.tdma_nsant = tdma_nsant_8723d,
2223 	.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8723d),
2224 	.wl_rf_para_tx = rf_para_tx_8723d,
2225 	.wl_rf_para_rx = rf_para_rx_8723d,
2226 	.bt_afh_span_bw20 = 0x20,
2227 	.bt_afh_span_bw40 = 0x30,
2228 	.afh_5g_num = ARRAY_SIZE(afh_5g_8723d),
2229 	.afh_5g = afh_5g_8723d,
2230 	.btg_reg = &btg_reg_8723d,
2231 
2232 	.coex_info_hw_regs_num = ARRAY_SIZE(coex_info_hw_regs_8723d),
2233 	.coex_info_hw_regs = coex_info_hw_regs_8723d,
2234 };
2235 EXPORT_SYMBOL(rtw8723d_hw_spec);
2236 
2237 MODULE_FIRMWARE("rtw88/rtw8723d_fw.bin");
2238 
2239 MODULE_AUTHOR("Realtek Corporation");
2240 MODULE_DESCRIPTION("Realtek 802.11n wireless 8723d driver");
2241 MODULE_LICENSE("Dual BSD/GPL");
2242