Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_dig.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
#include "mp_precomp.h"
31
#include "phydm_precomp.h"
32
33
#ifdef CFG_DIG_DAMPING_CHK
34
void phydm_dig_recorder_reset(void *dm_void)
35
{
36
struct dm_struct *dm = (struct dm_struct *)dm_void;
37
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
38
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
39
40
PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
41
42
odm_memory_set(dm, &dig_rc->igi_bitmap, 0,
43
sizeof(struct phydm_dig_recorder_strcut));
44
}
45
46
void phydm_dig_recorder(void *dm_void, u8 igi_curr,
47
u32 fa_cnt)
48
{
49
struct dm_struct *dm = (struct dm_struct *)dm_void;
50
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
51
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
52
u8 igi_pre = dig_rc->igi_history[0];
53
u8 igi_up = 0;
54
55
if (!dm->is_linked)
56
return;
57
58
PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
59
60
if (dm->first_connect) {
61
phydm_dig_recorder_reset(dm);
62
dig_rc->igi_history[0] = igi_curr;
63
dig_rc->fa_history[0] = fa_cnt;
64
return;
65
}
66
67
if (igi_curr % 2)
68
igi_curr--;
69
70
igi_pre = dig_rc->igi_history[0];
71
igi_up = (igi_curr > igi_pre) ? 1 : 0;
72
dig_rc->igi_bitmap = ((dig_rc->igi_bitmap << 1) & 0xfe) | igi_up;
73
74
dig_rc->igi_history[3] = dig_rc->igi_history[2];
75
dig_rc->igi_history[2] = dig_rc->igi_history[1];
76
dig_rc->igi_history[1] = dig_rc->igi_history[0];
77
dig_rc->igi_history[0] = igi_curr;
78
79
dig_rc->fa_history[3] = dig_rc->fa_history[2];
80
dig_rc->fa_history[2] = dig_rc->fa_history[1];
81
dig_rc->fa_history[1] = dig_rc->fa_history[0];
82
dig_rc->fa_history[0] = fa_cnt;
83
84
PHYDM_DBG(dm, DBG_DIG, "igi_history[3:0] = {0x%x, 0x%x, 0x%x, 0x%x}\n",
85
dig_rc->igi_history[3], dig_rc->igi_history[2],
86
dig_rc->igi_history[1], dig_rc->igi_history[0]);
87
PHYDM_DBG(dm, DBG_DIG, "fa_history[3:0] = {%d, %d, %d, %d}\n",
88
dig_rc->fa_history[3], dig_rc->fa_history[2],
89
dig_rc->fa_history[1], dig_rc->fa_history[0]);
90
PHYDM_DBG(dm, DBG_DIG, "igi_bitmap = {%d, %d, %d, %d} = 0x%x\n",
91
(u8)((dig_rc->igi_bitmap & BIT(3)) >> 3),
92
(u8)((dig_rc->igi_bitmap & BIT(2)) >> 2),
93
(u8)((dig_rc->igi_bitmap & BIT(1)) >> 1),
94
(u8)(dig_rc->igi_bitmap & BIT(0)),
95
dig_rc->igi_bitmap);
96
}
97
98
void phydm_dig_damping_chk(void *dm_void)
99
{
100
struct dm_struct *dm = (struct dm_struct *)dm_void;
101
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
102
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
103
u8 igi_bitmap_4bit = dig_rc->igi_bitmap & 0xf;
104
u8 diff1 = 0, diff2 = 0;
105
u32 fa_low_th = dig_t->fa_th[0];
106
u32 fa_high_th = dig_t->fa_th[1];
107
u32 fa_high_th2 = dig_t->fa_th[2];
108
u8 fa_pattern_match = 0;
109
u32 time_tmp = 0;
110
111
if (!dm->is_linked)
112
return;
113
114
PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
115
116
/*@== Release Damping ================================================*/
117
if (dig_rc->damping_limit_en) {
118
PHYDM_DBG(dm, DBG_DIG,
119
"[Damping Limit!] limit_time=%d, phydm_sys_up_time=%d\n",
120
dig_rc->limit_time, dm->phydm_sys_up_time);
121
122
time_tmp = dig_rc->limit_time + DIG_LIMIT_PERIOD;
123
124
if (DIFF_2(dm->rssi_min, dig_rc->limit_rssi) > 3 ||
125
time_tmp < dm->phydm_sys_up_time) {
126
dig_rc->damping_limit_en = 0;
127
PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, limit_rssi=%d\n",
128
dm->rssi_min, dig_rc->limit_rssi);
129
}
130
return;
131
}
132
133
/*@== Damping Pattern Check===========================================*/
134
PHYDM_DBG(dm, DBG_DIG, "fa_th{H, L}= {%d,%d}\n", fa_high_th, fa_low_th);
135
136
switch (igi_bitmap_4bit) {
137
case 0x5:
138
/*@ 4b'0101
139
* IGI:[3]down(0x24)->[2]up(0x26)->[1]down(0x24)->[0]up(0x26)->[new](Lock @ 0x26)
140
* FA: [3] >high1 ->[2] <low ->[1] >high1 ->[0] <low ->[new] <low
141
*
142
* IGI:[3]down(0x24)->[2]up(0x28)->[1]down(0x24)->[0]up(0x28)->[new](Lock @ 0x28)
143
* FA: [3] >high2 ->[2] <low ->[1] >high2 ->[0] <low ->[new] <low
144
*/
145
if (dig_rc->igi_history[0] > dig_rc->igi_history[1])
146
diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];
147
148
if (dig_rc->igi_history[2] > dig_rc->igi_history[3])
149
diff2 = dig_rc->igi_history[2] - dig_rc->igi_history[3];
150
151
if (dig_rc->fa_history[0] < fa_low_th &&
152
dig_rc->fa_history[1] > fa_high_th &&
153
dig_rc->fa_history[2] < fa_low_th &&
154
dig_rc->fa_history[3] > fa_high_th) {
155
/*@Check each fa element*/
156
fa_pattern_match = 1;
157
}
158
break;
159
case 0x9:
160
/*@ 4b'1001
161
* IGI:[3]up(0x28)->[2]down(0x26)->[1]down(0x24)->[0]up(0x28)->[new](Lock @ 0x28)
162
* FA: [3] <low ->[2] <low ->[1] >high2 ->[0] <low ->[new] <low
163
*/
164
if (dig_rc->igi_history[0] > dig_rc->igi_history[1])
165
diff1 = dig_rc->igi_history[0] - dig_rc->igi_history[1];
166
167
if (dig_rc->igi_history[2] < dig_rc->igi_history[3])
168
diff2 = dig_rc->igi_history[3] - dig_rc->igi_history[2];
169
170
if (dig_rc->fa_history[0] < fa_low_th &&
171
dig_rc->fa_history[1] > fa_high_th2 &&
172
dig_rc->fa_history[2] < fa_low_th &&
173
dig_rc->fa_history[3] < fa_low_th) {
174
/*@Check each fa element*/
175
fa_pattern_match = 1;
176
}
177
break;
178
default:
179
break;
180
}
181
182
if (diff1 >= 2 && diff2 >= 2 && fa_pattern_match) {
183
dig_rc->damping_limit_en = 1;
184
dig_rc->damping_limit_val = dig_rc->igi_history[0];
185
dig_rc->limit_time = dm->phydm_sys_up_time;
186
dig_rc->limit_rssi = dm->rssi_min;
187
188
PHYDM_DBG(dm, DBG_DIG,
189
"[Start damping_limit!] IGI_dyn_min=0x%x, limit_time=%d, limit_rssi=%d\n",
190
dig_rc->damping_limit_val,
191
dig_rc->limit_time, dig_rc->limit_rssi);
192
}
193
194
PHYDM_DBG(dm, DBG_DIG, "damping_limit=%d\n", dig_rc->damping_limit_en);
195
}
196
#endif
197
198
boolean
199
phydm_dig_go_up_check(void *dm_void)
200
{
201
struct dm_struct *dm = (struct dm_struct *)dm_void;
202
struct ccx_info *ccx_info = &dm->dm_ccx_info;
203
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
204
u8 cur_ig_value = dig_t->cur_ig_value;
205
u8 max_cover_bond = 0;
206
u8 rx_gain_range_max = dig_t->rx_gain_range_max;
207
u8 i = 0, j = 0;
208
u8 total_nhm_cnt = ccx_info->nhm_rpt_sum;
209
u32 dig_cnt = 0;
210
u32 over_dig_cnt = 0;
211
boolean ret = true;
212
213
if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE)
214
return ret;
215
216
max_cover_bond = DIG_MAX_BALANCE_MODE - dig_t->upcheck_init_val;
217
218
if (cur_ig_value < max_cover_bond - 6)
219
dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_0;
220
else if (cur_ig_value <= DIG_MAX_BALANCE_MODE)
221
dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_1;
222
else /* @cur_ig_value > DM_DIG_MAX_AP, foolproof */
223
dig_t->go_up_chk_lv = DIG_GOUPCHECK_LEVEL_2;
224
225
PHYDM_DBG(dm, DBG_DIG, "check_lv = %d, max_cover_bond = 0x%x\n",
226
dig_t->go_up_chk_lv, max_cover_bond);
227
228
if (total_nhm_cnt == 0)
229
return true;
230
231
if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_0) {
232
for (i = 3; i <= 11; i++)
233
dig_cnt += ccx_info->nhm_result[i];
234
235
if ((dig_t->lv0_ratio_reciprocal * dig_cnt) >= total_nhm_cnt)
236
ret = true;
237
else
238
ret = false;
239
240
} else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_1) {
241
/* search index */
242
for (i = 0; i <= 10; i++) {
243
if ((max_cover_bond * 2) == ccx_info->nhm_th[i]) {
244
for (j = (i + 1); j <= 11; j++)
245
over_dig_cnt += ccx_info->nhm_result[j];
246
break;
247
}
248
}
249
250
if (dig_t->lv1_ratio_reciprocal * over_dig_cnt < total_nhm_cnt)
251
ret = true;
252
else
253
ret = false;
254
255
if (!ret) {
256
/* update dig_t->rx_gain_range_max */
257
if (rx_gain_range_max + 6 >= max_cover_bond)
258
dig_t->rx_gain_range_max = max_cover_bond - 6;
259
else
260
dig_t->rx_gain_range_max = rx_gain_range_max;
261
262
PHYDM_DBG(dm, DBG_DIG,
263
"Noise pwr over DIG can filter, lock rx_gain_range_max to 0x%x\n",
264
dig_t->rx_gain_range_max);
265
}
266
} else if (dig_t->go_up_chk_lv == DIG_GOUPCHECK_LEVEL_2) {
267
/* @cur_ig_value > DM_DIG_MAX_AP, foolproof */
268
ret = true;
269
}
270
271
return ret;
272
}
273
274
void phydm_fa_threshold_check(void *dm_void, boolean is_dfs_band)
275
{
276
struct dm_struct *dm = (struct dm_struct *)dm_void;
277
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
278
279
if (dig_t->is_dbg_fa_th) {
280
PHYDM_DBG(dm, DBG_DIG, "Manual Fix FA_th\n");
281
} else if (dm->is_linked) {
282
if (dm->rssi_min < 20) { /*@[PHYDM-252]*/
283
dig_t->fa_th[0] = 500;
284
dig_t->fa_th[1] = 750;
285
dig_t->fa_th[2] = 1000;
286
} else if (((dm->rx_tp >> 2) > dm->tx_tp) && /*Test RX TP*/
287
(dm->rx_tp < 10) && (dm->rx_tp > 1)) { /*TP=1~10Mb*/
288
dig_t->fa_th[0] = 125;
289
dig_t->fa_th[1] = 250;
290
dig_t->fa_th[2] = 500;
291
} else {
292
dig_t->fa_th[0] = 250;
293
dig_t->fa_th[1] = 500;
294
dig_t->fa_th[2] = 750;
295
}
296
} else {
297
if (is_dfs_band) { /* @For DFS band and no link */
298
299
dig_t->fa_th[0] = 250;
300
dig_t->fa_th[1] = 1000;
301
dig_t->fa_th[2] = 2000;
302
} else {
303
dig_t->fa_th[0] = 2000;
304
dig_t->fa_th[1] = 4000;
305
dig_t->fa_th[2] = 5000;
306
}
307
}
308
309
PHYDM_DBG(dm, DBG_DIG, "FA_th={%d,%d,%d}\n", dig_t->fa_th[0],
310
dig_t->fa_th[1], dig_t->fa_th[2]);
311
}
312
313
void phydm_set_big_jump_step(void *dm_void, u8 curr_igi)
314
{
315
#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
316
struct dm_struct *dm = (struct dm_struct *)dm_void;
317
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
318
u8 step1[8] = {24, 30, 40, 50, 60, 70, 80, 90};
319
u8 big_jump_lmt = dig_t->big_jump_lmt[dig_t->agc_table_idx];
320
u8 i;
321
322
if (dig_t->enable_adjust_big_jump == 0)
323
return;
324
325
for (i = 0; i <= dig_t->big_jump_step1; i++) {
326
if ((curr_igi + step1[i]) > big_jump_lmt) {
327
if (i != 0)
328
i = i - 1;
329
break;
330
} else if (i == dig_t->big_jump_step1) {
331
break;
332
}
333
}
334
if (dm->support_ic_type & ODM_RTL8822B)
335
odm_set_bb_reg(dm, R_0x8c8, 0xe, i);
336
else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))
337
odm_set_bb_reg(dm, ODM_REG_BB_AGC_SET_2_11N, 0xe, i);
338
339
PHYDM_DBG(dm, DBG_DIG, "Bigjump = %d (ori = 0x%x), LMT=0x%x\n", i,
340
dig_t->big_jump_step1, big_jump_lmt);
341
#endif
342
}
343
344
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
345
void phydm_write_dig_reg_jgr3(void *dm_void, u8 igi)
346
{
347
struct dm_struct *dm = (struct dm_struct *)dm_void;
348
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
349
350
PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
351
352
/* Set IGI value */
353
if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
354
return;
355
356
odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC, igi);
357
358
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
359
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)
360
odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3, igi);
361
#endif
362
363
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
364
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
365
odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3, igi);
366
odm_set_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3, igi);
367
}
368
#endif
369
}
370
371
u8 phydm_get_igi_reg_val_jgr3(void *dm_void, enum bb_path path)
372
{
373
struct dm_struct *dm = (struct dm_struct *)dm_void;
374
u32 val = 0;
375
376
PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
377
378
/* Set IGI value */
379
if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
380
return (u8)val;
381
382
if (path == BB_PATH_A)
383
val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_11AC);
384
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
385
else if (path == BB_PATH_B)
386
val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_B_11AC3);
387
#endif
388
389
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
390
else if (path == BB_PATH_C)
391
val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_C_11AC3);
392
#endif
393
394
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
395
else if (path == BB_PATH_D)
396
val = odm_get_bb_reg(dm, R_0x1d70, ODM_BIT_IGI_D_11AC3);
397
#endif
398
return (u8)val;
399
}
400
401
void phydm_fa_cnt_statistics_jgr3(void *dm_void)
402
{
403
struct dm_struct *dm = (struct dm_struct *)dm_void;
404
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
405
u32 ret_value = 0;
406
u32 cck_enable = 0;
407
u16 ofdm_tx_counter = 0;
408
u16 cck_tx_counter = 0;
409
410
if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))
411
return;
412
413
ofdm_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de0, MASKLWORD);
414
cck_tx_counter = (u16)odm_get_bb_reg(dm, R_0x2de4, MASKLWORD);
415
416
ret_value = odm_get_bb_reg(dm, R_0x2d20, MASKDWORD);
417
fa_t->cnt_fast_fsync = ret_value & 0xffff;
418
fa_t->cnt_sb_search_fail = (ret_value & 0xffff0000) >> 16;
419
420
ret_value = odm_get_bb_reg(dm, R_0x2d04, MASKDWORD);
421
fa_t->cnt_parity_fail = (ret_value & 0xffff0000) >> 16;
422
423
ret_value = odm_get_bb_reg(dm, R_0x2d08, MASKDWORD);
424
fa_t->cnt_rate_illegal = ret_value & 0xffff;
425
fa_t->cnt_crc8_fail = (ret_value & 0xffff0000) >> 16;
426
427
ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);
428
fa_t->cnt_mcs_fail = ret_value & 0xffff;
429
430
/* read CCK CRC32 counter */
431
ret_value = odm_get_bb_reg(dm, R_0x2c04, MASKDWORD);
432
fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;
433
fa_t->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;
434
435
/* read OFDM CRC32 counter */
436
ret_value = odm_get_bb_reg(dm, R_0x2c14, MASKDWORD);
437
fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;
438
fa_t->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;
439
440
/* read HT CRC32 counter */
441
ret_value = odm_get_bb_reg(dm, R_0x2c10, MASKDWORD);
442
fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;
443
fa_t->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;
444
445
/* @for VHT part */
446
if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8812F |
447
ODM_RTL8814B)) {
448
/* @read VHT CRC32 counter */
449
ret_value = odm_get_bb_reg(dm, R_0x2c0c, MASKDWORD);
450
fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;
451
fa_t->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;
452
453
ret_value = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);
454
fa_t->cnt_mcs_fail_vht = (ret_value & 0xffff0000) >> 16;
455
456
ret_value = odm_get_bb_reg(dm, R_0x2d0c, MASKDWORD);
457
fa_t->cnt_crc8_fail_vhta = ret_value & 0xffff;
458
fa_t->cnt_crc8_fail_vhtb = (ret_value & 0xffff0000) >> 16;
459
} else {
460
fa_t->cnt_vht_crc32_error = 0;
461
fa_t->cnt_vht_crc32_ok = 0;
462
fa_t->cnt_mcs_fail_vht = 0;
463
fa_t->cnt_crc8_fail_vhta = 0;
464
fa_t->cnt_crc8_fail_vhtb = 0;
465
}
466
467
/* @calculate OFDM FA counter instead of reading brk_cnt*/
468
fa_t->cnt_ofdm_fail = fa_t->cnt_parity_fail + fa_t->cnt_rate_illegal +
469
fa_t->cnt_crc8_fail + fa_t->cnt_mcs_fail +
470
fa_t->cnt_fast_fsync + fa_t->cnt_sb_search_fail +
471
fa_t->cnt_mcs_fail_vht + fa_t->cnt_crc8_fail_vhta;
472
473
/* Read CCK FA counter */
474
fa_t->cnt_cck_fail = odm_get_bb_reg(dm, R_0x1a5c, MASKLWORD);
475
476
/* read CCK/OFDM CCA counter */
477
ret_value = odm_get_bb_reg(dm, R_0x2c08, MASKDWORD);
478
fa_t->cnt_ofdm_cca = ((ret_value & 0xffff0000) >> 16);
479
fa_t->cnt_cck_cca = ret_value & 0xffff;
480
481
/* @CCK RxIQ weighting = 1 => 0x1a14[9:8]=0x0 */
482
cck_enable = odm_get_bb_reg(dm, R_0x1a14, 0x300);
483
if (cck_enable == 0x0) { /* @if(*dm->band_type == ODM_BAND_2_4G) */
484
fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail;
485
fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;
486
PHYDM_DBG(dm, DBG_FA_CNT, "ac3 OFDM FA = %d, CCK FA = %d\n",
487
fa_t->cnt_ofdm_fail, fa_t->cnt_cck_fail);
488
} else {
489
fa_t->cnt_all = fa_t->cnt_ofdm_fail;
490
fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;
491
PHYDM_DBG(dm, DBG_FA_CNT, "ac3 CCK disable OFDM FA = %d\n",
492
fa_t->cnt_ofdm_fail);
493
}
494
495
PHYDM_DBG(dm, DBG_FA_CNT,
496
"ac3 [OFDM FA Detail] Parity_fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=((%d)), SBD_fail=((%d))\n",
497
fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
498
fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,
499
fa_t->cnt_sb_search_fail);
500
}
501
502
#endif
503
504
void phydm_write_dig_reg_c50(void *dm_void, u8 igi)
505
{
506
struct dm_struct *dm = (struct dm_struct *)dm_void;
507
508
PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
509
510
odm_set_bb_reg(dm, ODM_REG(IGI_A, dm), ODM_BIT(IGI, dm), igi);
511
512
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
513
if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)
514
odm_set_bb_reg(dm, ODM_REG(IGI_B, dm), ODM_BIT(IGI, dm), igi);
515
#endif
516
517
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
518
if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {
519
odm_set_bb_reg(dm, ODM_REG(IGI_C, dm), ODM_BIT(IGI, dm), igi);
520
odm_set_bb_reg(dm, ODM_REG(IGI_D, dm), ODM_BIT(IGI, dm), igi);
521
}
522
#endif
523
}
524
525
void phydm_write_dig_reg(void *dm_void, u8 igi)
526
{
527
struct dm_struct *dm = (struct dm_struct *)dm_void;
528
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
529
u8 rf_gain = 0;
530
531
PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
532
533
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
534
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
535
phydm_write_dig_reg_jgr3(dm, igi);
536
else
537
#endif
538
phydm_write_dig_reg_c50(dm, igi);
539
540
#if (RTL8721D_SUPPORT)
541
if (dm->invalid_mode) {
542
if (igi <= 0x10)
543
rf_gain = 0xfa;
544
else if (igi <= 0x40)
545
rf_gain = 0xe3 + 0x20 - (igi >> 1);
546
else if (igi <= 0x50)
547
rf_gain = 0xcb - (igi >> 1);
548
else if (igi <= 0x5e)
549
rf_gain = 0x92 - (igi >> 1);
550
else if (igi <= 0x64)
551
rf_gain = 0x74 - (igi >> 1);
552
else
553
rf_gain = (0x3d > (igi >> 1)) ? (0x3d - (igi >> 1)) : 0;
554
odm_set_bb_reg(dm, R_0x850, 0x1fe0, rf_gain);
555
}
556
#endif
557
558
dig_t->cur_ig_value = igi;
559
}
560
561
void odm_write_dig(void *dm_void, u8 new_igi)
562
{
563
struct dm_struct *dm = (struct dm_struct *)dm_void;
564
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
565
struct phydm_adaptivity_struct *adaptivity = &dm->adaptivity;
566
567
PHYDM_DBG(dm, DBG_DIG, "%s===>\n", __func__);
568
569
/* @1 Check IGI by upper bound */
570
if (adaptivity->igi_lmt_en &&
571
new_igi > adaptivity->adapt_igi_up && dm->is_linked) {
572
new_igi = adaptivity->adapt_igi_up;
573
574
PHYDM_DBG(dm, DBG_DIG, "Force Adaptivity Up-bound=((0x%x))\n",
575
new_igi);
576
}
577
578
#if (RTL8192F_SUPPORT)
579
if ((dm->support_ic_type & ODM_RTL8192F) &&
580
dm->cut_version == ODM_CUT_A &&
581
new_igi > 0x38) {
582
new_igi = 0x38;
583
PHYDM_DBG(dm, DBG_DIG,
584
"Force 92F Adaptivity Up-bound=((0x%x))\n", new_igi);
585
}
586
#endif
587
588
if (dig_t->cur_ig_value != new_igi) {
589
#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
590
/* @Modify big jump step for 8822B and 8197F */
591
if (dm->support_ic_type &
592
(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F))
593
phydm_set_big_jump_step(dm, new_igi);
594
#endif
595
596
#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT)
597
/* Set IGI value of CCK for new CCK AGC */
598
if (dm->cck_new_agc &&
599
(dm->support_ic_type & PHYSTS_2ND_TYPE_IC))
600
odm_set_bb_reg(dm, R_0xa0c, 0x3f00, (new_igi >> 1));
601
#endif
602
603
/*@Add by YuChen for USB IO too slow issue*/
604
if (!(dm->support_ic_type & ODM_IC_PWDB_EDCCA)) {
605
if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&
606
new_igi < dig_t->cur_ig_value) {
607
dig_t->cur_ig_value = new_igi;
608
phydm_adaptivity(dm);
609
}
610
} else {
611
if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&
612
new_igi > dig_t->cur_ig_value) {
613
dig_t->cur_ig_value = new_igi;
614
phydm_adaptivity(dm);
615
}
616
}
617
phydm_write_dig_reg(dm, new_igi);
618
}
619
620
PHYDM_DBG(dm, DBG_DIG, "New_igi=((0x%x))\n\n", new_igi);
621
}
622
623
u8 phydm_get_igi_reg_val(void *dm_void, enum bb_path path)
624
{
625
struct dm_struct *dm = (struct dm_struct *)dm_void;
626
u32 val = 0;
627
u32 bit_map = ODM_BIT(IGI, dm);
628
629
switch (path) {
630
case BB_PATH_A:
631
val = odm_get_bb_reg(dm, ODM_REG(IGI_A, dm), bit_map);
632
break;
633
#if (defined(PHYDM_COMPILE_ABOVE_2SS))
634
case BB_PATH_B:
635
val = odm_get_bb_reg(dm, ODM_REG(IGI_B, dm), bit_map);
636
break;
637
#endif
638
639
#if (defined(PHYDM_COMPILE_ABOVE_3SS))
640
case BB_PATH_C:
641
val = odm_get_bb_reg(dm, ODM_REG(IGI_C, dm), bit_map);
642
break;
643
#endif
644
645
#if (defined(PHYDM_COMPILE_ABOVE_4SS))
646
case BB_PATH_D:
647
val = odm_get_bb_reg(dm, ODM_REG(IGI_D, dm), bit_map);
648
break;
649
#endif
650
651
default:
652
break;
653
}
654
655
return (u8)val;
656
}
657
658
u8 phydm_get_igi(void *dm_void, enum bb_path path)
659
{
660
struct dm_struct *dm = (struct dm_struct *)dm_void;
661
u8 val = 0;
662
663
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
664
if (dm->support_ic_type & ODM_IC_JGR3_SERIES)
665
val = phydm_get_igi_reg_val_jgr3(dm, path);
666
else
667
#endif
668
val = phydm_get_igi_reg_val(dm, path);
669
670
return val;
671
}
672
673
void phydm_set_dig_val(void *dm_void, u32 *val_buf, u8 val_len)
674
{
675
struct dm_struct *dm = (struct dm_struct *)dm_void;
676
677
if (val_len != 1) {
678
PHYDM_DBG(dm, ODM_COMP_API, "[Error][DIG]Need val_len=1\n");
679
return;
680
}
681
682
odm_write_dig(dm, (u8)(*val_buf));
683
}
684
685
void odm_pause_dig(void *dm_void, enum phydm_pause_type type,
686
enum phydm_pause_level lv, u8 igi_input)
687
{
688
struct dm_struct *dm = (struct dm_struct *)dm_void;
689
u8 rpt = false;
690
u32 igi = (u32)igi_input;
691
692
PHYDM_DBG(dm, DBG_DIG, "[%s]type=%d, LV=%d, igi=0x%x\n", __func__, type,
693
lv, igi);
694
695
switch (type) {
696
case PHYDM_PAUSE:
697
case PHYDM_PAUSE_NO_SET: {
698
rpt = phydm_pause_func(dm, F00_DIG, PHYDM_PAUSE, lv, 1, &igi);
699
break;
700
}
701
702
case PHYDM_RESUME: {
703
rpt = phydm_pause_func(dm, F00_DIG, PHYDM_RESUME, lv, 1, &igi);
704
break;
705
}
706
default:
707
PHYDM_DBG(dm, DBG_DIG, "Wrong type\n");
708
break;
709
}
710
711
PHYDM_DBG(dm, DBG_DIG, "DIG pause_result=%d\n", rpt);
712
}
713
714
boolean
715
phydm_dig_abort(void *dm_void)
716
{
717
struct dm_struct *dm = (struct dm_struct *)dm_void;
718
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
719
void *adapter = dm->adapter;
720
#endif
721
722
/* support_ability */
723
if ((!(dm->support_ability & ODM_BB_FA_CNT)) ||
724
(!(dm->support_ability & ODM_BB_DIG))) {
725
PHYDM_DBG(dm, DBG_DIG, "[DIG] Not Support\n");
726
return true;
727
}
728
729
if (dm->pause_ability & ODM_BB_DIG) {
730
PHYDM_DBG(dm, DBG_DIG, "Return: Pause DIG in LV=%d\n",
731
dm->pause_lv_table.lv_dig);
732
return true;
733
}
734
735
if (*dm->is_scan_in_process) {
736
PHYDM_DBG(dm, DBG_DIG, "Return: Scan in process\n");
737
return true;
738
}
739
740
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
741
#if OS_WIN_FROM_WIN7(OS_VERSION)
742
if (IsAPModeExist(adapter) && ((PADAPTER)(adapter))->bInHctTest) {
743
PHYDM_DBG(dm, DBG_DIG, " Return: Is AP mode or In HCT Test\n");
744
return true;
745
}
746
#endif
747
#endif
748
749
return false;
750
}
751
752
void phydm_dig_init(void *dm_void)
753
{
754
struct dm_struct *dm = (struct dm_struct *)dm_void;
755
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
756
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
757
struct phydm_fa_struct *false_alm_cnt = &dm->false_alm_cnt;
758
#endif
759
u32 ret_value = 0;
760
u8 i;
761
762
dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
763
dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
764
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
765
766
dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);
767
768
dig_t->fa_th[0] = 250;
769
dig_t->fa_th[1] = 500;
770
dig_t->fa_th[2] = 750;
771
dig_t->is_dbg_fa_th = false;
772
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
773
/* @For RTL8881A */
774
false_alm_cnt->cnt_ofdm_fail_pre = 0;
775
#endif
776
777
dig_t->rx_gain_range_max = DIG_MAX_BALANCE_MODE;
778
dig_t->rx_gain_range_min = dig_t->cur_ig_value;
779
780
#if (RTL8822B_SUPPORT || RTL8197F_SUPPORT || RTL8192F_SUPPORT)
781
dig_t->enable_adjust_big_jump = 1;
782
if (dm->support_ic_type & ODM_RTL8822B)
783
ret_value = odm_get_bb_reg(dm, R_0x8c8, MASKLWORD);
784
else if (dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))
785
ret_value = odm_get_bb_reg(dm, R_0xc74, MASKLWORD);
786
787
dig_t->big_jump_step1 = (u8)(ret_value & 0xe) >> 1;
788
dig_t->big_jump_step2 = (u8)(ret_value & 0x30) >> 4;
789
dig_t->big_jump_step3 = (u8)(ret_value & 0xc0) >> 6;
790
791
if (dm->support_ic_type &
792
(ODM_RTL8822B | ODM_RTL8197F | ODM_RTL8192F)) {
793
for (i = 0; i < sizeof(dig_t->big_jump_lmt); i++) {
794
if (dig_t->big_jump_lmt[i] == 0)
795
dig_t->big_jump_lmt[i] = 0x64;
796
/* Set -10dBm as default value */
797
}
798
}
799
#endif
800
801
#ifdef PHYDM_TDMA_DIG_SUPPORT
802
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
803
dm->original_dig_restore = true;
804
dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;
805
dm->tdma_dig_timer_ms = DIG_TIMER_MS;
806
#endif
807
#endif
808
#ifdef CFG_DIG_DAMPING_CHK
809
phydm_dig_recorder_reset(dm);
810
dig_t->dig_dl_en = 1;
811
#endif
812
}
813
void phydm_dig_abs_boundary_decision(struct dm_struct *dm, boolean is_dfs_band)
814
{
815
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
816
struct phydm_adaptivity_struct *adapt = &dm->adaptivity;
817
818
if (!dm->is_linked) {
819
dig_t->dm_dig_max = DIG_MAX_COVERAGR;
820
dig_t->dm_dig_min = DIG_MIN_COVERAGE;
821
} else if (is_dfs_band) {
822
if (*dm->band_width == CHANNEL_WIDTH_20)
823
dig_t->dm_dig_min = DIG_MIN_DFS + 2;
824
else
825
dig_t->dm_dig_min = DIG_MIN_DFS;
826
827
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
828
dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
829
} else {
830
if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {
831
/*service > 2 devices*/
832
dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
833
#if (DIG_HW == 1)
834
dig_t->dig_max_of_min = DIG_MIN_COVERAGE;
835
#else
836
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
837
#endif
838
} else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {
839
/*service 1 devices*/
840
if (*dm->edcca_mode == PHYDM_EDCCA_ADAPT_MODE &&
841
dm->support_ic_type & (ODM_RTL8197F | ODM_RTL8192F))
842
/*dig_max shouldn't be too high because of adaptivity*/
843
dig_t->dm_dig_max =
844
MIN_2((adapt->th_l2h + 40),
845
DIG_MAX_PERFORMANCE_MODE);
846
else
847
dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;
848
849
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;
850
}
851
852
if (dm->support_ic_type &
853
(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
854
dig_t->dm_dig_min = 0x1c;
855
else if (dm->support_ic_type & ODM_RTL8197F)
856
dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
857
else
858
dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
859
}
860
861
PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
862
dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
863
}
864
865
void phydm_dig_dym_boundary_decision(struct dm_struct *dm)
866
{
867
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
868
#ifdef CFG_DIG_DAMPING_CHK
869
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
870
#endif
871
u8 offset = 15, tmp_max = 0;
872
u8 max_of_rssi_min = 0;
873
874
PHYDM_DBG(dm, DBG_DIG, "%s ======>\n", __func__);
875
876
if (!dm->is_linked) {
877
/*@if no link, always stay at lower bound*/
878
dig_t->rx_gain_range_max = dig_t->dig_max_of_min;
879
dig_t->rx_gain_range_min = dig_t->dm_dig_min;
880
881
PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
882
dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
883
return;
884
}
885
886
PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n", dm->rssi_min, offset);
887
888
/* @DIG lower bound */
889
if (dm->rssi_min > dig_t->dig_max_of_min)
890
dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
891
else if (dm->rssi_min < dig_t->dm_dig_min)
892
dig_t->rx_gain_range_min = dig_t->dm_dig_min;
893
else
894
dig_t->rx_gain_range_min = dm->rssi_min;
895
896
#ifdef CFG_DIG_DAMPING_CHK
897
/*@Limit Dyn min by damping*/
898
if (dig_t->dig_dl_en &&
899
dig_rc->damping_limit_en &&
900
dig_t->rx_gain_range_min < dig_rc->damping_limit_val) {
901
PHYDM_DBG(dm, DBG_DIG,
902
"[Limit by Damping] Dig_dyn_min=0x%x -> 0x%x\n",
903
dig_t->rx_gain_range_min, dig_rc->damping_limit_val);
904
905
dig_t->rx_gain_range_min = dig_rc->damping_limit_val;
906
}
907
#endif
908
909
/* @DIG upper bound */
910
tmp_max = dig_t->rx_gain_range_min + offset;
911
if (dig_t->rx_gain_range_min != dm->rssi_min) {
912
max_of_rssi_min = dm->rssi_min + offset;
913
if (tmp_max > max_of_rssi_min)
914
tmp_max = max_of_rssi_min;
915
}
916
917
if (tmp_max > dig_t->dm_dig_max)
918
dig_t->rx_gain_range_max = dig_t->dm_dig_max;
919
else if (tmp_max < dig_t->dm_dig_min)
920
dig_t->rx_gain_range_max = dig_t->dm_dig_min;
921
else
922
dig_t->rx_gain_range_max = tmp_max;
923
924
#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY
925
/* @1 Force Lower Bound for AntDiv */
926
if (!dm->is_one_entry_only &&
927
(dm->support_ability & ODM_BB_ANT_DIV) &&
928
(dm->ant_div_type == CG_TRX_HW_ANTDIV ||
929
dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
930
if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
931
dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
932
else
933
dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
934
935
PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
936
dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
937
}
938
#endif
939
940
PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
941
dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
942
}
943
944
void phydm_dig_abnormal_case(struct dm_struct *dm)
945
{
946
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
947
948
/* @Abnormal lower bound case */
949
if (dig_t->rx_gain_range_min > dig_t->rx_gain_range_max)
950
dig_t->rx_gain_range_min = dig_t->rx_gain_range_max;
951
952
PHYDM_DBG(dm, DBG_DIG, "Abnoraml checked {Max, Min}={0x%x, 0x%x}\n",
953
dig_t->rx_gain_range_max, dig_t->rx_gain_range_min);
954
}
955
956
u8 phydm_new_igi_by_fa(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *step_size)
957
{
958
boolean dig_go_up_check = true;
959
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
960
961
#if 0
962
/*@dig_go_up_check = phydm_dig_go_up_check(dm);*/
963
#endif
964
965
if (fa_cnt > dig_t->fa_th[2] && dig_go_up_check)
966
igi = igi + step_size[0];
967
else if ((fa_cnt > dig_t->fa_th[1]) && dig_go_up_check)
968
igi = igi + step_size[1];
969
else if (fa_cnt < dig_t->fa_th[0])
970
igi = igi - step_size[2];
971
972
return igi;
973
}
974
975
u8 phydm_get_new_igi(struct dm_struct *dm, u8 igi, u32 fa_cnt,
976
boolean is_dfs_band)
977
{
978
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
979
u8 step[3] = {0};
980
981
if (dm->is_linked) {
982
if (dm->pre_rssi_min <= dm->rssi_min) {
983
PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");
984
step[0] = 2;
985
step[1] = 1;
986
step[2] = 2;
987
} else {
988
step[0] = 4;
989
step[1] = 2;
990
step[2] = 2;
991
}
992
} else {
993
step[0] = 2;
994
step[1] = 1;
995
step[2] = 2;
996
}
997
998
PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],
999
step[0]);
1000
1001
if (dm->first_connect) {
1002
if (is_dfs_band) {
1003
if (dm->rssi_min > DIG_MAX_DFS)
1004
igi = DIG_MAX_DFS;
1005
else
1006
igi = dm->rssi_min;
1007
PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",
1008
dig_t->rx_gain_range_max);
1009
} else {
1010
igi = dig_t->rx_gain_range_min;
1011
}
1012
1013
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1014
#if (RTL8812A_SUPPORT)
1015
if (dm->support_ic_type == ODM_RTL8812)
1016
odm_config_bb_with_header_file(dm,
1017
CONFIG_BB_AGC_TAB_DIFF);
1018
#endif
1019
#endif
1020
PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);
1021
} else if (dm->is_linked) {
1022
PHYDM_DBG(dm, DBG_DIG, "Adjust IGI @ linked\n");
1023
/* @4 Abnormal # beacon case */
1024
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1025
if (dm->phy_dbg_info.num_qry_beacon_pkt < 5 &&
1026
fa_cnt < DM_DIG_FA_TH1 && dm->bsta_state &&
1027
dm->support_ic_type != ODM_RTL8723D) {
1028
dig_t->rx_gain_range_min = 0x1c;
1029
igi = dig_t->rx_gain_range_min;
1030
PHYDM_DBG(dm, DBG_DIG, "Beacon_num=%d,force igi=0x%x\n",
1031
dm->phy_dbg_info.num_qry_beacon_pkt, igi);
1032
} else {
1033
igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
1034
}
1035
#else
1036
igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
1037
#endif
1038
} else {
1039
/* @2 Before link */
1040
PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");
1041
1042
if (dm->first_disconnect) {
1043
igi = dig_t->dm_dig_min;
1044
PHYDM_DBG(dm, DBG_DIG,
1045
"First disconnect:foce IGI to lower bound\n");
1046
} else {
1047
PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",
1048
igi, fa_cnt);
1049
1050
igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
1051
}
1052
}
1053
1054
/*@Check IGI by dyn-upper/lower bound */
1055
if (igi < dig_t->rx_gain_range_min)
1056
igi = dig_t->rx_gain_range_min;
1057
1058
if (igi > dig_t->rx_gain_range_max)
1059
igi = dig_t->rx_gain_range_max;
1060
1061
PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",
1062
fa_cnt, dig_t->cur_ig_value, igi);
1063
1064
return igi;
1065
}
1066
1067
boolean phydm_dig_dfs_mode_en(void *dm_void)
1068
{
1069
struct dm_struct *dm = (struct dm_struct *)dm_void;
1070
boolean dfs_mode_en = false;
1071
1072
/* @Modify lower bound for DFS band */
1073
if (dm->is_dfs_band) {
1074
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1075
dfs_mode_en = true;
1076
#else
1077
if (phydm_dfs_master_enabled(dm))
1078
dfs_mode_en = true;
1079
#endif
1080
PHYDM_DBG(dm, DBG_DIG, "In DFS band\n");
1081
}
1082
return dfs_mode_en;
1083
}
1084
1085
void phydm_dig(void *dm_void)
1086
{
1087
struct dm_struct *dm = (struct dm_struct *)dm_void;
1088
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1089
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1090
#ifdef PHYDM_TDMA_DIG_SUPPORT
1091
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1092
#endif
1093
u8 igi = dig_t->cur_ig_value;
1094
u8 new_igi = 0x20;
1095
u32 fa_cnt = falm_cnt->cnt_all;
1096
boolean dfs_mode_en = false;
1097
1098
#ifdef PHYDM_TDMA_DIG_SUPPORT
1099
if (!(dm->original_dig_restore)) {
1100
if (dig_t->cur_ig_value_tdma == 0)
1101
dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1102
1103
igi = dig_t->cur_ig_value_tdma;
1104
fa_cnt = falm_cnt_acc->cnt_all_1sec;
1105
}
1106
#endif
1107
1108
if (phydm_dig_abort(dm)) {
1109
dig_t->cur_ig_value = phydm_get_igi(dm, BB_PATH_A);
1110
return;
1111
}
1112
1113
PHYDM_DBG(dm, DBG_DIG, "%s Start===>\n", __func__);
1114
PHYDM_DBG(dm, DBG_DIG,
1115
"is_linked=%d, RSSI=%d, 1stConnect=%d, 1stDisconnect=%d\n",
1116
dm->is_linked, dm->rssi_min,
1117
dm->first_connect, dm->first_disconnect);
1118
1119
PHYDM_DBG(dm, DBG_DIG, "DIG ((%s)) mode\n",
1120
(*dm->bb_op_mode ? "Balance" : "Performance"));
1121
1122
/*@DFS mode enable check*/
1123
dfs_mode_en = phydm_dig_dfs_mode_en(dm);
1124
1125
#ifdef CFG_DIG_DAMPING_CHK
1126
/*Record IGI History*/
1127
phydm_dig_recorder(dm, igi, fa_cnt);
1128
1129
/*@DIG Damping Check*/
1130
phydm_dig_damping_chk(dm);
1131
#endif
1132
1133
/*@Absolute Boundary Decision */
1134
phydm_dig_abs_boundary_decision(dm, dfs_mode_en);
1135
1136
/*@Dynamic Boundary Decision*/
1137
phydm_dig_dym_boundary_decision(dm);
1138
1139
/*@Abnormal case check*/
1140
phydm_dig_abnormal_case(dm);
1141
1142
/*@FA threshold decision */
1143
phydm_fa_threshold_check(dm, dfs_mode_en);
1144
1145
/*Select new IGI by FA */
1146
new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
1147
1148
/* @1 Update status */
1149
#ifdef PHYDM_TDMA_DIG_SUPPORT
1150
if (!(dm->original_dig_restore)) {
1151
dig_t->cur_ig_value_tdma = new_igi;
1152
/*@It is possible fa_acc_1sec_tsf >= */
1153
/*@1sec while tdma_dig_state == 0*/
1154
if (dig_t->tdma_dig_state != 0)
1155
odm_write_dig(dm, dig_t->cur_ig_value_tdma);
1156
} else
1157
#endif
1158
odm_write_dig(dm, new_igi);
1159
}
1160
1161
void phydm_dig_lps_32k(void *dm_void)
1162
{
1163
struct dm_struct *dm = (struct dm_struct *)dm_void;
1164
u8 current_igi = dm->rssi_min;
1165
1166
odm_write_dig(dm, current_igi);
1167
}
1168
1169
void phydm_dig_by_rssi_lps(void *dm_void)
1170
{
1171
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE | ODM_IOT))
1172
struct dm_struct *dm = (struct dm_struct *)dm_void;
1173
struct phydm_fa_struct *falm_cnt;
1174
1175
u8 rssi_lower = DIG_MIN_LPS; /* @0x1E or 0x1C */
1176
u8 current_igi = dm->rssi_min;
1177
1178
falm_cnt = &dm->false_alm_cnt;
1179
if (phydm_dig_abort(dm))
1180
return;
1181
1182
current_igi = current_igi + RSSI_OFFSET_DIG_LPS;
1183
PHYDM_DBG(dm, DBG_DIG, "%s==>\n", __func__);
1184
1185
/* Using FW PS mode to make IGI */
1186
/* @Adjust by FA in LPS MODE */
1187
if (falm_cnt->cnt_all > DM_DIG_FA_TH2_LPS)
1188
current_igi = current_igi + 4;
1189
else if (falm_cnt->cnt_all > DM_DIG_FA_TH1_LPS)
1190
current_igi = current_igi + 2;
1191
else if (falm_cnt->cnt_all < DM_DIG_FA_TH0_LPS)
1192
current_igi = current_igi - 2;
1193
1194
/* @Lower bound checking */
1195
1196
/* RSSI Lower bound check */
1197
if ((dm->rssi_min - 10) > DIG_MIN_LPS)
1198
rssi_lower = (dm->rssi_min - 10);
1199
else
1200
rssi_lower = DIG_MIN_LPS;
1201
1202
/* Upper and Lower Bound checking */
1203
if (current_igi > DIG_MAX_LPS)
1204
current_igi = DIG_MAX_LPS;
1205
else if (current_igi < rssi_lower)
1206
current_igi = rssi_lower;
1207
1208
PHYDM_DBG(dm, DBG_DIG, "fa_cnt_all=%d, rssi_min=%d, curr_igi=0x%x\n",
1209
falm_cnt->cnt_all, dm->rssi_min, current_igi);
1210
odm_write_dig(dm, current_igi);
1211
#endif
1212
}
1213
1214
/* @3============================================================
1215
* 3 FASLE ALARM CHECK
1216
* 3============================================================
1217
*/
1218
void phydm_false_alarm_counter_reg_reset(void *dm_void)
1219
{
1220
struct dm_struct *dm = (struct dm_struct *)dm_void;
1221
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1222
#ifdef PHYDM_TDMA_DIG_SUPPORT
1223
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1224
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1225
#endif
1226
u32 false_alm_cnt = 0;
1227
1228
#ifdef PHYDM_TDMA_DIG_SUPPORT
1229
if (!(dm->original_dig_restore)) {
1230
if (dig_t->cur_ig_value_tdma == 0)
1231
dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1232
1233
false_alm_cnt = falm_cnt_acc->cnt_all_1sec;
1234
} else
1235
#endif
1236
{
1237
false_alm_cnt = falm_cnt->cnt_all;
1238
}
1239
1240
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1241
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1242
/* @reset CCK FA counter */
1243
odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 0);
1244
odm_set_bb_reg(dm, R_0x1a2c, BIT(15) | BIT(14), 2);
1245
1246
/* @reset CCK CCA counter */
1247
odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 0);
1248
odm_set_bb_reg(dm, R_0x1a2c, BIT(13) | BIT(12), 2);
1249
1250
/* @Disable common rx clk gating => WLANBB-1106*/
1251
odm_set_bb_reg(dm, R_0x1d2c, BIT(31), 0);
1252
/* @reset OFDM CCA counter, OFDM FA counter*/
1253
phydm_reset_bb_hw_cnt(dm);
1254
/* @Enable common rx clk gating => WLANBB-1106*/
1255
odm_set_bb_reg(dm, R_0x1d2c, BIT(31), 1);
1256
}
1257
#endif
1258
#if (ODM_IC_11N_SERIES_SUPPORT)
1259
if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1260
/* @reset false alarm counter registers*/
1261
odm_set_bb_reg(dm, R_0xc0c, BIT(31), 1);
1262
odm_set_bb_reg(dm, R_0xc0c, BIT(31), 0);
1263
odm_set_bb_reg(dm, R_0xd00, BIT(27), 1);
1264
odm_set_bb_reg(dm, R_0xd00, BIT(27), 0);
1265
1266
/* @update ofdm counter*/
1267
/* @update page C counter*/
1268
odm_set_bb_reg(dm, R_0xc00, BIT(31), 0);
1269
/* @update page D counter*/
1270
odm_set_bb_reg(dm, R_0xd00, BIT(31), 0);
1271
1272
/* @reset CCK CCA counter*/
1273
odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 0);
1274
odm_set_bb_reg(dm, R_0xa2c, BIT(13) | BIT(12), 2);
1275
1276
/* @reset CCK FA counter*/
1277
odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 0);
1278
odm_set_bb_reg(dm, R_0xa2c, BIT(15) | BIT(14), 2);
1279
1280
/* @reset CRC32 counter*/
1281
odm_set_bb_reg(dm, R_0xf14, BIT(16), 1);
1282
odm_set_bb_reg(dm, R_0xf14, BIT(16), 0);
1283
}
1284
#endif /* @#if (ODM_IC_11N_SERIES_SUPPORT) */
1285
1286
#if (ODM_IC_11AC_SERIES_SUPPORT)
1287
if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1288
#if (RTL8881A_SUPPORT)
1289
/* @Reset FA counter by enable/disable OFDM */
1290
if ((dm->support_ic_type == ODM_RTL8881A) &&
1291
false_alm_cnt->cnt_ofdm_fail_pre >= 0x7fff) {
1292
/* reset OFDM */
1293
odm_set_bb_reg(dm, R_0x808, BIT(29), 0);
1294
odm_set_bb_reg(dm, R_0x808, BIT(29), 1);
1295
false_alm_cnt->cnt_ofdm_fail_pre = 0;
1296
PHYDM_DBG(dm, DBG_FA_CNT, "Reset FA_cnt\n");
1297
}
1298
#endif /* @#if (RTL8881A_SUPPORT) */
1299
1300
/* @reset OFDM FA countner */
1301
odm_set_bb_reg(dm, R_0x9a4, BIT(17), 1);
1302
odm_set_bb_reg(dm, R_0x9a4, BIT(17), 0);
1303
1304
/* @reset CCK FA counter */
1305
odm_set_bb_reg(dm, R_0xa2c, BIT(15), 0);
1306
odm_set_bb_reg(dm, R_0xa2c, BIT(15), 1);
1307
1308
/* @reset CCA counter */
1309
phydm_reset_bb_hw_cnt(dm);
1310
}
1311
#endif /* @#if (ODM_IC_11AC_SERIES_SUPPORT) */
1312
}
1313
1314
void phydm_false_alarm_counter_reg_hold(void *dm_void)
1315
{
1316
struct dm_struct *dm = (struct dm_struct *)dm_void;
1317
1318
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1319
/* @hold cck counter */
1320
odm_set_bb_reg(dm, R_0x1a2c, BIT(12), 1);
1321
odm_set_bb_reg(dm, R_0x1a2c, BIT(14), 1);
1322
} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1323
/*@hold ofdm counter*/
1324
/*@hold page C counter*/
1325
odm_set_bb_reg(dm, R_0xc00, BIT(31), 1);
1326
/*@hold page D counter*/
1327
odm_set_bb_reg(dm, R_0xd00, BIT(31), 1);
1328
1329
/*@hold cck counter*/
1330
odm_set_bb_reg(dm, R_0xa2c, BIT(12), 1);
1331
odm_set_bb_reg(dm, R_0xa2c, BIT(14), 1);
1332
}
1333
}
1334
1335
#if (ODM_IC_11N_SERIES_SUPPORT)
1336
void phydm_fa_cnt_statistics_n(void *dm_void)
1337
{
1338
struct dm_struct *dm = (struct dm_struct *)dm_void;
1339
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1340
u32 reg = 0;
1341
1342
if (!(dm->support_ic_type & ODM_IC_11N_SERIES))
1343
return;
1344
1345
/* @hold ofdm & cck counter */
1346
phydm_false_alarm_counter_reg_hold(dm);
1347
1348
reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11N, MASKDWORD);
1349
fa_t->cnt_fast_fsync = (reg & 0xffff);
1350
fa_t->cnt_sb_search_fail = ((reg & 0xffff0000) >> 16);
1351
1352
reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11N, MASKDWORD);
1353
fa_t->cnt_ofdm_cca = (reg & 0xffff);
1354
fa_t->cnt_parity_fail = ((reg & 0xffff0000) >> 16);
1355
1356
reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11N, MASKDWORD);
1357
fa_t->cnt_rate_illegal = (reg & 0xffff);
1358
fa_t->cnt_crc8_fail = ((reg & 0xffff0000) >> 16);
1359
1360
reg = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11N, MASKDWORD);
1361
fa_t->cnt_mcs_fail = (reg & 0xffff);
1362
1363
fa_t->cnt_ofdm_fail =
1364
fa_t->cnt_parity_fail + fa_t->cnt_rate_illegal +
1365
fa_t->cnt_crc8_fail + fa_t->cnt_mcs_fail +
1366
fa_t->cnt_fast_fsync + fa_t->cnt_sb_search_fail;
1367
1368
/* read CCK CRC32 counter */
1369
fa_t->cnt_cck_crc32_error = odm_get_bb_reg(dm, R_0xf84, MASKDWORD);
1370
fa_t->cnt_cck_crc32_ok = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);
1371
1372
/* read OFDM CRC32 counter */
1373
reg = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11N, MASKDWORD);
1374
fa_t->cnt_ofdm_crc32_error = (reg & 0xffff0000) >> 16;
1375
fa_t->cnt_ofdm_crc32_ok = reg & 0xffff;
1376
1377
/* read HT CRC32 counter */
1378
reg = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11N, MASKDWORD);
1379
fa_t->cnt_ht_crc32_error = (reg & 0xffff0000) >> 16;
1380
fa_t->cnt_ht_crc32_ok = reg & 0xffff;
1381
1382
/* read VHT CRC32 counter */
1383
fa_t->cnt_vht_crc32_error = 0;
1384
fa_t->cnt_vht_crc32_ok = 0;
1385
1386
#if (RTL8723D_SUPPORT)
1387
if (dm->support_ic_type == ODM_RTL8723D) {
1388
/* read HT CRC32 agg counter */
1389
reg = odm_get_bb_reg(dm, R_0xfb8, MASKDWORD);
1390
fa_t->cnt_ht_crc32_error_agg = (reg & 0xffff0000) >> 16;
1391
fa_t->cnt_ht_crc32_ok_agg = reg & 0xffff;
1392
}
1393
#endif
1394
1395
#if (RTL8188E_SUPPORT)
1396
if (dm->support_ic_type == ODM_RTL8188E) {
1397
reg = odm_get_bb_reg(dm, ODM_REG_SC_CNT_11N, MASKDWORD);
1398
fa_t->cnt_bw_lsc = (reg & 0xffff);
1399
fa_t->cnt_bw_usc = ((reg & 0xffff0000) >> 16);
1400
}
1401
#endif
1402
1403
reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_LSB_11N, MASKBYTE0);
1404
fa_t->cnt_cck_fail = reg;
1405
1406
reg = odm_get_bb_reg(dm, ODM_REG_CCK_FA_MSB_11N, MASKBYTE3);
1407
fa_t->cnt_cck_fail += (reg & 0xff) << 8;
1408
1409
reg = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11N, MASKDWORD);
1410
fa_t->cnt_cck_cca = ((reg & 0xFF) << 8) | ((reg & 0xFF00) >> 8);
1411
1412
fa_t->cnt_all_pre = fa_t->cnt_all;
1413
1414
fa_t->cnt_all = fa_t->cnt_fast_fsync +
1415
fa_t->cnt_sb_search_fail +
1416
fa_t->cnt_parity_fail +
1417
fa_t->cnt_rate_illegal +
1418
fa_t->cnt_crc8_fail +
1419
fa_t->cnt_mcs_fail +
1420
fa_t->cnt_cck_fail;
1421
1422
fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca + fa_t->cnt_cck_cca;
1423
1424
PHYDM_DBG(dm, DBG_FA_CNT,
1425
"[OFDM FA Detail] Parity_Fail=((%d)), Rate_Illegal=((%d)), CRC8_fail=((%d)), Mcs_fail=((%d)), Fast_Fsync=(( %d )), SBD_fail=((%d))\n",
1426
fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
1427
fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail, fa_t->cnt_fast_fsync,
1428
fa_t->cnt_sb_search_fail);
1429
}
1430
#endif
1431
1432
#if (ODM_IC_11AC_SERIES_SUPPORT)
1433
void phydm_fa_cnt_statistics_ac(void *dm_void)
1434
{
1435
struct dm_struct *dm = (struct dm_struct *)dm_void;
1436
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1437
u32 ret_value = 0;
1438
u32 cck_enable = 0;
1439
1440
if (!(dm->support_ic_type & ODM_IC_11AC_SERIES))
1441
return;
1442
1443
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE1_11AC, MASKDWORD);
1444
fa_t->cnt_fast_fsync = (ret_value & 0xffff0000) >> 16;
1445
1446
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE2_11AC, MASKDWORD);
1447
fa_t->cnt_sb_search_fail = ret_value & 0xffff;
1448
1449
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE3_11AC, MASKDWORD);
1450
fa_t->cnt_parity_fail = ret_value & 0xffff;
1451
fa_t->cnt_rate_illegal = (ret_value & 0xffff0000) >> 16;
1452
1453
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE4_11AC, MASKDWORD);
1454
fa_t->cnt_crc8_fail = ret_value & 0xffff;
1455
fa_t->cnt_mcs_fail = (ret_value & 0xffff0000) >> 16;
1456
1457
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE5_11AC, MASKDWORD);
1458
fa_t->cnt_crc8_fail_vhta = ret_value & 0xffff;
1459
fa_t->cnt_crc8_fail_vhtb = ret_value & 0xffff0000 >> 16;
1460
1461
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_FA_TYPE6_11AC, MASKDWORD);
1462
fa_t->cnt_mcs_fail_vht = ret_value & 0xffff;
1463
1464
/* read OFDM FA counter */
1465
fa_t->cnt_ofdm_fail = odm_get_bb_reg(dm, R_0xf48, MASKLWORD);
1466
1467
/* Read CCK FA counter */
1468
fa_t->cnt_cck_fail = odm_get_bb_reg(dm, ODM_REG_CCK_FA_11AC, MASKLWORD);
1469
1470
/* read CCK/OFDM CCA counter */
1471
ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CCA_CNT_11AC, MASKDWORD);
1472
fa_t->cnt_ofdm_cca = (ret_value & 0xffff0000) >> 16;
1473
fa_t->cnt_cck_cca = ret_value & 0xffff;
1474
1475
/* read CCK CRC32 counter */
1476
ret_value = odm_get_bb_reg(dm, ODM_REG_CCK_CRC32_CNT_11AC, MASKDWORD);
1477
fa_t->cnt_cck_crc32_error = (ret_value & 0xffff0000) >> 16;
1478
fa_t->cnt_cck_crc32_ok = ret_value & 0xffff;
1479
1480
/* read OFDM CRC32 counter */
1481
ret_value = odm_get_bb_reg(dm, ODM_REG_OFDM_CRC32_CNT_11AC, MASKDWORD);
1482
fa_t->cnt_ofdm_crc32_error = (ret_value & 0xffff0000) >> 16;
1483
fa_t->cnt_ofdm_crc32_ok = ret_value & 0xffff;
1484
1485
/* read HT CRC32 counter */
1486
ret_value = odm_get_bb_reg(dm, ODM_REG_HT_CRC32_CNT_11AC, MASKDWORD);
1487
fa_t->cnt_ht_crc32_error = (ret_value & 0xffff0000) >> 16;
1488
fa_t->cnt_ht_crc32_ok = ret_value & 0xffff;
1489
1490
/* read VHT CRC32 counter */
1491
ret_value = odm_get_bb_reg(dm, ODM_REG_VHT_CRC32_CNT_11AC, MASKDWORD);
1492
fa_t->cnt_vht_crc32_error = (ret_value & 0xffff0000) >> 16;
1493
fa_t->cnt_vht_crc32_ok = ret_value & 0xffff;
1494
1495
#if (RTL8881A_SUPPORT)
1496
if (dm->support_ic_type == ODM_RTL8881A) {
1497
u32 tmp = 0;
1498
1499
if (fa_t->cnt_ofdm_fail >= fa_t->cnt_ofdm_fail_pre) {
1500
tmp = fa_t->cnt_ofdm_fail_pre;
1501
fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;
1502
fa_t->cnt_ofdm_fail = fa_t->cnt_ofdm_fail - tmp;
1503
} else {
1504
fa_t->cnt_ofdm_fail_pre = fa_t->cnt_ofdm_fail;
1505
}
1506
1507
PHYDM_DBG(dm, DBG_FA_CNT,
1508
"[8881]cnt_ofdm_fail{curr,pre}={%d,%d}\n",
1509
fa_t->cnt_ofdm_fail_pre, tmp);
1510
}
1511
#endif
1512
1513
cck_enable = odm_get_bb_reg(dm, ODM_REG_BB_RX_PATH_11AC, BIT(28));
1514
1515
if (cck_enable) { /* @if(*dm->band_type == ODM_BAND_2_4G) */
1516
fa_t->cnt_all = fa_t->cnt_ofdm_fail + fa_t->cnt_cck_fail;
1517
fa_t->cnt_cca_all = fa_t->cnt_cck_cca + fa_t->cnt_ofdm_cca;
1518
} else {
1519
fa_t->cnt_all = fa_t->cnt_ofdm_fail;
1520
fa_t->cnt_cca_all = fa_t->cnt_ofdm_cca;
1521
}
1522
}
1523
#endif
1524
1525
void phydm_get_dbg_port_info(void *dm_void)
1526
{
1527
struct dm_struct *dm = (struct dm_struct *)dm_void;
1528
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1529
u32 dbg_port = dm->adaptivity.adaptivity_dbg_port;
1530
u32 val = 0;
1531
1532
/*set debug port to 0x0*/
1533
if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, 0x0)) {
1534
fa_t->dbg_port0 = phydm_get_bb_dbg_port_val(dm);
1535
phydm_release_bb_dbg_port(dm);
1536
}
1537
1538
if (dm->support_ic_type & ODM_RTL8723D) {
1539
val = odm_get_bb_reg(dm, R_0x9a0, BIT(29));
1540
} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1541
val = odm_get_bb_reg(dm, R_0x2d38, BIT(24));
1542
} else if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_1, dbg_port)) {
1543
if (dm->support_ic_type & (ODM_RTL8723B | ODM_RTL8188E))
1544
val = (phydm_get_bb_dbg_port_val(dm) & BIT(30)) >> 30;
1545
else
1546
val = (phydm_get_bb_dbg_port_val(dm) & BIT(29)) >> 29;
1547
phydm_release_bb_dbg_port(dm);
1548
}
1549
1550
fa_t->edcca_flag = (boolean)val;
1551
1552
PHYDM_DBG(dm, DBG_FA_CNT, "FA_Cnt: Dbg port 0x0 = 0x%x, EDCCA = %d\n\n",
1553
fa_t->dbg_port0, fa_t->edcca_flag);
1554
}
1555
1556
void phydm_false_alarm_counter_statistics(void *dm_void)
1557
{
1558
struct dm_struct *dm = (struct dm_struct *)dm_void;
1559
struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;
1560
1561
if (!(dm->support_ability & ODM_BB_FA_CNT))
1562
return;
1563
1564
PHYDM_DBG(dm, DBG_FA_CNT, "%s======>\n", __func__);
1565
1566
if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {
1567
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
1568
phydm_fa_cnt_statistics_jgr3(dm);
1569
#endif
1570
} else if (dm->support_ic_type & ODM_IC_11N_SERIES) {
1571
#if (ODM_IC_11N_SERIES_SUPPORT)
1572
phydm_fa_cnt_statistics_n(dm);
1573
#endif
1574
} else if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
1575
#if (ODM_IC_11AC_SERIES_SUPPORT)
1576
phydm_fa_cnt_statistics_ac(dm);
1577
#endif
1578
}
1579
1580
phydm_get_dbg_port_info(dm);
1581
phydm_false_alarm_counter_reg_reset(dm_void);
1582
1583
fa_t->time_fa_all = fa_t->cnt_fast_fsync * 12 +
1584
fa_t->cnt_sb_search_fail * 12 +
1585
fa_t->cnt_parity_fail * 28 +
1586
fa_t->cnt_rate_illegal * 28 +
1587
fa_t->cnt_crc8_fail * 20 +
1588
fa_t->cnt_crc8_fail_vhta * 28 +
1589
fa_t->cnt_mcs_fail_vht * 36 +
1590
fa_t->cnt_mcs_fail * 32 +
1591
fa_t->cnt_cck_fail * 80;
1592
1593
fa_t->cnt_crc32_error_all = fa_t->cnt_vht_crc32_error +
1594
fa_t->cnt_ht_crc32_error +
1595
fa_t->cnt_ofdm_crc32_error +
1596
fa_t->cnt_cck_crc32_error;
1597
1598
fa_t->cnt_crc32_ok_all = fa_t->cnt_vht_crc32_ok +
1599
fa_t->cnt_ht_crc32_ok +
1600
fa_t->cnt_ofdm_crc32_ok +
1601
fa_t->cnt_cck_crc32_ok;
1602
1603
PHYDM_DBG(dm, DBG_FA_CNT,
1604
"[OFDM FA Detail-1] Parity=((%d)), Rate_Illegal=((%d)), HT_CRC8=((%d)), HT_MCS=((%d))\n",
1605
fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,
1606
fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail);
1607
PHYDM_DBG(dm, DBG_FA_CNT,
1608
"[OFDM FA Detail-2] Fast_Fsync=((%d)), SBD=((%d)), VHT_SIGA_CRC8=((%d)), VHT_SIGB_CRC8=((%d)), VHT_MCS=((%d))\n",
1609
fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail,
1610
fa_t->cnt_crc8_fail_vhta, fa_t->cnt_crc8_fail_vhtb,
1611
fa_t->cnt_mcs_fail_vht);
1612
PHYDM_DBG(dm, DBG_FA_CNT,
1613
"[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
1614
fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);
1615
PHYDM_DBG(dm, DBG_FA_CNT,
1616
"[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
1617
fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);
1618
PHYDM_DBG(dm, DBG_FA_CNT, "[CCK] CRC32 {error, ok}= {%d, %d}\n",
1619
fa_t->cnt_cck_crc32_error, fa_t->cnt_cck_crc32_ok);
1620
PHYDM_DBG(dm, DBG_FA_CNT, "[OFDM]CRC32 {error, ok}= {%d, %d}\n",
1621
fa_t->cnt_ofdm_crc32_error, fa_t->cnt_ofdm_crc32_ok);
1622
PHYDM_DBG(dm, DBG_FA_CNT, "[ HT ] CRC32 {error, ok}= {%d, %d}\n",
1623
fa_t->cnt_ht_crc32_error, fa_t->cnt_ht_crc32_ok);
1624
PHYDM_DBG(dm, DBG_FA_CNT, "[VHT] CRC32 {error, ok}= {%d, %d}\n",
1625
fa_t->cnt_vht_crc32_error, fa_t->cnt_vht_crc32_ok);
1626
PHYDM_DBG(dm, DBG_FA_CNT, "[TOTAL] CRC32 {error, ok}= {%d, %d}\n",
1627
fa_t->cnt_crc32_error_all, fa_t->cnt_crc32_ok_all);
1628
}
1629
1630
#ifdef PHYDM_TDMA_DIG_SUPPORT
1631
void phydm_set_tdma_dig_timer(void *dm_void)
1632
{
1633
struct dm_struct *dm = (struct dm_struct *)dm_void;
1634
u32 delta_time_us = dm->tdma_dig_timer_ms * 1000;
1635
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1636
u32 timeout = 0;
1637
u32 current_time_stamp, diff_time_stamp, regb0 = 0;
1638
1639
/*some IC has no FREERUN_CUNT register, like 92E*/
1640
if (dm->support_ic_type & ODM_RTL8197F)
1641
current_time_stamp = odm_get_bb_reg(dm, R_0x568, 0xffffffff);
1642
else
1643
return;
1644
1645
timeout = current_time_stamp + delta_time_us;
1646
1647
diff_time_stamp = current_time_stamp - dig_t->cur_timestamp;
1648
dig_t->pre_timestamp = dig_t->cur_timestamp;
1649
dig_t->cur_timestamp = current_time_stamp;
1650
1651
/*@HIMR0, it shows HW interrupt mask*/
1652
regb0 = odm_get_bb_reg(dm, R_0xb0, 0xffffffff);
1653
1654
PHYDM_DBG(dm, DBG_DIG, "Set next timer\n");
1655
PHYDM_DBG(dm, DBG_DIG,
1656
"curr_time_stamp=%d, delta_time_us=%d\n",
1657
current_time_stamp, delta_time_us);
1658
PHYDM_DBG(dm, DBG_DIG,
1659
"timeout=%d, diff_time_stamp=%d, Reg0xb0 = 0x%x\n",
1660
timeout, diff_time_stamp, regb0);
1661
1662
if (dm->support_ic_type & ODM_RTL8197F) /*REG_PS_TIMER2*/
1663
odm_set_bb_reg(dm, R_0x588, 0xffffffff, timeout);
1664
else {
1665
PHYDM_DBG(dm, DBG_DIG, "NOT 97F, NOT start\n");
1666
return;
1667
}
1668
}
1669
1670
void phydm_tdma_dig_timer_check(void *dm_void)
1671
{
1672
struct dm_struct *dm = (struct dm_struct *)dm_void;
1673
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1674
1675
PHYDM_DBG(dm, DBG_DIG, "tdma_dig_cnt=%d, pre_tdma_dig_cnt=%d\n",
1676
dig_t->tdma_dig_cnt, dig_t->pre_tdma_dig_cnt);
1677
1678
if (dig_t->tdma_dig_cnt == 0 ||
1679
dig_t->tdma_dig_cnt == dig_t->pre_tdma_dig_cnt) {
1680
if (dm->support_ability & ODM_BB_DIG) {
1681
#ifdef IS_USE_NEW_TDMA
1682
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B |
1683
ODM_RTL8812F | ODM_RTL8822B | ODM_RTL8192F |
1684
ODM_RTL8821C | ODM_RTL8197G | ODM_RTL8822C |
1685
ODM_RTL8723D)) {
1686
PHYDM_DBG(dm, DBG_DIG,
1687
"Check fail, Restart timer\n\n");
1688
phydm_false_alarm_counter_reset(dm);
1689
odm_set_timer(dm, &dm->tdma_dig_timer,
1690
dm->tdma_dig_timer_ms);
1691
} else {
1692
PHYDM_DBG(dm, DBG_DIG,
1693
"Not support TDMADIG, no SW timer\n");
1694
}
1695
#else
1696
/*@if interrupt mask info is got.*/
1697
/*Reg0xb0 is no longer needed*/
1698
#if 0
1699
/*regb0 = odm_get_bb_reg(dm, R_0xb0, bMaskDWord);*/
1700
#endif
1701
PHYDM_DBG(dm, DBG_DIG,
1702
"Check fail, Mask[0]=0x%x, restart timer\n",
1703
*dm->interrupt_mask);
1704
1705
phydm_tdma_dig_add_interrupt_mask_handler(dm);
1706
phydm_enable_rx_related_interrupt_handler(dm);
1707
phydm_set_tdma_dig_timer(dm);
1708
#endif
1709
}
1710
} else {
1711
PHYDM_DBG(dm, DBG_DIG, "Check pass, update pre_tdma_dig_cnt\n");
1712
}
1713
1714
dig_t->pre_tdma_dig_cnt = dig_t->tdma_dig_cnt;
1715
}
1716
1717
/*@different IC/team may use different timer for tdma-dig*/
1718
void phydm_tdma_dig_add_interrupt_mask_handler(void *dm_void)
1719
{
1720
struct dm_struct *dm = (struct dm_struct *)dm_void;
1721
1722
#if (DM_ODM_SUPPORT_TYPE == (ODM_AP))
1723
if (dm->support_ic_type & ODM_RTL8197F) {
1724
/*@HAL_INT_TYPE_PSTIMEOUT2*/
1725
phydm_add_interrupt_mask_handler(dm, HAL_INT_TYPE_PSTIMEOUT2);
1726
}
1727
#elif (DM_ODM_SUPPORT_TYPE == (ODM_WIN))
1728
#elif (DM_ODM_SUPPORT_TYPE == (ODM_CE))
1729
#endif
1730
}
1731
1732
/* will be triggered by HW timer*/
1733
void phydm_tdma_dig(void *dm_void)
1734
{
1735
struct dm_struct *dm = (struct dm_struct *)dm_void;
1736
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1737
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1738
u32 reg_c50 = 0;
1739
1740
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT || RTL8812F_SUPPORT ||\
1741
RTL8822B_SUPPORT || RTL8192F_SUPPORT || RTL8821C_SUPPORT)
1742
#ifdef IS_USE_NEW_TDMA
1743
if (dm->support_ic_type &
1744
(ODM_RTL8198F | ODM_RTL8814B | ODM_RTL8812F | ODM_RTL8822B |
1745
ODM_RTL8192F | ODM_RTL8821C)) {
1746
PHYDM_DBG(dm, DBG_DIG, "98F/14B/12F/22B/92F/21C, new tdma\n");
1747
return;
1748
}
1749
#endif
1750
#endif
1751
reg_c50 = odm_get_bb_reg(dm, R_0xc50, MASKBYTE0);
1752
1753
dig_t->tdma_dig_state =
1754
dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
1755
1756
PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, regc50=0x%x\n",
1757
dig_t->tdma_dig_state, reg_c50);
1758
1759
dig_t->tdma_dig_cnt++;
1760
1761
if (dig_t->tdma_dig_state == 1) {
1762
/* update IGI from tdma_dig_state == 0*/
1763
if (dig_t->cur_ig_value_tdma == 0)
1764
dig_t->cur_ig_value_tdma = dig_t->cur_ig_value;
1765
1766
odm_write_dig(dm, dig_t->cur_ig_value_tdma);
1767
phydm_tdma_false_alarm_counter_check(dm);
1768
PHYDM_DBG(dm, DBG_DIG, "tdma_dig_state=%d, reset FA counter\n",
1769
dig_t->tdma_dig_state);
1770
1771
} else if (dig_t->tdma_dig_state == 0) {
1772
/* update dig_t->CurIGValue,*/
1773
/* @it may different from dig_t->cur_ig_value_tdma */
1774
/* TDMA IGI upperbond @ L-state = */
1775
/* rf_ft_var.tdma_dig_low_upper_bond = 0x26 */
1776
1777
if (dig_t->cur_ig_value >= dm->tdma_dig_low_upper_bond)
1778
dig_t->low_ig_value = dm->tdma_dig_low_upper_bond;
1779
else
1780
dig_t->low_ig_value = dig_t->cur_ig_value;
1781
1782
odm_write_dig(dm, dig_t->low_ig_value);
1783
phydm_tdma_false_alarm_counter_check(dm);
1784
} else {
1785
phydm_tdma_false_alarm_counter_check(dm);
1786
}
1787
}
1788
1789
/*@============================================================*/
1790
/*@FASLE ALARM CHECK*/
1791
/*@============================================================*/
1792
void phydm_tdma_false_alarm_counter_check(void *dm_void)
1793
{
1794
struct dm_struct *dm = (struct dm_struct *)dm_void;
1795
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1796
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1797
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1798
boolean rssi_dump_en = 0;
1799
u32 timestamp = 0;
1800
u8 tdma_dig_state_number = 0;
1801
u32 start_th = 0;
1802
1803
if (dig_t->tdma_dig_state == 1)
1804
phydm_false_alarm_counter_reset(dm);
1805
/* Reset FalseAlarmCounterStatistics */
1806
/* @fa_acc_1sec_tsf = fa_acc_1sec_tsf, keep */
1807
/* @fa_end_tsf = fa_start_tsf = TSF */
1808
else {
1809
phydm_false_alarm_counter_statistics(dm);
1810
if (dm->support_ic_type & ODM_RTL8197F) /*REG_FREERUN_CNT*/
1811
timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);
1812
else {
1813
PHYDM_DBG(dm, DBG_DIG, "NOT 97F! NOT start\n");
1814
return;
1815
}
1816
dig_t->fa_end_timestamp = timestamp;
1817
dig_t->fa_acc_1sec_timestamp +=
1818
(dig_t->fa_end_timestamp - dig_t->fa_start_timestamp);
1819
1820
/*prevent dumb*/
1821
if (dm->tdma_dig_state_number == 1)
1822
dm->tdma_dig_state_number = 2;
1823
1824
tdma_dig_state_number = dm->tdma_dig_state_number;
1825
dig_t->sec_factor =
1826
tdma_dig_state_number / (tdma_dig_state_number - 1);
1827
1828
/*@1sec = 1000000us*/
1829
if (dig_t->sec_factor)
1830
start_th = (u32)(1000000 / dig_t->sec_factor);
1831
1832
if (dig_t->fa_acc_1sec_timestamp >= start_th) {
1833
rssi_dump_en = 1;
1834
phydm_false_alarm_counter_acc(dm, rssi_dump_en);
1835
PHYDM_DBG(dm, DBG_DIG,
1836
"sec_factor=%d, total FA=%d, is_linked=%d\n",
1837
dig_t->sec_factor, falm_cnt_acc->cnt_all,
1838
dm->is_linked);
1839
1840
phydm_noisy_detection(dm);
1841
#ifdef PHYDM_SUPPORT_CCKPD
1842
phydm_cck_pd_th(dm);
1843
#endif
1844
phydm_dig(dm);
1845
phydm_false_alarm_counter_acc_reset(dm);
1846
1847
/* Reset FalseAlarmCounterStatistics */
1848
/* @fa_end_tsf = fa_start_tsf = TSF, keep */
1849
/* @fa_acc_1sec_tsf = 0 */
1850
phydm_false_alarm_counter_reset(dm);
1851
} else {
1852
phydm_false_alarm_counter_acc(dm, rssi_dump_en);
1853
}
1854
}
1855
}
1856
1857
void phydm_false_alarm_counter_acc(void *dm_void, boolean rssi_dump_en)
1858
{
1859
struct dm_struct *dm = (struct dm_struct *)dm_void;
1860
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
1861
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
1862
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
1863
1864
falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;
1865
falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;
1866
falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;
1867
falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;
1868
falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;
1869
falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;
1870
falm_cnt_acc->cnt_all += falm_cnt->cnt_all;
1871
falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;
1872
falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;
1873
falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;
1874
falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;
1875
falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;
1876
falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;
1877
falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;
1878
falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;
1879
falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;
1880
falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;
1881
falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;
1882
falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;
1883
falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;
1884
falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;
1885
falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;
1886
1887
if (rssi_dump_en == 1) {
1888
falm_cnt_acc->cnt_all_1sec =
1889
falm_cnt_acc->cnt_all * dig_t->sec_factor;
1890
falm_cnt_acc->cnt_cca_all_1sec =
1891
falm_cnt_acc->cnt_cca_all * dig_t->sec_factor;
1892
falm_cnt_acc->cnt_cck_fail_1sec =
1893
falm_cnt_acc->cnt_cck_fail * dig_t->sec_factor;
1894
}
1895
}
1896
1897
void phydm_false_alarm_counter_acc_reset(void *dm_void)
1898
{
1899
struct dm_struct *dm = (struct dm_struct *)dm_void;
1900
struct phydm_fa_acc_struct *falm_cnt_acc = NULL;
1901
1902
#ifdef IS_USE_NEW_TDMA
1903
struct phydm_fa_acc_struct *falm_cnt_acc_low = NULL;
1904
u32 tmp_cca_1sec = 0;
1905
u32 tmp_fa_1sec = 0;
1906
1907
/*@clear L-fa_acc struct*/
1908
falm_cnt_acc_low = &dm->false_alm_cnt_acc_low;
1909
tmp_cca_1sec = falm_cnt_acc_low->cnt_cca_all_1sec;
1910
tmp_fa_1sec = falm_cnt_acc_low->cnt_all_1sec;
1911
odm_memory_set(dm, falm_cnt_acc_low, 0, sizeof(dm->false_alm_cnt_acc));
1912
falm_cnt_acc_low->cnt_cca_all_1sec = tmp_cca_1sec;
1913
falm_cnt_acc_low->cnt_all_1sec = tmp_fa_1sec;
1914
1915
/*@clear H-fa_acc struct*/
1916
falm_cnt_acc = &dm->false_alm_cnt_acc;
1917
tmp_cca_1sec = falm_cnt_acc->cnt_cca_all_1sec;
1918
tmp_fa_1sec = falm_cnt_acc->cnt_all_1sec;
1919
odm_memory_set(dm, falm_cnt_acc, 0, sizeof(dm->false_alm_cnt_acc));
1920
falm_cnt_acc->cnt_cca_all_1sec = tmp_cca_1sec;
1921
falm_cnt_acc->cnt_all_1sec = tmp_fa_1sec;
1922
#else
1923
falm_cnt_acc = &dm->false_alm_cnt_acc;
1924
/* @Cnt_all_for_rssi_dump & Cnt_CCA_all_for_rssi_dump */
1925
/* @do NOT need to be reset */
1926
odm_memory_set(dm, falm_cnt_acc, 0, sizeof(falm_cnt_acc));
1927
#endif
1928
}
1929
1930
void phydm_false_alarm_counter_reset(void *dm_void)
1931
{
1932
struct dm_struct *dm = (struct dm_struct *)dm_void;
1933
struct phydm_fa_struct *falm_cnt;
1934
struct phydm_dig_struct *dig_t;
1935
u32 timestamp;
1936
1937
falm_cnt = &dm->false_alm_cnt;
1938
dig_t = &dm->dm_dig_table;
1939
1940
memset(falm_cnt, 0, sizeof(dm->false_alm_cnt));
1941
phydm_false_alarm_counter_reg_reset(dm);
1942
1943
#ifdef IS_USE_NEW_TDMA
1944
return;
1945
#endif
1946
if (dig_t->tdma_dig_state != 1)
1947
dig_t->fa_acc_1sec_timestamp = 0;
1948
else
1949
dig_t->fa_acc_1sec_timestamp = dig_t->fa_acc_1sec_timestamp;
1950
1951
/*REG_FREERUN_CNT*/
1952
timestamp = odm_get_bb_reg(dm, R_0x568, bMaskDWord);
1953
dig_t->fa_start_timestamp = timestamp;
1954
dig_t->fa_end_timestamp = timestamp;
1955
}
1956
1957
void phydm_tdma_dig_para_upd(void *dm_void, enum upd_type type, u8 input)
1958
{
1959
struct dm_struct *dm = (struct dm_struct *)dm_void;
1960
1961
switch (type) {
1962
case ENABLE_TDMA:
1963
dm->original_dig_restore = !((boolean)input);
1964
break;
1965
case MODE_DECISION:
1966
if (input == (u8)MODE_PERFORMANCE)
1967
dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES + 2;
1968
else if (input == (u8)MODE_COVERAGE)
1969
dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;
1970
else
1971
dm->tdma_dig_state_number = DIG_NUM_OF_TDMA_STATES;
1972
break;
1973
}
1974
}
1975
1976
#ifdef IS_USE_NEW_TDMA
1977
#if defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI)
1978
static void pre_phydm_tdma_dig_cbk(unsigned long task_dm)
1979
{
1980
struct dm_struct *dm = (struct dm_struct *)task_dm;
1981
struct rtl8192cd_priv *priv = dm->priv;
1982
struct priv_shared_info *pshare = priv->pshare;
1983
1984
if (!(priv->drv_state & DRV_STATE_OPEN))
1985
return;
1986
1987
if (pshare->bDriverStopped || pshare->bSurpriseRemoved) {
1988
printk("[%s] bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
1989
__FUNCTION__, pshare->bDriverStopped,
1990
pshare->bSurpriseRemoved);
1991
return;
1992
}
1993
1994
rtw_enqueue_timer_event(priv, &pshare->tdma_dig_event,
1995
ENQUEUE_TO_TAIL);
1996
}
1997
1998
void phydm_tdma_dig_timers_usb(void *dm_void, u8 state)
1999
{
2000
struct dm_struct *dm = (struct dm_struct *)dm_void;
2001
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2002
2003
if (state == INIT_TDMA_DIG_TIMMER) {
2004
struct rtl8192cd_priv *priv = dm->priv;
2005
2006
init_timer(&dm->tdma_dig_timer);
2007
dm->tdma_dig_timer.data = (unsigned long)dm;
2008
dm->tdma_dig_timer.function = pre_phydm_tdma_dig_cbk;
2009
INIT_TIMER_EVENT_ENTRY(&priv->pshare->tdma_dig_event,
2010
phydm_tdma_dig_cbk,
2011
(unsigned long)dm);
2012
} else if (state == CANCEL_TDMA_DIG_TIMMER) {
2013
odm_cancel_timer(dm, &dm->tdma_dig_timer);
2014
} else if (state == RELEASE_TDMA_DIG_TIMMER) {
2015
odm_release_timer(dm, &dm->tdma_dig_timer);
2016
}
2017
}
2018
#endif /* defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI) */
2019
2020
void phydm_tdma_dig_timers(void *dm_void, u8 state)
2021
{
2022
struct dm_struct *dm = (struct dm_struct *)dm_void;
2023
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2024
#if defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI)
2025
struct rtl8192cd_priv *priv = dm->priv;
2026
2027
if (priv->hci_type == RTL_HCI_USB) {
2028
phydm_tdma_dig_timers_usb(dm_void, state);
2029
return;
2030
}
2031
#endif /* defined(CONFIG_RTL_TRIBAND_SUPPORT) && defined(CONFIG_USB_HCI) */
2032
2033
if (state == INIT_TDMA_DIG_TIMMER)
2034
odm_initialize_timer(dm, &dm->tdma_dig_timer,
2035
(void *)phydm_tdma_dig_cbk,
2036
NULL, "phydm_tdma_dig_timer");
2037
else if (state == CANCEL_TDMA_DIG_TIMMER)
2038
odm_cancel_timer(dm, &dm->tdma_dig_timer);
2039
else if (state == RELEASE_TDMA_DIG_TIMMER)
2040
odm_release_timer(dm, &dm->tdma_dig_timer);
2041
}
2042
2043
u8 get_new_igi_bound(struct dm_struct *dm, u8 igi, u32 fa_cnt, u8 *rx_gain_max,
2044
u8 *rx_gain_min, boolean is_dfs_band)
2045
{
2046
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2047
u8 step[3] = {0};
2048
u8 cur_igi = igi;
2049
2050
if (dm->is_linked) {
2051
if (dm->pre_rssi_min <= dm->rssi_min) {
2052
PHYDM_DBG(dm, DBG_DIG, "pre_rssi_min <= rssi_min\n");
2053
step[0] = 2;
2054
step[1] = 1;
2055
step[2] = 2;
2056
} else {
2057
step[0] = 4;
2058
step[1] = 2;
2059
step[2] = 2;
2060
}
2061
} else {
2062
step[0] = 2;
2063
step[1] = 1;
2064
step[2] = 2;
2065
}
2066
2067
PHYDM_DBG(dm, DBG_DIG, "step = {-%d, +%d, +%d}\n", step[2], step[1],
2068
step[0]);
2069
2070
if (dm->first_connect) {
2071
if (is_dfs_band) {
2072
if (dm->rssi_min > DIG_MAX_DFS)
2073
igi = DIG_MAX_DFS;
2074
else
2075
igi = dm->rssi_min;
2076
PHYDM_DBG(dm, DBG_DIG, "DFS band:IgiMax=0x%x\n",
2077
*rx_gain_max);
2078
} else {
2079
igi = *rx_gain_min;
2080
}
2081
2082
#if 0
2083
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
2084
#if (RTL8812A_SUPPORT)
2085
if (dm->support_ic_type == ODM_RTL8812)
2086
odm_config_bb_with_header_file(dm,
2087
CONFIG_BB_AGC_TAB_DIFF);
2088
#endif
2089
#endif
2090
#endif
2091
PHYDM_DBG(dm, DBG_DIG, "First connect: foce IGI=0x%x\n", igi);
2092
} else {
2093
/* @2 Before link */
2094
PHYDM_DBG(dm, DBG_DIG, "Adjust IGI before link\n");
2095
2096
if (dm->first_disconnect) {
2097
igi = dig_t->dm_dig_min;
2098
PHYDM_DBG(dm, DBG_DIG,
2099
"First disconnect:foce IGI to lower bound\n");
2100
} else {
2101
PHYDM_DBG(dm, DBG_DIG, "Pre_IGI=((0x%x)), FA=((%d))\n",
2102
igi, fa_cnt);
2103
2104
igi = phydm_new_igi_by_fa(dm, igi, fa_cnt, step);
2105
}
2106
}
2107
/*@Check IGI by dyn-upper/lower bound */
2108
if (igi < *rx_gain_min)
2109
igi = *rx_gain_min;
2110
2111
if (igi > *rx_gain_max)
2112
igi = *rx_gain_max;
2113
2114
PHYDM_DBG(dm, DBG_DIG, "fa_cnt = %d, IGI: 0x%x -> 0x%x\n",
2115
fa_cnt, cur_igi, igi);
2116
2117
return igi;
2118
}
2119
2120
void phydm_tdma_dig_new(void *dm_void)
2121
{
2122
struct dm_struct *dm = (struct dm_struct *)dm_void;
2123
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2124
2125
if (phydm_dig_abort(dm) || dm->original_dig_restore)
2126
return;
2127
/*@
2128
*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");
2129
* dig_t->tdma_dig_state);
2130
*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",
2131
* dig_t->cur_ig_value_tdma,
2132
* dig_t->low_ig_value);
2133
*/
2134
phydm_tdma_fa_cnt_chk(dm);
2135
2136
/*@prevent dumb*/
2137
if (dm->tdma_dig_state_number < 2)
2138
dm->tdma_dig_state_number = 2;
2139
2140
/*@update state*/
2141
dig_t->tdma_dig_cnt++;
2142
dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
2143
2144
/*@
2145
*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",
2146
* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);
2147
*/
2148
2149
if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2150
odm_write_dig(dm, dig_t->low_ig_value);
2151
else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2152
odm_write_dig(dm, dig_t->cur_ig_value_tdma);
2153
2154
odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);
2155
}
2156
2157
/*@callback function triggered by SW timer*/
2158
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2159
void phydm_tdma_dig_cbk(struct phydm_timer_list *timer)
2160
{
2161
void *adapter = (void *)timer->Adapter;
2162
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2163
struct dm_struct *dm = &hal_data->DM_OutSrcs;
2164
2165
#if DEV_BUS_TYPE == RT_PCI_INTERFACE
2166
#if USE_WORKITEM
2167
odm_schedule_work_item(&dm->phydm_tdma_dig_workitem);
2168
#else
2169
phydm_tdma_dig_new(dm);
2170
#endif
2171
#else
2172
odm_schedule_work_item(&dm->phydm_tdma_dig_workitem);
2173
#endif
2174
}
2175
2176
void phydm_tdma_dig_workitem_callback(void *context)
2177
{
2178
void *adapter = (void *)context;
2179
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2180
struct dm_struct *dm = &hal_data->DM_OutSrc;
2181
2182
phydm_tdma_dig_new(dm);
2183
}
2184
2185
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
2186
void phydm_tdma_dig_cbk(void *dm_void)
2187
{
2188
struct dm_struct *dm = (struct dm_struct *)dm_void;
2189
void *padapter = dm->adapter;
2190
2191
if (dm->support_interface == ODM_ITRF_PCIE)
2192
phydm_tdma_dig_workitem_callback(dm);
2193
/* @Can't do I/O in timer callback*/
2194
else
2195
phydm_run_in_thread_cmd(dm, phydm_tdma_dig_workitem_callback,
2196
dm);
2197
}
2198
2199
void phydm_tdma_dig_workitem_callback(void *dm_void)
2200
{
2201
struct dm_struct *dm = (struct dm_struct *)dm_void;
2202
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2203
2204
if (phydm_dig_abort(dm) || (dm->original_dig_restore))
2205
return;
2206
/*@
2207
*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");
2208
* dig_t->tdma_dig_state);
2209
*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",
2210
* dig_t->cur_ig_value_tdma,
2211
* dig_t->low_ig_value);
2212
*/
2213
phydm_tdma_fa_cnt_chk(dm);
2214
2215
/*@prevent dumb*/
2216
if (dm->tdma_dig_state_number < 2)
2217
dm->tdma_dig_state_number = 2;
2218
2219
/*@update state*/
2220
dig_t->tdma_dig_cnt++;
2221
dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
2222
2223
/*@
2224
*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",
2225
* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);
2226
*/
2227
2228
if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2229
odm_write_dig(dm, dig_t->low_ig_value);
2230
else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2231
odm_write_dig(dm, dig_t->cur_ig_value_tdma);
2232
2233
odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);
2234
}
2235
#else
2236
void phydm_tdma_dig_cbk(void *dm_void)
2237
{
2238
struct dm_struct *dm = (struct dm_struct *)dm_void;
2239
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2240
2241
if (phydm_dig_abort(dm) || dm->original_dig_restore)
2242
return;
2243
/*@
2244
*PHYDM_DBG(dm, DBG_DIG, "timer callback =======> tdma_dig_state=%d\n");
2245
* dig_t->tdma_dig_state);
2246
*PHYDM_DBG(dm, DBG_DIG, "tdma_h_igi=0x%x, tdma_l_igi=0x%x\n",
2247
* dig_t->cur_ig_value_tdma,
2248
* dig_t->low_ig_value);
2249
*/
2250
phydm_tdma_fa_cnt_chk(dm);
2251
2252
/*@prevent dumb*/
2253
if (dm->tdma_dig_state_number < 2)
2254
dm->tdma_dig_state_number = 2;
2255
2256
/*@update state*/
2257
dig_t->tdma_dig_cnt++;
2258
dig_t->tdma_dig_state = dig_t->tdma_dig_cnt % dm->tdma_dig_state_number;
2259
2260
/*@
2261
*PHYDM_DBG(dm, DBG_DIG, "enter state %d, dig count %d\n",
2262
* dig_t->tdma_dig_state, dig_t->tdma_dig_cnt);
2263
*/
2264
2265
if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2266
odm_write_dig(dm, dig_t->low_ig_value);
2267
else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2268
odm_write_dig(dm, dig_t->cur_ig_value_tdma);
2269
2270
odm_set_timer(dm, &dm->tdma_dig_timer, dm->tdma_dig_timer_ms);
2271
}
2272
#endif
2273
/*@============================================================*/
2274
/*@FASLE ALARM CHECK*/
2275
/*@============================================================*/
2276
void phydm_tdma_fa_cnt_chk(void *dm_void)
2277
{
2278
struct dm_struct *dm = (struct dm_struct *)dm_void;
2279
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2280
struct phydm_fa_acc_struct *fa_t_acc = &dm->false_alm_cnt_acc;
2281
struct phydm_fa_acc_struct *fa_t_acc_low = &dm->false_alm_cnt_acc_low;
2282
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2283
boolean tdma_dig_block_1sec_flag = false;
2284
u32 timestamp = 0;
2285
u8 states_per_block = dm->tdma_dig_state_number;
2286
u8 cur_tdma_dig_state = 0;
2287
u32 start_th = 0;
2288
u8 state_diff = 0;
2289
u32 tdma_dig_block_period_ms = 0;
2290
u32 tdma_dig_block_cnt_thd = 0;
2291
u32 timestamp_diff = 0;
2292
2293
/*@calculate duration of a tdma block*/
2294
tdma_dig_block_period_ms = dm->tdma_dig_timer_ms * states_per_block;
2295
2296
/*@
2297
*caution!ONE_SEC_MS must be divisible by tdma_dig_block_period_ms,
2298
*or FA will be fewer.
2299
*/
2300
tdma_dig_block_cnt_thd = ONE_SEC_MS / tdma_dig_block_period_ms;
2301
2302
/*@tdma_dig_state == 0, collect H-state FA, else, collect L-state FA*/
2303
if (dig_t->tdma_dig_state == TDMA_DIG_LOW_STATE)
2304
cur_tdma_dig_state = TDMA_DIG_LOW_STATE;
2305
else if (dig_t->tdma_dig_state >= TDMA_DIG_HIGH_STATE)
2306
cur_tdma_dig_state = TDMA_DIG_HIGH_STATE;
2307
/*@
2308
*PHYDM_DBG(dm, DBG_DIG, "in state %d, dig count %d\n",
2309
* cur_tdma_dig_state, dig_t->tdma_dig_cnt);
2310
*/
2311
if (cur_tdma_dig_state == 0) {
2312
/*@L-state indicates next block*/
2313
dig_t->tdma_dig_block_cnt++;
2314
2315
/*@1sec dump check*/
2316
if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)
2317
tdma_dig_block_1sec_flag = true;
2318
2319
/*@
2320
*PHYDM_DBG(dm, DBG_DIG,"[L-state] tdma_dig_block_cnt=%d\n",
2321
* dig_t->tdma_dig_block_cnt);
2322
*/
2323
2324
/*@collect FA till this block end*/
2325
phydm_false_alarm_counter_statistics(dm);
2326
phydm_fa_cnt_acc(dm, tdma_dig_block_1sec_flag,
2327
cur_tdma_dig_state);
2328
/*@1s L-FA collect end*/
2329
2330
/*@1sec dump reached*/
2331
if (tdma_dig_block_1sec_flag) {
2332
/*@L-DIG*/
2333
phydm_noisy_detection(dm);
2334
#ifdef PHYDM_SUPPORT_CCKPD
2335
phydm_cck_pd_th(dm);
2336
#endif
2337
PHYDM_DBG(dm, DBG_DIG, "run tdma L-state dig ====>\n");
2338
phydm_tdma_low_dig(dm);
2339
PHYDM_DBG(dm, DBG_DIG, "\n\n");
2340
}
2341
} else if (cur_tdma_dig_state == 1) {
2342
/*@1sec dump check*/
2343
if (dig_t->tdma_dig_block_cnt >= tdma_dig_block_cnt_thd)
2344
tdma_dig_block_1sec_flag = true;
2345
2346
/*@
2347
*PHYDM_DBG(dm, DBG_DIG,"[H-state] tdma_dig_block_cnt=%d\n",
2348
* dig_t->tdma_dig_block_cnt);
2349
*/
2350
2351
/*@collect FA till this block end*/
2352
phydm_false_alarm_counter_statistics(dm);
2353
phydm_fa_cnt_acc(dm, tdma_dig_block_1sec_flag,
2354
cur_tdma_dig_state);
2355
/*@1s H-FA collect end*/
2356
2357
/*@1sec dump reached*/
2358
state_diff = dm->tdma_dig_state_number - dig_t->tdma_dig_state;
2359
if (tdma_dig_block_1sec_flag && state_diff == 1) {
2360
/*@H-DIG*/
2361
phydm_noisy_detection(dm);
2362
#ifdef PHYDM_SUPPORT_CCKPD
2363
phydm_cck_pd_th(dm);
2364
#endif
2365
PHYDM_DBG(dm, DBG_DIG, "run tdma H-state dig ====>\n");
2366
phydm_tdma_high_dig(dm);
2367
PHYDM_DBG(dm, DBG_DIG, "\n\n");
2368
PHYDM_DBG(dm, DBG_DIG, "1 sec reached, is_linked=%d\n",
2369
dm->is_linked);
2370
PHYDM_DBG(dm, DBG_DIG, "1 sec L-CCA=%d, L-FA=%d\n",
2371
fa_t_acc_low->cnt_cca_all_1sec,
2372
fa_t_acc_low->cnt_all_1sec);
2373
PHYDM_DBG(dm, DBG_DIG, "1 sec H-CCA=%d, H-FA=%d\n",
2374
fa_t_acc->cnt_cca_all_1sec,
2375
fa_t_acc->cnt_all_1sec);
2376
PHYDM_DBG(dm, DBG_DIG,
2377
"1 sec TOTAL-CCA=%d, TOTAL-FA=%d\n\n",
2378
fa_t_acc->cnt_cca_all +
2379
fa_t_acc_low->cnt_cca_all,
2380
fa_t_acc->cnt_all + fa_t_acc_low->cnt_all);
2381
2382
/*@Reset AccFalseAlarmCounterStatistics */
2383
phydm_false_alarm_counter_acc_reset(dm);
2384
dig_t->tdma_dig_block_cnt = 0;
2385
}
2386
}
2387
/*@Reset FalseAlarmCounterStatistics */
2388
phydm_false_alarm_counter_reset(dm);
2389
}
2390
2391
void phydm_tdma_low_dig(void *dm_void)
2392
{
2393
struct dm_struct *dm = (struct dm_struct *)dm_void;
2394
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2395
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2396
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc_low;
2397
#ifdef CFG_DIG_DAMPING_CHK
2398
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
2399
#endif
2400
u8 igi = dig_t->cur_ig_value;
2401
u8 new_igi = 0x20;
2402
u8 tdma_l_igi = dig_t->low_ig_value;
2403
u8 tdma_l_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE];
2404
u8 tdma_l_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE];
2405
u32 fa_cnt = falm_cnt->cnt_all;
2406
boolean dfs_mode_en = false, is_performance = true;
2407
u8 rssi_min = dm->rssi_min;
2408
u8 igi_upper_rssi_min = 0;
2409
u8 offset = 15;
2410
2411
if (!(dm->original_dig_restore)) {
2412
if (tdma_l_igi == 0)
2413
tdma_l_igi = igi;
2414
2415
fa_cnt = falm_cnt_acc->cnt_all_1sec;
2416
}
2417
2418
if (phydm_dig_abort(dm)) {
2419
dig_t->low_ig_value = phydm_get_igi(dm, BB_PATH_A);
2420
return;
2421
}
2422
2423
/*@Mode Decision*/
2424
dfs_mode_en = false;
2425
is_performance = true;
2426
2427
/* @Abs Boundary Decision*/
2428
dig_t->dm_dig_max = DIG_MAX_COVERAGR; //0x26
2429
dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; //0x20
2430
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_COVERAGE; //0x22
2431
2432
if (dfs_mode_en) {
2433
if (*dm->band_width == CHANNEL_WIDTH_20)
2434
dig_t->dm_dig_min = DIG_MIN_DFS + 2;
2435
else
2436
dig_t->dm_dig_min = DIG_MIN_DFS;
2437
2438
} else {
2439
#if 0
2440
if (dm->support_ic_type &
2441
(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
2442
dig_t->dm_dig_min = 0x1c;
2443
else if (dm->support_ic_type & ODM_RTL8197F)
2444
dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
2445
#endif
2446
}
2447
2448
PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
2449
dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
2450
2451
/* @Dyn Boundary by RSSI*/
2452
if (!dm->is_linked) {
2453
/*@if no link, always stay at lower bound*/
2454
tdma_l_dym_max = 0x26;
2455
tdma_l_dym_min = dig_t->dm_dig_min;
2456
2457
PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
2458
tdma_l_dym_max, tdma_l_dym_min);
2459
} else {
2460
PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",
2461
dm->rssi_min, offset);
2462
2463
/* @DIG lower bound in L-state*/
2464
tdma_l_dym_min = dig_t->dm_dig_min;
2465
2466
/*@
2467
*#ifdef CFG_DIG_DAMPING_CHK
2468
*@Limit Dyn min by damping
2469
*if (dig_t->dig_dl_en &&
2470
* dig_rc->damping_limit_en &&
2471
* tdma_l_dym_min < dig_rc->damping_limit_val) {
2472
* PHYDM_DBG(dm, DBG_DIG,
2473
* "[Limit by Damping] dyn_min=0x%x -> 0x%x\n",
2474
* tdma_l_dym_min, dig_rc->damping_limit_val);
2475
*
2476
* tdma_l_dym_min = dig_rc->damping_limit_val;
2477
*}
2478
*#endif
2479
*/
2480
2481
/*@DIG upper bound in L-state*/
2482
igi_upper_rssi_min = rssi_min + offset;
2483
if (igi_upper_rssi_min > dig_t->dm_dig_max)
2484
tdma_l_dym_max = dig_t->dm_dig_max;
2485
else if (igi_upper_rssi_min < dig_t->dm_dig_min)
2486
tdma_l_dym_max = dig_t->dm_dig_min;
2487
else
2488
tdma_l_dym_max = igi_upper_rssi_min;
2489
2490
/* @1 Force Lower Bound for AntDiv */
2491
/*@
2492
*if (!dm->is_one_entry_only &&
2493
*(dm->support_ability & ODM_BB_ANT_DIV) &&
2494
*(dm->ant_div_type == CG_TRX_HW_ANTDIV ||
2495
*dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
2496
*if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
2497
* dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
2498
*else
2499
* dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
2500
*
2501
*PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
2502
* dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
2503
*}
2504
*/
2505
2506
PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
2507
tdma_l_dym_max, tdma_l_dym_min);
2508
}
2509
2510
/*@Abnormal Case Check*/
2511
/*@Abnormal lower bound case*/
2512
if (tdma_l_dym_min > tdma_l_dym_max)
2513
tdma_l_dym_min = tdma_l_dym_max;
2514
2515
PHYDM_DBG(dm, DBG_DIG,
2516
"Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",
2517
tdma_l_dym_max, tdma_l_dym_min);
2518
2519
/*@False Alarm Threshold Decision*/
2520
phydm_fa_threshold_check(dm, dfs_mode_en);
2521
2522
/*@Adjust Initial Gain by False Alarm*/
2523
/*Select new IGI by FA */
2524
if (!(dm->original_dig_restore)) {
2525
tdma_l_igi = get_new_igi_bound(dm, tdma_l_igi, fa_cnt,
2526
&tdma_l_dym_max,
2527
&tdma_l_dym_min,
2528
dfs_mode_en);
2529
} else {
2530
new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
2531
}
2532
2533
/*Update status*/
2534
if (!(dm->original_dig_restore)) {
2535
dig_t->low_ig_value = tdma_l_igi;
2536
dig_t->tdma_rx_gain_min[TDMA_DIG_LOW_STATE] = tdma_l_dym_min;
2537
dig_t->tdma_rx_gain_max[TDMA_DIG_LOW_STATE] = tdma_l_dym_max;
2538
#if 0
2539
/*odm_write_dig(dm, tdma_l_igi);*/
2540
#endif
2541
} else {
2542
odm_write_dig(dm, new_igi);
2543
}
2544
}
2545
2546
void phydm_tdma_high_dig(void *dm_void)
2547
{
2548
struct dm_struct *dm = (struct dm_struct *)dm_void;
2549
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2550
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2551
struct phydm_fa_acc_struct *falm_cnt_acc = &dm->false_alm_cnt_acc;
2552
#ifdef CFG_DIG_DAMPING_CHK
2553
struct phydm_dig_recorder_strcut *dig_rc = &dig_t->dig_recorder_t;
2554
#endif
2555
u8 igi = dig_t->cur_ig_value;
2556
u8 new_igi = 0x20;
2557
u8 tdma_h_igi = dig_t->cur_ig_value_tdma;
2558
u8 tdma_h_dym_min = dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE];
2559
u8 tdma_h_dym_max = dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE];
2560
u32 fa_cnt = falm_cnt->cnt_all;
2561
boolean dfs_mode_en = false, is_performance = true;
2562
u8 rssi_min = dm->rssi_min;
2563
u8 igi_upper_rssi_min = 0;
2564
u8 offset = 15;
2565
2566
if (!(dm->original_dig_restore)) {
2567
if (tdma_h_igi == 0)
2568
tdma_h_igi = igi;
2569
2570
fa_cnt = falm_cnt_acc->cnt_all_1sec;
2571
}
2572
2573
if (phydm_dig_abort(dm)) {
2574
dig_t->cur_ig_value_tdma = phydm_get_igi(dm, BB_PATH_A);
2575
return;
2576
}
2577
2578
/*@Mode Decision*/
2579
dfs_mode_en = false;
2580
is_performance = true;
2581
2582
/*@Abs Boundary Decision*/
2583
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE; // 0x2a
2584
2585
if (!dm->is_linked) {
2586
dig_t->dm_dig_max = DIG_MAX_COVERAGR;
2587
dig_t->dm_dig_min = DIG_MIN_PERFORMANCE; // 0x20
2588
} else if (dfs_mode_en) {
2589
if (*dm->band_width == CHANNEL_WIDTH_20)
2590
dig_t->dm_dig_min = DIG_MIN_DFS + 2;
2591
else
2592
dig_t->dm_dig_min = DIG_MIN_DFS;
2593
2594
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
2595
dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
2596
} else {
2597
if (*dm->bb_op_mode == PHYDM_BALANCE_MODE) {
2598
/*service > 2 devices*/
2599
dig_t->dm_dig_max = DIG_MAX_BALANCE_MODE;
2600
#if (DIG_HW == 1)
2601
dig_t->dig_max_of_min = DIG_MIN_COVERAGE;
2602
#else
2603
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_BALANCE_MODE;
2604
#endif
2605
} else if (*dm->bb_op_mode == PHYDM_PERFORMANCE_MODE) {
2606
/*service 1 devices*/
2607
dig_t->dm_dig_max = DIG_MAX_PERFORMANCE_MODE;
2608
dig_t->dig_max_of_min = DIG_MAX_OF_MIN_PERFORMANCE_MODE;
2609
}
2610
2611
#if 0
2612
if (dm->support_ic_type &
2613
(ODM_RTL8814A | ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8822B))
2614
dig_t->dm_dig_min = 0x1c;
2615
else if (dm->support_ic_type & ODM_RTL8197F)
2616
dig_t->dm_dig_min = 0x1e; /*@For HW setting*/
2617
else
2618
#endif
2619
dig_t->dm_dig_min = DIG_MIN_PERFORMANCE;
2620
}
2621
PHYDM_DBG(dm, DBG_DIG, "Abs{Max, Min}={0x%x, 0x%x}, Max_of_min=0x%x\n",
2622
dig_t->dm_dig_max, dig_t->dm_dig_min, dig_t->dig_max_of_min);
2623
2624
/*@Dyn Boundary by RSSI*/
2625
if (!dm->is_linked) {
2626
/*@if no link, always stay at lower bound*/
2627
tdma_h_dym_max = dig_t->dig_max_of_min;
2628
tdma_h_dym_min = dig_t->dm_dig_min;
2629
2630
PHYDM_DBG(dm, DBG_DIG, "No-Link, Dyn{Max, Min}={0x%x, 0x%x}\n",
2631
tdma_h_dym_max, tdma_h_dym_min);
2632
} else {
2633
PHYDM_DBG(dm, DBG_DIG, "rssi_min=%d, ofst=%d\n",
2634
dm->rssi_min, offset);
2635
2636
/* @DIG lower bound in H-state*/
2637
if (rssi_min < dig_t->dm_dig_min)
2638
tdma_h_dym_min = dig_t->dm_dig_min;
2639
else
2640
tdma_h_dym_min = rssi_min; // turbo not considered yet
2641
2642
#ifdef CFG_DIG_DAMPING_CHK
2643
/*@Limit Dyn min by damping*/
2644
if (dig_t->dig_dl_en &&
2645
dig_rc->damping_limit_en &&
2646
tdma_h_dym_min < dig_rc->damping_limit_val) {
2647
PHYDM_DBG(dm, DBG_DIG,
2648
"[Limit by Damping] dyn_min=0x%x -> 0x%x\n",
2649
tdma_h_dym_min, dig_rc->damping_limit_val);
2650
2651
tdma_h_dym_min = dig_rc->damping_limit_val;
2652
}
2653
#endif
2654
2655
/*@DIG upper bound in H-state*/
2656
igi_upper_rssi_min = rssi_min + offset;
2657
if (igi_upper_rssi_min > dig_t->dm_dig_max)
2658
tdma_h_dym_max = dig_t->dm_dig_max;
2659
else
2660
tdma_h_dym_max = igi_upper_rssi_min;
2661
2662
/* @1 Force Lower Bound for AntDiv */
2663
/*@
2664
*if (!dm->is_one_entry_only &&
2665
*(dm->support_ability & ODM_BB_ANT_DIV) &&
2666
*(dm->ant_div_type == CG_TRX_HW_ANTDIV ||
2667
*dm->ant_div_type == CG_TRX_SMART_ANTDIV)) {
2668
* if (dig_t->ant_div_rssi_max > dig_t->dig_max_of_min)
2669
* dig_t->rx_gain_range_min = dig_t->dig_max_of_min;
2670
* else
2671
* dig_t->rx_gain_range_min = (u8)dig_t->ant_div_rssi_max;
2672
*/
2673
/*@
2674
*PHYDM_DBG(dm, DBG_DIG, "Force Dyn-Min=0x%x, RSSI_max=0x%x\n",
2675
* dig_t->rx_gain_range_min, dig_t->ant_div_rssi_max);
2676
*}
2677
*/
2678
PHYDM_DBG(dm, DBG_DIG, "Dyn{Max, Min}={0x%x, 0x%x}\n",
2679
tdma_h_dym_max, tdma_h_dym_min);
2680
}
2681
2682
/*@Abnormal Case Check*/
2683
/*@Abnormal low higher bound case*/
2684
if (tdma_h_dym_max < dig_t->dm_dig_min)
2685
tdma_h_dym_max = dig_t->dm_dig_min;
2686
/*@Abnormal lower bound case*/
2687
if (tdma_h_dym_min > tdma_h_dym_max)
2688
tdma_h_dym_min = tdma_h_dym_max;
2689
2690
PHYDM_DBG(dm, DBG_DIG, "Abnoraml chk, force {Max, Min}={0x%x, 0x%x}\n",
2691
tdma_h_dym_max, tdma_h_dym_min);
2692
2693
/*@False Alarm Threshold Decision*/
2694
phydm_fa_threshold_check(dm, dfs_mode_en);
2695
2696
/*@Adjust Initial Gain by False Alarm*/
2697
/*Select new IGI by FA */
2698
if (!(dm->original_dig_restore)) {
2699
tdma_h_igi = get_new_igi_bound(dm, tdma_h_igi, fa_cnt,
2700
&tdma_h_dym_max,
2701
&tdma_h_dym_min,
2702
dfs_mode_en);
2703
} else {
2704
new_igi = phydm_get_new_igi(dm, igi, fa_cnt, dfs_mode_en);
2705
}
2706
2707
/*Update status*/
2708
if (!(dm->original_dig_restore)) {
2709
dig_t->cur_ig_value_tdma = tdma_h_igi;
2710
dig_t->tdma_rx_gain_min[TDMA_DIG_HIGH_STATE] = tdma_h_dym_min;
2711
dig_t->tdma_rx_gain_max[TDMA_DIG_HIGH_STATE] = tdma_h_dym_max;
2712
#if 0
2713
/*odm_write_dig(dm, tdma_h_igi);*/
2714
#endif
2715
} else {
2716
odm_write_dig(dm, new_igi);
2717
}
2718
}
2719
2720
void phydm_fa_cnt_acc(void *dm_void, boolean tdma_dig_block_1sec_flag,
2721
u8 cur_tdma_dig_state)
2722
{
2723
struct dm_struct *dm = (struct dm_struct *)dm_void;
2724
struct phydm_fa_struct *falm_cnt = &dm->false_alm_cnt;
2725
struct phydm_fa_acc_struct *falm_cnt_acc = NULL;
2726
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2727
u8 factor_num = 0;
2728
u8 factor_denum = 1;
2729
u8 total_state_number = 0;
2730
2731
if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE)
2732
falm_cnt_acc = &dm->false_alm_cnt_acc_low;
2733
else if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE)
2734
2735
falm_cnt_acc = &dm->false_alm_cnt_acc;
2736
/*@
2737
*PHYDM_DBG(dm, DBG_DIG,
2738
* "[%s] ==> dig_state=%d, one_sec=%d\n", __func__,
2739
* cur_tdma_dig_state, tdma_dig_block_1sec_flag);
2740
*/
2741
falm_cnt_acc->cnt_parity_fail += falm_cnt->cnt_parity_fail;
2742
falm_cnt_acc->cnt_rate_illegal += falm_cnt->cnt_rate_illegal;
2743
falm_cnt_acc->cnt_crc8_fail += falm_cnt->cnt_crc8_fail;
2744
falm_cnt_acc->cnt_mcs_fail += falm_cnt->cnt_mcs_fail;
2745
falm_cnt_acc->cnt_ofdm_fail += falm_cnt->cnt_ofdm_fail;
2746
falm_cnt_acc->cnt_cck_fail += falm_cnt->cnt_cck_fail;
2747
falm_cnt_acc->cnt_all += falm_cnt->cnt_all;
2748
falm_cnt_acc->cnt_fast_fsync += falm_cnt->cnt_fast_fsync;
2749
falm_cnt_acc->cnt_sb_search_fail += falm_cnt->cnt_sb_search_fail;
2750
falm_cnt_acc->cnt_ofdm_cca += falm_cnt->cnt_ofdm_cca;
2751
falm_cnt_acc->cnt_cck_cca += falm_cnt->cnt_cck_cca;
2752
falm_cnt_acc->cnt_cca_all += falm_cnt->cnt_cca_all;
2753
falm_cnt_acc->cnt_cck_crc32_error += falm_cnt->cnt_cck_crc32_error;
2754
falm_cnt_acc->cnt_cck_crc32_ok += falm_cnt->cnt_cck_crc32_ok;
2755
falm_cnt_acc->cnt_ofdm_crc32_error += falm_cnt->cnt_ofdm_crc32_error;
2756
falm_cnt_acc->cnt_ofdm_crc32_ok += falm_cnt->cnt_ofdm_crc32_ok;
2757
falm_cnt_acc->cnt_ht_crc32_error += falm_cnt->cnt_ht_crc32_error;
2758
falm_cnt_acc->cnt_ht_crc32_ok += falm_cnt->cnt_ht_crc32_ok;
2759
falm_cnt_acc->cnt_vht_crc32_error += falm_cnt->cnt_vht_crc32_error;
2760
falm_cnt_acc->cnt_vht_crc32_ok += falm_cnt->cnt_vht_crc32_ok;
2761
falm_cnt_acc->cnt_crc32_error_all += falm_cnt->cnt_crc32_error_all;
2762
falm_cnt_acc->cnt_crc32_ok_all += falm_cnt->cnt_crc32_ok_all;
2763
2764
/*@
2765
*PHYDM_DBG(dm, DBG_DIG,
2766
* "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2767
* falm_cnt->cnt_cck_cca,
2768
* falm_cnt->cnt_ofdm_cca,
2769
* falm_cnt->cnt_cca_all);
2770
*PHYDM_DBG(dm, DBG_DIG,
2771
* "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2772
* falm_cnt->cnt_cck_fail,
2773
* falm_cnt->cnt_ofdm_fail,
2774
* falm_cnt->cnt_all);
2775
*/
2776
if (tdma_dig_block_1sec_flag) {
2777
total_state_number = dm->tdma_dig_state_number;
2778
2779
if (cur_tdma_dig_state == TDMA_DIG_HIGH_STATE) {
2780
factor_num = total_state_number;
2781
factor_denum = total_state_number - 1;
2782
} else if (cur_tdma_dig_state == TDMA_DIG_LOW_STATE) {
2783
factor_num = total_state_number;
2784
factor_denum = 1;
2785
}
2786
2787
falm_cnt_acc->cnt_all_1sec =
2788
falm_cnt_acc->cnt_all * factor_num / factor_denum;
2789
falm_cnt_acc->cnt_cca_all_1sec =
2790
falm_cnt_acc->cnt_cca_all * factor_num / factor_denum;
2791
falm_cnt_acc->cnt_cck_fail_1sec =
2792
falm_cnt_acc->cnt_cck_fail * factor_num / factor_denum;
2793
2794
PHYDM_DBG(dm, DBG_DIG,
2795
"[ACC CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",
2796
falm_cnt_acc->cnt_cck_cca,
2797
falm_cnt_acc->cnt_ofdm_cca,
2798
falm_cnt_acc->cnt_cca_all);
2799
PHYDM_DBG(dm, DBG_DIG,
2800
"[ACC FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n\n",
2801
falm_cnt_acc->cnt_cck_fail,
2802
falm_cnt_acc->cnt_ofdm_fail,
2803
falm_cnt_acc->cnt_all);
2804
2805
}
2806
}
2807
#endif /*@#ifdef IS_USE_NEW_TDMA*/
2808
#endif /*@#ifdef PHYDM_TDMA_DIG_SUPPORT*/
2809
2810
void phydm_dig_debug(void *dm_void, char input[][16], u32 *_used, char *output,
2811
u32 *_out_len)
2812
{
2813
struct dm_struct *dm = (struct dm_struct *)dm_void;
2814
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2815
char help[] = "-h";
2816
u32 var1[10] = {0};
2817
u32 used = *_used;
2818
u32 out_len = *_out_len;
2819
u8 i = 0;
2820
2821
if ((strcmp(input[1], help) == 0)) {
2822
PDM_SNPF(out_len, used, output + used, out_len - used,
2823
"{0} {en} fa_th[0] fa_th[1] fa_th[2]\n");
2824
PDM_SNPF(out_len, used, output + used, out_len - used,
2825
"{1} {Damping Limit en}\n");
2826
#ifdef PHYDM_TDMA_DIG_SUPPORT
2827
PDM_SNPF(out_len, used, output + used, out_len - used,
2828
"{2} {original_dig_restore = %d}\n",
2829
dm->original_dig_restore);
2830
PDM_SNPF(out_len, used, output + used, out_len - used,
2831
"{3} {tdma_dig_timer_ms = %d}\n",
2832
dm->tdma_dig_timer_ms);
2833
PDM_SNPF(out_len, used, output + used, out_len - used,
2834
"{4} {tdma_dig_state_number = %d}\n",
2835
dm->tdma_dig_state_number);
2836
#endif
2837
} else {
2838
PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
2839
2840
for (i = 1; i < 10; i++)
2841
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);
2842
2843
if (var1[0] == 0) {
2844
if (var1[1] == 1) {
2845
dig_t->is_dbg_fa_th = true;
2846
dig_t->fa_th[0] = (u16)var1[2];
2847
dig_t->fa_th[1] = (u16)var1[3];
2848
dig_t->fa_th[2] = (u16)var1[4];
2849
2850
PDM_SNPF(out_len, used, output + used,
2851
out_len - used,
2852
"Set DIG fa_th[0:2]= {%d, %d, %d}\n",
2853
dig_t->fa_th[0], dig_t->fa_th[1],
2854
dig_t->fa_th[2]);
2855
} else {
2856
dig_t->is_dbg_fa_th = false;
2857
}
2858
#ifdef PHYDM_TDMA_DIG_SUPPORT
2859
} else if (var1[0] == 2) {
2860
dm->original_dig_restore = (u8)var1[1];
2861
if (dm->original_dig_restore == 1) {
2862
PDM_SNPF(out_len, used, output + used,
2863
out_len - used, "Disable TDMA-DIG\n");
2864
} else {
2865
PDM_SNPF(out_len, used, output + used,
2866
out_len - used, "Enable TDMA-DIG\n");
2867
}
2868
} else if (var1[0] == 3) {
2869
dm->tdma_dig_timer_ms = (u8)var1[1];
2870
PDM_SNPF(out_len, used, output + used,
2871
out_len - used, "tdma_dig_timer_ms = %d\n",
2872
dm->tdma_dig_timer_ms);
2873
} else if (var1[0] == 4) {
2874
dm->tdma_dig_state_number = (u8)var1[1];
2875
PDM_SNPF(out_len, used, output + used,
2876
out_len - used, "tdma_dig_state_number = %d\n",
2877
dm->tdma_dig_state_number);
2878
#endif
2879
}
2880
2881
#ifdef CFG_DIG_DAMPING_CHK
2882
else if (var1[0] == 1) {
2883
dig_t->dig_dl_en = (u8)var1[1];
2884
/*@*/
2885
}
2886
#endif
2887
}
2888
*_used = used;
2889
*_out_len = out_len;
2890
}
2891
2892
#ifdef CONFIG_MCC_DM
2893
#if (RTL8822B_SUPPORT || RTL8822C_SUPPORT)
2894
void phydm_mcc_igi_clr(void *dm_void, u8 clr_port)
2895
{
2896
struct dm_struct *dm = (struct dm_struct *)dm_void;
2897
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2898
2899
mcc_dm->mcc_rssi[clr_port] = 0xff;
2900
mcc_dm->mcc_dm_val[0][clr_port] = 0xff; /* 0xc50 clr */
2901
mcc_dm->mcc_dm_val[1][clr_port] = 0xff; /* 0xe50 clr */
2902
}
2903
2904
void phydm_mcc_igi_chk(void *dm_void)
2905
{
2906
struct dm_struct *dm = (struct dm_struct *)dm_void;
2907
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2908
2909
if (mcc_dm->mcc_dm_val[0][0] == 0xff &&
2910
mcc_dm->mcc_dm_val[0][1] == 0xff) {
2911
mcc_dm->mcc_dm_reg[0] = 0xffff;
2912
mcc_dm->mcc_reg_id[0] = 0xff;
2913
}
2914
if (mcc_dm->mcc_dm_val[1][0] == 0xff &&
2915
mcc_dm->mcc_dm_val[1][1] == 0xff) {
2916
mcc_dm->mcc_dm_reg[1] = 0xffff;
2917
mcc_dm->mcc_reg_id[1] = 0xff;
2918
}
2919
}
2920
2921
void phydm_mcc_igi_cal(void *dm_void)
2922
{
2923
struct dm_struct *dm = (struct dm_struct *)dm_void;
2924
struct _phydm_mcc_dm_ *mcc_dm = &dm->mcc_dm;
2925
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
2926
u8 shift = 0;
2927
u8 igi_val0, igi_val1;
2928
2929
if (mcc_dm->mcc_rssi[0] == 0xff)
2930
phydm_mcc_igi_clr(dm, 0);
2931
if (mcc_dm->mcc_rssi[1] == 0xff)
2932
phydm_mcc_igi_clr(dm, 1);
2933
phydm_mcc_igi_chk(dm);
2934
igi_val0 = mcc_dm->mcc_rssi[0] - shift;
2935
igi_val1 = mcc_dm->mcc_rssi[1] - shift;
2936
#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT
2937
phydm_fill_mcccmd(dm, 0, R_0x1d70, igi_val0, igi_val1);
2938
phydm_fill_mcccmd(dm, 1, R_0x1d70 + 1, igi_val0, igi_val1);
2939
#else
2940
phydm_fill_mcccmd(dm, 0, 0xc50, igi_val0, igi_val1);
2941
phydm_fill_mcccmd(dm, 1, 0xe50, igi_val0, igi_val1);
2942
#endif
2943
PHYDM_DBG(dm, DBG_COMP_MCC, "RSSI_min: %d %d, MCC_igi: %d %d\n",
2944
mcc_dm->mcc_rssi[0], mcc_dm->mcc_rssi[1],
2945
mcc_dm->mcc_dm_val[0][0], mcc_dm->mcc_dm_val[0][1]);
2946
}
2947
#endif /*#if (RTL8822B_SUPPORT)*/
2948
#endif /*#ifdef CONFIG_MCC_DM*/
2949
2950