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