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