Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_api.c
1307 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
* The full GNU General Public License is included in this distribution in the
15
* file called LICENSE.
16
*
17
* Contact Information:
18
* wlanfae <[email protected]>
19
* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20
* Hsinchu 300, Taiwan.
21
*
22
* Larry Finger <[email protected]>
23
*
24
*****************************************************************************/
25
26
/*@************************************************************
27
* include files
28
* ************************************************************
29
*/
30
31
#include "mp_precomp.h"
32
#include "phydm_precomp.h"
33
34
void phydm_reset_bb_hw_cnt(void *dm_void)
35
{
36
struct dm_struct *dm = (struct dm_struct *)dm_void;
37
38
/*@ Reset all counter when 1 */
39
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
40
odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 1);
41
odm_set_bb_reg(dm, R_0x1eb4, BIT(25), 0);
42
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
43
/*@ Reset all counter when 1 (including PMAC and PHY)*/
44
/* Reset Page F counter*/
45
odm_set_bb_reg(dm, R_0xb58, BIT(0), 1);
46
odm_set_bb_reg(dm, R_0xb58, BIT(0), 0);
47
} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
48
odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x1);
49
odm_set_bb_reg(dm, R_0xf14, BIT(16), 0x0);
50
}
51
}
52
53
void phydm_dynamic_ant_weighting(void *dm_void)
54
{
55
struct dm_struct *dm = (struct dm_struct *)dm_void;
56
57
#ifdef DYN_ANT_WEIGHTING_SUPPORT
58
#if (RTL8197F_SUPPORT)
59
if (dm->support_ic_type & (ODM_RTL8197F))
60
phydm_dynamic_ant_weighting_8197f(dm);
61
#endif
62
63
#if (RTL8812A_SUPPORT)
64
if (dm->support_ic_type & (ODM_RTL8812)) {
65
phydm_dynamic_ant_weighting_8812a(dm);
66
}
67
#endif
68
69
#if (RTL8822B_SUPPORT)
70
if (dm->support_ic_type & (ODM_RTL8822B))
71
phydm_dynamic_ant_weighting_8822b(dm);
72
#endif
73
#endif
74
}
75
76
#ifdef DYN_ANT_WEIGHTING_SUPPORT
77
void phydm_ant_weight_dbg(void *dm_void, char input[][16], u32 *_used,
78
char *output, u32 *_out_len)
79
{
80
struct dm_struct *dm = (struct dm_struct *)dm_void;
81
char help[] = "-h";
82
u32 var1[10] = {0};
83
u32 used = *_used;
84
u32 out_len = *_out_len;
85
86
if ((strcmp(input[1], help) == 0)) {
87
PDM_SNPF(out_len, used, output + used, out_len - used,
88
"echo dis_dym_ant_weighting {0/1}\n");
89
90
} else {
91
PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
92
93
if (var1[0] == 1) {
94
dm->is_disable_dym_ant_weighting = 1;
95
PDM_SNPF(out_len, used, output + used, out_len - used,
96
"Disable dyn-ant-weighting\n");
97
} else {
98
dm->is_disable_dym_ant_weighting = 0;
99
PDM_SNPF(out_len, used, output + used, out_len - used,
100
"Enable dyn-ant-weighting\n");
101
}
102
}
103
*_used = used;
104
*_out_len = out_len;
105
}
106
#endif
107
108
void phydm_trx_antenna_setting_init(void *dm_void, u8 num_rf_path)
109
{
110
struct dm_struct *dm = (struct dm_struct *)dm_void;
111
u8 rx_ant = 0, tx_ant = 0;
112
u8 path_bitmap = 1;
113
114
path_bitmap = (u8)phydm_gen_bitmask(num_rf_path);
115
#if 0
116
/*PHYDM_DBG(dm, ODM_COMP_INIT, "path_bitmap=0x%x\n", path_bitmap);*/
117
#endif
118
119
dm->tx_ant_status = path_bitmap;
120
dm->rx_ant_status = path_bitmap;
121
122
if (num_rf_path == PDM_1SS)
123
return;
124
125
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
126
if (dm->support_ic_type &
127
(ODM_RTL8192F | ODM_RTL8192E | ODM_RTL8197F)) {
128
dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0xc04, 0x3);
129
dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x90c, 0x3);
130
} else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8814A)) {
131
dm->rx_ant_status = (u8)odm_get_bb_reg(dm, R_0x808, 0xf);
132
dm->tx_ant_status = (u8)odm_get_bb_reg(dm, R_0x80c, 0xf);
133
}
134
#endif
135
/* @trx_ant_status are already updated in trx mode API in JGR3 ICs */
136
137
PHYDM_DBG(dm, ODM_COMP_INIT, "[%s]ant_status{tx,rx}={0x%x, 0x%x}\n",
138
__func__, dm->tx_ant_status, dm->rx_ant_status);
139
}
140
141
void phydm_config_ofdm_tx_path(void *dm_void, enum bb_path path)
142
{
143
#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT || RTL8812A_SUPPORT)
144
struct dm_struct *dm = (struct dm_struct *)dm_void;
145
u8 ofdm_tx_path = 0x33;
146
147
if (dm->num_rf_path == PDM_1SS)
148
return;
149
150
switch (dm->support_ic_type) {
151
#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT)
152
case ODM_RTL8192E:
153
case ODM_RTL8192F:
154
if (path == BB_PATH_A)
155
odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x81121313);
156
else if (path == BB_PATH_B)
157
odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x82221323);
158
else if (path == BB_PATH_AB)
159
odm_set_bb_reg(dm, R_0x90c, MASKDWORD, 0x83321333);
160
161
break;
162
#endif
163
164
#if (RTL8812A_SUPPORT)
165
case ODM_RTL8812:
166
if (path == BB_PATH_A)
167
ofdm_tx_path = 0x11;
168
else if (path == BB_PATH_B)
169
ofdm_tx_path = 0x22;
170
else if (path == BB_PATH_AB)
171
ofdm_tx_path = 0x33;
172
173
odm_set_bb_reg(dm, R_0x80c, 0xff00, ofdm_tx_path);
174
175
break;
176
#endif
177
178
default:
179
break;
180
}
181
#endif
182
}
183
184
void phydm_config_ofdm_rx_path(void *dm_void, enum bb_path path)
185
{
186
struct dm_struct *dm = (struct dm_struct *)dm_void;
187
u8 val = 0;
188
189
if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8192F)) {
190
#if (RTL8192E_SUPPORT || RTL8192F_SUPPORT)
191
if (path == BB_PATH_A)
192
val = 1;
193
else if (path == BB_PATH_B)
194
val = 2;
195
else if (path == BB_PATH_AB)
196
val = 3;
197
198
odm_set_bb_reg(dm, R_0xc04, 0xff, ((val << 4) | val));
199
odm_set_bb_reg(dm, R_0xd04, 0xf, val);
200
#endif
201
}
202
#if (RTL8812A_SUPPORT || RTL8822B_SUPPORT)
203
else if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8822B)) {
204
if (path == BB_PATH_A)
205
val = 1;
206
else if (path == BB_PATH_B)
207
val = 2;
208
else if (path == BB_PATH_AB)
209
val = 3;
210
211
odm_set_bb_reg(dm, R_0x808, MASKBYTE0, ((val << 4) | val));
212
}
213
#endif
214
}
215
216
void phydm_config_cck_rx_antenna_init(void *dm_void)
217
{
218
struct dm_struct *dm = (struct dm_struct *)dm_void;
219
220
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
221
if (dm->support_ic_type & ODM_IC_1SS)
222
return;
223
224
/*@CCK 2R CCA parameters*/
225
odm_set_bb_reg(dm, R_0xa00, BIT(15), 0x0); /*@Disable Ant diversity*/
226
odm_set_bb_reg(dm, R_0xa70, BIT(7), 0); /*@Concurrent CCA at LSB & USB*/
227
odm_set_bb_reg(dm, R_0xa74, BIT(8), 0); /*RX path diversity enable*/
228
odm_set_bb_reg(dm, R_0xa14, BIT(7), 0); /*r_en_mrc_antsel*/
229
odm_set_bb_reg(dm, R_0xa20, (BIT(5) | BIT(4)), 1); /*@MBC weighting*/
230
231
if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8197F | ODM_RTL8192F))
232
odm_set_bb_reg(dm, R_0xa08, BIT(28), 1); /*r_cck_2nd_sel_eco*/
233
else if (dm->support_ic_type & ODM_RTL8814A)
234
odm_set_bb_reg(dm, R_0xa84, BIT(28), 1); /*@2R CCA only*/
235
#endif
236
}
237
238
void phydm_config_cck_rx_path(void *dm_void, enum bb_path path)
239
{
240
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
241
struct dm_struct *dm = (struct dm_struct *)dm_void;
242
u8 path_div_select = 0;
243
u8 cck_path[2] = {0};
244
u8 en_2R_path = 0;
245
u8 en_2R_mrc = 0;
246
u8 i = 0, j = 0;
247
u8 num_enable_path = 0;
248
u8 cck_mrc_max_path = 2;
249
250
if (dm->support_ic_type & ODM_IC_1SS)
251
return;
252
253
for (i = 0; i < 4; i++) {
254
if (path & BIT(i)) { /*@ex: PHYDM_ABCD*/
255
num_enable_path++;
256
cck_path[j] = i;
257
j++;
258
}
259
if (num_enable_path >= cck_mrc_max_path)
260
break;
261
}
262
263
if (num_enable_path > 1) {
264
path_div_select = 1;
265
en_2R_path = 1;
266
en_2R_mrc = 1;
267
} else {
268
path_div_select = 0;
269
en_2R_path = 0;
270
en_2R_mrc = 0;
271
}
272
/*@CCK_1 input signal path*/
273
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), cck_path[0]);
274
/*@CCK_2 input signal path*/
275
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), cck_path[1]);
276
/*@enable Rx path diversity*/
277
odm_set_bb_reg(dm, R_0xa74, BIT(8), path_div_select);
278
/*@enable 2R Rx path*/
279
odm_set_bb_reg(dm, R_0xa2c, BIT(18), en_2R_path);
280
/*@enable 2R MRC*/
281
odm_set_bb_reg(dm, R_0xa2c, BIT(22), en_2R_mrc);
282
if (dm->support_ic_type & (ODM_RTL8192F | ODM_RTL8197F)) {
283
if (path == BB_PATH_A) {
284
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);
285
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 0);
286
odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);
287
odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);
288
odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);
289
} else if (path == BB_PATH_B) {/*@for DC cancellation*/
290
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 1);
291
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);
292
odm_set_bb_reg(dm, R_0xa74, BIT(8), 0);
293
odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 0);
294
odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 0);
295
} else if (path == BB_PATH_AB) {
296
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);
297
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);
298
odm_set_bb_reg(dm, R_0xa74, BIT(8), 1);
299
odm_set_bb_reg(dm, R_0xa2c, (BIT(18) | BIT(17)), 1);
300
odm_set_bb_reg(dm, R_0xa2c, (BIT(22) | BIT(21)), 1);
301
}
302
} else if (dm->support_ic_type & ODM_RTL8822B) {
303
if (path == BB_PATH_A) {
304
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 0);
305
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 0);
306
} else {
307
odm_set_bb_reg(dm, R_0xa04, (BIT(27) | BIT(26)), 1);
308
odm_set_bb_reg(dm, R_0xa04, (BIT(25) | BIT(24)), 1);
309
}
310
}
311
312
#endif
313
}
314
315
void phydm_config_cck_tx_path(void *dm_void, enum bb_path path)
316
{
317
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
318
struct dm_struct *dm = (struct dm_struct *)dm_void;
319
320
if (path == BB_PATH_A)
321
odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x8);
322
else if (path == BB_PATH_B)
323
odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x4);
324
else /*if (path == BB_PATH_AB)*/
325
odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0xc);
326
#endif
327
}
328
329
void phydm_config_trx_path_v2(void *dm_void, char input[][16], u32 *_used,
330
char *output, u32 *_out_len)
331
{
332
#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT ||\
333
RTL8822C_SUPPORT || RTL8814B_SUPPORT || RTL8197G_SUPPORT ||\
334
RTL8812F_SUPPORT)
335
struct dm_struct *dm = (struct dm_struct *)dm_void;
336
u32 used = *_used;
337
u32 out_len = *_out_len;
338
u32 val[10] = {0};
339
char help[] = "-h";
340
u8 i = 0, input_idx = 0;
341
enum bb_path tx_path, rx_path, tx_path_ctrl;
342
boolean dbg_mode_en;
343
344
if (!(dm->support_ic_type &
345
(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F | ODM_RTL8822C |
346
ODM_RTL8814B | ODM_RTL8812F | ODM_RTL8197G)))
347
return;
348
349
for (i = 0; i < 5; i++) {
350
if (input[i + 1]) {
351
PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);
352
input_idx++;
353
}
354
}
355
356
if (input_idx == 0)
357
return;
358
359
dbg_mode_en = (boolean)val[0];
360
tx_path = (enum bb_path)val[1];
361
rx_path = (enum bb_path)val[2];
362
tx_path_ctrl = (enum bb_path)val[3];
363
364
if ((strcmp(input[1], help) == 0)) {
365
if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8822B |
366
ODM_RTL8192F)) {
367
PDM_SNPF(out_len, used, output + used, out_len - used,
368
"{en} {tx_path} {rx_path} {ff:auto, else:1ss_tx_path}\n"
369
);
370
} else {
371
PDM_SNPF(out_len, used, output + used, out_len - used,
372
"{en} {tx_path} {rx_path} {is_tx_2_path}\n");
373
}
374
375
} else if (dbg_mode_en) {
376
dm->is_disable_phy_api = false;
377
phydm_api_trx_mode(dm, tx_path, rx_path, tx_path_ctrl);
378
dm->is_disable_phy_api = true;
379
PDM_SNPF(out_len, used, output + used, out_len - used,
380
"T/RX path = 0x%x/0x%x, tx_path_ctrl=%d\n",
381
tx_path, rx_path, tx_path_ctrl);
382
PDM_SNPF(out_len, used, output + used, out_len - used,
383
"T/RX path_en={0x%x, 0x%x}, tx_1ss=%d\n",
384
dm->tx_ant_status, dm->rx_ant_status,
385
dm->tx_1ss_status);
386
} else {
387
dm->is_disable_phy_api = false;
388
PDM_SNPF(out_len, used, output + used, out_len - used,
389
"Disable API debug mode\n");
390
}
391
#endif
392
}
393
394
void phydm_config_trx_path_v1(void *dm_void, char input[][16], u32 *_used,
395
char *output, u32 *_out_len)
396
{
397
#if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)
398
struct dm_struct *dm = (struct dm_struct *)dm_void;
399
u32 used = *_used;
400
u32 out_len = *_out_len;
401
u32 val[10] = {0};
402
char help[] = "-h";
403
u8 i = 0, input_idx = 0;
404
405
if (!(dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)))
406
return;
407
408
for (i = 0; i < 5; i++) {
409
if (input[i + 1]) {
410
PHYDM_SSCANF(input[i + 1], DCMD_HEX, &val[i]);
411
input_idx++;
412
}
413
}
414
415
if (input_idx == 0)
416
return;
417
418
if ((strcmp(input[1], help) == 0)) {
419
PDM_SNPF(out_len, used, output + used, out_len - used,
420
"{0:CCK, 1:OFDM} {1:TX, 2:RX} {1:path_A, 2:path_B, 3:path_AB}\n");
421
422
*_used = used;
423
*_out_len = out_len;
424
return;
425
426
} else if (val[0] == 0) {
427
/* @CCK */
428
if (val[1] == 1) { /*TX*/
429
if (val[2] == 1)
430
phydm_config_cck_tx_path(dm, BB_PATH_A);
431
else if (val[2] == 2)
432
phydm_config_cck_tx_path(dm, BB_PATH_B);
433
else if (val[2] == 3)
434
phydm_config_cck_tx_path(dm, BB_PATH_AB);
435
} else if (val[1] == 2) { /*RX*/
436
437
phydm_config_cck_rx_antenna_init(dm);
438
439
if (val[2] == 1)
440
phydm_config_cck_rx_path(dm, BB_PATH_A);
441
else if (val[2] == 2)
442
phydm_config_cck_rx_path(dm, BB_PATH_B);
443
else if (val[2] == 3)
444
phydm_config_cck_rx_path(dm, BB_PATH_AB);
445
}
446
}
447
/* OFDM */
448
else if (val[0] == 1) {
449
if (val[1] == 1) /*TX*/
450
phydm_config_ofdm_tx_path(dm, val[2]);
451
else if (val[1] == 2) /*RX*/
452
phydm_config_ofdm_rx_path(dm, val[2]);
453
}
454
455
PDM_SNPF(out_len, used, output + used, out_len - used,
456
"PHYDM Set path [%s] [%s] = [%s%s%s%s]\n",
457
(val[0] == 1) ? "OFDM" : "CCK",
458
(val[1] == 1) ? "TX" : "RX",
459
(val[2] & 0x1) ? "A" : "", (val[2] & 0x2) ? "B" : "",
460
(val[2] & 0x4) ? "C" : "",
461
(val[2] & 0x8) ? "D" : "");
462
463
*_used = used;
464
*_out_len = out_len;
465
#endif
466
}
467
468
void phydm_config_trx_path(void *dm_void, char input[][16], u32 *_used,
469
char *output, u32 *_out_len)
470
{
471
struct dm_struct *dm = (struct dm_struct *)dm_void;
472
473
if (dm->support_ic_type & (ODM_RTL8192E | ODM_RTL8812)) {
474
#if (RTL8192E_SUPPORT || RTL8812A_SUPPORT)
475
phydm_config_trx_path_v1(dm, input, _used, output, _out_len);
476
#endif
477
} else if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F |
478
ODM_RTL8192F | ODM_RTL8822C | ODM_RTL8812F |
479
ODM_RTL8197G | ODM_RTL8814B)) {
480
#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT ||\
481
RTL8192F_SUPPORT || RTL8822C_SUPPORT ||\
482
RTL8814B_SUPPORT || RTL8812F_SUPPORT ||\
483
RTL8197G_SUPPORT)
484
phydm_config_trx_path_v2(dm, input, _used, output, _out_len);
485
#endif
486
}
487
}
488
489
void phydm_tx_2path(void *dm_void)
490
{
491
#if (defined(PHYDM_COMPILE_IC_2SS))
492
struct dm_struct *dm = (struct dm_struct *)dm_void;
493
enum bb_path rx_path = (enum bb_path)dm->rx_ant_status;
494
495
PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);
496
497
498
if (!(dm->support_ic_type & ODM_IC_2SS))
499
return;
500
501
#if (RTL8822B_SUPPORT || RTL8192F_SUPPORT || RTL8197F_SUPPORT ||\
502
RTL8822C_SUPPORT || RTL8812F_SUPPORT || RTL8197G_SUPPORT)
503
if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F |
504
ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G))
505
phydm_api_trx_mode(dm, BB_PATH_AB, rx_path, BB_PATH_AB);
506
#endif
507
508
#if (RTL8812A_SUPPORT || RTL8192E_SUPPORT)
509
if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8192E)) {
510
phydm_config_cck_tx_path(dm, BB_PATH_AB);
511
phydm_config_ofdm_tx_path(dm, BB_PATH_AB);
512
}
513
#endif
514
#endif
515
}
516
517
void phydm_stop_3_wire(void *dm_void, u8 set_type)
518
{
519
struct dm_struct *dm = (struct dm_struct *)dm_void;
520
521
if (set_type == PHYDM_SET) {
522
/*@[Stop 3-wires]*/
523
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
524
odm_set_bb_reg(dm, R_0x180c, 0x3, 0x0);
525
odm_set_bb_reg(dm, R_0x180c, BIT(28), 0x1);
526
527
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
528
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
529
odm_set_bb_reg(dm, R_0x410c, 0x3, 0x0);
530
odm_set_bb_reg(dm, R_0x410c, BIT(28), 0x1);
531
}
532
#endif
533
534
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
535
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
536
odm_set_bb_reg(dm, R_0x520c, 0x3, 0x0);
537
odm_set_bb_reg(dm, R_0x520c, BIT(28), 0x1);
538
odm_set_bb_reg(dm, R_0x530c, 0x3, 0x0);
539
odm_set_bb_reg(dm, R_0x530c, BIT(28), 0x1);
540
}
541
#endif
542
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
543
odm_set_bb_reg(dm, R_0xc00, 0xf, 0x4);
544
odm_set_bb_reg(dm, R_0xe00, 0xf, 0x4);
545
} else {
546
odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0xf);
547
}
548
549
} else { /*@if (set_type == PHYDM_REVERT)*/
550
551
/*@[Start 3-wires]*/
552
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
553
odm_set_bb_reg(dm, R_0x180c, 0x3, 0x3);
554
odm_set_bb_reg(dm, R_0x180c, BIT(28), 0x1);
555
556
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
557
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS) {
558
odm_set_bb_reg(dm, R_0x410c, 0x3, 0x3);
559
odm_set_bb_reg(dm, R_0x410c, BIT(28), 0x1);
560
}
561
#endif
562
563
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
564
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
565
odm_set_bb_reg(dm, R_0x520c, 0x3, 0x3);
566
odm_set_bb_reg(dm, R_0x520c, BIT(28), 0x1);
567
odm_set_bb_reg(dm, R_0x530c, 0x3, 0x3);
568
odm_set_bb_reg(dm, R_0x530c, BIT(28), 0x1);
569
}
570
#endif
571
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
572
odm_set_bb_reg(dm, R_0xc00, 0xf, 0x7);
573
odm_set_bb_reg(dm, R_0xe00, 0xf, 0x7);
574
} else {
575
odm_set_bb_reg(dm, R_0x88c, 0xf00000, 0x0);
576
}
577
}
578
}
579
580
u8 phydm_stop_ic_trx(void *dm_void, u8 set_type)
581
{
582
struct dm_struct *dm = (struct dm_struct *)dm_void;
583
struct phydm_api_stuc *api = &dm->api_table;
584
u32 i = 0;
585
u8 trx_idle_success = false;
586
u32 dbg_port_value = 0;
587
588
if (set_type == PHYDM_SET) {
589
/*@[Stop TRX]---------------------------------------------------------*/
590
/*set debug port to 0x0*/
591
if (!phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, 0x0))
592
return PHYDM_SET_FAIL;
593
594
for (i = 0; i < 100; i++) {
595
dbg_port_value = phydm_get_bb_dbg_port_val(dm);
596
597
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
598
/* BB idle */
599
if ((dbg_port_value & 0x1FFEFF3F) == 0 &&
600
(dbg_port_value & 0xC0010000) ==
601
0xC0010000) {
602
PHYDM_DBG(dm, ODM_COMP_API,
603
"Stop trx wait for (%d) times\n",
604
i);
605
606
trx_idle_success = true;
607
break;
608
}
609
} else {
610
/* PHYTXON && CCA_all */
611
if (dm->support_ic_type & (ODM_RTL8721D |
612
ODM_RTL8710C)) {
613
if ((dbg_port_value &
614
(BIT(20) | BIT(15))) == 0) {
615
PHYDM_DBG(dm, ODM_COMP_API,
616
"Stop trx wait for (%d) times\n",
617
i);
618
619
trx_idle_success = true;
620
break;
621
}
622
} else {
623
if ((dbg_port_value &
624
(BIT(17) | BIT(3))) == 0) {
625
PHYDM_DBG(dm, ODM_COMP_API,
626
"Stop trx wait for (%d) times\n",
627
i);
628
629
trx_idle_success = true;
630
break;
631
}
632
}
633
}
634
ODM_delay_ms(1);
635
}
636
phydm_release_bb_dbg_port(dm);
637
638
if (trx_idle_success) {
639
api->tx_queue_bitmap = odm_read_1byte(dm, R_0x522);
640
641
/*pause all TX queue*/
642
odm_set_mac_reg(dm, R_0x520, 0xff0000, 0xff);
643
644
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
645
/*@disable OFDM RX CCA*/
646
odm_set_bb_reg(dm, R_0x1c68, BIT(24), 1);
647
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
648
/*@disable OFDM RX CCA*/
649
odm_set_bb_reg(dm, R_0x838, BIT(1), 1);
650
} else {
651
api->rxiqc_reg1 = odm_read_4byte(dm, R_0xc14);
652
api->rxiqc_reg2 = odm_read_4byte(dm, R_0xc1c);
653
/* @[ Set IQK Matrix = 0 ]
654
* equivalent to [ Turn off CCA]
655
*/
656
odm_set_bb_reg(dm, R_0xc14, MASKDWORD, 0x0);
657
odm_set_bb_reg(dm, R_0xc1c, MASKDWORD, 0x0);
658
}
659
phydm_dis_cck_trx(dm, PHYDM_SET);
660
} else {
661
return PHYDM_SET_FAIL;
662
}
663
664
return PHYDM_SET_SUCCESS;
665
666
} else { /*@if (set_type == PHYDM_REVERT)*/
667
/*Release all TX queue*/
668
odm_write_1byte(dm, R_0x522, api->tx_queue_bitmap);
669
670
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
671
/*@enable OFDM RX CCA*/
672
odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0);
673
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
674
/*@enable OFDM RX CCA*/
675
odm_set_bb_reg(dm, R_0x838, BIT(1), 0);
676
} else {
677
/* @[Set IQK Matrix = 0] equivalent to [ Turn off CCA]*/
678
odm_write_4byte(dm, R_0xc14, api->rxiqc_reg1);
679
odm_write_4byte(dm, R_0xc1c, api->rxiqc_reg2);
680
}
681
phydm_dis_cck_trx(dm, PHYDM_REVERT);
682
return PHYDM_SET_SUCCESS;
683
}
684
}
685
686
void phydm_dis_cck_trx(void *dm_void, u8 set_type)
687
{
688
struct dm_struct *dm = (struct dm_struct *)dm_void;
689
struct phydm_api_stuc *api = &dm->api_table;
690
691
if (set_type == PHYDM_SET) {
692
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
693
api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0x1a04,
694
0xf0000000);
695
/* @CCK RxIQ weighting = [0,0] */
696
odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x3);
697
/* @disable CCK Tx */
698
odm_set_bb_reg(dm, R_0x1a04, 0xf0000000, 0x0);
699
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
700
api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0xa04,
701
0xf0000000);
702
/* @disable CCK block */
703
odm_set_bb_reg(dm, R_0x808, BIT(28), 0);
704
/* @disable CCK Tx */
705
odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x0);
706
} else {
707
api->ccktx_path = (u8)odm_get_bb_reg(dm, R_0xa04,
708
0xf0000000);
709
/* @disable whole CCK block */
710
odm_set_bb_reg(dm, R_0x800, BIT(24), 0);
711
/* @disable CCK Tx */
712
odm_set_bb_reg(dm, R_0xa04, 0xf0000000, 0x0);
713
}
714
} else if (set_type == PHYDM_REVERT) {
715
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
716
/* @CCK RxIQ weighting = [1,1] */
717
odm_set_bb_reg(dm, R_0x1a14, 0x300, 0x0);
718
/* @enable CCK Tx */
719
odm_set_bb_reg(dm, R_0x1a04, 0xf0000000,
720
api->ccktx_path);
721
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
722
/* @enable CCK block */
723
odm_set_bb_reg(dm, R_0x808, BIT(28), 1);
724
/* @enable CCK Tx */
725
odm_set_bb_reg(dm, R_0xa04, 0xf0000000,
726
api->ccktx_path);
727
} else {
728
/* @enable whole CCK block */
729
odm_set_bb_reg(dm, R_0x800, BIT(24), 1);
730
/* @enable CCK Tx */
731
odm_set_bb_reg(dm, R_0xa04, 0xf0000000,
732
api->ccktx_path);
733
}
734
}
735
}
736
void phydm_set_ext_switch(void *dm_void, u32 ext_ant_switch)
737
{
738
#if (RTL8821A_SUPPORT || RTL8881A_SUPPORT)
739
struct dm_struct *dm = (struct dm_struct *)dm_void;
740
741
if (!(dm->support_ic_type & (ODM_RTL8821 | ODM_RTL8881A)))
742
return;
743
744
/*Output Pin Settings*/
745
746
/*select DPDT_P and DPDT_N as output pin*/
747
odm_set_mac_reg(dm, R_0x4c, BIT(23), 0);
748
749
/*@by WLAN control*/
750
odm_set_mac_reg(dm, R_0x4c, BIT(24), 1);
751
752
/*@DPDT_N = 1b'0*/ /*@DPDT_P = 1b'0*/
753
odm_set_bb_reg(dm, R_0xcb4, 0xFF, 77);
754
755
if (ext_ant_switch == 1) { /*@2b'01*/
756
odm_set_bb_reg(dm, R_0xcb4, (BIT(29) | BIT(28)), 1);
757
PHYDM_DBG(dm, ODM_COMP_API, "8821A ant swh=2b'01\n");
758
} else if (ext_ant_switch == 2) { /*@2b'10*/
759
odm_set_bb_reg(dm, R_0xcb4, BIT(29) | BIT(28), 2);
760
PHYDM_DBG(dm, ODM_COMP_API, "*8821A ant swh=2b'10\n");
761
}
762
#endif
763
}
764
765
void phydm_csi_mask_enable(void *dm_void, u32 enable)
766
{
767
struct dm_struct *dm = (struct dm_struct *)dm_void;
768
boolean en = false;
769
770
en = (enable == FUNC_ENABLE) ? true : false;
771
772
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
773
odm_set_bb_reg(dm, R_0xd2c, BIT(28), en);
774
PHYDM_DBG(dm, ODM_COMP_API,
775
"Enable CSI Mask: Reg 0xD2C[28] = ((0x%x))\n", en);
776
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
777
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
778
odm_set_bb_reg(dm, R_0xc0c, BIT(3), en);
779
PHYDM_DBG(dm, ODM_COMP_API,
780
"Enable CSI Mask: Reg 0xc0c[3] = ((0x%x))\n", en);
781
#endif
782
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
783
odm_set_bb_reg(dm, R_0x874, BIT(0), en);
784
PHYDM_DBG(dm, ODM_COMP_API,
785
"Enable CSI Mask: Reg 0x874[0] = ((0x%x))\n", en);
786
}
787
}
788
789
void phydm_clean_all_csi_mask(void *dm_void)
790
{
791
struct dm_struct *dm = (struct dm_struct *)dm_void;
792
793
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
794
odm_set_bb_reg(dm, R_0xd40, MASKDWORD, 0);
795
odm_set_bb_reg(dm, R_0xd44, MASKDWORD, 0);
796
odm_set_bb_reg(dm, R_0xd48, MASKDWORD, 0);
797
odm_set_bb_reg(dm, R_0xd4c, MASKDWORD, 0);
798
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
799
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
800
u8 i = 0, idx_lmt = 0;
801
802
if (dm->support_ic_type &
803
(ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G))
804
idx_lmt = 127;
805
else /*@for IC supporting 80 + 80*/
806
idx_lmt = 255;
807
808
odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x3);
809
odm_set_bb_reg(dm, R_0x1d94, BIT(31) | BIT(30), 0x1);
810
for (i = 0; i < idx_lmt; i++) {
811
odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, i);
812
odm_set_bb_reg(dm, R_0x1d94, MASKBYTE0, 0x0);
813
}
814
odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);
815
#endif
816
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
817
odm_set_bb_reg(dm, R_0x880, MASKDWORD, 0);
818
odm_set_bb_reg(dm, R_0x884, MASKDWORD, 0);
819
odm_set_bb_reg(dm, R_0x888, MASKDWORD, 0);
820
odm_set_bb_reg(dm, R_0x88c, MASKDWORD, 0);
821
odm_set_bb_reg(dm, R_0x890, MASKDWORD, 0);
822
odm_set_bb_reg(dm, R_0x894, MASKDWORD, 0);
823
odm_set_bb_reg(dm, R_0x898, MASKDWORD, 0);
824
odm_set_bb_reg(dm, R_0x89c, MASKDWORD, 0);
825
}
826
}
827
828
void phydm_set_csi_mask(void *dm_void, u32 tone_idx_tmp, u8 tone_direction)
829
{
830
struct dm_struct *dm = (struct dm_struct *)dm_void;
831
u8 byte_offset = 0, bit_offset = 0;
832
u32 target_reg = 0;
833
u8 reg_tmp_value = 0;
834
u32 tone_num = 64;
835
u32 tone_num_shift = 0;
836
u32 csi_mask_reg_p = 0, csi_mask_reg_n = 0;
837
838
/* @calculate real tone idx*/
839
if ((tone_idx_tmp % 10) >= 5)
840
tone_idx_tmp += 10;
841
842
tone_idx_tmp = (tone_idx_tmp / 10);
843
844
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
845
tone_num = 64;
846
csi_mask_reg_p = 0xD40;
847
csi_mask_reg_n = 0xD48;
848
849
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
850
tone_num = 128;
851
csi_mask_reg_p = 0x880;
852
csi_mask_reg_n = 0x890;
853
}
854
855
if (tone_direction == FREQ_POSITIVE) {
856
if (tone_idx_tmp >= (tone_num - 1))
857
tone_idx_tmp = (tone_num - 1);
858
859
byte_offset = (u8)(tone_idx_tmp >> 3);
860
bit_offset = (u8)(tone_idx_tmp & 0x7);
861
target_reg = csi_mask_reg_p + byte_offset;
862
863
} else {
864
tone_num_shift = tone_num;
865
866
if (tone_idx_tmp >= tone_num)
867
tone_idx_tmp = tone_num;
868
869
tone_idx_tmp = tone_num - tone_idx_tmp;
870
871
byte_offset = (u8)(tone_idx_tmp >> 3);
872
bit_offset = (u8)(tone_idx_tmp & 0x7);
873
target_reg = csi_mask_reg_n + byte_offset;
874
}
875
876
reg_tmp_value = odm_read_1byte(dm, target_reg);
877
PHYDM_DBG(dm, ODM_COMP_API,
878
"Pre Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",
879
(tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);
880
reg_tmp_value |= BIT(bit_offset);
881
odm_write_1byte(dm, target_reg, reg_tmp_value);
882
PHYDM_DBG(dm, ODM_COMP_API,
883
"New Mask tone idx[%d]: Reg0x%x = ((0x%x))\n",
884
(tone_idx_tmp + tone_num_shift), target_reg, reg_tmp_value);
885
}
886
887
void phydm_set_nbi_reg(void *dm_void, u32 tone_idx_tmp, u32 bw)
888
{
889
struct dm_struct *dm = (struct dm_struct *)dm_void;
890
/*tone_idx X 10*/
891
u32 nbi_128[NBI_128TONE] = {25, 55, 85, 115, 135,
892
155, 185, 205, 225, 245,
893
265, 285, 305, 335, 355,
894
375, 395, 415, 435, 455,
895
485, 505, 525, 555, 585, 615, 635};
896
/*tone_idx X 10*/
897
u32 nbi_256[NBI_256TONE] = {25, 55, 85, 115, 135,
898
155, 175, 195, 225, 245,
899
265, 285, 305, 325, 345,
900
365, 385, 405, 425, 445,
901
465, 485, 505, 525, 545,
902
565, 585, 605, 625, 645,
903
665, 695, 715, 735, 755,
904
775, 795, 815, 835, 855,
905
875, 895, 915, 935, 955,
906
975, 995, 1015, 1035, 1055,
907
1085, 1105, 1125, 1145, 1175,
908
1195, 1225, 1255, 1275};
909
u32 reg_idx = 0;
910
u32 i;
911
u8 nbi_table_idx = FFT_128_TYPE;
912
913
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
914
nbi_table_idx = FFT_128_TYPE;
915
} else if (dm->support_ic_type & ODM_IC_11AC_1_SERIES) {
916
nbi_table_idx = FFT_256_TYPE;
917
} else if (dm->support_ic_type & ODM_IC_11AC_2_SERIES) {
918
if (bw == 80)
919
nbi_table_idx = FFT_256_TYPE;
920
else /*@20M, 40M*/
921
nbi_table_idx = FFT_128_TYPE;
922
}
923
924
if (nbi_table_idx == FFT_128_TYPE) {
925
for (i = 0; i < NBI_128TONE; i++) {
926
if (tone_idx_tmp < nbi_128[i]) {
927
reg_idx = i + 1;
928
break;
929
}
930
}
931
932
} else if (nbi_table_idx == FFT_256_TYPE) {
933
for (i = 0; i < NBI_256TONE; i++) {
934
if (tone_idx_tmp < nbi_256[i]) {
935
reg_idx = i + 1;
936
break;
937
}
938
}
939
}
940
941
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
942
odm_set_bb_reg(dm, R_0xc40, 0x1f000000, reg_idx);
943
PHYDM_DBG(dm, ODM_COMP_API,
944
"Set tone idx: Reg0xC40[28:24] = ((0x%x))\n",
945
reg_idx);
946
} else {
947
odm_set_bb_reg(dm, R_0x87c, 0xfc000, reg_idx);
948
PHYDM_DBG(dm, ODM_COMP_API,
949
"Set tone idx: Reg0x87C[19:14] = ((0x%x))\n",
950
reg_idx);
951
}
952
}
953
954
void phydm_nbi_enable(void *dm_void, u32 enable)
955
{
956
struct dm_struct *dm = (struct dm_struct *)dm_void;
957
u32 val = 0;
958
959
val = (enable == FUNC_ENABLE) ? 1 : 0;
960
961
PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);
962
963
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
964
if (dm->support_ic_type & (ODM_RTL8192F | ODM_RTL8197F)) {
965
val = (enable == FUNC_ENABLE) ? 0xf : 0;
966
odm_set_bb_reg(dm, R_0xc50, 0xf000000, val);
967
} else {
968
odm_set_bb_reg(dm, R_0xc40, BIT(9), val);
969
}
970
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
971
if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) {
972
odm_set_bb_reg(dm, R_0x87c, BIT(13), val);
973
odm_set_bb_reg(dm, R_0xc20, BIT(28), val);
974
if (dm->rf_type > RF_1T1R)
975
odm_set_bb_reg(dm, R_0xe20, BIT(28), val);
976
} else {
977
odm_set_bb_reg(dm, R_0x87c, BIT(13), val);
978
}
979
}
980
}
981
982
u8 phydm_find_fc(void *dm_void, u32 channel, u32 bw, u32 second_ch, u32 *fc_in)
983
{
984
struct dm_struct *dm = (struct dm_struct *)dm_void;
985
u32 fc = *fc_in;
986
u32 start_ch_per_40m[NUM_START_CH_40M] = {36, 44, 52, 60, 100,
987
108, 116, 124, 132, 140,
988
149, 157, 165, 173};
989
u32 start_ch_per_80m[NUM_START_CH_80M] = {36, 52, 100, 116, 132,
990
149, 165};
991
u32 *start_ch = &start_ch_per_40m[0];
992
u32 num_start_channel = NUM_START_CH_40M;
993
u32 channel_offset = 0;
994
u32 i;
995
996
/*@2.4G*/
997
if (channel <= 14 && channel > 0) {
998
if (bw == 80)
999
return PHYDM_SET_FAIL;
1000
1001
fc = 2412 + (channel - 1) * 5;
1002
1003
if (bw == 40 && second_ch == PHYDM_ABOVE) {
1004
if (channel >= 10) {
1005
PHYDM_DBG(dm, ODM_COMP_API,
1006
"CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",
1007
channel, second_ch);
1008
return PHYDM_SET_FAIL;
1009
}
1010
fc += 10;
1011
} else if (bw == 40 && (second_ch == PHYDM_BELOW)) {
1012
if (channel <= 2) {
1013
PHYDM_DBG(dm, ODM_COMP_API,
1014
"CH = ((%d)), Scnd_CH = ((%d)) Error setting\n",
1015
channel, second_ch);
1016
return PHYDM_SET_FAIL;
1017
}
1018
fc -= 10;
1019
}
1020
}
1021
/*@5G*/
1022
else if (channel >= 36 && channel <= 177) {
1023
if (bw != 20) {
1024
if (bw == 40) {
1025
num_start_channel = NUM_START_CH_40M;
1026
start_ch = &start_ch_per_40m[0];
1027
channel_offset = CH_OFFSET_40M;
1028
} else if (bw == 80) {
1029
num_start_channel = NUM_START_CH_80M;
1030
start_ch = &start_ch_per_80m[0];
1031
channel_offset = CH_OFFSET_80M;
1032
}
1033
1034
for (i = 0; i < (num_start_channel - 1); i++) {
1035
if (channel < start_ch[i + 1]) {
1036
channel = start_ch[i] + channel_offset;
1037
break;
1038
}
1039
}
1040
PHYDM_DBG(dm, ODM_COMP_API, "Mod_CH = ((%d))\n",
1041
channel);
1042
}
1043
1044
fc = 5180 + (channel - 36) * 5;
1045
1046
} else {
1047
PHYDM_DBG(dm, ODM_COMP_API, "CH = ((%d)) Error setting\n",
1048
channel);
1049
return PHYDM_SET_FAIL;
1050
}
1051
1052
*fc_in = fc;
1053
1054
return PHYDM_SET_SUCCESS;
1055
}
1056
1057
u8 phydm_find_intf_distance(void *dm_void, u32 bw, u32 fc, u32 f_interference,
1058
u32 *tone_idx_tmp_in)
1059
{
1060
struct dm_struct *dm = (struct dm_struct *)dm_void;
1061
u32 bw_up = 0, bw_low = 0;
1062
u32 int_distance = 0;
1063
u32 tone_idx_tmp = 0;
1064
u8 set_result = PHYDM_SET_NO_NEED;
1065
1066
bw_up = fc + bw / 2;
1067
bw_low = fc - bw / 2;
1068
1069
PHYDM_DBG(dm, ODM_COMP_API,
1070
"[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\n", bw_low,
1071
fc, bw_up, f_interference);
1072
1073
if (f_interference >= bw_low && f_interference <= bw_up) {
1074
int_distance = DIFF_2(fc, f_interference);
1075
/*@10*(int_distance /0.3125)*/
1076
tone_idx_tmp = (int_distance << 5);
1077
PHYDM_DBG(dm, ODM_COMP_API,
1078
"int_distance = ((%d MHz)) Mhz, tone_idx_tmp = ((%d.%d))\n",
1079
int_distance, tone_idx_tmp / 10,
1080
tone_idx_tmp % 10);
1081
*tone_idx_tmp_in = tone_idx_tmp;
1082
set_result = PHYDM_SET_SUCCESS;
1083
}
1084
1085
return set_result;
1086
}
1087
1088
u8 phydm_csi_mask_setting(void *dm_void, u32 enable, u32 ch, u32 bw,
1089
u32 f_intf, u32 sec_ch)
1090
{
1091
struct dm_struct *dm = (struct dm_struct *)dm_void;
1092
u32 fc = 2412;
1093
u8 direction = FREQ_POSITIVE;
1094
u32 tone_idx = 0;
1095
u8 set_result = PHYDM_SET_SUCCESS;
1096
u8 rpt = 0;
1097
1098
if (enable == FUNC_DISABLE) {
1099
set_result = PHYDM_SET_SUCCESS;
1100
phydm_clean_all_csi_mask(dm);
1101
1102
} else {
1103
PHYDM_DBG(dm, ODM_COMP_API,
1104
"[Set CSI MASK_] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
1105
ch, bw, f_intf,
1106
(((bw == 20) || (ch > 14)) ? "Don't care" :
1107
(sec_ch == PHYDM_ABOVE) ? "H" : "L"));
1108
1109
/*@calculate fc*/
1110
if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
1111
set_result = PHYDM_SET_FAIL;
1112
} else {
1113
/*@calculate interference distance*/
1114
rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
1115
&tone_idx);
1116
if (rpt == PHYDM_SET_SUCCESS) {
1117
if (f_intf >= fc)
1118
direction = FREQ_POSITIVE;
1119
else
1120
direction = FREQ_NEGATIVE;
1121
1122
phydm_set_csi_mask(dm, tone_idx, direction);
1123
set_result = PHYDM_SET_SUCCESS;
1124
} else {
1125
set_result = PHYDM_SET_NO_NEED;
1126
}
1127
}
1128
}
1129
1130
if (set_result == PHYDM_SET_SUCCESS)
1131
phydm_csi_mask_enable(dm, enable);
1132
else
1133
phydm_csi_mask_enable(dm, FUNC_DISABLE);
1134
1135
return set_result;
1136
}
1137
1138
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1139
u8 phydm_find_intf_distance_jgr3(void *dm_void, u32 bw, u32 fc,
1140
u32 f_interference, u32 *tone_idx_tmp_in)
1141
{
1142
struct dm_struct *dm = (struct dm_struct *)dm_void;
1143
u32 bw_up = 0, bw_low = 0;
1144
u32 int_distance = 0;
1145
u32 tone_idx_tmp = 0;
1146
u8 set_result = PHYDM_SET_NO_NEED;
1147
1148
bw_up = 1000 * (fc + bw / 2);
1149
bw_low = 1000 * (fc - bw / 2);
1150
fc = 1000 * fc;
1151
1152
PHYDM_DBG(dm, ODM_COMP_API,
1153
"[f_l, fc, fh] = [ %d, %d, %d ], f_int = ((%d))\n", bw_low,
1154
fc, bw_up, f_interference);
1155
1156
if (f_interference >= bw_low && f_interference <= bw_up) {
1157
int_distance = DIFF_2(fc, f_interference);
1158
/*@10*(int_distance /0.3125)*/
1159
tone_idx_tmp = ((int_distance + 156) / 312);
1160
PHYDM_DBG(dm, ODM_COMP_API,
1161
"int_distance = ((%d)) , tone_idx_tmp = ((%d))\n",
1162
int_distance, tone_idx_tmp);
1163
*tone_idx_tmp_in = tone_idx_tmp;
1164
set_result = PHYDM_SET_SUCCESS;
1165
}
1166
1167
return set_result;
1168
}
1169
u8 phydm_csi_mask_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw,
1170
u32 f_intf, u32 sec_ch, u8 wgt)
1171
{
1172
struct dm_struct *dm = (struct dm_struct *)dm_void;
1173
u32 fc = 2412;
1174
u8 direction = FREQ_POSITIVE;
1175
u32 tone_idx = 0;
1176
u8 set_result = PHYDM_SET_SUCCESS;
1177
u8 rpt = 0;
1178
1179
if (enable == FUNC_DISABLE) {
1180
phydm_csi_mask_enable(dm, FUNC_ENABLE);
1181
phydm_clean_all_csi_mask(dm);
1182
phydm_csi_mask_enable(dm, FUNC_DISABLE);
1183
set_result = PHYDM_SET_SUCCESS;
1184
} else {
1185
PHYDM_DBG(dm, ODM_COMP_API,
1186
"[Set CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s)), wgt = ((%d))\n",
1187
ch, bw, f_intf,
1188
(((bw == 20) || (ch > 14)) ? "Don't care" :
1189
(sec_ch == PHYDM_ABOVE) ? "H" : "L"), wgt);
1190
1191
/*@calculate fc*/
1192
if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
1193
set_result = PHYDM_SET_FAIL;
1194
} else {
1195
/*@calculate interference distance*/
1196
rpt = phydm_find_intf_distance_jgr3(dm, bw, fc, f_intf,
1197
&tone_idx);
1198
if (rpt == PHYDM_SET_SUCCESS) {
1199
if (f_intf >= 1000 * fc)
1200
direction = FREQ_POSITIVE;
1201
else
1202
direction = FREQ_NEGATIVE;
1203
1204
phydm_csi_mask_enable(dm, FUNC_ENABLE);
1205
phydm_set_csi_mask_jgr3(dm, tone_idx, direction,
1206
wgt);
1207
set_result = PHYDM_SET_SUCCESS;
1208
} else {
1209
set_result = PHYDM_SET_NO_NEED;
1210
}
1211
}
1212
if (!(set_result == PHYDM_SET_SUCCESS))
1213
phydm_csi_mask_enable(dm, FUNC_DISABLE);
1214
}
1215
1216
return set_result;
1217
}
1218
1219
void phydm_set_csi_mask_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,
1220
u8 wgt)
1221
{
1222
struct dm_struct *dm = (struct dm_struct *)dm_void;
1223
u32 reg_tmp_value = 0;
1224
u32 tone_num = 64;
1225
u32 table_addr = 0;
1226
u32 addr = 0;
1227
u8 rf_bw = 0;
1228
u8 value = 0;
1229
1230
rf_bw = odm_read_1byte(dm, R_0x9b0);
1231
if (((rf_bw & 0xc) >> 2) == 0x2)
1232
tone_num = 128; /* @RF80 : tone(-1) at tone_idx=255 */
1233
else
1234
tone_num = 64; /* @RF20/40 : tone(-1) at tone_idx=127 */
1235
1236
if (tone_direction == FREQ_POSITIVE) {
1237
if (tone_idx_tmp >= (tone_num - 1))
1238
tone_idx_tmp = (tone_num - 1);
1239
} else {
1240
if (tone_idx_tmp >= tone_num)
1241
tone_idx_tmp = tone_num;
1242
1243
tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;
1244
}
1245
table_addr = tone_idx_tmp >> 1;
1246
1247
reg_tmp_value = odm_read_4byte(dm, R_0x1d94);
1248
PHYDM_DBG(dm, ODM_COMP_API,
1249
"Pre Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",
1250
tone_idx_tmp, reg_tmp_value);
1251
odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x3);
1252
odm_set_bb_reg(dm, R_0x1d94, BIT(31) | BIT(30), 0x1);
1253
odm_set_bb_reg(dm, R_0x1d94, MASKBYTE2, (table_addr & 0xff));
1254
if (tone_idx_tmp % 2)
1255
value = (BIT(3) | (wgt & 0x7)) << 4;
1256
else
1257
value = BIT(3) | (wgt & 0x7);
1258
1259
odm_set_bb_reg(dm, R_0x1d94, 0xff, value);
1260
reg_tmp_value = odm_read_4byte(dm, R_0x1d94);
1261
PHYDM_DBG(dm, ODM_COMP_API,
1262
"New Mask tone idx[%d]: Reg0x1d94 = ((0x%x))\n",
1263
tone_idx_tmp, reg_tmp_value);
1264
odm_set_bb_reg(dm, R_0x1ee8, 0x3, 0x0);
1265
}
1266
1267
void phydm_nbi_reset_jgr3(void *dm_void)
1268
{
1269
struct dm_struct *dm = (struct dm_struct *)dm_void;
1270
1271
odm_set_bb_reg(dm, R_0x818, BIT(3), 1);
1272
odm_set_bb_reg(dm, R_0x1d3c, 0x78000000, 0);
1273
odm_set_bb_reg(dm, R_0x818, BIT(3), 0);
1274
odm_set_bb_reg(dm, R_0x818, BIT(11), 0);
1275
#if RTL8814B_SUPPORT
1276
if (dm->support_ic_type & ODM_RTL8814B) {
1277
odm_set_bb_reg(dm, R_0x1944, 0x300, 0x3);
1278
odm_set_bb_reg(dm, R_0x4044, 0x300, 0x3);
1279
odm_set_bb_reg(dm, R_0x5044, 0x300, 0x3);
1280
odm_set_bb_reg(dm, R_0x5144, 0x300, 0x3);
1281
odm_set_bb_reg(dm, R_0x810, 0xf, 0x0);
1282
odm_set_bb_reg(dm, R_0x810, 0xf0000, 0x0);
1283
odm_set_bb_reg(dm, R_0xc24, MASKDWORD, 0x406000ff);
1284
}
1285
#endif
1286
}
1287
1288
u8 phydm_nbi_setting_jgr3(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,
1289
u32 sec_ch, u8 path)
1290
{
1291
struct dm_struct *dm = (struct dm_struct *)dm_void;
1292
u32 fc = 2412;
1293
u8 direction = FREQ_POSITIVE;
1294
u32 tone_idx = 0;
1295
u8 set_result = PHYDM_SET_SUCCESS;
1296
u8 rpt = 0;
1297
1298
if (enable == FUNC_DISABLE) {
1299
phydm_nbi_reset_jgr3(dm);
1300
set_result = PHYDM_SET_SUCCESS;
1301
} else {
1302
PHYDM_DBG(dm, ODM_COMP_API,
1303
"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
1304
ch, bw, f_intf,
1305
(((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||
1306
(ch > 14)) ? "Don't care" :
1307
(sec_ch == PHYDM_ABOVE) ? "H" : "L"));
1308
1309
/*@calculate fc*/
1310
if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
1311
set_result = PHYDM_SET_FAIL;
1312
} else {
1313
/*@calculate interference distance*/
1314
rpt = phydm_find_intf_distance_jgr3(dm, bw, fc, f_intf,
1315
&tone_idx);
1316
if (rpt == PHYDM_SET_SUCCESS) {
1317
if (f_intf >= 1000 * fc)
1318
direction = FREQ_POSITIVE;
1319
else
1320
direction = FREQ_NEGATIVE;
1321
1322
phydm_set_nbi_reg_jgr3(dm, tone_idx, direction,
1323
path);
1324
set_result = PHYDM_SET_SUCCESS;
1325
} else {
1326
set_result = PHYDM_SET_NO_NEED;
1327
}
1328
}
1329
}
1330
1331
if (set_result == PHYDM_SET_SUCCESS)
1332
phydm_nbi_enable_jgr3(dm, enable, path);
1333
else
1334
phydm_nbi_enable_jgr3(dm, FUNC_DISABLE, path);
1335
1336
return set_result;
1337
}
1338
1339
void phydm_set_nbi_reg_jgr3(void *dm_void, u32 tone_idx_tmp, u8 tone_direction,
1340
u8 path)
1341
{
1342
struct dm_struct *dm = (struct dm_struct *)dm_void;
1343
u32 reg_tmp_value = 0;
1344
u32 tone_num = 64;
1345
u32 addr = 0;
1346
u8 rf_bw = 0;
1347
1348
rf_bw = odm_read_1byte(dm, R_0x9b0);
1349
if (((rf_bw & 0xc) >> 2) == 0x2)
1350
tone_num = 128; /* RF80 : tone-1 at tone_idx=255 */
1351
else
1352
tone_num = 64; /* RF20/40 : tone-1 at tone_idx=127 */
1353
1354
if (tone_direction == FREQ_POSITIVE) {
1355
if (tone_idx_tmp >= (tone_num - 1))
1356
tone_idx_tmp = (tone_num - 1);
1357
} else {
1358
if (tone_idx_tmp >= tone_num)
1359
tone_idx_tmp = tone_num;
1360
1361
tone_idx_tmp = (tone_num << 1) - tone_idx_tmp;
1362
}
1363
/*Mark the tone idx for Packet detection*/
1364
#if RTL8814B_SUPPORT
1365
if (dm->support_ic_type & ODM_RTL8814B) {
1366
odm_set_bb_reg(dm, R_0xc24, 0xff, 0xff);
1367
odm_set_bb_reg(dm, R_0xc24, 0xff00, tone_idx_tmp);
1368
}
1369
#endif
1370
switch (path) {
1371
case RF_PATH_A:
1372
odm_set_bb_reg(dm, R_0x1944, 0x001FF000, tone_idx_tmp);
1373
PHYDM_DBG(dm, ODM_COMP_API,
1374
"Set tone idx[%d]:PATH-A = ((0x%x))\n",
1375
tone_idx_tmp, tone_idx_tmp);
1376
break;
1377
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
1378
case RF_PATH_B:
1379
odm_set_bb_reg(dm, R_0x4044, 0x001FF000, tone_idx_tmp);
1380
PHYDM_DBG(dm, ODM_COMP_API,
1381
"Set tone idx[%d]:PATH-B = ((0x%x))\n",
1382
tone_idx_tmp, tone_idx_tmp);
1383
break;
1384
#endif
1385
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
1386
case RF_PATH_C:
1387
odm_set_bb_reg(dm, R_0x5044, 0x001FF000, tone_idx_tmp);
1388
PHYDM_DBG(dm, ODM_COMP_API,
1389
"Set tone idx[%d]:PATH-C = ((0x%x))\n",
1390
tone_idx_tmp, tone_idx_tmp);
1391
break;
1392
#endif
1393
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
1394
case RF_PATH_D:
1395
odm_set_bb_reg(dm, R_0x5144, 0x001FF000, tone_idx_tmp);
1396
PHYDM_DBG(dm, ODM_COMP_API,
1397
"Set tone idx[%d]:PATH-D = ((0x%x))\n",
1398
tone_idx_tmp, tone_idx_tmp);
1399
break;
1400
#endif
1401
default:
1402
break;
1403
}
1404
}
1405
1406
void phydm_nbi_enable_jgr3(void *dm_void, u32 enable, u8 path)
1407
{
1408
struct dm_struct *dm = (struct dm_struct *)dm_void;
1409
boolean val = false;
1410
1411
val = (enable == FUNC_ENABLE) ? true : false;
1412
1413
PHYDM_DBG(dm, ODM_COMP_API, "Enable NBI=%d\n", val);
1414
1415
if (dm->support_ic_type & ODM_RTL8814B) {
1416
odm_set_bb_reg(dm, R_0x1d3c, BIT(19), val);
1417
odm_set_bb_reg(dm, R_0x818, BIT(3), val);
1418
} else if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F)) {
1419
odm_set_bb_reg(dm, R_0x818, BIT(3), !val);
1420
}
1421
odm_set_bb_reg(dm, R_0x818, BIT(11), val);
1422
odm_set_bb_reg(dm, R_0x1d3c, 0x78000000, 0xf);
1423
1424
if (enable == FUNC_ENABLE) {
1425
switch (path) {
1426
case RF_PATH_A:
1427
odm_set_bb_reg(dm, R_0x1940, BIT(31), val);
1428
break;
1429
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
1430
case RF_PATH_B:
1431
odm_set_bb_reg(dm, R_0x4040, BIT(31), val);
1432
break;
1433
#endif
1434
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
1435
case RF_PATH_C:
1436
odm_set_bb_reg(dm, R_0x5040, BIT(31), val);
1437
break;
1438
#endif
1439
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
1440
case RF_PATH_D:
1441
odm_set_bb_reg(dm, R_0x5140, BIT(31), val);
1442
break;
1443
#endif
1444
default:
1445
break;
1446
}
1447
} else {
1448
odm_set_bb_reg(dm, R_0x1940, BIT(31), val);
1449
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
1450
odm_set_bb_reg(dm, R_0x4040, BIT(31), val);
1451
#endif
1452
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
1453
odm_set_bb_reg(dm, R_0x5040, BIT(31), val);
1454
#endif
1455
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
1456
odm_set_bb_reg(dm, R_0x5140, BIT(31), val);
1457
#endif
1458
}
1459
}
1460
1461
u8 phydm_phystat_rpt_jgr3(void *dm_void, enum phystat_rpt info,
1462
enum rf_path ant_path)
1463
{
1464
struct dm_struct *dm = (struct dm_struct *)dm_void;
1465
s8 evm_org, cfo_org, rxsnr_org;
1466
u8 i, return_info = 0, tmp_lsb = 0, tmp_msb = 0, tmp_info = 0;
1467
1468
/* Update the status for each pkt */
1469
odm_set_bb_reg(dm, R_0x8c4, 0xfff000, 0x448);
1470
odm_set_bb_reg(dm, R_0x8c0, MASKLWORD, 0x4001);
1471
/* PHY status Page1 */
1472
odm_set_bb_reg(dm, R_0x8c0, 0x3C00000, 0x1);
1473
/*choose debug port for phystatus */
1474
odm_set_bb_reg(dm, R_0x1c3c, 0xFFF00, 0x380);
1475
1476
if (info == PHY_PWDB) {
1477
/* Choose the report of the diff path */
1478
if (ant_path == RF_PATH_A)
1479
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1);
1480
else if (ant_path == RF_PATH_B)
1481
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x2);
1482
else if (ant_path == RF_PATH_C)
1483
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x3);
1484
else if (ant_path == RF_PATH_D)
1485
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x4);
1486
} else if (info == PHY_EVM) {
1487
/* Choose the report of the diff path */
1488
if (ant_path == RF_PATH_A)
1489
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x10);
1490
else if (ant_path == RF_PATH_B)
1491
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x11);
1492
else if (ant_path == RF_PATH_C)
1493
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x12);
1494
else if (ant_path == RF_PATH_D)
1495
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x13);
1496
return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);
1497
} else if (info == PHY_CFO) {
1498
/* Choose the report of the diff path */
1499
if (ant_path == RF_PATH_A)
1500
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x14);
1501
else if (ant_path == RF_PATH_B)
1502
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x15);
1503
else if (ant_path == RF_PATH_C)
1504
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x16);
1505
else if (ant_path == RF_PATH_D)
1506
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x17);
1507
return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);
1508
} else if (info == PHY_RXSNR) {
1509
/* Choose the report of the diff path */
1510
if (ant_path == RF_PATH_A)
1511
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x18);
1512
else if (ant_path == RF_PATH_B)
1513
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x19);
1514
else if (ant_path == RF_PATH_C)
1515
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1a);
1516
else if (ant_path == RF_PATH_D)
1517
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x1b);
1518
return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);
1519
} else if (info == PHY_LGAIN) {
1520
/* choose page */
1521
odm_set_bb_reg(dm, R_0x8c0, 0x3c00000, 0x2);
1522
/* Choose the report of the diff path */
1523
if (ant_path == RF_PATH_A) {
1524
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xd);
1525
tmp_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3f);
1526
return_info = tmp_info;
1527
} else if (ant_path == RF_PATH_B) {
1528
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xd);
1529
tmp_lsb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xc0);
1530
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xe);
1531
tmp_msb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xf);
1532
tmp_info |= (tmp_msb << 2) | tmp_lsb;
1533
return_info = tmp_info;
1534
} else if (ant_path == RF_PATH_C) {
1535
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xe);
1536
tmp_lsb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xf0);
1537
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0xf);
1538
tmp_msb = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3);
1539
tmp_info |= (tmp_msb << 4) | tmp_lsb;
1540
return_info = tmp_info;
1541
} else if (ant_path == RF_PATH_D) {
1542
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x10);
1543
tmp_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0x3f);
1544
return_info = tmp_info;
1545
}
1546
} else if (info == PHY_HT_AAGC_GAIN) {
1547
/* choose page */
1548
odm_set_bb_reg(dm, R_0x8c0, 0x3c00000, 0x2);
1549
/* Choose the report of the diff path */
1550
if (ant_path == RF_PATH_A)
1551
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x12);
1552
else if (ant_path == RF_PATH_B)
1553
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x13);
1554
else if (ant_path == RF_PATH_C)
1555
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x14);
1556
else if (ant_path == RF_PATH_D)
1557
odm_set_bb_reg(dm, R_0x8c4, 0x3ff, 0x15);
1558
return_info = (u8)odm_get_bb_reg(dm, R_0x2dbc, 0xff);
1559
}
1560
return return_info;
1561
}
1562
1563
void phydm_ex_hal8814b_wifi_only_hw_config(void *dm_void)
1564
{
1565
/*BB control*/
1566
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x4c, 0x01800000, 0x2);*/
1567
/*SW control*/
1568
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcb4, 0xff, 0x77);*/
1569
/*antenna mux switch */
1570
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x974, 0x300, 0x3);*/
1571
1572
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1990, 0x300, 0x0);*/
1573
1574
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0xcbc, 0x80000, 0x0);*/
1575
/*switch to WL side controller and gnt_wl gnt_bt debug signal */
1576
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x70, 0xff000000, 0x0e);*/
1577
/*gnt_wl=1 , gnt_bt=0*/
1578
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1704, 0xffffffff,
1579
* 0x7700);
1580
*/
1581
/*halwifionly_phy_set_bb_reg(pwifionlycfg, 0x1700, 0xffffffff,
1582
* 0xc00f0038);
1583
*/
1584
}
1585
1586
void phydm_user_position_for_sniffer(void *dm_void, u8 user_position)
1587
{
1588
struct dm_struct *dm = (struct dm_struct *)dm_void;
1589
1590
/* user position valid */
1591
odm_set_bb_reg(dm, R_0xa68, BIT(17), 1);
1592
/* Select user seat from pmac */
1593
odm_set_bb_reg(dm, R_0xa68, BIT(16), 1);
1594
/*user seat*/
1595
odm_set_bb_reg(dm, R_0xa68, (BIT(19) | BIT(18)), user_position);
1596
}
1597
1598
boolean
1599
phydm_bb_ctrl_txagc_ofst_jgr3(void *dm_void, s8 pw_offset, /*@(unit: dB)*/
1600
u8 add_half_db /*@(+0.5 dB)*/)
1601
{
1602
struct dm_struct *dm = (struct dm_struct *)dm_void;
1603
s8 pw_idx = pw_offset * 4; /*@ 7Bit, 0.25dB unit*/
1604
1605
if (pw_offset < -16 || pw_offset > 15) {
1606
pr_debug("[Warning][%s]Ofst error=%d", __func__, pw_offset);
1607
return false;
1608
}
1609
1610
if (add_half_db)
1611
pw_idx += 2;
1612
1613
PHYDM_DBG(dm, ODM_COMP_API, "Pw_ofst=0x%x\n", pw_idx);
1614
1615
odm_set_bb_reg(dm, R_0x18a0, 0x3f, pw_idx);
1616
1617
if (dm->num_rf_path >= 2)
1618
odm_set_bb_reg(dm, R_0x41a0, 0x3f, pw_idx);
1619
1620
if (dm->num_rf_path >= 3)
1621
odm_set_bb_reg(dm, R_0x52a0, 0x3f, pw_idx);
1622
1623
if (dm->num_rf_path >= 4)
1624
odm_set_bb_reg(dm, R_0x53a0, 0x3f, pw_idx);
1625
1626
return true;
1627
}
1628
1629
#endif
1630
u8 phydm_nbi_setting(void *dm_void, u32 enable, u32 ch, u32 bw, u32 f_intf,
1631
u32 sec_ch)
1632
{
1633
struct dm_struct *dm = (struct dm_struct *)dm_void;
1634
u32 fc = 2412;
1635
u8 direction = FREQ_POSITIVE;
1636
u32 tone_idx = 0;
1637
u8 set_result = PHYDM_SET_SUCCESS;
1638
u8 rpt = 0;
1639
1640
if (enable == FUNC_DISABLE) {
1641
set_result = PHYDM_SET_SUCCESS;
1642
} else {
1643
PHYDM_DBG(dm, ODM_COMP_API,
1644
"[Set NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
1645
ch, bw, f_intf,
1646
(((sec_ch == PHYDM_DONT_CARE) || (bw == 20) ||
1647
(ch > 14)) ? "Don't care" :
1648
(sec_ch == PHYDM_ABOVE) ? "H" : "L"));
1649
1650
/*@calculate fc*/
1651
if (phydm_find_fc(dm, ch, bw, sec_ch, &fc) == PHYDM_SET_FAIL) {
1652
set_result = PHYDM_SET_FAIL;
1653
} else {
1654
/*@calculate interference distance*/
1655
rpt = phydm_find_intf_distance(dm, bw, fc, f_intf,
1656
&tone_idx);
1657
if (rpt == PHYDM_SET_SUCCESS) {
1658
if (f_intf >= fc)
1659
direction = FREQ_POSITIVE;
1660
else
1661
direction = FREQ_NEGATIVE;
1662
1663
phydm_set_nbi_reg(dm, tone_idx, bw);
1664
1665
set_result = PHYDM_SET_SUCCESS;
1666
} else {
1667
set_result = PHYDM_SET_NO_NEED;
1668
}
1669
}
1670
}
1671
1672
if (set_result == PHYDM_SET_SUCCESS)
1673
phydm_nbi_enable(dm, enable);
1674
else
1675
phydm_nbi_enable(dm, FUNC_DISABLE);
1676
1677
return set_result;
1678
}
1679
1680
void phydm_nbi_debug(void *dm_void, char input[][16], u32 *_used, char *output,
1681
u32 *_out_len)
1682
{
1683
struct dm_struct *dm = (struct dm_struct *)dm_void;
1684
u32 used = *_used;
1685
u32 out_len = *_out_len;
1686
u32 val[10] = {0};
1687
char help[] = "-h";
1688
u8 i = 0, input_idx = 0, idx_lmt = 0;
1689
u32 enable = 0; /*@function enable*/
1690
u32 ch = 0;
1691
u32 bw = 0;
1692
u32 f_int = 0; /*@interference frequency*/
1693
u32 sec_ch = 0; /*secondary channel*/
1694
u8 rpt = 0;
1695
u8 path = 0;
1696
1697
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1698
idx_lmt = 6;
1699
else
1700
idx_lmt = 5;
1701
for (i = 0; i < idx_lmt; i++) {
1702
if (input[i + 1]) {
1703
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
1704
input_idx++;
1705
}
1706
}
1707
1708
if (input_idx == 0)
1709
return;
1710
1711
enable = val[0];
1712
ch = val[1];
1713
bw = val[2];
1714
f_int = val[3];
1715
sec_ch = val[4];
1716
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1717
path = (u8)val[5];
1718
#endif
1719
1720
if ((strcmp(input[1], help) == 0)) {
1721
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1722
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1723
PDM_SNPF(out_len, used, output + used, out_len - used,
1724
"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(khz)} {Scnd_CH(L=1, H=2)} {Path:A~D(0~3)}\n");
1725
else
1726
#endif
1727
PDM_SNPF(out_len, used, output + used, out_len - used,
1728
"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(khz)} {Scnd_CH(L=1, H=2)}\n");
1729
*_used = used;
1730
*_out_len = out_len;
1731
return;
1732
} else if (val[0] == FUNC_ENABLE) {
1733
PDM_SNPF(out_len, used, output + used, out_len - used,
1734
"[Enable NBI] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
1735
ch, bw, f_int,
1736
((sec_ch == PHYDM_DONT_CARE) ||
1737
(bw == 20) || (ch > 14)) ? "Don't care" :
1738
((sec_ch == PHYDM_ABOVE) ? "H" : "L"));
1739
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1740
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1741
rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,
1742
sec_ch, path);
1743
else
1744
#endif
1745
rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,
1746
sec_ch);
1747
} else if (val[0] == FUNC_DISABLE) {
1748
PDM_SNPF(out_len, used, output + used, out_len - used,
1749
"[Disable NBI]\n");
1750
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1751
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1752
rpt = phydm_nbi_setting_jgr3(dm, enable, ch, bw, f_int,
1753
sec_ch, path);
1754
else
1755
#endif
1756
rpt = phydm_nbi_setting(dm, enable, ch, bw, f_int,
1757
sec_ch);
1758
} else {
1759
rpt = PHYDM_SET_FAIL;
1760
}
1761
1762
PDM_SNPF(out_len, used, output + used, out_len - used,
1763
"[NBI set result: %s]\n",
1764
(rpt == PHYDM_SET_SUCCESS) ? "Success" :
1765
((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));
1766
1767
*_used = used;
1768
*_out_len = out_len;
1769
}
1770
1771
void phydm_csi_debug(void *dm_void, char input[][16], u32 *_used, char *output,
1772
u32 *_out_len)
1773
{
1774
struct dm_struct *dm = (struct dm_struct *)dm_void;
1775
u32 used = *_used;
1776
u32 out_len = *_out_len;
1777
u32 val[10] = {0};
1778
char help[] = "-h";
1779
u8 i = 0, input_idx = 0, idx_lmt = 0;
1780
u32 enable = 0; /*@function enable*/
1781
u32 ch = 0;
1782
u32 bw = 0;
1783
u32 f_int = 0; /*@interference frequency*/
1784
u32 sec_ch = 0; /*secondary channel*/
1785
u8 rpt = 0;
1786
u8 wgt = 0;
1787
1788
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1789
idx_lmt = 6;
1790
else
1791
idx_lmt = 5;
1792
1793
for (i = 0; i < idx_lmt; i++) {
1794
if (input[i + 1]) {
1795
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);
1796
input_idx++;
1797
}
1798
}
1799
1800
if (input_idx == 0)
1801
return;
1802
1803
enable = val[0];
1804
ch = val[1];
1805
bw = val[2];
1806
f_int = val[3];
1807
sec_ch = val[4];
1808
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1809
wgt = (u8)val[5];
1810
#endif
1811
1812
if ((strcmp(input[1], help) == 0)) {
1813
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1814
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1815
PDM_SNPF(out_len, used, output + used, out_len - used,
1816
"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(KHz)} {Scnd_CH(L=1, H=2)}\n{wgt:(7:3/4),(6~1: 1/2 ~ 1/64),(0:0)}\n");
1817
else
1818
#endif
1819
PDM_SNPF(out_len, used, output + used, out_len - used,
1820
"{en:1 Dis:2} {ch} {BW:20/40/80} {f_intf(Mhz)} {Scnd_CH(L=1, H=2)}\n");
1821
1822
*_used = used;
1823
*_out_len = out_len;
1824
return;
1825
1826
} else if (val[0] == FUNC_ENABLE) {
1827
PDM_SNPF(out_len, used, output + used, out_len - used,
1828
"[Enable CSI MASK] CH = ((%d)), BW = ((%d)), f_intf = ((%d)), Scnd_CH = ((%s))\n",
1829
ch, bw, f_int,
1830
(ch > 14) ? "Don't care" :
1831
(((sec_ch == PHYDM_DONT_CARE) ||
1832
(bw == 20) || (ch > 14)) ? "H" : "L"));
1833
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1834
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1835
rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,
1836
f_int, sec_ch, wgt);
1837
else
1838
#endif
1839
rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,
1840
sec_ch);
1841
} else if (val[0] == FUNC_DISABLE) {
1842
PDM_SNPF(out_len, used, output + used, out_len - used,
1843
"[Disable CSI MASK]\n");
1844
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1845
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
1846
rpt = phydm_csi_mask_setting_jgr3(dm, enable, ch, bw,
1847
f_int, sec_ch, wgt);
1848
else
1849
#endif
1850
rpt = phydm_csi_mask_setting(dm, enable, ch, bw, f_int,
1851
sec_ch);
1852
} else {
1853
rpt = PHYDM_SET_FAIL;
1854
}
1855
PDM_SNPF(out_len, used, output + used, out_len - used,
1856
"[CSI MASK set result: %s]\n",
1857
(rpt == PHYDM_SET_SUCCESS) ? "Success" :
1858
((rpt == PHYDM_SET_NO_NEED) ? "No need" : "Error"));
1859
1860
*_used = used;
1861
*_out_len = out_len;
1862
}
1863
1864
void phydm_stop_ck320(void *dm_void, u8 enable)
1865
{
1866
struct dm_struct *dm = (struct dm_struct *)dm_void;
1867
u32 val = enable ? 1 : 0;
1868
1869
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1870
odm_set_bb_reg(dm, R_0x8b4, BIT(6), val);
1871
} else {
1872
if (dm->support_ic_type & ODM_IC_N_2SS) /*N-2SS*/
1873
odm_set_bb_reg(dm, R_0x87c, BIT(29), val);
1874
else /*N-1SS*/
1875
odm_set_bb_reg(dm, R_0x87c, BIT(31), val);
1876
}
1877
}
1878
1879
boolean
1880
phydm_bb_ctrl_txagc_ofst(void *dm_void, s8 pw_offset, /*@(unit: dB)*/
1881
u8 add_half_db /*@(+0.5 dB)*/)
1882
{
1883
struct dm_struct *dm = (struct dm_struct *)dm_void;
1884
s8 pw_idx;
1885
u8 offset_bit_num = 0;
1886
1887
if (dm->support_ic_type & N_IC_TX_OFFEST_5_BIT) {
1888
/*@ 5Bit, 0.5dB unit*/
1889
if (pw_offset < -8 || pw_offset > 7) {
1890
pr_debug("[Warning][%s] Ofst=%d", __func__, pw_offset);
1891
return false;
1892
}
1893
offset_bit_num = 5;
1894
} else {
1895
if (pw_offset < -16 || pw_offset > 15) {
1896
pr_debug("[Warning][%s] Ofst=%d", __func__, pw_offset);
1897
return false;
1898
}
1899
if (dm->support_ic_type & N_IC_TX_OFFEST_7_BIT) {
1900
/*@ 7Bit, 0.25dB unit*/
1901
offset_bit_num = 7;
1902
} else {
1903
/*@ 6Bit, 0.5dB unit*/
1904
offset_bit_num = 6;
1905
}
1906
}
1907
1908
pw_idx = (offset_bit_num == 7) ? pw_offset * 4 : pw_offset * 2;
1909
1910
if (add_half_db)
1911
pw_idx = (offset_bit_num == 7) ? pw_idx + 2 : pw_idx + 1;
1912
1913
PHYDM_DBG(dm, ODM_COMP_API, "Pw_ofst=0x%x\n", pw_idx);
1914
1915
switch (dm->ic_ip_series) {
1916
case PHYDM_IC_AC:
1917
odm_set_bb_reg(dm, R_0x8b4, 0x3f, pw_idx); /*6Bit*/
1918
break;
1919
case PHYDM_IC_N:
1920
if (offset_bit_num == 5) {
1921
odm_set_bb_reg(dm, R_0x80c, 0x1f00, pw_idx);
1922
if (dm->num_rf_path >= 2)
1923
odm_set_bb_reg(dm, R_0x80c, 0x3e000, pw_idx);
1924
} else if (offset_bit_num == 6) {
1925
odm_set_bb_reg(dm, R_0x80c, 0x3f00, pw_idx);
1926
if (dm->num_rf_path >= 2)
1927
odm_set_bb_reg(dm, R_0x80c, 0xfc000, pw_idx);
1928
} else { /*7Bit*/
1929
odm_set_bb_reg(dm, R_0x80c, 0x7f00, pw_idx);
1930
if (dm->num_rf_path >= 2)
1931
odm_set_bb_reg(dm, R_0x80c, 0x3f8000, pw_idx);
1932
}
1933
break;
1934
}
1935
return true;
1936
}
1937
1938
boolean
1939
phydm_set_bb_txagc_offset(void *dm_void, s8 pw_offset, /*@(unit: dB)*/
1940
u8 add_half_db /*@(+0.5 dB)*/)
1941
{
1942
struct dm_struct *dm = (struct dm_struct *)dm_void;
1943
boolean rpt = false;
1944
1945
PHYDM_DBG(dm, ODM_COMP_API, "power_offset=%d, add_half_db =%d\n",
1946
pw_offset, add_half_db);
1947
1948
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1949
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1950
rpt = phydm_bb_ctrl_txagc_ofst_jgr3(dm, pw_offset, add_half_db);
1951
} else
1952
#endif
1953
{
1954
rpt = phydm_bb_ctrl_txagc_ofst(dm, pw_offset, add_half_db);
1955
}
1956
1957
PHYDM_DBG(dm, ODM_COMP_API, "TX AGC Offset set_success=%d", rpt);
1958
1959
return rpt;
1960
}
1961
1962
#ifdef PHYDM_COMMON_API_SUPPORT
1963
void phydm_reset_txagc(void *dm_void)
1964
{
1965
struct dm_struct *dm = (struct dm_struct *)dm_void;
1966
u32 r_txagc_cck[4] = {R_0x18a0, R_0x41a0, R_0x52a0, R_0x53a0};
1967
u32 r_txagc_ofdm[4] = {R_0x18e8, R_0x41e8, R_0x52e8, R_0x53e8};
1968
u32 r_txagc_diff = R_0x3a00;
1969
u8 i = 0;
1970
1971
if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES)) {
1972
PHYDM_DBG(dm, ODM_COMP_API, "Only for JGR3 ICs!\n");
1973
return;
1974
}
1975
1976
for (i = RF_PATH_A; i < dm->num_rf_path; i++) {
1977
odm_set_bb_reg(dm, r_txagc_cck[i], 0x7f0000, 0x0);
1978
odm_set_bb_reg(dm, r_txagc_ofdm[i], 0x1fc00, 0x0);
1979
}
1980
1981
for (i = 0; i <= ODM_RATEVHTSS4MCS6; i = i + 4)
1982
odm_set_bb_reg(dm, r_txagc_diff + i, MASKDWORD, 0x0);
1983
}
1984
boolean
1985
phydm_api_shift_txagc(void *dm_void, u32 pwr_offset, enum rf_path path,
1986
boolean is_positive) {
1987
struct dm_struct *dm = (struct dm_struct *)dm_void;
1988
boolean ret = false;
1989
u32 txagc_cck = 0;
1990
u32 txagc_ofdm = 0;
1991
u32 r_txagc_ofdm[4] = {R_0x18e8, R_0x41e8, R_0x52e8, R_0x53e8};
1992
u32 r_txagc_cck[4] = {R_0x18a0, R_0x41a0, R_0x52a0, R_0x53a0};
1993
1994
#if (RTL8822C_SUPPORT || RTL8812F_SUPPORT || RTL8197G_SUPPORT)
1995
if (dm->support_ic_type &
1996
(ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G)) {
1997
if (path > RF_PATH_B) {
1998
PHYDM_DBG(dm, ODM_PHY_CONFIG, "Unsupported path (%d)\n",
1999
path);
2000
return false;
2001
}
2002
txagc_cck = (u8)odm_get_bb_reg(dm, r_txagc_cck[path],
2003
0x7F0000);
2004
txagc_ofdm = (u8)odm_get_bb_reg(dm, r_txagc_ofdm[path],
2005
0x1FC00);
2006
if (is_positive) {
2007
if (((txagc_cck + pwr_offset) > 127) ||
2008
((txagc_ofdm + pwr_offset) > 127))
2009
return false;
2010
2011
txagc_cck += pwr_offset;
2012
txagc_ofdm += pwr_offset;
2013
} else {
2014
if (pwr_offset > txagc_cck || pwr_offset > txagc_ofdm)
2015
return false;
2016
2017
txagc_cck -= pwr_offset;
2018
txagc_ofdm -= pwr_offset;
2019
}
2020
#if (RTL8822C_SUPPORT)
2021
ret = config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_cck,
2022
path, PDM_CCK);
2023
ret &= config_phydm_write_txagc_ref_8822c(dm, (u8)txagc_ofdm,
2024
path, PDM_OFDM);
2025
#endif
2026
#if (RTL8812F_SUPPORT)
2027
ret = config_phydm_write_txagc_ref_8812f(dm, (u8)txagc_cck,
2028
path, PDM_CCK);
2029
ret &= config_phydm_write_txagc_ref_8812f(dm, (u8)txagc_ofdm,
2030
path, PDM_OFDM);
2031
#endif
2032
#if (RTL8197G_SUPPORT)
2033
ret = config_phydm_write_txagc_ref_8197g(dm, (u8)txagc_cck,
2034
path, PDM_CCK);
2035
ret &= config_phydm_write_txagc_ref_8197g(dm, (u8)txagc_ofdm,
2036
path, PDM_OFDM);
2037
#endif
2038
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2039
"%s: path-%d txagc_cck_ref=%x txagc_ofdm_ref=0x%x\n",
2040
__func__, path, txagc_cck, txagc_ofdm);
2041
}
2042
#endif
2043
2044
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
2045
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B)) {
2046
if (path > RF_PATH_D) {
2047
PHYDM_DBG(dm, ODM_PHY_CONFIG, "Unsupported path (%d)\n",
2048
path);
2049
return false;
2050
}
2051
txagc_cck = (u8)odm_get_bb_reg(dm, r_txagc_cck[path],
2052
0x7F0000);
2053
txagc_ofdm = (u8)odm_get_bb_reg(dm, r_txagc_ofdm[path],
2054
0x1FC00);
2055
if (is_positive) {
2056
if (((txagc_cck + pwr_offset) > 127) ||
2057
((txagc_ofdm + pwr_offset) > 127))
2058
return false;
2059
2060
txagc_cck += pwr_offset;
2061
txagc_ofdm += pwr_offset;
2062
} else {
2063
if (pwr_offset > txagc_cck || pwr_offset > txagc_ofdm)
2064
return false;
2065
2066
txagc_cck -= pwr_offset;
2067
txagc_ofdm -= pwr_offset;
2068
}
2069
#if (RTL8198F_SUPPORT)
2070
ret = config_phydm_write_txagc_ref_8198f(dm, (u8)txagc_cck,
2071
path, PDM_CCK);
2072
ret &= config_phydm_write_txagc_ref_8198f(dm, (u8)txagc_ofdm,
2073
path, PDM_OFDM);
2074
#endif
2075
#if (RTL8814B_SUPPORT)
2076
ret = config_phydm_write_txagc_ref_8814b(dm, (u8)txagc_cck,
2077
path, PDM_CCK);
2078
ret &= config_phydm_write_txagc_ref_8814b(dm, (u8)txagc_ofdm,
2079
path, PDM_OFDM);
2080
#endif
2081
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2082
"%s: path-%d txagc_cck_ref=%x txagc_ofdm_ref=0x%x\n",
2083
__func__, path, txagc_cck, txagc_ofdm);
2084
}
2085
#endif
2086
2087
return ret;
2088
}
2089
2090
boolean
2091
phydm_api_set_txagc(void *dm_void, u32 pwr_idx, enum rf_path path,
2092
u8 rate, boolean is_single_rate)
2093
{
2094
struct dm_struct *dm = (struct dm_struct *)dm_void;
2095
boolean ret = false;
2096
#if (RTL8198F_SUPPORT || RTL8822C_SUPPORT || RTL8812F_SUPPORT ||\
2097
RTL8814B_SUPPORT || RTL8197G_SUPPORT)
2098
u8 base = 0;
2099
u8 txagc_tmp = 0;
2100
s8 pw_by_rate_tmp = 0;
2101
s8 pw_by_rate_new = 0;
2102
#endif
2103
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2104
u8 i = 0;
2105
#endif
2106
2107
#if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8195B_SUPPORT)
2108
if (dm->support_ic_type &
2109
(ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B)) {
2110
if (is_single_rate) {
2111
#if (RTL8822B_SUPPORT)
2112
if (dm->support_ic_type == ODM_RTL8822B)
2113
ret = phydm_write_txagc_1byte_8822b(dm, pwr_idx,
2114
path, rate);
2115
#endif
2116
2117
#if (RTL8821C_SUPPORT)
2118
if (dm->support_ic_type == ODM_RTL8821C)
2119
ret = phydm_write_txagc_1byte_8821c(dm, pwr_idx,
2120
path, rate);
2121
#endif
2122
2123
#if (RTL8195B_SUPPORT)
2124
if (dm->support_ic_type == ODM_RTL8195B)
2125
ret = phydm_write_txagc_1byte_8195b(dm, pwr_idx,
2126
path, rate);
2127
#endif
2128
2129
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2130
set_current_tx_agc(dm->priv, path, rate, (u8)pwr_idx);
2131
#endif
2132
2133
} else {
2134
#if (RTL8822B_SUPPORT)
2135
if (dm->support_ic_type == ODM_RTL8822B)
2136
ret = config_phydm_write_txagc_8822b(dm,
2137
pwr_idx,
2138
path,
2139
rate);
2140
#endif
2141
2142
#if (RTL8821C_SUPPORT)
2143
if (dm->support_ic_type == ODM_RTL8821C)
2144
ret = config_phydm_write_txagc_8821c(dm,
2145
pwr_idx,
2146
path,
2147
rate);
2148
#endif
2149
2150
#if (RTL8195B_SUPPORT)
2151
if (dm->support_ic_type == ODM_RTL8195B)
2152
ret = config_phydm_write_txagc_8195b(dm,
2153
pwr_idx,
2154
path,
2155
rate);
2156
#endif
2157
2158
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2159
for (i = 0; i < 4; i++)
2160
set_current_tx_agc(dm->priv, path, (rate + i),
2161
(u8)pwr_idx);
2162
#endif
2163
}
2164
}
2165
#endif
2166
2167
#if (RTL8198F_SUPPORT)
2168
if (dm->support_ic_type & ODM_RTL8198F) {
2169
if (rate < 0x4)
2170
txagc_tmp = config_phydm_read_txagc_8198f(dm, path,
2171
rate,
2172
PDM_CCK);
2173
else
2174
txagc_tmp = config_phydm_read_txagc_8198f(dm, path,
2175
rate,
2176
PDM_OFDM);
2177
2178
pw_by_rate_tmp = config_phydm_read_txagc_diff_8198f(dm, rate);
2179
base = txagc_tmp - pw_by_rate_tmp;
2180
base = base & 0x7f;
2181
if (DIFF_2((pwr_idx & 0x7f), base) > 64 || pwr_idx > 127)
2182
return false;
2183
2184
pw_by_rate_new = (s8)(pwr_idx - base);
2185
ret = phydm_write_txagc_1byte_8198f(dm, pw_by_rate_new, rate);
2186
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2187
"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
2188
__func__, path, rate, base, pw_by_rate_new);
2189
}
2190
#endif
2191
2192
#if (RTL8822C_SUPPORT)
2193
if (dm->support_ic_type & ODM_RTL8822C) {
2194
if (rate < 0x4)
2195
txagc_tmp = config_phydm_read_txagc_8822c(dm, path,
2196
rate,
2197
PDM_CCK);
2198
else
2199
txagc_tmp = config_phydm_read_txagc_8822c(dm, path,
2200
rate,
2201
PDM_OFDM);
2202
2203
pw_by_rate_tmp = config_phydm_read_txagc_diff_8822c(dm, rate);
2204
base = txagc_tmp - pw_by_rate_tmp;
2205
base = base & 0x7f;
2206
if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)
2207
return false;
2208
2209
pw_by_rate_new = (s8)(pwr_idx - base);
2210
ret = phydm_write_txagc_1byte_8822c(dm, pw_by_rate_new, rate);
2211
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2212
"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
2213
__func__, path, rate, base, pw_by_rate_new);
2214
}
2215
#endif
2216
2217
#if (RTL8814B_SUPPORT)
2218
if (dm->support_ic_type & ODM_RTL8814B) {
2219
if (rate < 0x4)
2220
txagc_tmp = config_phydm_read_txagc_8814b(dm, path,
2221
rate,
2222
PDM_CCK);
2223
else
2224
txagc_tmp = config_phydm_read_txagc_8814b(dm, path,
2225
rate,
2226
PDM_OFDM);
2227
2228
pw_by_rate_tmp = config_phydm_read_txagc_diff_8814b(dm, rate);
2229
base = txagc_tmp - pw_by_rate_tmp;
2230
base = base & 0x7f;
2231
if (DIFF_2((pwr_idx & 0x7f), base) > 64)
2232
return false;
2233
2234
pw_by_rate_new = (s8)(pwr_idx - base);
2235
ret = phydm_write_txagc_1byte_8814b(dm, pw_by_rate_new, rate);
2236
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2237
"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
2238
__func__, path, rate, base, pw_by_rate_new);
2239
}
2240
#endif
2241
2242
#if (RTL8812F_SUPPORT)
2243
if (dm->support_ic_type & ODM_RTL8812F) {
2244
if (rate < 0x4)
2245
txagc_tmp = config_phydm_read_txagc_8812f(dm, path,
2246
rate,
2247
PDM_CCK);
2248
else
2249
txagc_tmp = config_phydm_read_txagc_8812f(dm, path,
2250
rate,
2251
PDM_OFDM);
2252
2253
pw_by_rate_tmp = config_phydm_read_txagc_diff_8812f(dm, rate);
2254
base = txagc_tmp - pw_by_rate_tmp;
2255
base = base & 0x7f;
2256
if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)
2257
return false;
2258
2259
pw_by_rate_new = (s8)(pwr_idx - base);
2260
ret = phydm_write_txagc_1byte_8812f(dm, pw_by_rate_new, rate);
2261
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2262
"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
2263
__func__, path, rate, base, pw_by_rate_new);
2264
}
2265
#endif
2266
2267
#if (RTL8197G_SUPPORT)
2268
if (dm->support_ic_type & ODM_RTL8197G) {
2269
if (rate < 0x4)
2270
txagc_tmp = config_phydm_read_txagc_8197g(dm, path,
2271
rate,
2272
PDM_CCK);
2273
else
2274
txagc_tmp = config_phydm_read_txagc_8197g(dm, path,
2275
rate,
2276
PDM_OFDM);
2277
2278
pw_by_rate_tmp = config_phydm_read_txagc_diff_8197g(dm, rate);
2279
base = txagc_tmp - pw_by_rate_tmp;
2280
base = base & 0x7f;
2281
if (DIFF_2((pwr_idx & 0x7f), base) > 63 || pwr_idx > 127)
2282
return false;
2283
2284
pw_by_rate_new = (s8)(pwr_idx - base);
2285
ret = phydm_write_txagc_1byte_8197g(dm, pw_by_rate_new, rate);
2286
PHYDM_DBG(dm, ODM_PHY_CONFIG,
2287
"%s: path-%d rate_idx=%x base=0x%x new_diff=0x%x\n",
2288
__func__, path, rate, base, pw_by_rate_new);
2289
}
2290
#endif
2291
2292
#if (RTL8197F_SUPPORT)
2293
if (dm->support_ic_type & ODM_RTL8197F)
2294
ret = config_phydm_write_txagc_8197f(dm, pwr_idx, path, rate);
2295
#endif
2296
2297
#if (RTL8192F_SUPPORT)
2298
if (dm->support_ic_type & ODM_RTL8192F)
2299
ret = config_phydm_write_txagc_8192f(dm, pwr_idx, path, rate);
2300
#endif
2301
2302
#if (RTL8721D_SUPPORT)
2303
if (dm->support_ic_type & ODM_RTL8721D)
2304
ret = config_phydm_write_txagc_8721d(dm, pwr_idx, path, rate);
2305
#endif
2306
#if (RTL8710C_SUPPORT)
2307
if (dm->support_ic_type & ODM_RTL8710C)
2308
ret = config_phydm_write_txagc_8710c(dm, pwr_idx, path, rate);
2309
#endif
2310
return ret;
2311
}
2312
2313
u8 phydm_api_get_txagc(void *dm_void, enum rf_path path, u8 hw_rate)
2314
{
2315
struct dm_struct *dm = (struct dm_struct *)dm_void;
2316
u8 ret = 0;
2317
2318
#if (RTL8822B_SUPPORT)
2319
if (dm->support_ic_type & ODM_RTL8822B)
2320
ret = config_phydm_read_txagc_8822b(dm, path, hw_rate);
2321
#endif
2322
2323
#if (RTL8197F_SUPPORT)
2324
if (dm->support_ic_type & ODM_RTL8197F)
2325
ret = config_phydm_read_txagc_8197f(dm, path, hw_rate);
2326
#endif
2327
2328
#if (RTL8821C_SUPPORT)
2329
if (dm->support_ic_type & ODM_RTL8821C)
2330
ret = config_phydm_read_txagc_8821c(dm, path, hw_rate);
2331
#endif
2332
2333
#if (RTL8195B_SUPPORT)
2334
if (dm->support_ic_type & ODM_RTL8195B)
2335
ret = config_phydm_read_txagc_8195b(dm, path, hw_rate);
2336
#endif
2337
2338
/*@jj add 20170822*/
2339
#if (RTL8192F_SUPPORT)
2340
if (dm->support_ic_type & ODM_RTL8192F)
2341
ret = config_phydm_read_txagc_8192f(dm, path, hw_rate);
2342
#endif
2343
2344
#if (RTL8198F_SUPPORT)
2345
if (dm->support_ic_type & ODM_RTL8198F) {
2346
if (hw_rate < 0x4) {
2347
ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,
2348
PDM_CCK);
2349
} else {
2350
ret = config_phydm_read_txagc_8198f(dm, path, hw_rate,
2351
PDM_OFDM);
2352
}
2353
}
2354
#endif
2355
2356
#if (RTL8822C_SUPPORT)
2357
if (dm->support_ic_type & ODM_RTL8822C) {
2358
if (hw_rate < 0x4) {
2359
ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,
2360
PDM_CCK);
2361
} else {
2362
ret = config_phydm_read_txagc_8822c(dm, path, hw_rate,
2363
PDM_OFDM);
2364
}
2365
}
2366
#endif
2367
2368
#if (RTL8814B_SUPPORT)
2369
if (dm->support_ic_type & ODM_RTL8814B) {
2370
if (hw_rate < 0x4) {
2371
ret = config_phydm_read_txagc_8814b(dm, path, hw_rate,
2372
PDM_CCK);
2373
} else {
2374
ret = config_phydm_read_txagc_8814b(dm, path, hw_rate,
2375
PDM_OFDM);
2376
}
2377
}
2378
#endif
2379
2380
#if (RTL8812F_SUPPORT)
2381
if (dm->support_ic_type & ODM_RTL8812F) {
2382
if (hw_rate < 0x4) {
2383
ret = config_phydm_read_txagc_8812f(dm, path, hw_rate,
2384
PDM_CCK);
2385
} else {
2386
ret = config_phydm_read_txagc_8812f(dm, path, hw_rate,
2387
PDM_OFDM);
2388
}
2389
}
2390
#endif
2391
2392
#if (RTL8197G_SUPPORT)
2393
if (dm->support_ic_type & ODM_RTL8197G) {
2394
if (hw_rate < 0x4) {
2395
ret = config_phydm_read_txagc_8197g(dm, path,
2396
hw_rate,
2397
PDM_CCK);
2398
} else {
2399
ret = config_phydm_read_txagc_8197g(dm, path,
2400
hw_rate,
2401
PDM_OFDM);
2402
}
2403
}
2404
#endif
2405
2406
#if (RTL8721D_SUPPORT)
2407
if (dm->support_ic_type & ODM_RTL8721D)
2408
ret = config_phydm_read_txagc_8721d(dm, path, hw_rate);
2409
#endif
2410
#if (RTL8710C_SUPPORT)
2411
if (dm->support_ic_type & ODM_RTL8710C)
2412
ret = config_phydm_read_txagc_8710c(dm, path, hw_rate);
2413
#endif
2414
return ret;
2415
}
2416
2417
boolean
2418
phydm_api_switch_bw_channel(void *dm_void, u8 ch, u8 pri_ch,
2419
enum channel_width bw)
2420
{
2421
struct dm_struct *dm = (struct dm_struct *)dm_void;
2422
boolean ret = false;
2423
2424
switch (dm->support_ic_type) {
2425
#if (RTL8822B_SUPPORT)
2426
case ODM_RTL8822B:
2427
ret = config_phydm_switch_channel_bw_8822b(dm, ch, pri_ch, bw);
2428
break;
2429
#endif
2430
2431
#if (RTL8197F_SUPPORT)
2432
case ODM_RTL8197F:
2433
ret = config_phydm_switch_channel_bw_8197f(dm, ch, pri_ch, bw);
2434
break;
2435
#endif
2436
2437
#if (RTL8821C_SUPPORT)
2438
case ODM_RTL8821C:
2439
ret = config_phydm_switch_channel_bw_8821c(dm, ch, pri_ch, bw);
2440
break;
2441
#endif
2442
2443
#if (RTL8192F_SUPPORT)
2444
case ODM_RTL8192F:
2445
ret = config_phydm_switch_channel_bw_8192f(dm, ch, pri_ch, bw);
2446
break;
2447
#endif
2448
2449
#if (RTL8198F_SUPPORT)
2450
case ODM_RTL8198F:
2451
ret = config_phydm_switch_channel_bw_8198f(dm, ch, pri_ch, bw);
2452
break;
2453
#endif
2454
2455
#if (RTL8822C_SUPPORT)
2456
case ODM_RTL8822C:
2457
ret = config_phydm_switch_channel_bw_8822c(dm, ch, pri_ch, bw);
2458
break;
2459
#endif
2460
2461
#if (RTL8814B_SUPPORT)
2462
case ODM_RTL8814B:
2463
ret = config_phydm_switch_channel_bw_8814b(dm, ch, pri_ch, bw);
2464
break;
2465
#endif
2466
2467
#if (RTL8812F_SUPPORT)
2468
case ODM_RTL8812F:
2469
ret = config_phydm_switch_channel_bw_8812f(dm, ch, pri_ch, bw);
2470
break;
2471
#endif
2472
2473
#if (RTL8197G_SUPPORT)
2474
case ODM_RTL8197G:
2475
ret = config_phydm_switch_channel_bw_8197g(dm, ch, pri_ch, bw);
2476
break;
2477
#endif
2478
2479
#if (RTL8721D_SUPPORT)
2480
case ODM_RTL8721D:
2481
ret = config_phydm_switch_channel_bw_8721d(dm, ch, pri_ch, bw);
2482
break;
2483
#endif
2484
#if (RTL8710C_SUPPORT)
2485
case ODM_RTL8710C:
2486
ret = config_phydm_switch_channel_bw_8710c(dm, ch, pri_ch, bw);
2487
break;
2488
#endif
2489
2490
default:
2491
break;
2492
}
2493
return ret;
2494
}
2495
2496
boolean
2497
phydm_api_trx_mode(void *dm_void, enum bb_path tx_path, enum bb_path rx_path,
2498
enum bb_path tx_path_ctrl)
2499
{
2500
struct dm_struct *dm = (struct dm_struct *)dm_void;
2501
boolean ret = false;
2502
boolean is_2tx = false;
2503
2504
if (tx_path_ctrl == BB_PATH_AB)
2505
is_2tx = true;
2506
2507
switch (dm->support_ic_type) {
2508
#if (RTL8822B_SUPPORT)
2509
case ODM_RTL8822B:
2510
ret = config_phydm_trx_mode_8822b(dm, tx_path, rx_path,
2511
tx_path_ctrl);
2512
break;
2513
#endif
2514
2515
#if (RTL8197F_SUPPORT)
2516
case ODM_RTL8197F:
2517
ret = config_phydm_trx_mode_8197f(dm, tx_path, rx_path, is_2tx);
2518
break;
2519
#endif
2520
2521
#if (RTL8192F_SUPPORT)
2522
case ODM_RTL8192F:
2523
ret = config_phydm_trx_mode_8192f(dm, tx_path, rx_path,
2524
tx_path_ctrl);
2525
break;
2526
#endif
2527
2528
#if (RTL8198F_SUPPORT)
2529
case ODM_RTL8198F:
2530
ret = config_phydm_trx_mode_8198f(dm, tx_path, rx_path, is_2tx);
2531
break;
2532
#endif
2533
2534
#if (RTL8814B_SUPPORT)
2535
case ODM_RTL8814B:
2536
ret = config_phydm_trx_mode_8814b(dm, tx_path, rx_path);
2537
break;
2538
#endif
2539
2540
#if (RTL8822C_SUPPORT)
2541
case ODM_RTL8822C:
2542
ret = config_phydm_trx_mode_8822c(dm, tx_path, rx_path,
2543
tx_path_ctrl);
2544
break;
2545
#endif
2546
2547
#if (RTL8812F_SUPPORT)
2548
case ODM_RTL8812F:
2549
ret = config_phydm_trx_mode_8812f(dm, tx_path, rx_path, is_2tx);
2550
break;
2551
#endif
2552
2553
#if (RTL8197G_SUPPORT)
2554
case ODM_RTL8197G:
2555
ret = config_phydm_trx_mode_8197g(dm, tx_path, rx_path, is_2tx);
2556
break;
2557
#endif
2558
2559
#if (RTL8721D_SUPPORT)
2560
case ODM_RTL8721D:
2561
ret = config_phydm_trx_mode_8721d(dm, tx_path, rx_path, is_2tx);
2562
break;
2563
#endif
2564
2565
#if (RTL8710C_SUPPORT)
2566
case ODM_RTL8710C:
2567
ret = config_phydm_trx_mode_8710c(dm, tx_path, rx_path, is_2tx);
2568
break;
2569
#endif
2570
}
2571
return ret;
2572
}
2573
#else
2574
u8 config_phydm_read_txagc_n(void *dm_void, enum rf_path path, u8 hw_rate)
2575
{
2576
struct dm_struct *dm = (struct dm_struct *)dm_void;
2577
u8 read_back_data = INVALID_TXAGC_DATA;
2578
u32 reg_txagc;
2579
u32 reg_mask;
2580
/* This function is for 92E/88E etc... */
2581
/* @Input need to be HW rate index, not driver rate index!!!! */
2582
2583
/* @Error handling */
2584
if (path > RF_PATH_B || hw_rate > ODM_RATEMCS15) {
2585
PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: unsupported path (%d)\n",
2586
__func__, path);
2587
return INVALID_TXAGC_DATA;
2588
}
2589
2590
if (path == RF_PATH_A) {
2591
switch (hw_rate) {
2592
case ODM_RATE1M:
2593
reg_txagc = R_0xe08;
2594
reg_mask = 0x00007f00;
2595
break;
2596
case ODM_RATE2M:
2597
reg_txagc = R_0x86c;
2598
reg_mask = 0x00007f00;
2599
break;
2600
case ODM_RATE5_5M:
2601
reg_txagc = R_0x86c;
2602
reg_mask = 0x007f0000;
2603
break;
2604
case ODM_RATE11M:
2605
reg_txagc = R_0x86c;
2606
reg_mask = 0x7f000000;
2607
break;
2608
2609
case ODM_RATE6M:
2610
reg_txagc = R_0xe00;
2611
reg_mask = 0x0000007f;
2612
break;
2613
case ODM_RATE9M:
2614
reg_txagc = R_0xe00;
2615
reg_mask = 0x00007f00;
2616
break;
2617
case ODM_RATE12M:
2618
reg_txagc = R_0xe00;
2619
reg_mask = 0x007f0000;
2620
break;
2621
case ODM_RATE18M:
2622
reg_txagc = R_0xe00;
2623
reg_mask = 0x7f000000;
2624
break;
2625
case ODM_RATE24M:
2626
reg_txagc = R_0xe04;
2627
reg_mask = 0x0000007f;
2628
break;
2629
case ODM_RATE36M:
2630
reg_txagc = R_0xe04;
2631
reg_mask = 0x00007f00;
2632
break;
2633
case ODM_RATE48M:
2634
reg_txagc = R_0xe04;
2635
reg_mask = 0x007f0000;
2636
break;
2637
case ODM_RATE54M:
2638
reg_txagc = R_0xe04;
2639
reg_mask = 0x7f000000;
2640
break;
2641
2642
case ODM_RATEMCS0:
2643
reg_txagc = R_0xe10;
2644
reg_mask = 0x0000007f;
2645
break;
2646
case ODM_RATEMCS1:
2647
reg_txagc = R_0xe10;
2648
reg_mask = 0x00007f00;
2649
break;
2650
case ODM_RATEMCS2:
2651
reg_txagc = R_0xe10;
2652
reg_mask = 0x007f0000;
2653
break;
2654
case ODM_RATEMCS3:
2655
reg_txagc = R_0xe10;
2656
reg_mask = 0x7f000000;
2657
break;
2658
case ODM_RATEMCS4:
2659
reg_txagc = R_0xe14;
2660
reg_mask = 0x0000007f;
2661
break;
2662
case ODM_RATEMCS5:
2663
reg_txagc = R_0xe14;
2664
reg_mask = 0x00007f00;
2665
break;
2666
case ODM_RATEMCS6:
2667
reg_txagc = R_0xe14;
2668
reg_mask = 0x007f0000;
2669
break;
2670
case ODM_RATEMCS7:
2671
reg_txagc = R_0xe14;
2672
reg_mask = 0x7f000000;
2673
break;
2674
2675
case ODM_RATEMCS8:
2676
reg_txagc = R_0xe18;
2677
reg_mask = 0x0000007f;
2678
break;
2679
case ODM_RATEMCS9:
2680
reg_txagc = R_0xe18;
2681
reg_mask = 0x00007f00;
2682
break;
2683
case ODM_RATEMCS10:
2684
reg_txagc = R_0xe18;
2685
reg_mask = 0x007f0000;
2686
break;
2687
case ODM_RATEMCS11:
2688
reg_txagc = R_0xe18;
2689
reg_mask = 0x7f000000;
2690
break;
2691
case ODM_RATEMCS12:
2692
reg_txagc = R_0xe1c;
2693
reg_mask = 0x0000007f;
2694
break;
2695
case ODM_RATEMCS13:
2696
reg_txagc = R_0xe1c;
2697
reg_mask = 0x00007f00;
2698
break;
2699
case ODM_RATEMCS14:
2700
reg_txagc = R_0xe1c;
2701
reg_mask = 0x007f0000;
2702
break;
2703
case ODM_RATEMCS15:
2704
reg_txagc = R_0xe1c;
2705
reg_mask = 0x7f000000;
2706
break;
2707
2708
default:
2709
PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");
2710
break;
2711
}
2712
} else if (path == RF_PATH_B) {
2713
switch (hw_rate) {
2714
case ODM_RATE1M:
2715
reg_txagc = R_0x838;
2716
reg_mask = 0x00007f00;
2717
break;
2718
case ODM_RATE2M:
2719
reg_txagc = R_0x838;
2720
reg_mask = 0x007f0000;
2721
break;
2722
case ODM_RATE5_5M:
2723
reg_txagc = R_0x838;
2724
reg_mask = 0x7f000000;
2725
break;
2726
case ODM_RATE11M:
2727
reg_txagc = R_0x86c;
2728
reg_mask = 0x0000007f;
2729
break;
2730
2731
case ODM_RATE6M:
2732
reg_txagc = R_0x830;
2733
reg_mask = 0x0000007f;
2734
break;
2735
case ODM_RATE9M:
2736
reg_txagc = R_0x830;
2737
reg_mask = 0x00007f00;
2738
break;
2739
case ODM_RATE12M:
2740
reg_txagc = R_0x830;
2741
reg_mask = 0x007f0000;
2742
break;
2743
case ODM_RATE18M:
2744
reg_txagc = R_0x830;
2745
reg_mask = 0x7f000000;
2746
break;
2747
case ODM_RATE24M:
2748
reg_txagc = R_0x834;
2749
reg_mask = 0x0000007f;
2750
break;
2751
case ODM_RATE36M:
2752
reg_txagc = R_0x834;
2753
reg_mask = 0x00007f00;
2754
break;
2755
case ODM_RATE48M:
2756
reg_txagc = R_0x834;
2757
reg_mask = 0x007f0000;
2758
break;
2759
case ODM_RATE54M:
2760
reg_txagc = R_0x834;
2761
reg_mask = 0x7f000000;
2762
break;
2763
2764
case ODM_RATEMCS0:
2765
reg_txagc = R_0x83c;
2766
reg_mask = 0x0000007f;
2767
break;
2768
case ODM_RATEMCS1:
2769
reg_txagc = R_0x83c;
2770
reg_mask = 0x00007f00;
2771
break;
2772
case ODM_RATEMCS2:
2773
reg_txagc = R_0x83c;
2774
reg_mask = 0x007f0000;
2775
break;
2776
case ODM_RATEMCS3:
2777
reg_txagc = R_0x83c;
2778
reg_mask = 0x7f000000;
2779
break;
2780
case ODM_RATEMCS4:
2781
reg_txagc = R_0x848;
2782
reg_mask = 0x0000007f;
2783
break;
2784
case ODM_RATEMCS5:
2785
reg_txagc = R_0x848;
2786
reg_mask = 0x00007f00;
2787
break;
2788
case ODM_RATEMCS6:
2789
reg_txagc = R_0x848;
2790
reg_mask = 0x007f0000;
2791
break;
2792
case ODM_RATEMCS7:
2793
reg_txagc = R_0x848;
2794
reg_mask = 0x7f000000;
2795
break;
2796
2797
case ODM_RATEMCS8:
2798
reg_txagc = R_0x84c;
2799
reg_mask = 0x0000007f;
2800
break;
2801
case ODM_RATEMCS9:
2802
reg_txagc = R_0x84c;
2803
reg_mask = 0x00007f00;
2804
break;
2805
case ODM_RATEMCS10:
2806
reg_txagc = R_0x84c;
2807
reg_mask = 0x007f0000;
2808
break;
2809
case ODM_RATEMCS11:
2810
reg_txagc = R_0x84c;
2811
reg_mask = 0x7f000000;
2812
break;
2813
case ODM_RATEMCS12:
2814
reg_txagc = R_0x868;
2815
reg_mask = 0x0000007f;
2816
break;
2817
case ODM_RATEMCS13:
2818
reg_txagc = R_0x868;
2819
reg_mask = 0x00007f00;
2820
break;
2821
case ODM_RATEMCS14:
2822
reg_txagc = R_0x868;
2823
reg_mask = 0x007f0000;
2824
break;
2825
case ODM_RATEMCS15:
2826
reg_txagc = R_0x868;
2827
reg_mask = 0x7f000000;
2828
break;
2829
2830
default:
2831
PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid HWrate!\n");
2832
break;
2833
}
2834
} else {
2835
PHYDM_DBG(dm, ODM_PHY_CONFIG, "Invalid RF path!!\n");
2836
}
2837
read_back_data = (u8)odm_get_bb_reg(dm, reg_txagc, reg_mask);
2838
PHYDM_DBG(dm, ODM_PHY_CONFIG, "%s: path-%d rate index 0x%x = 0x%x\n",
2839
__func__, path, hw_rate, read_back_data);
2840
return read_back_data;
2841
}
2842
#endif
2843
2844
#ifdef CONFIG_MCC_DM
2845
#ifdef DYN_ANT_WEIGHTING_SUPPORT
2846
void phydm_set_weighting_cmn(struct dm_struct *dm)
2847
{
2848
PHYDM_DBG(dm, DBG_COMP_MCC, "%s\n", __func__);
2849
odm_set_bb_reg(dm, 0xc04, (BIT(18) | BIT(21)), 0x0);
2850
odm_set_bb_reg(dm, 0xe04, (BIT(18) | BIT(21)), 0x0);
2851
}
2852
2853
void phydm_set_weighting_mcc(u8 b_equal_weighting, void *dm_void, u8 port)
2854
{
2855
/*u8 reg_8;*/
2856
struct dm_struct *dm = (struct dm_struct *)dm_void;
2857
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2858
u8 val_0x98e, val_0x98f, val_0x81b;
2859
u32 temp_reg;
2860
2861
PHYDM_DBG(dm, DBG_COMP_MCC, "ant_weighting_mcc, port = %d\n", port);
2862
if (b_equal_weighting) {
2863
temp_reg = odm_get_bb_reg(dm, 0x98c, 0x00ff0000);
2864
val_0x98e = (u8)(temp_reg >> 16) & 0xc0;
2865
temp_reg = odm_get_bb_reg(dm, 0x98c, 0xff000000);
2866
val_0x98f = (u8)(temp_reg >> 24) & 0x7f;
2867
temp_reg = odm_get_bb_reg(dm, 0x818, 0xff000000);
2868
val_0x81b = (u8)(temp_reg >> 24) & 0xfd;
2869
PHYDM_DBG(dm, DBG_COMP_MCC, "Equal weighting ,rssi_min = %d\n",
2870
dm->rssi_min);
2871
/*equal weighting*/
2872
} else {
2873
val_0x98e = 0x44;
2874
val_0x98f = 0x43;
2875
temp_reg = odm_get_bb_reg(dm, 0x818, 0xff000000);
2876
val_0x81b = (u8)(temp_reg >> 24) | BIT(2);
2877
PHYDM_DBG(dm, DBG_COMP_MCC, "AGC weighting ,rssi_min = %d\n",
2878
dm->rssi_min);
2879
/*fix sec_min_wgt = 1/2*/
2880
}
2881
mcc_dm->mcc_reg_id[2] = 0x2;
2882
mcc_dm->mcc_dm_reg[2] = 0x98e;
2883
mcc_dm->mcc_dm_val[2][port] = val_0x98e;
2884
2885
mcc_dm->mcc_reg_id[3] = 0x3;
2886
mcc_dm->mcc_dm_reg[3] = 0x98f;
2887
mcc_dm->mcc_dm_val[3][port] = val_0x98f;
2888
2889
mcc_dm->mcc_reg_id[4] = 0x4;
2890
mcc_dm->mcc_dm_reg[4] = 0x81b;
2891
mcc_dm->mcc_dm_val[4][port] = val_0x81b;
2892
}
2893
2894
void phydm_dyn_ant_dec_mcc(u8 port, u8 rssi_in, void *dm_void)
2895
{
2896
struct dm_struct *dm = (struct dm_struct *)dm_void;
2897
u8 rssi_l2h = 43, rssi_h2l = 37;
2898
2899
if (rssi_in == 0xff)
2900
phydm_set_weighting_mcc(FALSE, dm, port);
2901
else if (rssi_in >= rssi_l2h)
2902
phydm_set_weighting_mcc(TRUE, dm, port);
2903
else if (rssi_in <= rssi_h2l)
2904
phydm_set_weighting_mcc(FALSE, dm, port);
2905
}
2906
2907
void phydm_dynamic_ant_weighting_mcc_8822b(void *dm_void)
2908
{
2909
struct dm_struct *dm = (struct dm_struct *)dm_void;
2910
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2911
u8 i;
2912
2913
phydm_set_weighting_cmn(dm);
2914
for (i = 0; i <= 1; i++)
2915
phydm_dyn_ant_dec_mcc(i, mcc_dm->mcc_rssi[i], dm);
2916
}
2917
#endif /*#ifdef DYN_ANT_WEIGHTING_SUPPORT*/
2918
2919
void phydm_mcc_init(void *dm_void)
2920
{
2921
struct dm_struct *dm = (struct dm_struct *)dm_void;
2922
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2923
u8 i;
2924
2925
/*PHYDM_DBG(dm, DBG_COMP_MCC, ("MCC init\n"));*/
2926
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC init\n");
2927
for (i = 0; i < MCC_DM_REG_NUM; i++) {
2928
mcc_dm->mcc_reg_id[i] = 0xff;
2929
mcc_dm->mcc_dm_reg[i] = 0;
2930
mcc_dm->mcc_dm_val[i][0] = 0;
2931
mcc_dm->mcc_dm_val[i][1] = 0;
2932
}
2933
for (i = 0; i < NUM_STA; i++) {
2934
mcc_dm->sta_macid[0][i] = 0xff;
2935
mcc_dm->sta_macid[1][i] = 0xff;
2936
}
2937
/* Function init */
2938
dm->is_stop_dym_ant_weighting = 0;
2939
}
2940
2941
u8 phydm_check(void *dm_void)
2942
{
2943
struct dm_struct *dm = (struct dm_struct *)dm_void;
2944
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2945
struct cmn_sta_info *p_entry = NULL;
2946
u8 shift = 0;
2947
u8 i = 0;
2948
u8 j = 0;
2949
u8 rssi_min[2] = {0xff, 0xff};
2950
u8 sta_num = 8;
2951
u8 mcc_macid = 0;
2952
2953
for (i = 0; i <= 1; i++) {
2954
for (j = 0; j < sta_num; j++) {
2955
if (mcc_dm->sta_macid[i][j] != 0xff) {
2956
mcc_macid = mcc_dm->sta_macid[i][j];
2957
p_entry = dm->phydm_sta_info[mcc_macid];
2958
if (!p_entry) {
2959
PHYDM_DBG(dm, DBG_COMP_MCC,
2960
"PEntry NULL(mac=%d)\n",
2961
mcc_dm->sta_macid[i][j]);
2962
return _FAIL;
2963
}
2964
PHYDM_DBG(dm, DBG_COMP_MCC,
2965
"undec_smoothed_pwdb=%d\n",
2966
p_entry->rssi_stat.rssi);
2967
if (p_entry->rssi_stat.rssi < rssi_min[i])
2968
rssi_min[i] = p_entry->rssi_stat.rssi;
2969
}
2970
}
2971
}
2972
mcc_dm->mcc_rssi[0] = (u8)rssi_min[0];
2973
mcc_dm->mcc_rssi[1] = (u8)rssi_min[1];
2974
return _SUCCESS;
2975
}
2976
2977
void phydm_mcc_h2ccmd_rst(void *dm_void)
2978
{
2979
struct dm_struct *dm = (struct dm_struct *)dm_void;
2980
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2981
u8 i;
2982
u8 regid;
2983
u8 h2c_mcc[H2C_MAX_LENGTH];
2984
2985
/* RST MCC */
2986
for (i = 0; i < H2C_MAX_LENGTH; i++)
2987
h2c_mcc[i] = 0xff;
2988
h2c_mcc[0] = 0x00;
2989
odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH, h2c_mcc);
2990
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC H2C RST\n");
2991
}
2992
2993
void phydm_mcc_h2ccmd(void *dm_void)
2994
{
2995
struct dm_struct *dm = (struct dm_struct *)dm_void;
2996
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2997
u8 i;
2998
u8 regid;
2999
u8 h2c_mcc[H2C_MAX_LENGTH];
3000
3001
if (mcc_dm->mcc_rf_ch[0] == 0xff && mcc_dm->mcc_rf_ch[1] == 0xff) {
3002
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC channel Error\n");
3003
return;
3004
}
3005
/* Set Channel number */
3006
for (i = 0; i < H2C_MAX_LENGTH; i++)
3007
h2c_mcc[i] = 0xff;
3008
h2c_mcc[0] = 0xe0;
3009
h2c_mcc[1] = (u8)(mcc_dm->mcc_rf_ch[0]);
3010
h2c_mcc[2] = (u8)(mcc_dm->mcc_rf_ch[0] >> 8);
3011
h2c_mcc[3] = (u8)(mcc_dm->mcc_rf_ch[1]);
3012
h2c_mcc[4] = (u8)(mcc_dm->mcc_rf_ch[1] >> 8);
3013
h2c_mcc[5] = 0xff;
3014
h2c_mcc[6] = 0xff;
3015
odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH, h2c_mcc);
3016
PHYDM_DBG(dm, DBG_COMP_MCC,
3017
"MCC H2C SetCH: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3018
h2c_mcc[0], h2c_mcc[1], h2c_mcc[2], h2c_mcc[3],
3019
h2c_mcc[4], h2c_mcc[5], h2c_mcc[6]);
3020
3021
/* Set Reg and value*/
3022
for (i = 0; i < H2C_MAX_LENGTH; i++)
3023
h2c_mcc[i] = 0xff;
3024
3025
for (i = 0; i < MCC_DM_REG_NUM; i++) {
3026
regid = mcc_dm->mcc_reg_id[i];
3027
if (regid != 0xff) {
3028
h2c_mcc[0] = 0xa0 | (regid & 0x1f);
3029
h2c_mcc[1] = (u8)(mcc_dm->mcc_dm_reg[i]);
3030
h2c_mcc[2] = (u8)(mcc_dm->mcc_dm_reg[i] >> 8);
3031
h2c_mcc[3] = mcc_dm->mcc_dm_val[i][0];
3032
h2c_mcc[4] = mcc_dm->mcc_dm_val[i][1];
3033
h2c_mcc[5] = 0xff;
3034
h2c_mcc[6] = 0xff;
3035
odm_fill_h2c_cmd(dm, PHYDM_H2C_MCC, H2C_MAX_LENGTH,
3036
h2c_mcc);
3037
PHYDM_DBG(dm, DBG_COMP_MCC,
3038
"MCC H2C: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
3039
h2c_mcc[0], h2c_mcc[1], h2c_mcc[2],
3040
h2c_mcc[3], h2c_mcc[4],
3041
h2c_mcc[5], h2c_mcc[6]);
3042
}
3043
}
3044
}
3045
3046
void phydm_mcc_ctrl(void *dm_void)
3047
{
3048
struct dm_struct *dm = (struct dm_struct *)dm_void;
3049
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
3050
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
3051
3052
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC status: %x\n", mcc_dm->mcc_status);
3053
/*MCC stage no change*/
3054
if (mcc_dm->mcc_status == mcc_dm->mcc_pre_status)
3055
return;
3056
/*Not in MCC stage*/
3057
if (mcc_dm->mcc_status == 0) {
3058
/* Enable normal Ant-weighting */
3059
dm->is_stop_dym_ant_weighting = 0;
3060
/* Enable normal DIG */
3061
odm_pause_dig(dm, PHYDM_RESUME, PHYDM_PAUSE_LEVEL_1, 0x20);
3062
} else {
3063
/* Disable normal Ant-weighting */
3064
dm->is_stop_dym_ant_weighting = 1;
3065
/* Enable normal DIG */
3066
odm_pause_dig(dm, PHYDM_PAUSE_NO_SET, PHYDM_PAUSE_LEVEL_1,
3067
0x20);
3068
}
3069
if (mcc_dm->mcc_status == 0 && mcc_dm->mcc_pre_status != 0)
3070
phydm_mcc_init(dm);
3071
mcc_dm->mcc_pre_status = mcc_dm->mcc_status;
3072
}
3073
3074
void phydm_fill_mcccmd(void *dm_void, u8 regid, u16 reg_add,
3075
u8 val0, u8 val1)
3076
{
3077
struct dm_struct *dm = (struct dm_struct *)dm_void;
3078
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
3079
3080
mcc_dm->mcc_reg_id[regid] = regid;
3081
mcc_dm->mcc_dm_reg[regid] = reg_add;
3082
mcc_dm->mcc_dm_val[regid][0] = val0;
3083
mcc_dm->mcc_dm_val[regid][1] = val1;
3084
}
3085
3086
void phydm_mcc_switch(void *dm_void)
3087
{
3088
struct dm_struct *dm = (struct dm_struct *)dm_void;
3089
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
3090
s8 ret;
3091
3092
phydm_mcc_ctrl(dm);
3093
if (mcc_dm->mcc_status == 0) {/*Not in MCC stage*/
3094
phydm_mcc_h2ccmd_rst(dm);
3095
return;
3096
}
3097
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC switch\n");
3098
ret = phydm_check(dm);
3099
if (ret == _FAIL) {
3100
PHYDM_DBG(dm, DBG_COMP_MCC, "MCC check fail\n");
3101
return;
3102
}
3103
/* Set IGI*/
3104
phydm_mcc_igi_cal(dm);
3105
3106
/* Set Antenna Gain*/
3107
#if (RTL8822B_SUPPORT == 1)
3108
phydm_dynamic_ant_weighting_mcc_8822b(dm);
3109
#endif
3110
/* Set H2C Cmd*/
3111
phydm_mcc_h2ccmd(dm);
3112
}
3113
#endif
3114
3115
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
3116
void phydm_normal_driver_rx_sniffer(
3117
struct dm_struct *dm,
3118
u8 *desc,
3119
PRT_RFD_STATUS rt_rfd_status,
3120
u8 *drv_info,
3121
u8 phy_status)
3122
{
3123
#if (defined(CONFIG_PHYDM_RX_SNIFFER_PARSING))
3124
u32 *msg;
3125
u16 seq_num;
3126
3127
if (rt_rfd_status->packet_report_type != NORMAL_RX)
3128
return;
3129
3130
if (!dm->is_linked) {
3131
if (rt_rfd_status->is_hw_error)
3132
return;
3133
}
3134
3135
if (phy_status == true) {
3136
if (dm->rx_pkt_type == type_block_ack ||
3137
dm->rx_pkt_type == type_rts || dm->rx_pkt_type == type_cts)
3138
seq_num = 0;
3139
else
3140
seq_num = rt_rfd_status->seq_num;
3141
3142
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
3143
"%04d , %01s, rate=0x%02x, L=%04d , %s , %s",
3144
seq_num,
3145
/*rt_rfd_status->mac_id,*/
3146
(rt_rfd_status->is_crc ? "C" :
3147
rt_rfd_status->is_ampdu ? "A" : "_"),
3148
rt_rfd_status->data_rate,
3149
rt_rfd_status->length,
3150
((rt_rfd_status->band_width == 0) ? "20M" :
3151
((rt_rfd_status->band_width == 1) ? "40M" : "80M")),
3152
(rt_rfd_status->is_ldpc ? "LDP" : "BCC"));
3153
3154
if (dm->rx_pkt_type == type_asoc_req)
3155
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_REQ");
3156
else if (dm->rx_pkt_type == type_asoc_rsp)
3157
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "AS_RSP");
3158
else if (dm->rx_pkt_type == type_probe_req)
3159
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_REQ");
3160
else if (dm->rx_pkt_type == type_probe_rsp)
3161
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "PR_RSP");
3162
else if (dm->rx_pkt_type == type_deauth)
3163
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "DEAUTH");
3164
else if (dm->rx_pkt_type == type_beacon)
3165
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BEACON");
3166
else if (dm->rx_pkt_type == type_block_ack_req)
3167
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "BA_REQ");
3168
else if (dm->rx_pkt_type == type_rts)
3169
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__RTS_");
3170
else if (dm->rx_pkt_type == type_cts)
3171
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__CTS_");
3172
else if (dm->rx_pkt_type == type_ack)
3173
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__ACK_");
3174
else if (dm->rx_pkt_type == type_block_ack)
3175
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "__BA__");
3176
else if (dm->rx_pkt_type == type_data)
3177
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "_DATA_");
3178
else if (dm->rx_pkt_type == type_data_ack)
3179
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "Data_Ack");
3180
else if (dm->rx_pkt_type == type_qos_data)
3181
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [%s]", "QoS_Data");
3182
else
3183
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [0x%x]",
3184
dm->rx_pkt_type);
3185
3186
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER, " , [RSSI=%d,%d,%d,%d ]",
3187
dm->rssi_a,
3188
dm->rssi_b,
3189
dm->rssi_c,
3190
dm->rssi_d);
3191
3192
msg = (u32 *)drv_info;
3193
3194
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
3195
" , P-STS[28:0]=%08x-%08x-%08x-%08x-%08x-%08x-%08x\n",
3196
msg[6], msg[5], msg[4], msg[3],
3197
msg[2], msg[1], msg[1]);
3198
} else {
3199
PHYDM_DBG_F(dm, ODM_COMP_SNIFFER,
3200
"%04d , %01s, rate=0x%02x, L=%04d , %s , %s\n",
3201
rt_rfd_status->seq_num,
3202
/*rt_rfd_status->mac_id,*/
3203
(rt_rfd_status->is_crc ? "C" :
3204
(rt_rfd_status->is_ampdu) ? "A" : "_"),
3205
rt_rfd_status->data_rate,
3206
rt_rfd_status->length,
3207
((rt_rfd_status->band_width == 0) ? "20M" :
3208
((rt_rfd_status->band_width == 1) ? "40M" : "80M")),
3209
(rt_rfd_status->is_ldpc ? "LDP" : "BCC"));
3210
}
3211
3212
#endif
3213
}
3214
3215
#endif
3216
3217