Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/net/wireless/realtek/rtw88/rtw8703b.c
25924 views
1
// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2
/* Copyright Fiona Klute <[email protected]> */
3
4
#include <linux/of_net.h>
5
#include "main.h"
6
#include "coex.h"
7
#include "debug.h"
8
#include "mac.h"
9
#include "phy.h"
10
#include "reg.h"
11
#include "rx.h"
12
#include "rtw8703b.h"
13
#include "rtw8703b_tables.h"
14
#include "rtw8723x.h"
15
16
#define BIT_MASK_TXQ_INIT (BIT(7))
17
#define WLAN_RL_VAL 0x3030
18
/* disable BAR */
19
#define WLAN_BAR_VAL 0x0201ffff
20
#define WLAN_PIFS_VAL 0
21
#define WLAN_RX_PKT_LIMIT 0x18
22
#define WLAN_SLOT_TIME 0x09
23
#define WLAN_SPEC_SIFS 0x100a
24
#define WLAN_MAX_AGG_NR 0x1f
25
#define WLAN_AMPDU_MAX_TIME 0x70
26
27
/* unit is 32us */
28
#define TBTT_PROHIBIT_SETUP_TIME 0x04
29
#define TBTT_PROHIBIT_HOLD_TIME 0x80
30
#define TBTT_PROHIBIT_HOLD_TIME_STOP_BCN 0x64
31
32
#define TRANS_SEQ_END \
33
0xFFFF, \
34
RTW_PWR_CUT_ALL_MSK, \
35
RTW_PWR_INTF_ALL_MSK, \
36
0, \
37
RTW_PWR_CMD_END, 0, 0
38
39
/* rssi in percentage % (dbm = % - 100) */
40
/* These are used to select simple signal quality levels, might need
41
* tweaking. Same for rf_para tables below.
42
*/
43
static const u8 wl_rssi_step_8703b[] = {60, 50, 44, 30};
44
static const u8 bt_rssi_step_8703b[] = {30, 30, 30, 30};
45
static const struct coex_5g_afh_map afh_5g_8703b[] = { {0, 0, 0} };
46
47
/* Actually decreasing wifi TX power/RX gain isn't implemented in
48
* rtw8703b, but hopefully adjusting the BT side helps.
49
*/
50
static const struct coex_rf_para rf_para_tx_8703b[] = {
51
{0, 0, false, 7}, /* for normal */
52
{0, 10, false, 7}, /* for WL-CPT */
53
{1, 0, true, 4},
54
{1, 2, true, 4},
55
{1, 10, true, 4},
56
{1, 15, true, 4}
57
};
58
59
static const struct coex_rf_para rf_para_rx_8703b[] = {
60
{0, 0, false, 7}, /* for normal */
61
{0, 10, false, 7}, /* for WL-CPT */
62
{1, 0, true, 5},
63
{1, 2, true, 5},
64
{1, 10, true, 5},
65
{1, 15, true, 5}
66
};
67
68
static const u32 rtw8703b_ofdm_swing_table[] = {
69
0x0b40002d, /* 0, -15.0dB */
70
0x0c000030, /* 1, -14.5dB */
71
0x0cc00033, /* 2, -14.0dB */
72
0x0d800036, /* 3, -13.5dB */
73
0x0e400039, /* 4, -13.0dB */
74
0x0f00003c, /* 5, -12.5dB */
75
0x10000040, /* 6, -12.0dB */
76
0x11000044, /* 7, -11.5dB */
77
0x12000048, /* 8, -11.0dB */
78
0x1300004c, /* 9, -10.5dB */
79
0x14400051, /* 10, -10.0dB */
80
0x15800056, /* 11, -9.5dB */
81
0x16c0005b, /* 12, -9.0dB */
82
0x18000060, /* 13, -8.5dB */
83
0x19800066, /* 14, -8.0dB */
84
0x1b00006c, /* 15, -7.5dB */
85
0x1c800072, /* 16, -7.0dB */
86
0x1e400079, /* 17, -6.5dB */
87
0x20000080, /* 18, -6.0dB */
88
0x22000088, /* 19, -5.5dB */
89
0x24000090, /* 20, -5.0dB */
90
0x26000098, /* 21, -4.5dB */
91
0x288000a2, /* 22, -4.0dB */
92
0x2ac000ab, /* 23, -3.5dB */
93
0x2d4000b5, /* 24, -3.0dB */
94
0x300000c0, /* 25, -2.5dB */
95
0x32c000cb, /* 26, -2.0dB */
96
0x35c000d7, /* 27, -1.5dB */
97
0x390000e4, /* 28, -1.0dB */
98
0x3c8000f2, /* 29, -0.5dB */
99
0x40000100, /* 30, +0dB */
100
0x43c0010f, /* 31, +0.5dB */
101
0x47c0011f, /* 32, +1.0dB */
102
0x4c000130, /* 33, +1.5dB */
103
0x50800142, /* 34, +2.0dB */
104
0x55400155, /* 35, +2.5dB */
105
0x5a400169, /* 36, +3.0dB */
106
0x5fc0017f, /* 37, +3.5dB */
107
0x65400195, /* 38, +4.0dB */
108
0x6b8001ae, /* 39, +4.5dB */
109
0x71c001c7, /* 40, +5.0dB */
110
0x788001e2, /* 41, +5.5dB */
111
0x7f8001fe /* 42, +6.0dB */
112
};
113
114
static const u32 rtw8703b_cck_pwr_regs[] = {
115
0x0a22, 0x0a23, 0x0a24, 0x0a25, 0x0a26, 0x0a27, 0x0a28, 0x0a29,
116
0x0a9a, 0x0a9b, 0x0a9c, 0x0a9d, 0x0aa0, 0x0aa1, 0x0aa2, 0x0aa3,
117
};
118
119
static const u8 rtw8703b_cck_swing_table[][16] = {
120
{0x44, 0x42, 0x3C, 0x33, 0x28, 0x1C, 0x13, 0x0B, 0x05, 0x02,
121
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-16dB*/
122
{0x48, 0x46, 0x3F, 0x36, 0x2A, 0x1E, 0x14, 0x0B, 0x05, 0x02,
123
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15.5dB*/
124
{0x4D, 0x4A, 0x43, 0x39, 0x2C, 0x20, 0x15, 0x0C, 0x06, 0x02,
125
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-15dB*/
126
{0x51, 0x4F, 0x47, 0x3C, 0x2F, 0x22, 0x16, 0x0D, 0x06, 0x02,
127
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14.5dB*/
128
{0x56, 0x53, 0x4B, 0x40, 0x32, 0x24, 0x17, 0x0E, 0x06, 0x02,
129
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-14dB*/
130
{0x5B, 0x58, 0x50, 0x43, 0x35, 0x26, 0x19, 0x0E, 0x07, 0x02,
131
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13.5dB*/
132
{0x60, 0x5D, 0x54, 0x47, 0x38, 0x28, 0x1A, 0x0F, 0x07, 0x02,
133
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-13dB*/
134
{0x66, 0x63, 0x59, 0x4C, 0x3B, 0x2B, 0x1C, 0x10, 0x08, 0x02,
135
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12.5dB*/
136
{0x6C, 0x69, 0x5F, 0x50, 0x3F, 0x2D, 0x1E, 0x11, 0x08, 0x03,
137
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-12dB*/
138
{0x73, 0x6F, 0x64, 0x55, 0x42, 0x30, 0x1F, 0x12, 0x08, 0x03,
139
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11.5dB*/
140
{0x79, 0x76, 0x6A, 0x5A, 0x46, 0x33, 0x21, 0x13, 0x09, 0x03,
141
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-11dB*/
142
{0x81, 0x7C, 0x71, 0x5F, 0x4A, 0x36, 0x23, 0x14, 0x0A, 0x03,
143
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10.5dB*/
144
{0x88, 0x84, 0x77, 0x65, 0x4F, 0x39, 0x25, 0x15, 0x0A, 0x03,
145
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-10dB*/
146
{0x90, 0x8C, 0x7E, 0x6B, 0x54, 0x3C, 0x27, 0x17, 0x0B, 0x03,
147
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9.5dB*/
148
{0x99, 0x94, 0x86, 0x71, 0x58, 0x40, 0x2A, 0x18, 0x0B, 0x04,
149
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-9dB*/
150
{0xA2, 0x9D, 0x8E, 0x78, 0x5E, 0x43, 0x2C, 0x19, 0x0C, 0x04,
151
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8.5dB*/
152
{0xAC, 0xA6, 0x96, 0x7F, 0x63, 0x47, 0x2F, 0x1B, 0x0D, 0x04,
153
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-8dB*/
154
{0xB6, 0xB0, 0x9F, 0x87, 0x69, 0x4C, 0x32, 0x1D, 0x0D, 0x04,
155
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7.5dB*/
156
{0xC1, 0xBA, 0xA8, 0x8F, 0x6F, 0x50, 0x35, 0x1E, 0x0E, 0x04,
157
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-7dB*/
158
{0xCC, 0xC5, 0xB2, 0x97, 0x76, 0x55, 0x38, 0x20, 0x0F, 0x05,
159
0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /*-6.5dB*/
160
{0xD8, 0xD1, 0xBD, 0xA0, 0x7D, 0x5A, 0x3B, 0x22, 0x10, 0x05,
161
0x00, 0x00, 0x00, 0x00, 0x00, 0x00} /*-6dB*/
162
};
163
164
#define RTW_OFDM_SWING_TABLE_SIZE ARRAY_SIZE(rtw8703b_ofdm_swing_table)
165
#define RTW_CCK_SWING_TABLE_SIZE ARRAY_SIZE(rtw8703b_cck_swing_table)
166
167
static const struct rtw_pwr_seq_cmd trans_pre_enable_8703b[] = {
168
/* set up external crystal (XTAL) */
169
{REG_PAD_CTRL1 + 2,
170
RTW_PWR_CUT_ALL_MSK,
171
RTW_PWR_INTF_ALL_MSK,
172
RTW_PWR_ADDR_MAC,
173
RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
174
/* set CLK_REQ to high active */
175
{0x0069,
176
RTW_PWR_CUT_ALL_MSK,
177
RTW_PWR_INTF_ALL_MSK,
178
RTW_PWR_ADDR_MAC,
179
RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
180
/* unlock ISO/CLK/power control register */
181
{REG_RSV_CTRL,
182
RTW_PWR_CUT_ALL_MSK,
183
RTW_PWR_INTF_ALL_MSK,
184
RTW_PWR_ADDR_MAC,
185
RTW_PWR_CMD_WRITE, 0xff, 0},
186
{TRANS_SEQ_END},
187
};
188
189
static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8703b[] = {
190
{0x0005,
191
RTW_PWR_CUT_ALL_MSK,
192
RTW_PWR_INTF_ALL_MSK,
193
RTW_PWR_ADDR_MAC,
194
RTW_PWR_CMD_WRITE, BIT(7), 0},
195
{TRANS_SEQ_END},
196
};
197
198
static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8703b[] = {
199
{0x0023,
200
RTW_PWR_CUT_ALL_MSK,
201
RTW_PWR_INTF_SDIO_MSK,
202
RTW_PWR_ADDR_MAC,
203
RTW_PWR_CMD_WRITE, BIT(4), BIT(4)},
204
{0x0007,
205
RTW_PWR_CUT_ALL_MSK,
206
RTW_PWR_INTF_SDIO_MSK | RTW_PWR_INTF_USB_MSK,
207
RTW_PWR_ADDR_MAC,
208
RTW_PWR_CMD_WRITE, 0xFF, 0x20},
209
{0x0006,
210
RTW_PWR_CUT_ALL_MSK,
211
RTW_PWR_INTF_ALL_MSK,
212
RTW_PWR_ADDR_MAC,
213
RTW_PWR_CMD_WRITE, BIT(0), 0},
214
{0x0005,
215
RTW_PWR_CUT_ALL_MSK,
216
RTW_PWR_INTF_ALL_MSK,
217
RTW_PWR_ADDR_MAC,
218
RTW_PWR_CMD_WRITE, BIT(7), BIT(7)},
219
{TRANS_SEQ_END},
220
};
221
222
static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8703b[] = {
223
{0x0020,
224
RTW_PWR_CUT_ALL_MSK,
225
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
226
RTW_PWR_ADDR_MAC,
227
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
228
{0x0067,
229
RTW_PWR_CUT_ALL_MSK,
230
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
231
RTW_PWR_ADDR_MAC,
232
RTW_PWR_CMD_WRITE, BIT(4), 0},
233
{0x0001,
234
RTW_PWR_CUT_ALL_MSK,
235
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
236
RTW_PWR_ADDR_MAC,
237
RTW_PWR_CMD_DELAY, 1, RTW_PWR_DELAY_MS},
238
{0x0000,
239
RTW_PWR_CUT_ALL_MSK,
240
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
241
RTW_PWR_ADDR_MAC,
242
RTW_PWR_CMD_WRITE, BIT(5), 0},
243
{0x0005,
244
RTW_PWR_CUT_ALL_MSK,
245
RTW_PWR_INTF_ALL_MSK,
246
RTW_PWR_ADDR_MAC,
247
RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3) | BIT(2)), 0},
248
{0x0075,
249
RTW_PWR_CUT_ALL_MSK,
250
RTW_PWR_INTF_PCI_MSK,
251
RTW_PWR_ADDR_MAC,
252
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
253
{0x0004,
254
RTW_PWR_CUT_ALL_MSK,
255
RTW_PWR_INTF_PCI_MSK,
256
RTW_PWR_ADDR_MAC,
257
RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
258
{0x0004,
259
RTW_PWR_CUT_ALL_MSK,
260
RTW_PWR_INTF_PCI_MSK,
261
RTW_PWR_ADDR_MAC,
262
RTW_PWR_CMD_WRITE, BIT(3), 0},
263
/* wait for power ready */
264
{0x0006,
265
RTW_PWR_CUT_ALL_MSK,
266
RTW_PWR_INTF_ALL_MSK,
267
RTW_PWR_ADDR_MAC,
268
RTW_PWR_CMD_POLLING, BIT(1), BIT(1)},
269
{0x0075,
270
RTW_PWR_CUT_ALL_MSK,
271
RTW_PWR_INTF_PCI_MSK,
272
RTW_PWR_ADDR_MAC,
273
RTW_PWR_CMD_WRITE, BIT(0), 0},
274
{0x0006,
275
RTW_PWR_CUT_ALL_MSK,
276
RTW_PWR_INTF_ALL_MSK,
277
RTW_PWR_ADDR_MAC,
278
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
279
{0x0005,
280
RTW_PWR_CUT_ALL_MSK,
281
RTW_PWR_INTF_ALL_MSK,
282
RTW_PWR_ADDR_MAC,
283
RTW_PWR_CMD_WRITE, BIT(7), 0},
284
{0x0005,
285
RTW_PWR_CUT_ALL_MSK,
286
RTW_PWR_INTF_ALL_MSK,
287
RTW_PWR_ADDR_MAC,
288
RTW_PWR_CMD_WRITE, (BIT(4) | BIT(3)), 0},
289
{0x0005,
290
RTW_PWR_CUT_ALL_MSK,
291
RTW_PWR_INTF_ALL_MSK,
292
RTW_PWR_ADDR_MAC,
293
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
294
{0x0005,
295
RTW_PWR_CUT_ALL_MSK,
296
RTW_PWR_INTF_ALL_MSK,
297
RTW_PWR_ADDR_MAC,
298
RTW_PWR_CMD_POLLING, BIT(0), 0},
299
{0x0010,
300
RTW_PWR_CUT_ALL_MSK,
301
RTW_PWR_INTF_ALL_MSK,
302
RTW_PWR_ADDR_MAC,
303
RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
304
{0x0049,
305
RTW_PWR_CUT_ALL_MSK,
306
RTW_PWR_INTF_ALL_MSK,
307
RTW_PWR_ADDR_MAC,
308
RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
309
{0x0063,
310
RTW_PWR_CUT_ALL_MSK,
311
RTW_PWR_INTF_ALL_MSK,
312
RTW_PWR_ADDR_MAC,
313
RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
314
{0x0062,
315
RTW_PWR_CUT_ALL_MSK,
316
RTW_PWR_INTF_ALL_MSK,
317
RTW_PWR_ADDR_MAC,
318
RTW_PWR_CMD_WRITE, BIT(1), 0},
319
{0x0058,
320
RTW_PWR_CUT_ALL_MSK,
321
RTW_PWR_INTF_ALL_MSK,
322
RTW_PWR_ADDR_MAC,
323
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
324
{0x005A,
325
RTW_PWR_CUT_ALL_MSK,
326
RTW_PWR_INTF_ALL_MSK,
327
RTW_PWR_ADDR_MAC,
328
RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
329
{0x0068,
330
RTW_PWR_CUT_TEST_MSK,
331
RTW_PWR_INTF_ALL_MSK,
332
RTW_PWR_ADDR_MAC,
333
RTW_PWR_CMD_WRITE, BIT(3), BIT(3)},
334
{0x0069,
335
RTW_PWR_CUT_ALL_MSK,
336
RTW_PWR_INTF_ALL_MSK,
337
RTW_PWR_ADDR_MAC,
338
RTW_PWR_CMD_WRITE, BIT(6), BIT(6)},
339
{TRANS_SEQ_END},
340
};
341
342
static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8703b[] = {
343
{0x001f,
344
RTW_PWR_CUT_ALL_MSK,
345
RTW_PWR_INTF_ALL_MSK,
346
RTW_PWR_ADDR_MAC,
347
RTW_PWR_CMD_WRITE, 0xff, 0},
348
{0x0049,
349
RTW_PWR_CUT_ALL_MSK,
350
RTW_PWR_INTF_ALL_MSK,
351
RTW_PWR_ADDR_MAC,
352
RTW_PWR_CMD_WRITE, BIT(1), 0},
353
{0x0006,
354
RTW_PWR_CUT_ALL_MSK,
355
RTW_PWR_INTF_ALL_MSK,
356
RTW_PWR_ADDR_MAC,
357
RTW_PWR_CMD_WRITE, BIT(0), BIT(0)},
358
{0x0005,
359
RTW_PWR_CUT_ALL_MSK,
360
RTW_PWR_INTF_ALL_MSK,
361
RTW_PWR_ADDR_MAC,
362
RTW_PWR_CMD_WRITE, BIT(1), BIT(1)},
363
{0x0005,
364
RTW_PWR_CUT_ALL_MSK,
365
RTW_PWR_INTF_ALL_MSK,
366
RTW_PWR_ADDR_MAC,
367
RTW_PWR_CMD_POLLING, BIT(1), 0},
368
{0x0010,
369
RTW_PWR_CUT_ALL_MSK,
370
RTW_PWR_INTF_ALL_MSK,
371
RTW_PWR_ADDR_MAC,
372
RTW_PWR_CMD_WRITE, BIT(6), 0},
373
{0x0000,
374
RTW_PWR_CUT_ALL_MSK,
375
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
376
RTW_PWR_ADDR_MAC,
377
RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
378
{0x0020,
379
RTW_PWR_CUT_ALL_MSK,
380
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
381
RTW_PWR_ADDR_MAC,
382
RTW_PWR_CMD_WRITE, BIT(0), 0},
383
{TRANS_SEQ_END},
384
};
385
386
static const struct rtw_pwr_seq_cmd trans_act_to_reset_mcu_8703b[] = {
387
{REG_SYS_FUNC_EN + 1,
388
RTW_PWR_CUT_ALL_MSK,
389
RTW_PWR_INTF_SDIO_MSK,
390
RTW_PWR_ADDR_MAC,
391
RTW_PWR_CMD_WRITE, BIT_FEN_CPUEN, 0},
392
/* reset MCU ready */
393
{REG_MCUFW_CTRL,
394
RTW_PWR_CUT_ALL_MSK,
395
RTW_PWR_INTF_SDIO_MSK,
396
RTW_PWR_ADDR_MAC,
397
RTW_PWR_CMD_WRITE, 0xff, 0},
398
/* reset MCU IO wrapper */
399
{REG_RSV_CTRL + 1,
400
RTW_PWR_CUT_ALL_MSK,
401
RTW_PWR_INTF_SDIO_MSK,
402
RTW_PWR_ADDR_MAC,
403
RTW_PWR_CMD_WRITE, BIT(0), 0},
404
{REG_RSV_CTRL + 1,
405
RTW_PWR_CUT_ALL_MSK,
406
RTW_PWR_INTF_SDIO_MSK,
407
RTW_PWR_ADDR_MAC,
408
RTW_PWR_CMD_WRITE, BIT(0), 1},
409
{TRANS_SEQ_END},
410
};
411
412
static const struct rtw_pwr_seq_cmd trans_act_to_lps_8703b[] = {
413
{0x0301,
414
RTW_PWR_CUT_ALL_MSK,
415
RTW_PWR_INTF_ALL_MSK,
416
RTW_PWR_ADDR_MAC,
417
RTW_PWR_CMD_WRITE, 0xff, 0xff},
418
{0x0522,
419
RTW_PWR_CUT_ALL_MSK,
420
RTW_PWR_INTF_ALL_MSK,
421
RTW_PWR_ADDR_MAC,
422
RTW_PWR_CMD_WRITE, 0xff, 0xff},
423
{0x05f8,
424
RTW_PWR_CUT_ALL_MSK,
425
RTW_PWR_INTF_ALL_MSK,
426
RTW_PWR_ADDR_MAC,
427
RTW_PWR_CMD_POLLING, 0xff, 0},
428
{0x05f9,
429
RTW_PWR_CUT_ALL_MSK,
430
RTW_PWR_INTF_ALL_MSK,
431
RTW_PWR_ADDR_MAC,
432
RTW_PWR_CMD_POLLING, 0xff, 0},
433
{0x05fa,
434
RTW_PWR_CUT_ALL_MSK,
435
RTW_PWR_INTF_ALL_MSK,
436
RTW_PWR_ADDR_MAC,
437
RTW_PWR_CMD_POLLING, 0xff, 0},
438
{0x05fb,
439
RTW_PWR_CUT_ALL_MSK,
440
RTW_PWR_INTF_ALL_MSK,
441
RTW_PWR_ADDR_MAC,
442
RTW_PWR_CMD_POLLING, 0xff, 0},
443
{0x0002,
444
RTW_PWR_CUT_ALL_MSK,
445
RTW_PWR_INTF_ALL_MSK,
446
RTW_PWR_ADDR_MAC,
447
RTW_PWR_CMD_WRITE, BIT(0), 0},
448
{0x0002,
449
RTW_PWR_CUT_ALL_MSK,
450
RTW_PWR_INTF_ALL_MSK,
451
RTW_PWR_ADDR_MAC,
452
RTW_PWR_CMD_DELAY, 0, RTW_PWR_DELAY_US},
453
{0x0002,
454
RTW_PWR_CUT_ALL_MSK,
455
RTW_PWR_INTF_ALL_MSK,
456
RTW_PWR_ADDR_MAC,
457
RTW_PWR_CMD_WRITE, BIT(1), 0},
458
{0x0100,
459
RTW_PWR_CUT_ALL_MSK,
460
RTW_PWR_INTF_ALL_MSK,
461
RTW_PWR_ADDR_MAC,
462
RTW_PWR_CMD_WRITE, 0xff, 0x03},
463
{0x0101,
464
RTW_PWR_CUT_ALL_MSK,
465
RTW_PWR_INTF_ALL_MSK,
466
RTW_PWR_ADDR_MAC,
467
RTW_PWR_CMD_WRITE, BIT(1), 0},
468
{0x0093,
469
RTW_PWR_CUT_ALL_MSK,
470
RTW_PWR_INTF_SDIO_MSK,
471
RTW_PWR_ADDR_MAC,
472
RTW_PWR_CMD_WRITE, 0xff, 0},
473
{0x0553,
474
RTW_PWR_CUT_ALL_MSK,
475
RTW_PWR_INTF_ALL_MSK,
476
RTW_PWR_ADDR_MAC,
477
RTW_PWR_CMD_WRITE, BIT(5), BIT(5)},
478
{TRANS_SEQ_END},
479
};
480
481
static const struct rtw_pwr_seq_cmd * const card_enable_flow_8703b[] = {
482
trans_pre_enable_8703b,
483
trans_carddis_to_cardemu_8703b,
484
trans_cardemu_to_act_8703b,
485
NULL
486
};
487
488
static const struct rtw_pwr_seq_cmd * const card_disable_flow_8703b[] = {
489
trans_act_to_lps_8703b,
490
trans_act_to_reset_mcu_8703b,
491
trans_act_to_cardemu_8703b,
492
trans_cardemu_to_carddis_8703b,
493
NULL
494
};
495
496
static const struct rtw_page_table page_table_8703b[] = {
497
{12, 2, 2, 0, 1},
498
{12, 2, 2, 0, 1},
499
{12, 2, 2, 0, 1},
500
{12, 2, 2, 0, 1},
501
{12, 2, 2, 0, 1},
502
};
503
504
static const struct rtw_rqpn rqpn_table_8703b[] = {
505
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
506
RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
507
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
508
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
509
RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
510
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
511
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
512
RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_HIGH,
513
RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
514
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
515
RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
516
RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH},
517
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
518
RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
519
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
520
};
521
522
static void try_mac_from_devicetree(struct rtw_dev *rtwdev)
523
{
524
struct device_node *node = rtwdev->dev->of_node;
525
struct rtw_efuse *efuse = &rtwdev->efuse;
526
int ret;
527
528
if (node) {
529
ret = of_get_mac_address(node, efuse->addr);
530
if (ret == 0) {
531
rtw_dbg(rtwdev, RTW_DBG_EFUSE,
532
"got wifi mac address from DT: %pM\n",
533
efuse->addr);
534
}
535
}
536
}
537
538
static int rtw8703b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
539
{
540
struct rtw_efuse *efuse = &rtwdev->efuse;
541
int ret;
542
543
ret = rtw8723x_read_efuse(rtwdev, log_map);
544
if (ret != 0)
545
return ret;
546
547
if (!is_valid_ether_addr(efuse->addr))
548
try_mac_from_devicetree(rtwdev);
549
550
return 0;
551
}
552
553
static void rtw8703b_pwrtrack_init(struct rtw_dev *rtwdev)
554
{
555
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
556
u8 path;
557
558
/* TODO: The vendor driver selects these using tables in
559
* halrf_powertracking_ce.c, functions are called
560
* get_swing_index and get_cck_swing_index. There the current
561
* fixed values are only the defaults in case no match is
562
* found.
563
*/
564
dm_info->default_ofdm_index = 30;
565
dm_info->default_cck_index = 20;
566
567
for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) {
568
ewma_thermal_init(&dm_info->avg_thermal[path]);
569
dm_info->delta_power_index[path] = 0;
570
}
571
dm_info->pwr_trk_triggered = false;
572
dm_info->pwr_trk_init_trigger = true;
573
dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
574
dm_info->txagc_remnant_cck = 0;
575
dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0;
576
}
577
578
static void rtw8703b_phy_set_param(struct rtw_dev *rtwdev)
579
{
580
u8 xtal_cap = rtwdev->efuse.crystal_cap & 0x3F;
581
582
/* power on BB/RF domain */
583
rtw_write16_set(rtwdev, REG_SYS_FUNC_EN,
584
BIT_FEN_EN_25_1 | BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB);
585
rtw_write8_set(rtwdev, REG_RF_CTRL,
586
BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB);
587
rtw_write_rf(rtwdev, RF_PATH_A, RF_WLINT, RFREG_MASK, 0x0780);
588
rtw_write8(rtwdev, REG_AFE_CTRL1 + 1, 0x80);
589
590
rtw_phy_load_tables(rtwdev);
591
592
rtw_write32_clr(rtwdev, REG_RCR, BIT_RCR_ADF);
593
/* 0xff is from vendor driver, rtw8723d uses
594
* BIT_HIQ_NO_LMT_EN_ROOT. Comment in vendor driver: "Packet
595
* in Hi Queue Tx immediately". I wonder if setting all bits
596
* is really necessary.
597
*/
598
rtw_write8_set(rtwdev, REG_HIQ_NO_LMT_EN, 0xff);
599
rtw_write16_set(rtwdev, REG_AFE_CTRL_4, BIT_CK320M_AFE_EN | BIT_EN_SYN);
600
601
rtw_write32_mask(rtwdev, REG_AFE_CTRL3, BIT_MASK_XTAL,
602
xtal_cap | (xtal_cap << 6));
603
rtw_write32_set(rtwdev, REG_FPGA0_RFMOD, BIT_CCKEN | BIT_OFDMEN);
604
605
/* Init EDCA */
606
rtw_write16(rtwdev, REG_SPEC_SIFS, WLAN_SPEC_SIFS);
607
rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, WLAN_SPEC_SIFS);
608
rtw_write16(rtwdev, REG_SIFS, WLAN_SPEC_SIFS); /* CCK */
609
rtw_write16(rtwdev, REG_SIFS + 2, WLAN_SPEC_SIFS); /* OFDM */
610
/* TXOP */
611
rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226);
612
rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324);
613
rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B);
614
rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F);
615
616
/* Init retry */
617
rtw_write8(rtwdev, REG_ACKTO, 0x40);
618
619
/* Set up RX aggregation. sdio.c also sets DMA mode, but not
620
* the burst parameters.
621
*/
622
rtw_write8(rtwdev, REG_RXDMA_MODE,
623
BIT_DMA_MODE |
624
FIELD_PREP_CONST(BIT_MASK_AGG_BURST_NUM, AGG_BURST_NUM) |
625
FIELD_PREP_CONST(BIT_MASK_AGG_BURST_SIZE, AGG_BURST_SIZE));
626
627
/* Init beacon parameters */
628
rtw_write8(rtwdev, REG_BCN_CTRL,
629
BIT_DIS_TSF_UDT | BIT_EN_BCN_FUNCTION | BIT_EN_TXBCN_RPT);
630
rtw_write8(rtwdev, REG_TBTT_PROHIBIT, TBTT_PROHIBIT_SETUP_TIME);
631
rtw_write8(rtwdev, REG_TBTT_PROHIBIT + 1,
632
TBTT_PROHIBIT_HOLD_TIME_STOP_BCN & 0xFF);
633
rtw_write8(rtwdev, REG_TBTT_PROHIBIT + 2,
634
(rtw_read8(rtwdev, REG_TBTT_PROHIBIT + 2) & 0xF0)
635
| (TBTT_PROHIBIT_HOLD_TIME_STOP_BCN >> 8));
636
637
/* configure packet burst */
638
rtw_write8_set(rtwdev, REG_SINGLE_AMPDU_CTRL, BIT_EN_SINGLE_APMDU);
639
rtw_write8(rtwdev, REG_RX_PKT_LIMIT, WLAN_RX_PKT_LIMIT);
640
rtw_write8(rtwdev, REG_MAX_AGGR_NUM, WLAN_MAX_AGG_NR);
641
rtw_write8(rtwdev, REG_PIFS, WLAN_PIFS_VAL);
642
rtw_write8_clr(rtwdev, REG_FWHW_TXQ_CTRL, BIT_MASK_TXQ_INIT);
643
rtw_write8(rtwdev, REG_AMPDU_MAX_TIME, WLAN_AMPDU_MAX_TIME);
644
645
rtw_write8(rtwdev, REG_SLOT, WLAN_SLOT_TIME);
646
rtw_write16(rtwdev, REG_RETRY_LIMIT, WLAN_RL_VAL);
647
rtw_write32(rtwdev, REG_BAR_MODE_CTRL, WLAN_BAR_VAL);
648
rtw_write16(rtwdev, REG_ATIMWND, 0x2);
649
650
rtw_phy_init(rtwdev);
651
652
if (rtw_read32_mask(rtwdev, REG_BB_AMP, BIT_MASK_RX_LNA) != 0) {
653
rtwdev->dm_info.rx_cck_agc_report_type = 1;
654
} else {
655
rtwdev->dm_info.rx_cck_agc_report_type = 0;
656
rtw_warn(rtwdev, "unexpected cck agc report type");
657
}
658
659
rtw8723x_lck(rtwdev);
660
661
rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x50);
662
rtw_write32_mask(rtwdev, REG_OFDM0_XAAGC1, MASKBYTE0, 0x20);
663
664
rtw8703b_pwrtrack_init(rtwdev);
665
}
666
667
static bool rtw8703b_check_spur_ov_thres(struct rtw_dev *rtwdev,
668
u32 freq, u32 thres)
669
{
670
bool ret = false;
671
672
rtw_write32(rtwdev, REG_ANALOG_P4, DIS_3WIRE);
673
rtw_write32(rtwdev, REG_PSDFN, freq);
674
rtw_write32(rtwdev, REG_PSDFN, START_PSD | freq);
675
676
msleep(30);
677
if (rtw_read32(rtwdev, REG_PSDRPT) >= thres)
678
ret = true;
679
680
rtw_write32(rtwdev, REG_PSDFN, freq);
681
rtw_write32(rtwdev, REG_ANALOG_P4, EN_3WIRE);
682
683
return ret;
684
}
685
686
static void rtw8703b_cfg_notch(struct rtw_dev *rtwdev, u8 channel, bool notch)
687
{
688
if (!notch) {
689
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x1f);
690
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
691
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
692
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
693
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
694
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
695
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
696
return;
697
}
698
699
switch (channel) {
700
case 5:
701
fallthrough;
702
case 13:
703
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xb);
704
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
705
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x06000000);
706
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
707
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
708
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
709
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
710
break;
711
case 6:
712
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x4);
713
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
714
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000600);
715
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
716
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
717
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000000);
718
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
719
break;
720
case 7:
721
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x3);
722
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
723
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
724
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
725
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
726
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x06000000);
727
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
728
break;
729
case 8:
730
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0xa);
731
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
732
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
733
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
734
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
735
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00000380);
736
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
737
break;
738
case 14:
739
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_MASK_RXDSP, 0x5);
740
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x1);
741
rtw_write32(rtwdev, REG_OFDM1_CSI1, 0x00000000);
742
rtw_write32(rtwdev, REG_OFDM1_CSI2, 0x00000000);
743
rtw_write32(rtwdev, REG_OFDM1_CSI3, 0x00000000);
744
rtw_write32(rtwdev, REG_OFDM1_CSI4, 0x00180000);
745
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x1);
746
break;
747
default:
748
rtw_warn(rtwdev,
749
"Bug: Notch filter enable called for channel %u!",
750
channel);
751
rtw_write32_mask(rtwdev, REG_OFDM0_RXDSP, BIT_EN_RXDSP, 0x0);
752
rtw_write32_mask(rtwdev, REG_OFDM1_CFOTRK, BIT_EN_CFOTRK, 0x0);
753
break;
754
}
755
}
756
757
static void rtw8703b_spur_cal(struct rtw_dev *rtwdev, u8 channel)
758
{
759
bool notch;
760
u32 freq;
761
762
if (channel == 5) {
763
freq = FREQ_CH5;
764
} else if (channel == 6) {
765
freq = FREQ_CH6;
766
} else if (channel == 7) {
767
freq = FREQ_CH7;
768
} else if (channel == 8) {
769
freq = FREQ_CH8;
770
} else if (channel == 13) {
771
freq = FREQ_CH13;
772
} else if (channel == 14) {
773
freq = FREQ_CH14;
774
} else {
775
rtw8703b_cfg_notch(rtwdev, channel, false);
776
return;
777
}
778
779
notch = rtw8703b_check_spur_ov_thres(rtwdev, freq, SPUR_THRES);
780
rtw8703b_cfg_notch(rtwdev, channel, notch);
781
}
782
783
static void rtw8703b_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw)
784
{
785
u32 rf_cfgch_a;
786
u32 rf_cfgch_b;
787
/* default value for 20M */
788
u32 rf_rck = 0x00000C08;
789
790
rf_cfgch_a = rtw_read_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK);
791
rf_cfgch_b = rtw_read_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK);
792
793
rf_cfgch_a &= ~RFCFGCH_CHANNEL_MASK;
794
rf_cfgch_b &= ~RFCFGCH_CHANNEL_MASK;
795
rf_cfgch_a |= (channel & RFCFGCH_CHANNEL_MASK);
796
rf_cfgch_b |= (channel & RFCFGCH_CHANNEL_MASK);
797
798
rf_cfgch_a &= ~RFCFGCH_BW_MASK;
799
switch (bw) {
800
case RTW_CHANNEL_WIDTH_20:
801
rf_cfgch_a |= RFCFGCH_BW_20M;
802
break;
803
case RTW_CHANNEL_WIDTH_40:
804
rf_cfgch_a |= RFCFGCH_BW_40M;
805
rf_rck = 0x00000C4C;
806
break;
807
default:
808
break;
809
}
810
811
rtw_write_rf(rtwdev, RF_PATH_A, RF_CFGCH, RFREG_MASK, rf_cfgch_a);
812
rtw_write_rf(rtwdev, RF_PATH_B, RF_CFGCH, RFREG_MASK, rf_cfgch_b);
813
814
rtw_write_rf(rtwdev, RF_PATH_A, RF_RCK1, RFREG_MASK, rf_rck);
815
rtw8703b_spur_cal(rtwdev, channel);
816
}
817
818
#define CCK_DFIR_NR_8703B 2
819
static const struct rtw_backup_info cck_dfir_cfg[][CCK_DFIR_NR_8703B] = {
820
[0] = {
821
{ .len = 4, .reg = REG_CCK_TXSF2, .val = 0x5A7DA0BD },
822
{ .len = 4, .reg = REG_CCK_DBG, .val = 0x0000223B },
823
},
824
[1] = {
825
{ .len = 4, .reg = REG_CCK_TXSF2, .val = 0x00000000 },
826
{ .len = 4, .reg = REG_CCK_DBG, .val = 0x00000000 },
827
},
828
};
829
830
static void rtw8703b_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
831
u8 primary_ch_idx)
832
{
833
const struct rtw_backup_info *cck_dfir;
834
int i;
835
836
cck_dfir = channel <= 13 ? cck_dfir_cfg[0] : cck_dfir_cfg[1];
837
838
for (i = 0; i < CCK_DFIR_NR_8703B; i++, cck_dfir++)
839
rtw_write32(rtwdev, cck_dfir->reg, cck_dfir->val);
840
841
switch (bw) {
842
case RTW_CHANNEL_WIDTH_20:
843
rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x0);
844
rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x0);
845
rtw_write32_mask(rtwdev, REG_OFDM0_TX_PSD_NOISE,
846
GENMASK(31, 30), 0x0);
847
rtw_write32(rtwdev, REG_BBRX_DFIR, 0x4A880000);
848
rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x19F60000);
849
break;
850
case RTW_CHANNEL_WIDTH_40:
851
rtw_write32_mask(rtwdev, REG_FPGA0_RFMOD, BIT_MASK_RFMOD, 0x1);
852
rtw_write32_mask(rtwdev, REG_FPGA1_RFMOD, BIT_MASK_RFMOD, 0x1);
853
rtw_write32(rtwdev, REG_BBRX_DFIR, 0x40100000);
854
rtw_write32(rtwdev, REG_OFDM0_A_TX_AFE, 0x51F60000);
855
rtw_write32_mask(rtwdev, REG_CCK0_SYS, BIT_CCK_SIDE_BAND,
856
primary_ch_idx == RTW_SC_20_UPPER ? 1 : 0);
857
rtw_write32_mask(rtwdev, REG_OFDM_FA_RSTD_11N, 0xC00,
858
primary_ch_idx == RTW_SC_20_UPPER ? 2 : 1);
859
860
rtw_write32_mask(rtwdev, REG_BB_PWR_SAV5_11N, GENMASK(27, 26),
861
primary_ch_idx == RTW_SC_20_UPPER ? 1 : 2);
862
break;
863
default:
864
break;
865
}
866
}
867
868
static void rtw8703b_set_channel(struct rtw_dev *rtwdev, u8 channel,
869
u8 bw, u8 primary_chan_idx)
870
{
871
rtw8703b_set_channel_rf(rtwdev, channel, bw);
872
rtw_set_channel_mac(rtwdev, channel, bw, primary_chan_idx);
873
rtw8703b_set_channel_bb(rtwdev, channel, bw, primary_chan_idx);
874
}
875
876
/* Not all indices are valid, based on available data. None of the
877
* known valid values are positive, so use 0x7f as "invalid".
878
*/
879
#define LNA_IDX_INVALID 0x7f
880
static const s8 lna_gain_table[16] = {
881
-2, LNA_IDX_INVALID, LNA_IDX_INVALID, LNA_IDX_INVALID,
882
-6, LNA_IDX_INVALID, LNA_IDX_INVALID, -19,
883
-32, LNA_IDX_INVALID, -36, -42,
884
LNA_IDX_INVALID, LNA_IDX_INVALID, LNA_IDX_INVALID, -48,
885
};
886
887
static s8 get_cck_rx_pwr(struct rtw_dev *rtwdev, u8 lna_idx, u8 vga_idx)
888
{
889
s8 lna_gain = 0;
890
891
if (lna_idx < ARRAY_SIZE(lna_gain_table))
892
lna_gain = lna_gain_table[lna_idx];
893
894
if (lna_gain >= 0) {
895
rtw_warn(rtwdev, "incorrect lna index (%d)\n", lna_idx);
896
return -120;
897
}
898
899
return lna_gain - 2 * vga_idx;
900
}
901
902
static void query_phy_status_cck(struct rtw_dev *rtwdev, u8 *phy_raw,
903
struct rtw_rx_pkt_stat *pkt_stat)
904
{
905
struct phy_status_8703b *phy_status = (struct phy_status_8703b *)phy_raw;
906
u8 vga_idx = phy_status->cck_agc_rpt_ofdm_cfosho_a & VGA_BITS;
907
u8 lna_idx = phy_status->cck_agc_rpt_ofdm_cfosho_a & LNA_L_BITS;
908
s8 rx_power;
909
910
if (rtwdev->dm_info.rx_cck_agc_report_type == 1)
911
lna_idx = FIELD_PREP(BIT_LNA_H_MASK,
912
phy_status->cck_rpt_b_ofdm_cfosho_b & LNA_H_BIT)
913
| FIELD_PREP(BIT_LNA_L_MASK, lna_idx);
914
else
915
lna_idx = FIELD_PREP(BIT_LNA_L_MASK, lna_idx);
916
rx_power = get_cck_rx_pwr(rtwdev, lna_idx, vga_idx);
917
918
pkt_stat->rx_power[RF_PATH_A] = rx_power;
919
pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
920
rtwdev->dm_info.rssi[RF_PATH_A] = pkt_stat->rssi;
921
pkt_stat->signal_power = rx_power;
922
}
923
924
static void query_phy_status_ofdm(struct rtw_dev *rtwdev, u8 *phy_raw,
925
struct rtw_rx_pkt_stat *pkt_stat)
926
{
927
struct phy_status_8703b *phy_status = (struct phy_status_8703b *)phy_raw;
928
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
929
s8 val_s8;
930
931
val_s8 = phy_status->path_agc[RF_PATH_A].gain & 0x3F;
932
pkt_stat->rx_power[RF_PATH_A] = (val_s8 * 2) - 110;
933
pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1);
934
pkt_stat->rx_snr[RF_PATH_A] = (s8)(phy_status->path_rxsnr[RF_PATH_A] / 2);
935
936
/* signal power reported by HW */
937
val_s8 = phy_status->cck_sig_qual_ofdm_pwdb_all >> 1;
938
pkt_stat->signal_power = (val_s8 & 0x7f) - 110;
939
940
pkt_stat->rx_evm[RF_PATH_A] = phy_status->stream_rxevm[RF_PATH_A];
941
pkt_stat->cfo_tail[RF_PATH_A] = phy_status->path_cfotail[RF_PATH_A];
942
943
dm_info->curr_rx_rate = pkt_stat->rate;
944
dm_info->rssi[RF_PATH_A] = pkt_stat->rssi;
945
dm_info->rx_snr[RF_PATH_A] = pkt_stat->rx_snr[RF_PATH_A] >> 1;
946
/* convert to KHz (used only for debugfs) */
947
dm_info->cfo_tail[RF_PATH_A] = (pkt_stat->cfo_tail[RF_PATH_A] * 5) >> 1;
948
949
/* (EVM value as s8 / 2) is dbm, should usually be in -33 to 0
950
* range. rx_evm_dbm needs the absolute (positive) value.
951
*/
952
val_s8 = (s8)pkt_stat->rx_evm[RF_PATH_A];
953
val_s8 = clamp_t(s8, -val_s8 >> 1, 0, 64);
954
val_s8 &= 0x3F; /* 64->0: second path of 1SS rate is 64 */
955
dm_info->rx_evm_dbm[RF_PATH_A] = val_s8;
956
}
957
958
static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
959
struct rtw_rx_pkt_stat *pkt_stat)
960
{
961
if (pkt_stat->rate <= DESC_RATE11M)
962
query_phy_status_cck(rtwdev, phy_status, pkt_stat);
963
else
964
query_phy_status_ofdm(rtwdev, phy_status, pkt_stat);
965
}
966
967
#define ADDA_ON_VAL_8703B 0x03c00014
968
969
static
970
void rtw8703b_iqk_config_mac(struct rtw_dev *rtwdev,
971
const struct rtw8723x_iqk_backup_regs *backup)
972
{
973
rtw_write8(rtwdev, rtw8723x_common.iqk_mac8_regs[0], 0x3F);
974
for (int i = 1; i < RTW8723X_IQK_MAC8_REG_NUM; i++)
975
rtw_write8(rtwdev, rtw8723x_common.iqk_mac8_regs[i],
976
backup->mac8[i] & (~BIT(3)));
977
}
978
979
#define IQK_LTE_WRITE_VAL_8703B 0x00007700
980
#define IQK_DELAY_TIME_8703B 4
981
982
static void rtw8703b_iqk_one_shot(struct rtw_dev *rtwdev, bool tx)
983
{
984
u32 regval;
985
ktime_t t;
986
s64 dur;
987
int ret;
988
989
/* enter IQK mode */
990
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, EN_IQK);
991
rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8703B);
992
993
/* One shot, LOK & IQK */
994
rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf9000000);
995
rtw_write32(rtwdev, REG_IQK_AGC_PTS_11N, 0xf8000000);
996
997
t = ktime_get();
998
msleep(IQK_DELAY_TIME_8703B);
999
ret = read_poll_timeout(rtw_read32, regval, regval != 0, 1000,
1000
100000, false, rtwdev,
1001
REG_IQK_RDY);
1002
dur = ktime_us_delta(ktime_get(), t);
1003
1004
if (ret)
1005
rtw_warn(rtwdev, "[IQK] %s timed out after %lldus!\n",
1006
tx ? "TX" : "RX", dur);
1007
else
1008
rtw_dbg(rtwdev, RTW_DBG_RFK,
1009
"[IQK] %s done after %lldus\n",
1010
tx ? "TX" : "RX", dur);
1011
}
1012
1013
static void rtw8703b_iqk_txrx_path_post(struct rtw_dev *rtwdev,
1014
const struct rtw8723x_iqk_backup_regs *backup)
1015
{
1016
rtw8723x_iqk_restore_lte_path_gnt(rtwdev, backup);
1017
rtw_write32(rtwdev, REG_BB_SEL_BTG, backup->bb_sel_btg);
1018
1019
/* leave IQK mode */
1020
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1021
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x0);
1022
}
1023
1024
static u8 rtw8703b_iqk_check_tx_failed(struct rtw_dev *rtwdev)
1025
{
1026
s32 tx_x, tx_y;
1027
u32 tx_fail;
1028
1029
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xeac = 0x%x\n",
1030
rtw_read32(rtwdev, REG_IQK_RES_RY));
1031
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe94 = 0x%x, 0xe9c = 0x%x\n",
1032
rtw_read32(rtwdev, REG_IQK_RES_TX),
1033
rtw_read32(rtwdev, REG_IQK_RES_TY));
1034
rtw_dbg(rtwdev, RTW_DBG_RFK,
1035
"[IQK] 0xe90(before IQK) = 0x%x, 0xe98(after IQK) = 0x%x\n",
1036
rtw_read32(rtwdev, REG_IQK_RDY),
1037
rtw_read32(rtwdev, 0xe98));
1038
1039
tx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_TX_FAIL);
1040
tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
1041
tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
1042
1043
if (!tx_fail && tx_x != IQK_TX_X_ERR && tx_y != IQK_TX_Y_ERR)
1044
return IQK_TX_OK;
1045
1046
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] A TX IQK failed\n");
1047
1048
return 0;
1049
}
1050
1051
static u8 rtw8703b_iqk_check_rx_failed(struct rtw_dev *rtwdev)
1052
{
1053
s32 rx_x, rx_y;
1054
u32 rx_fail;
1055
1056
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xea4 = 0x%x, 0xeac = 0x%x\n",
1057
rtw_read32(rtwdev, REG_IQK_RES_RX),
1058
rtw_read32(rtwdev, REG_IQK_RES_RY));
1059
1060
rtw_dbg(rtwdev, RTW_DBG_RFK,
1061
"[IQK] 0xea0(before IQK) = 0x%x, 0xea8(after IQK) = 0x%x\n",
1062
rtw_read32(rtwdev, 0xea0),
1063
rtw_read32(rtwdev, 0xea8));
1064
1065
rx_fail = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_IQK_RX_FAIL);
1066
rx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_RX, BIT_MASK_RES_RX);
1067
rx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_RY, BIT_MASK_RES_RY);
1068
rx_y = abs(iqkxy_to_s32(rx_y));
1069
1070
if (!rx_fail && rx_x != IQK_RX_X_ERR && rx_y != IQK_RX_Y_ERR &&
1071
rx_x < IQK_RX_X_UPPER && rx_x > IQK_RX_X_LOWER &&
1072
rx_y < IQK_RX_Y_LMT)
1073
return IQK_RX_OK;
1074
1075
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] A RX IQK failed\n");
1076
1077
return 0;
1078
}
1079
1080
static u8 rtw8703b_iqk_tx_path(struct rtw_dev *rtwdev,
1081
const struct rtw8723x_iqk_backup_regs *backup)
1082
{
1083
u8 status;
1084
1085
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A TX IQK!\n");
1086
1087
/* IQK setting */
1088
rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
1089
rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1090
rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
1091
rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
1092
rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
1093
rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
1094
rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8214030f);
1095
rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28110000);
1096
rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000);
1097
rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000);
1098
1099
/* LO calibration setting */
1100
rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x00462911);
1101
1102
/* leave IQK mode */
1103
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000);
1104
1105
/* PA, PAD setting */
1106
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x1);
1107
rtw_write_rf(rtwdev, RF_PATH_A, 0x55, 0x7f, 0x7);
1108
rtw_write_rf(rtwdev, RF_PATH_A, 0x7f, RFREG_MASK, 0xd400);
1109
1110
rtw8703b_iqk_one_shot(rtwdev, true);
1111
status = rtw8703b_iqk_check_tx_failed(rtwdev);
1112
1113
rtw8703b_iqk_txrx_path_post(rtwdev, backup);
1114
1115
return status;
1116
}
1117
1118
static u8 rtw8703b_iqk_rx_path(struct rtw_dev *rtwdev,
1119
const struct rtw8723x_iqk_backup_regs *backup)
1120
{
1121
u8 status;
1122
u32 tx_x, tx_y;
1123
1124
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK step 1!\n");
1125
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @A RX IQK1 = 0x%x\n",
1126
rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
1127
rtw_write32(rtwdev, REG_BB_SEL_BTG, 0x99000000);
1128
1129
/* disable IQC mode */
1130
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1131
1132
/* IQK setting */
1133
rtw_write32(rtwdev, REG_TXIQK_11N, 0x01007c00);
1134
rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1135
1136
/* path IQK setting */
1137
rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x18008c1c);
1138
rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x38008c1c);
1139
rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
1140
rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
1141
rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x8214030f);
1142
rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28110000);
1143
rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000);
1144
rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000);
1145
1146
/* LOK setting */
1147
rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a911);
1148
1149
/* RX IQK mode */
1150
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, 0x80000, 0x1);
1151
rtw_write_rf(rtwdev, RF_PATH_A, 0x30, RFREG_MASK, 0x30000);
1152
rtw_write_rf(rtwdev, RF_PATH_A, 0x31, RFREG_MASK, 0x00007);
1153
rtw_write_rf(rtwdev, RF_PATH_A, 0x32, RFREG_MASK, 0x57db7);
1154
1155
rtw8703b_iqk_one_shot(rtwdev, true);
1156
/* leave IQK mode */
1157
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000);
1158
status = rtw8703b_iqk_check_tx_failed(rtwdev);
1159
1160
if (!status)
1161
goto restore;
1162
1163
/* second round */
1164
tx_x = rtw_read32_mask(rtwdev, REG_IQK_RES_TX, BIT_MASK_RES_TX);
1165
tx_y = rtw_read32_mask(rtwdev, REG_IQK_RES_TY, BIT_MASK_RES_TY);
1166
1167
rtw_write32(rtwdev, REG_TXIQK_11N, BIT_SET_TXIQK_11N(tx_x, tx_y));
1168
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0xe40 = 0x%x u4tmp = 0x%x\n",
1169
rtw_read32(rtwdev, REG_TXIQK_11N),
1170
BIT_SET_TXIQK_11N(tx_x, tx_y));
1171
1172
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK step 2!\n");
1173
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] 0x67 @A RX IQK 2 = 0x%x\n",
1174
rtw_read32_mask(rtwdev, REG_PAD_CTRL1, MASKBYTE3));
1175
1176
/* IQK setting */
1177
rtw_write32(rtwdev, REG_RXIQK_11N, 0x01004800);
1178
rtw_write32(rtwdev, REG_TXIQK_TONE_A_11N, 0x38008c1c);
1179
rtw_write32(rtwdev, REG_RXIQK_TONE_A_11N, 0x18008c1c);
1180
rtw_write32(rtwdev, REG_TX_IQK_TONE_B, 0x38008c1c);
1181
rtw_write32(rtwdev, REG_RX_IQK_TONE_B, 0x38008c1c);
1182
rtw_write32(rtwdev, REG_TXIQK_PI_A_11N, 0x82110000);
1183
rtw_write32(rtwdev, REG_RXIQK_PI_A_11N, 0x28160c1f);
1184
rtw_write32(rtwdev, REG_TXIQK_PI_B, 0x82110000);
1185
rtw_write32(rtwdev, REG_RXIQK_PI_B, 0x28110000);
1186
1187
/* LO calibration setting */
1188
rtw_write32(rtwdev, REG_IQK_AGC_RSP_11N, 0x0046a8d1);
1189
1190
/* leave IQK mode */
1191
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, 0xffffff00, 0x000000);
1192
/* modify RX IQK mode table */
1193
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, 0x80000, 0x1);
1194
/* RF_RCK_OS, RF_TXPA_G1, RF_TXPA_G2 */
1195
rtw_write_rf(rtwdev, RF_PATH_A, 0x30, RFREG_MASK, 0x30000);
1196
rtw_write_rf(rtwdev, RF_PATH_A, 0x31, RFREG_MASK, 0x00007);
1197
rtw_write_rf(rtwdev, RF_PATH_A, 0x32, RFREG_MASK, 0xf7d77);
1198
1199
/* PA, PAD setting */
1200
rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, 0x800, 0x1);
1201
rtw_write_rf(rtwdev, RF_PATH_A, 0x55, 0x7f, 0x5);
1202
1203
rtw8703b_iqk_one_shot(rtwdev, false);
1204
status |= rtw8703b_iqk_check_rx_failed(rtwdev);
1205
1206
restore:
1207
rtw8703b_iqk_txrx_path_post(rtwdev, backup);
1208
1209
return status;
1210
}
1211
1212
static
1213
void rtw8703b_iqk_one_round(struct rtw_dev *rtwdev, s32 result[][IQK_NR], u8 t,
1214
const struct rtw8723x_iqk_backup_regs *backup)
1215
{
1216
u32 i;
1217
u8 a_ok;
1218
1219
rtw_dbg(rtwdev, RTW_DBG_RFK,
1220
"[IQK] IQ Calibration for 1T1R_S0/S1 for %d times\n", t);
1221
1222
rtw8723x_iqk_path_adda_on(rtwdev, ADDA_ON_VAL_8703B);
1223
rtw8703b_iqk_config_mac(rtwdev, backup);
1224
rtw_write32_mask(rtwdev, REG_CCK_ANT_SEL_11N, 0x0f000000, 0xf);
1225
rtw_write32(rtwdev, REG_BB_RX_PATH_11N, 0x03a05600);
1226
rtw_write32(rtwdev, REG_TRMUX_11N, 0x000800e4);
1227
rtw_write32(rtwdev, REG_BB_PWR_SAV1_11N, 0x25204000);
1228
1229
for (i = 0; i < PATH_IQK_RETRY; i++) {
1230
a_ok = rtw8703b_iqk_tx_path(rtwdev, backup);
1231
if (a_ok == IQK_TX_OK) {
1232
rtw_dbg(rtwdev, RTW_DBG_RFK,
1233
"[IQK] path A TX IQK success!\n");
1234
result[t][IQK_S1_TX_X] =
1235
rtw_read32_mask(rtwdev, REG_IQK_RES_TX,
1236
BIT_MASK_RES_TX);
1237
result[t][IQK_S1_TX_Y] =
1238
rtw_read32_mask(rtwdev, REG_IQK_RES_TY,
1239
BIT_MASK_RES_TY);
1240
break;
1241
}
1242
1243
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A TX IQK fail!\n");
1244
result[t][IQK_S1_TX_X] = 0x100;
1245
result[t][IQK_S1_TX_Y] = 0x0;
1246
}
1247
1248
for (i = 0; i < PATH_IQK_RETRY; i++) {
1249
a_ok = rtw8703b_iqk_rx_path(rtwdev, backup);
1250
if (a_ok == (IQK_TX_OK | IQK_RX_OK)) {
1251
rtw_dbg(rtwdev, RTW_DBG_RFK,
1252
"[IQK] path A RX IQK success!\n");
1253
result[t][IQK_S1_RX_X] =
1254
rtw_read32_mask(rtwdev, REG_IQK_RES_RX,
1255
BIT_MASK_RES_RX);
1256
result[t][IQK_S1_RX_Y] =
1257
rtw_read32_mask(rtwdev, REG_IQK_RES_RY,
1258
BIT_MASK_RES_RY);
1259
break;
1260
}
1261
1262
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A RX IQK fail!\n");
1263
result[t][IQK_S1_RX_X] = 0x100;
1264
result[t][IQK_S1_RX_Y] = 0x0;
1265
}
1266
1267
if (a_ok == 0x0)
1268
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] path A IQK fail!\n");
1269
1270
rtw_write32_mask(rtwdev, REG_FPGA0_IQK_11N, BIT_MASK_IQK_MOD, RST_IQK);
1271
mdelay(1);
1272
}
1273
1274
static
1275
void rtw8703b_iqk_fill_a_matrix(struct rtw_dev *rtwdev, const s32 result[])
1276
{
1277
u32 tmp_rx_iqi = 0x40000100 & GENMASK(31, 16);
1278
s32 tx1_a, tx1_a_ext;
1279
s32 tx1_c, tx1_c_ext;
1280
s32 oldval_1;
1281
s32 x, y;
1282
1283
if (result[IQK_S1_TX_X] == 0)
1284
return;
1285
1286
oldval_1 = rtw_read32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1287
BIT_MASK_TXIQ_ELM_D);
1288
1289
x = iqkxy_to_s32(result[IQK_S1_TX_X]);
1290
tx1_a = iqk_mult(x, oldval_1, &tx1_a_ext);
1291
rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1292
BIT_MASK_TXIQ_ELM_A, tx1_a);
1293
rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
1294
BIT_MASK_OFDM0_EXT_A, tx1_a_ext);
1295
1296
y = iqkxy_to_s32(result[IQK_S1_TX_Y]);
1297
tx1_c = iqk_mult(y, oldval_1, &tx1_c_ext);
1298
rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1299
BIT_SET_TXIQ_ELM_C1(tx1_c));
1300
rtw_write32_mask(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE,
1301
BIT_MASK_TXIQ_ELM_C, BIT_SET_TXIQ_ELM_C2(tx1_c));
1302
rtw_write32_mask(rtwdev, REG_OFDM_0_ECCA_THRESHOLD,
1303
BIT_MASK_OFDM0_EXT_C, tx1_c_ext);
1304
1305
rtw_dbg(rtwdev, RTW_DBG_RFK,
1306
"[IQK] X = 0x%x, TX1_A = 0x%x, oldval_1 0x%x\n",
1307
x, tx1_a, oldval_1);
1308
rtw_dbg(rtwdev, RTW_DBG_RFK,
1309
"[IQK] Y = 0x%x, TX1_C = 0x%x\n", y, tx1_c);
1310
1311
if (result[IQK_S1_RX_X] == 0)
1312
return;
1313
1314
tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_X, result[IQK_S1_RX_X]);
1315
tmp_rx_iqi |= FIELD_PREP(BIT_MASK_RXIQ_S1_Y1, result[IQK_S1_RX_Y]);
1316
rtw_write32(rtwdev, REG_A_RXIQI, tmp_rx_iqi);
1317
rtw_write32_mask(rtwdev, REG_RXIQK_MATRIX_LSB_11N, BIT_MASK_RXIQ_S1_Y2,
1318
BIT_SET_RXIQ_S1_Y2(result[IQK_S1_RX_Y]));
1319
}
1320
1321
static void rtw8703b_phy_calibration(struct rtw_dev *rtwdev)
1322
{
1323
/* For some reason path A is called S1 and B S0 in shared
1324
* rtw88 calibration data.
1325
*/
1326
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1327
struct rtw8723x_iqk_backup_regs backup;
1328
u8 final_candidate = IQK_ROUND_INVALID;
1329
s32 result[IQK_ROUND_SIZE][IQK_NR];
1330
bool good;
1331
u8 i, j;
1332
1333
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Start!\n");
1334
1335
memset(result, 0, sizeof(result));
1336
1337
rtw8723x_iqk_backup_path_ctrl(rtwdev, &backup);
1338
rtw8723x_iqk_backup_lte_path_gnt(rtwdev, &backup);
1339
rtw8723x_iqk_backup_regs(rtwdev, &backup);
1340
1341
for (i = IQK_ROUND_0; i <= IQK_ROUND_2; i++) {
1342
rtw8723x_iqk_config_path_ctrl(rtwdev);
1343
rtw8723x_iqk_config_lte_path_gnt(rtwdev, IQK_LTE_WRITE_VAL_8703B);
1344
1345
rtw8703b_iqk_one_round(rtwdev, result, i, &backup);
1346
1347
rtw_dbg(rtwdev, RTW_DBG_RFK,
1348
"[IQK] back to BB mode, load original values!\n");
1349
if (i > IQK_ROUND_0)
1350
rtw8723x_iqk_restore_regs(rtwdev, &backup);
1351
rtw8723x_iqk_restore_lte_path_gnt(rtwdev, &backup);
1352
rtw8723x_iqk_restore_path_ctrl(rtwdev, &backup);
1353
1354
for (j = IQK_ROUND_0; j < i; j++) {
1355
good = rtw8723x_iqk_similarity_cmp(rtwdev, result, j, i);
1356
1357
if (good) {
1358
final_candidate = j;
1359
rtw_dbg(rtwdev, RTW_DBG_RFK,
1360
"[IQK] cmp %d:%d final_candidate is %x\n",
1361
j, i, final_candidate);
1362
goto iqk_done;
1363
}
1364
}
1365
}
1366
1367
if (final_candidate == IQK_ROUND_INVALID) {
1368
s32 reg_tmp = 0;
1369
1370
for (i = 0; i < IQK_NR; i++)
1371
reg_tmp += result[IQK_ROUND_HYBRID][i];
1372
1373
if (reg_tmp != 0) {
1374
final_candidate = IQK_ROUND_HYBRID;
1375
} else {
1376
WARN(1, "IQK failed\n");
1377
goto out;
1378
}
1379
}
1380
1381
iqk_done:
1382
/* only path A is calibrated in rtl8703b */
1383
rtw8703b_iqk_fill_a_matrix(rtwdev, result[final_candidate]);
1384
1385
dm_info->iqk.result.s1_x = result[final_candidate][IQK_S1_TX_X];
1386
dm_info->iqk.result.s1_y = result[final_candidate][IQK_S1_TX_Y];
1387
dm_info->iqk.result.s0_x = result[final_candidate][IQK_S0_TX_X];
1388
dm_info->iqk.result.s0_y = result[final_candidate][IQK_S0_TX_Y];
1389
dm_info->iqk.done = true;
1390
1391
out:
1392
rtw_write32(rtwdev, REG_BB_SEL_BTG, backup.bb_sel_btg);
1393
1394
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] final_candidate is %x\n",
1395
final_candidate);
1396
1397
for (i = IQK_ROUND_0; i < IQK_ROUND_SIZE; i++)
1398
rtw_dbg(rtwdev, RTW_DBG_RFK,
1399
"[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",
1400
i,
1401
result[i][0], result[i][1], result[i][2], result[i][3],
1402
result[i][4], result[i][5], result[i][6], result[i][7],
1403
final_candidate == i ? "(final candidate)" : "");
1404
1405
rtw_dbg(rtwdev, RTW_DBG_RFK,
1406
"[IQK] 0xc80 = 0x%x 0xc94 = 0x%x 0xc14 = 0x%x 0xca0 = 0x%x\n",
1407
rtw_read32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE),
1408
rtw_read32(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N),
1409
rtw_read32(rtwdev, REG_A_RXIQI),
1410
rtw_read32(rtwdev, REG_RXIQK_MATRIX_LSB_11N));
1411
rtw_dbg(rtwdev, RTW_DBG_RFK,
1412
"[IQK] 0xcd0 = 0x%x 0xcd4 = 0x%x 0xcd8 = 0x%x\n",
1413
rtw_read32(rtwdev, REG_TXIQ_AB_S0),
1414
rtw_read32(rtwdev, REG_TXIQ_CD_S0),
1415
rtw_read32(rtwdev, REG_RXIQ_AB_S0));
1416
1417
rtw_dbg(rtwdev, RTW_DBG_RFK, "[IQK] Finished.\n");
1418
}
1419
1420
static void rtw8703b_set_iqk_matrix_by_result(struct rtw_dev *rtwdev,
1421
u32 ofdm_swing, u8 rf_path)
1422
{
1423
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1424
s32 ele_A, ele_D, ele_C;
1425
s32 ele_A_ext, ele_C_ext, ele_D_ext;
1426
s32 iqk_result_x;
1427
s32 iqk_result_y;
1428
s32 value32;
1429
1430
switch (rf_path) {
1431
default:
1432
case RF_PATH_A:
1433
iqk_result_x = dm_info->iqk.result.s1_x;
1434
iqk_result_y = dm_info->iqk.result.s1_y;
1435
break;
1436
case RF_PATH_B:
1437
iqk_result_x = dm_info->iqk.result.s0_x;
1438
iqk_result_y = dm_info->iqk.result.s0_y;
1439
break;
1440
}
1441
1442
/* new element D */
1443
ele_D = OFDM_SWING_D(ofdm_swing);
1444
iqk_mult(iqk_result_x, ele_D, &ele_D_ext);
1445
/* new element A */
1446
iqk_result_x = iqkxy_to_s32(iqk_result_x);
1447
ele_A = iqk_mult(iqk_result_x, ele_D, &ele_A_ext);
1448
/* new element C */
1449
iqk_result_y = iqkxy_to_s32(iqk_result_y);
1450
ele_C = iqk_mult(iqk_result_y, ele_D, &ele_C_ext);
1451
1452
switch (rf_path) {
1453
case RF_PATH_A:
1454
default:
1455
/* write new elements A, C, D, and element B is always 0 */
1456
value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
1457
rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, value32);
1458
value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
1459
rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1460
value32);
1461
value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1462
value32 &= ~BIT_MASK_OFDM0_EXTS;
1463
value32 |= BIT_SET_OFDM0_EXTS(ele_A_ext, ele_C_ext, ele_D_ext);
1464
rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1465
break;
1466
1467
case RF_PATH_B:
1468
/* write new elements A, C, D, and element B is always 0 */
1469
value32 = BIT_SET_TXIQ_ELM_ACD(ele_A, ele_C, ele_D);
1470
rtw_write32(rtwdev, REG_OFDM_0_XB_TX_IQ_IMBALANCE, value32);
1471
value32 = BIT_SET_TXIQ_ELM_C1(ele_C);
1472
rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXB_LSB2_11N, MASKH4BITS,
1473
value32);
1474
value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1475
value32 &= ~BIT_MASK_OFDM0_EXTS_B;
1476
value32 |= BIT_SET_OFDM0_EXTS_B(ele_A_ext, ele_C_ext, ele_D_ext);
1477
rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1478
break;
1479
}
1480
}
1481
1482
static void rtw8703b_set_iqk_matrix(struct rtw_dev *rtwdev, s8 ofdm_index,
1483
u8 rf_path)
1484
{
1485
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1486
s32 value32;
1487
u32 ofdm_swing;
1488
1489
ofdm_index = clamp_t(s8, ofdm_index, 0, RTW_OFDM_SWING_TABLE_SIZE - 1);
1490
1491
ofdm_swing = rtw8703b_ofdm_swing_table[ofdm_index];
1492
1493
if (dm_info->iqk.done) {
1494
rtw8703b_set_iqk_matrix_by_result(rtwdev, ofdm_swing, rf_path);
1495
return;
1496
}
1497
1498
switch (rf_path) {
1499
case RF_PATH_A:
1500
default:
1501
rtw_write32(rtwdev, REG_OFDM_0_XA_TX_IQ_IMBALANCE, ofdm_swing);
1502
rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXA_LSB2_11N, MASKH4BITS,
1503
0x00);
1504
1505
value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1506
value32 &= ~BIT_MASK_OFDM0_EXTS;
1507
rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1508
break;
1509
1510
case RF_PATH_B:
1511
rtw_write32(rtwdev, REG_OFDM_0_XB_TX_IQ_IMBALANCE, ofdm_swing);
1512
rtw_write32_mask(rtwdev, REG_TXIQK_MATRIXB_LSB2_11N, MASKH4BITS,
1513
0x00);
1514
1515
value32 = rtw_read32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD);
1516
value32 &= ~BIT_MASK_OFDM0_EXTS_B;
1517
rtw_write32(rtwdev, REG_OFDM_0_ECCA_THRESHOLD, value32);
1518
break;
1519
}
1520
}
1521
1522
static void rtw8703b_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1523
s8 txagc_idx)
1524
{
1525
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1526
1527
dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx;
1528
1529
/* Only path A is calibrated for rtl8703b */
1530
rtw8703b_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
1531
}
1532
1533
static void rtw8703b_pwrtrack_set_cck_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
1534
s8 txagc_idx)
1535
{
1536
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1537
1538
dm_info->txagc_remnant_cck = txagc_idx;
1539
1540
swing_idx = clamp_t(s8, swing_idx, 0, RTW_CCK_SWING_TABLE_SIZE - 1);
1541
1542
BUILD_BUG_ON(ARRAY_SIZE(rtw8703b_cck_pwr_regs)
1543
!= ARRAY_SIZE(rtw8703b_cck_swing_table[0]));
1544
1545
for (int i = 0; i < ARRAY_SIZE(rtw8703b_cck_pwr_regs); i++)
1546
rtw_write8(rtwdev, rtw8703b_cck_pwr_regs[i],
1547
rtw8703b_cck_swing_table[swing_idx][i]);
1548
}
1549
1550
static void rtw8703b_pwrtrack_set(struct rtw_dev *rtwdev, u8 path)
1551
{
1552
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1553
struct rtw_hal *hal = &rtwdev->hal;
1554
u8 limit_ofdm;
1555
u8 limit_cck = 21;
1556
s8 final_ofdm_swing_index;
1557
s8 final_cck_swing_index;
1558
1559
limit_ofdm = rtw8723x_pwrtrack_get_limit_ofdm(rtwdev);
1560
1561
final_ofdm_swing_index = dm_info->default_ofdm_index +
1562
dm_info->delta_power_index[path];
1563
final_cck_swing_index = dm_info->default_cck_index +
1564
dm_info->delta_power_index[path];
1565
1566
if (final_ofdm_swing_index > limit_ofdm)
1567
rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, limit_ofdm,
1568
final_ofdm_swing_index - limit_ofdm);
1569
else if (final_ofdm_swing_index < 0)
1570
rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, 0,
1571
final_ofdm_swing_index);
1572
else
1573
rtw8703b_pwrtrack_set_ofdm_pwr(rtwdev, final_ofdm_swing_index, 0);
1574
1575
if (final_cck_swing_index > limit_cck)
1576
rtw8703b_pwrtrack_set_cck_pwr(rtwdev, limit_cck,
1577
final_cck_swing_index - limit_cck);
1578
else if (final_cck_swing_index < 0)
1579
rtw8703b_pwrtrack_set_cck_pwr(rtwdev, 0,
1580
final_cck_swing_index);
1581
else
1582
rtw8703b_pwrtrack_set_cck_pwr(rtwdev, final_cck_swing_index, 0);
1583
1584
rtw_phy_set_tx_power_level(rtwdev, hal->current_channel);
1585
}
1586
1587
static void rtw8703b_phy_pwrtrack(struct rtw_dev *rtwdev)
1588
{
1589
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1590
struct rtw_swing_table swing_table;
1591
u8 thermal_value, delta, path;
1592
bool do_iqk = false;
1593
1594
rtw_phy_config_swing_table(rtwdev, &swing_table);
1595
1596
if (rtwdev->efuse.thermal_meter[0] == 0xff)
1597
return;
1598
1599
thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00);
1600
1601
rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A);
1602
1603
do_iqk = rtw_phy_pwrtrack_need_iqk(rtwdev);
1604
1605
if (do_iqk)
1606
rtw8723x_lck(rtwdev);
1607
1608
if (dm_info->pwr_trk_init_trigger)
1609
dm_info->pwr_trk_init_trigger = false;
1610
else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value,
1611
RF_PATH_A))
1612
goto iqk;
1613
1614
delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A);
1615
1616
delta = min_t(u8, delta, RTW_PWR_TRK_TBL_SZ - 1);
1617
1618
for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
1619
s8 delta_cur, delta_last;
1620
1621
delta_last = dm_info->delta_power_index[path];
1622
delta_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, &swing_table,
1623
path, RF_PATH_A, delta);
1624
if (delta_last == delta_cur)
1625
continue;
1626
1627
dm_info->delta_power_index[path] = delta_cur;
1628
rtw8703b_pwrtrack_set(rtwdev, path);
1629
}
1630
1631
rtw8723x_pwrtrack_set_xtal(rtwdev, RF_PATH_A, delta);
1632
1633
iqk:
1634
if (do_iqk)
1635
rtw8703b_phy_calibration(rtwdev);
1636
}
1637
1638
static void rtw8703b_pwr_track(struct rtw_dev *rtwdev)
1639
{
1640
struct rtw_efuse *efuse = &rtwdev->efuse;
1641
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
1642
1643
if (efuse->power_track_type != 0) {
1644
rtw_warn(rtwdev, "unsupported power track type");
1645
return;
1646
}
1647
1648
if (!dm_info->pwr_trk_triggered) {
1649
rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER,
1650
GENMASK(17, 16), 0x03);
1651
dm_info->pwr_trk_triggered = true;
1652
return;
1653
}
1654
1655
rtw8703b_phy_pwrtrack(rtwdev);
1656
dm_info->pwr_trk_triggered = false;
1657
}
1658
1659
static void rtw8703b_coex_set_gnt_fix(struct rtw_dev *rtwdev)
1660
{
1661
}
1662
1663
static void rtw8703b_coex_set_gnt_debug(struct rtw_dev *rtwdev)
1664
{
1665
}
1666
1667
static void rtw8703b_coex_set_rfe_type(struct rtw_dev *rtwdev)
1668
{
1669
struct rtw_coex *coex = &rtwdev->coex;
1670
struct rtw_coex_rfe *coex_rfe = &coex->rfe;
1671
1672
coex_rfe->rfe_module_type = rtwdev->efuse.rfe_option;
1673
coex_rfe->ant_switch_polarity = 0;
1674
coex_rfe->ant_switch_exist = false;
1675
coex_rfe->ant_switch_with_bt = false;
1676
coex_rfe->ant_switch_diversity = false;
1677
coex_rfe->wlg_at_btg = true;
1678
1679
/* disable LTE coex on wifi side */
1680
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, BIT_LTE_COEX_EN, 0x0);
1681
rtw_coex_write_indirect_reg(rtwdev, LTE_WL_TRX_CTRL, MASKLWORD, 0xffff);
1682
rtw_coex_write_indirect_reg(rtwdev, LTE_BT_TRX_CTRL, MASKLWORD, 0xffff);
1683
}
1684
1685
static void rtw8703b_coex_set_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr)
1686
{
1687
}
1688
1689
static void rtw8703b_coex_set_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain)
1690
{
1691
}
1692
1693
static const u8 rtw8703b_pwrtrk_2gb_n[] = {
1694
0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
1695
7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11
1696
};
1697
1698
static const u8 rtw8703b_pwrtrk_2gb_p[] = {
1699
0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 7,
1700
8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15
1701
};
1702
1703
static const u8 rtw8703b_pwrtrk_2ga_n[] = {
1704
0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
1705
7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11
1706
};
1707
1708
static const u8 rtw8703b_pwrtrk_2ga_p[] = {
1709
0, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 7, 7, 7,
1710
8, 8, 9, 9, 10, 10, 11, 11, 12, 13, 13, 14, 14, 15, 15
1711
};
1712
1713
static const u8 rtw8703b_pwrtrk_2g_cck_b_n[] = {
1714
0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
1715
7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11
1716
};
1717
1718
static const u8 rtw8703b_pwrtrk_2g_cck_b_p[] = {
1719
0, 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6,
1720
7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13
1721
};
1722
1723
static const u8 rtw8703b_pwrtrk_2g_cck_a_n[] = {
1724
0, 0, 1, 2, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6,
1725
7, 7, 7, 7, 8, 8, 9, 9, 10, 10, 10, 11, 11, 11, 11
1726
};
1727
1728
static const u8 rtw8703b_pwrtrk_2g_cck_a_p[] = {
1729
0, 0, 1, 1, 2, 3, 3, 3, 4, 4, 4, 5, 6, 6, 6,
1730
7, 7, 8, 8, 8, 9, 10, 10, 10, 11, 11, 12, 12, 13, 13
1731
};
1732
1733
static const s8 rtw8703b_pwrtrk_xtal_n[] = {
1734
0, 0, 0, -1, -1, -1, -1, -2, -2, -2, -3, -3, -3, -3, -3,
1735
-4, -2, -2, -1, -1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1
1736
};
1737
1738
static const s8 rtw8703b_pwrtrk_xtal_p[] = {
1739
0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 1, 0, -1, -1, -1,
1740
-2, -3, -7, -9, -10, -11, -14, -16, -18, -20, -22, -24, -26, -28, -30
1741
};
1742
1743
static const struct rtw_pwr_track_tbl rtw8703b_rtw_pwr_track_tbl = {
1744
.pwrtrk_2gb_n = rtw8703b_pwrtrk_2gb_n,
1745
.pwrtrk_2gb_p = rtw8703b_pwrtrk_2gb_p,
1746
.pwrtrk_2ga_n = rtw8703b_pwrtrk_2ga_n,
1747
.pwrtrk_2ga_p = rtw8703b_pwrtrk_2ga_p,
1748
.pwrtrk_2g_cckb_n = rtw8703b_pwrtrk_2g_cck_b_n,
1749
.pwrtrk_2g_cckb_p = rtw8703b_pwrtrk_2g_cck_b_p,
1750
.pwrtrk_2g_ccka_n = rtw8703b_pwrtrk_2g_cck_a_n,
1751
.pwrtrk_2g_ccka_p = rtw8703b_pwrtrk_2g_cck_a_p,
1752
.pwrtrk_xtal_n = rtw8703b_pwrtrk_xtal_n,
1753
.pwrtrk_xtal_p = rtw8703b_pwrtrk_xtal_p,
1754
};
1755
1756
static const struct rtw_rfe_def rtw8703b_rfe_defs[] = {
1757
[0] = { .phy_pg_tbl = &rtw8703b_bb_pg_tbl,
1758
.txpwr_lmt_tbl = &rtw8703b_txpwr_lmt_tbl,
1759
.pwr_track_tbl = &rtw8703b_rtw_pwr_track_tbl, },
1760
};
1761
1762
/* Shared-Antenna Coex Table */
1763
static const struct coex_table_para table_sant_8703b[] = {
1764
{0xffffffff, 0xffffffff}, /* case-0 */
1765
{0x55555555, 0x55555555},
1766
{0x66555555, 0x66555555},
1767
{0xaaaaaaaa, 0xaaaaaaaa},
1768
{0x5a5a5a5a, 0x5a5a5a5a},
1769
{0xfafafafa, 0xfafafafa}, /* case-5 */
1770
{0x6a5a5555, 0xaaaaaaaa},
1771
{0x6a5a56aa, 0x6a5a56aa},
1772
{0x6a5a5a5a, 0x6a5a5a5a},
1773
{0x66555555, 0x5a5a5a5a},
1774
{0x66555555, 0x6a5a5a5a}, /* case-10 */
1775
{0x66555555, 0x6a5a5aaa},
1776
{0x66555555, 0x5a5a5aaa},
1777
{0x66555555, 0x6aaa5aaa},
1778
{0x66555555, 0xaaaa5aaa},
1779
{0x66555555, 0xaaaaaaaa}, /* case-15 */
1780
{0xffff55ff, 0xfafafafa},
1781
{0xffff55ff, 0x6afa5afa},
1782
{0xaaffffaa, 0xfafafafa},
1783
{0xaa5555aa, 0x5a5a5a5a},
1784
{0xaa5555aa, 0x6a5a5a5a}, /* case-20 */
1785
{0xaa5555aa, 0xaaaaaaaa},
1786
{0xffffffff, 0x5a5a5a5a},
1787
{0xffffffff, 0x5a5a5a5a},
1788
{0xffffffff, 0x55555555},
1789
{0xffffffff, 0x5a5a5aaa}, /* case-25 */
1790
{0x55555555, 0x5a5a5a5a},
1791
{0x55555555, 0xaaaaaaaa},
1792
{0x55555555, 0x6a5a6a5a},
1793
{0x66556655, 0x66556655},
1794
{0x66556aaa, 0x6a5a6aaa}, /* case-30 */
1795
{0xffffffff, 0x5aaa5aaa},
1796
{0x56555555, 0x5a5a5aaa},
1797
};
1798
1799
/* Shared-Antenna TDMA */
1800
static const struct coex_tdma_para tdma_sant_8703b[] = {
1801
{ {0x00, 0x00, 0x00, 0x00, 0x00} }, /* case-0 */
1802
{ {0x61, 0x45, 0x03, 0x11, 0x11} }, /* case-1 */
1803
{ {0x61, 0x3a, 0x03, 0x11, 0x11} },
1804
{ {0x61, 0x30, 0x03, 0x11, 0x11} },
1805
{ {0x61, 0x20, 0x03, 0x11, 0x11} },
1806
{ {0x61, 0x10, 0x03, 0x11, 0x11} }, /* case-5 */
1807
{ {0x61, 0x45, 0x03, 0x11, 0x10} },
1808
{ {0x61, 0x3a, 0x03, 0x11, 0x10} },
1809
{ {0x61, 0x30, 0x03, 0x11, 0x10} },
1810
{ {0x61, 0x20, 0x03, 0x11, 0x10} },
1811
{ {0x61, 0x10, 0x03, 0x11, 0x10} }, /* case-10 */
1812
{ {0x61, 0x08, 0x03, 0x11, 0x14} },
1813
{ {0x61, 0x08, 0x03, 0x10, 0x14} },
1814
{ {0x51, 0x08, 0x03, 0x10, 0x54} },
1815
{ {0x51, 0x08, 0x03, 0x10, 0x55} },
1816
{ {0x51, 0x08, 0x07, 0x10, 0x54} }, /* case-15 */
1817
{ {0x51, 0x45, 0x03, 0x10, 0x50} },
1818
{ {0x51, 0x3a, 0x03, 0x10, 0x50} },
1819
{ {0x51, 0x30, 0x03, 0x10, 0x50} },
1820
{ {0x51, 0x20, 0x03, 0x10, 0x50} },
1821
{ {0x51, 0x10, 0x03, 0x10, 0x50} }, /* case-20 */
1822
{ {0x51, 0x4a, 0x03, 0x10, 0x50} },
1823
{ {0x51, 0x0c, 0x03, 0x10, 0x54} },
1824
{ {0x55, 0x08, 0x03, 0x10, 0x54} },
1825
{ {0x65, 0x10, 0x03, 0x11, 0x10} },
1826
{ {0x51, 0x10, 0x03, 0x10, 0x51} }, /* case-25 */
1827
{ {0x51, 0x08, 0x03, 0x10, 0x50} },
1828
{ {0x61, 0x08, 0x03, 0x11, 0x11} },
1829
};
1830
1831
static const struct rtw_chip_ops rtw8703b_ops = {
1832
.power_on = rtw_power_on,
1833
.power_off = rtw_power_off,
1834
.mac_init = rtw8723x_mac_init,
1835
.mac_postinit = rtw8723x_mac_postinit,
1836
.dump_fw_crash = NULL,
1837
.shutdown = NULL,
1838
.read_efuse = rtw8703b_read_efuse,
1839
.phy_set_param = rtw8703b_phy_set_param,
1840
.set_channel = rtw8703b_set_channel,
1841
.query_phy_status = query_phy_status,
1842
.read_rf = rtw_phy_read_rf_sipi,
1843
.write_rf = rtw_phy_write_rf_reg_sipi,
1844
.set_tx_power_index = rtw8723x_set_tx_power_index,
1845
.set_antenna = NULL,
1846
.cfg_ldo25 = rtw8723x_cfg_ldo25,
1847
.efuse_grant = rtw8723x_efuse_grant,
1848
.set_ampdu_factor = NULL,
1849
.false_alarm_statistics = rtw8723x_false_alarm_statistics,
1850
.phy_calibration = rtw8703b_phy_calibration,
1851
.dpk_track = NULL,
1852
/* 8723d uses REG_CSRATIO to set dm_info.cck_pd_default, which
1853
* is used in its cck_pd_set function. According to comments
1854
* in the vendor driver code it doesn't exist in this chip
1855
* generation, only 0xa0a ("ODM_CCK_PD_THRESH", which is only
1856
* *written* to).
1857
*/
1858
.cck_pd_set = NULL,
1859
.pwr_track = rtw8703b_pwr_track,
1860
.config_bfee = NULL,
1861
.set_gid_table = NULL,
1862
.cfg_csi_rate = NULL,
1863
.adaptivity_init = NULL,
1864
.adaptivity = NULL,
1865
.cfo_init = NULL,
1866
.cfo_track = NULL,
1867
.config_tx_path = NULL,
1868
.config_txrx_mode = NULL,
1869
.fill_txdesc_checksum = rtw8723x_fill_txdesc_checksum,
1870
1871
/* for coex */
1872
.coex_set_init = rtw8723x_coex_cfg_init,
1873
.coex_set_ant_switch = NULL,
1874
.coex_set_gnt_fix = rtw8703b_coex_set_gnt_fix,
1875
.coex_set_gnt_debug = rtw8703b_coex_set_gnt_debug,
1876
.coex_set_rfe_type = rtw8703b_coex_set_rfe_type,
1877
.coex_set_wl_tx_power = rtw8703b_coex_set_wl_tx_power,
1878
.coex_set_wl_rx_gain = rtw8703b_coex_set_wl_rx_gain,
1879
};
1880
1881
const struct rtw_chip_info rtw8703b_hw_spec = {
1882
.ops = &rtw8703b_ops,
1883
.id = RTW_CHIP_TYPE_8703B,
1884
1885
.fw_name = "rtw88/rtw8703b_fw.bin",
1886
.wlan_cpu = RTW_WCPU_8051,
1887
.tx_pkt_desc_sz = 40,
1888
.tx_buf_desc_sz = 16,
1889
.rx_pkt_desc_sz = 24,
1890
.rx_buf_desc_sz = 8,
1891
.phy_efuse_size = 256,
1892
.log_efuse_size = 512,
1893
.ptct_efuse_size = 15,
1894
.txff_size = 32768,
1895
.rxff_size = 16384,
1896
.rsvd_drv_pg_num = 8,
1897
.band = RTW_BAND_2G,
1898
.page_size = TX_PAGE_SIZE,
1899
.csi_buf_pg_num = 0,
1900
.dig_min = 0x20,
1901
.txgi_factor = 1,
1902
.is_pwr_by_rate_dec = true,
1903
.rx_ldpc = false,
1904
.tx_stbc = false,
1905
.max_power_index = 0x3f,
1906
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
1907
.usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */
1908
.hw_feature_report = true,
1909
.c2h_ra_report_size = 7,
1910
.old_datarate_fb_limit = true,
1911
1912
.path_div_supported = false,
1913
.ht_supported = true,
1914
.vht_supported = false,
1915
.lps_deep_mode_supported = 0,
1916
1917
.sys_func_en = 0xFD,
1918
.pwr_on_seq = card_enable_flow_8703b,
1919
.pwr_off_seq = card_disable_flow_8703b,
1920
.rqpn_table = rqpn_table_8703b,
1921
.prioq_addrs = &rtw8723x_common.prioq_addrs,
1922
.page_table = page_table_8703b,
1923
/* used only in pci.c, not needed for SDIO devices */
1924
.intf_table = NULL,
1925
1926
.dig = rtw8723x_common.dig,
1927
.dig_cck = rtw8723x_common.dig_cck,
1928
1929
.rf_sipi_addr = {0x840, 0x844},
1930
.rf_sipi_read_addr = rtw8723x_common.rf_sipi_addr,
1931
.fix_rf_phy_num = 2,
1932
.ltecoex_addr = &rtw8723x_common.ltecoex_addr,
1933
1934
.mac_tbl = &rtw8703b_mac_tbl,
1935
.agc_tbl = &rtw8703b_agc_tbl,
1936
.bb_tbl = &rtw8703b_bb_tbl,
1937
.rf_tbl = {&rtw8703b_rf_a_tbl},
1938
1939
.rfe_defs = rtw8703b_rfe_defs,
1940
.rfe_defs_size = ARRAY_SIZE(rtw8703b_rfe_defs),
1941
1942
.iqk_threshold = 8,
1943
1944
/* WOWLAN firmware exists, but not implemented yet */
1945
.wow_fw_name = "rtw88/rtw8703b_wow_fw.bin",
1946
.wowlan_stub = NULL,
1947
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
1948
1949
/* Vendor driver has a time-based format, converted from
1950
* 20180330
1951
*/
1952
.coex_para_ver = 0x0133ed6a,
1953
.bt_desired_ver = 0x1c,
1954
.scbd_support = true,
1955
.new_scbd10_def = true,
1956
.ble_hid_profile_support = false,
1957
.wl_mimo_ps_support = false,
1958
.pstdma_type = COEX_PSTDMA_FORCE_LPSOFF,
1959
.bt_rssi_type = COEX_BTRSSI_RATIO,
1960
.ant_isolation = 15,
1961
.rssi_tolerance = 2,
1962
.bt_rssi_step = bt_rssi_step_8703b,
1963
.wl_rssi_step = wl_rssi_step_8703b,
1964
/* sant -> shared antenna, nsant -> non-shared antenna
1965
* Not sure if 8703b versions with non-shard antenna even exist.
1966
*/
1967
.table_sant_num = ARRAY_SIZE(table_sant_8703b),
1968
.table_sant = table_sant_8703b,
1969
.table_nsant_num = 0,
1970
.table_nsant = NULL,
1971
.tdma_sant_num = ARRAY_SIZE(tdma_sant_8703b),
1972
.tdma_sant = tdma_sant_8703b,
1973
.tdma_nsant_num = 0,
1974
.tdma_nsant = NULL,
1975
.wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8703b),
1976
.wl_rf_para_tx = rf_para_tx_8703b,
1977
.wl_rf_para_rx = rf_para_rx_8703b,
1978
.bt_afh_span_bw20 = 0x20,
1979
.bt_afh_span_bw40 = 0x30,
1980
.afh_5g_num = ARRAY_SIZE(afh_5g_8703b),
1981
.afh_5g = afh_5g_8703b,
1982
/* REG_BTG_SEL doesn't seem to have a counterpart in the
1983
* vendor driver. Mathematically it's REG_PAD_CTRL1 + 3.
1984
*
1985
* It is used in the cardemu_to_act power sequence by though
1986
* (by address, 0x0067), comment: "0x67[0] = 0 to disable
1987
* BT_GPS_SEL pins" That seems to fit.
1988
*/
1989
.btg_reg = NULL,
1990
/* These registers are used to read (and print) from if
1991
* CONFIG_RTW88_DEBUGFS is enabled.
1992
*/
1993
.coex_info_hw_regs_num = 0,
1994
.coex_info_hw_regs = NULL,
1995
};
1996
EXPORT_SYMBOL(rtw8703b_hw_spec);
1997
1998
MODULE_FIRMWARE("rtw88/rtw8703b_fw.bin");
1999
MODULE_FIRMWARE("rtw88/rtw8703b_wow_fw.bin");
2000
2001
MODULE_AUTHOR("Fiona Klute <[email protected]>");
2002
MODULE_DESCRIPTION("Realtek 802.11n wireless 8703b driver");
2003
MODULE_LICENSE("Dual BSD/GPL");
2004
2005