Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_lna_sat.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
#include "mp_precomp.h"
30
#include "phydm_precomp.h"
31
32
#ifdef PHYDM_LNA_SAT_CHK_SUPPORT
33
34
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
35
void phydm_lna_sat_chk_init(
36
void *dm_void)
37
{
38
struct dm_struct *dm = (struct dm_struct *)dm_void;
39
struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;
40
41
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
42
43
lna_info->check_time = 0;
44
lna_info->sat_cnt_acc_patha = 0;
45
lna_info->sat_cnt_acc_pathb = 0;
46
#ifdef PHYDM_IC_ABOVE_3SS
47
lna_info->sat_cnt_acc_pathc = 0;
48
#endif
49
#ifdef PHYDM_IC_ABOVE_4SS
50
lna_info->sat_cnt_acc_pathd = 0;
51
#endif
52
lna_info->cur_sat_status = 0;
53
lna_info->pre_sat_status = 0;
54
lna_info->cur_timer_check_cnt = 0;
55
lna_info->pre_timer_check_cnt = 0;
56
57
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
58
if (dm->support_ic_type &
59
(ODM_RTL8198F | ODM_RTL8814B))
60
phydm_lna_sat_chk_bb_init(dm);
61
#endif
62
}
63
64
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
65
void phydm_lna_sat_chk_bb_init(void *dm_void)
66
{
67
struct dm_struct *dm = (struct dm_struct *)dm_void;
68
struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;
69
70
boolean disable_bb_switch_tab = false;
71
72
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
73
74
/*@set table switch mux r_6table_sel_anten*/
75
odm_set_bb_reg(dm, 0x18ac, BIT(8), 0);
76
77
/*@tab decision when idle*/
78
odm_set_bb_reg(dm, 0x18ac, BIT(16), disable_bb_switch_tab);
79
odm_set_bb_reg(dm, 0x41ac, BIT(16), disable_bb_switch_tab);
80
odm_set_bb_reg(dm, 0x52ac, BIT(16), disable_bb_switch_tab);
81
odm_set_bb_reg(dm, 0x53ac, BIT(16), disable_bb_switch_tab);
82
/*@tab decision when ofdmcca*/
83
odm_set_bb_reg(dm, 0x18ac, BIT(17), disable_bb_switch_tab);
84
odm_set_bb_reg(dm, 0x41ac, BIT(17), disable_bb_switch_tab);
85
odm_set_bb_reg(dm, 0x52ac, BIT(17), disable_bb_switch_tab);
86
odm_set_bb_reg(dm, 0x53ac, BIT(17), disable_bb_switch_tab);
87
}
88
89
void phydm_set_ofdm_agc_tab_path(
90
void *dm_void,
91
u8 tab_sel,
92
enum rf_path path)
93
{
94
struct dm_struct *dm = (struct dm_struct *)dm_void;
95
96
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
97
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B)) {
98
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "set AGC Tab%d\n", tab_sel);
99
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "r_6table_sel_anten = 0x%x\n",
100
odm_get_bb_reg(dm, 0x18ac, BIT(8)));
101
}
102
103
if (dm->support_ic_type & ODM_RTL8198F) {
104
/*@table sel:0/2, mapping 2 to 1 */
105
if (tab_sel == OFDM_AGC_TAB_0) {
106
odm_set_bb_reg(dm, 0x18ac, BIT(4), 0);
107
odm_set_bb_reg(dm, 0x41ac, BIT(4), 0);
108
odm_set_bb_reg(dm, 0x52ac, BIT(4), 0);
109
odm_set_bb_reg(dm, 0x53ac, BIT(4), 0);
110
} else if (tab_sel == OFDM_AGC_TAB_2) {
111
odm_set_bb_reg(dm, 0x18ac, BIT(4), 1);
112
odm_set_bb_reg(dm, 0x41ac, BIT(4), 1);
113
odm_set_bb_reg(dm, 0x52ac, BIT(4), 1);
114
odm_set_bb_reg(dm, 0x53ac, BIT(4), 1);
115
} else {
116
odm_set_bb_reg(dm, 0x18ac, BIT(4), 0);
117
odm_set_bb_reg(dm, 0x41ac, BIT(4), 0);
118
odm_set_bb_reg(dm, 0x52ac, BIT(4), 0);
119
odm_set_bb_reg(dm, 0x53ac, BIT(4), 0);
120
}
121
} else if (dm->support_ic_type & ODM_RTL8814B) {
122
if (tab_sel == OFDM_AGC_TAB_0) {
123
odm_set_bb_reg(dm, 0x18ac, 0xf0, 0);
124
odm_set_bb_reg(dm, 0x41ac, 0xf0, 0);
125
odm_set_bb_reg(dm, 0x52ac, 0xf0, 0);
126
odm_set_bb_reg(dm, 0x53ac, 0xf0, 0);
127
} else if (tab_sel == OFDM_AGC_TAB_2) {
128
odm_set_bb_reg(dm, 0x18ac, 0xf0, 2);
129
odm_set_bb_reg(dm, 0x41ac, 0xf0, 2);
130
odm_set_bb_reg(dm, 0x52ac, 0xf0, 2);
131
odm_set_bb_reg(dm, 0x53ac, 0xf0, 2);
132
} else {
133
odm_set_bb_reg(dm, 0x18ac, 0xf0, 0);
134
odm_set_bb_reg(dm, 0x41ac, 0xf0, 0);
135
odm_set_bb_reg(dm, 0x52ac, 0xf0, 0);
136
odm_set_bb_reg(dm, 0x53ac, 0xf0, 0);
137
}
138
}
139
}
140
141
u8 phydm_get_ofdm_agc_tab_path(
142
void *dm_void,
143
enum rf_path path)
144
{
145
struct dm_struct *dm = (struct dm_struct *)dm_void;
146
u8 tab_sel = 0;
147
148
if (dm->support_ic_type & ODM_RTL8198F) {
149
tab_sel = (u8)odm_get_bb_reg(dm, R_0x18ac, BIT(4));
150
if (tab_sel == 0)
151
tab_sel = OFDM_AGC_TAB_0;
152
else if (tab_sel == 1)
153
tab_sel = OFDM_AGC_TAB_2;
154
} else if (dm->support_ic_type & ODM_RTL8814B) {
155
tab_sel = (u8)odm_get_bb_reg(dm, R_0x18ac, 0xf0);
156
if (tab_sel == 0)
157
tab_sel = OFDM_AGC_TAB_0;
158
else if (tab_sel == 2)
159
tab_sel = OFDM_AGC_TAB_2;
160
}
161
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "get path %d AGC Tab %d\n",
162
path, tab_sel);
163
return tab_sel;
164
}
165
#endif /*@#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)*/
166
167
void phydm_set_ofdm_agc_tab(
168
void *dm_void,
169
u8 tab_sel)
170
{
171
struct dm_struct *dm = (struct dm_struct *)dm_void;
172
173
/*@table sel:0/2, 1 is used for CCK */
174
if (tab_sel == OFDM_AGC_TAB_0)
175
odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_0);
176
else if (tab_sel == OFDM_AGC_TAB_2)
177
odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_2);
178
else
179
odm_set_bb_reg(dm, R_0xc70, 0x1e00, OFDM_AGC_TAB_0);
180
}
181
182
u8 phydm_get_ofdm_agc_tab(
183
void *dm_void)
184
{
185
struct dm_struct *dm = (struct dm_struct *)dm_void;
186
187
return (u8)odm_get_bb_reg(dm, R_0xc70, 0x1e00);
188
}
189
190
void phydm_lna_sat_chk(
191
void *dm_void)
192
{
193
struct dm_struct *dm = (struct dm_struct *)dm_void;
194
struct phydm_dig_struct *dig_t = &dm->dm_dig_table;
195
struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;
196
u8 igi_rssi_min;
197
u8 rssi_min = dm->rssi_min;
198
u32 sat_status_a, sat_status_b;
199
#ifdef PHYDM_IC_ABOVE_3SS
200
u32 sat_status_c;
201
#endif
202
#ifdef PHYDM_IC_ABOVE_4SS
203
u32 sat_status_d;
204
#endif
205
u8 igi_restore = dig_t->cur_ig_value;
206
u8 i, chk_cnt = lna_info->chk_cnt;
207
u32 lna_sat_cnt_thd = 0;
208
u8 agc_tab;
209
u32 max_check_time = 0;
210
/*@use rssi_max if rssi_min is not stable;*/
211
/*@rssi_min = dm->rssi_max;*/
212
213
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);
214
215
if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK)) {
216
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "Func disable\n");
217
return;
218
}
219
220
if (lna_info->is_disable_lna_sat_chk) {
221
phydm_lna_sat_chk_init(dm);
222
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "disable_lna_sat_chk\n");
223
return;
224
}
225
226
/*@move igi to target pin of rssi_min */
227
if (rssi_min == 0 || rssi_min == 0xff) {
228
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
229
"rssi_min=%d, set AGC Tab0\n", rssi_min);
230
/*@adapt agc table 0*/
231
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);
232
phydm_lna_sat_chk_init(dm);
233
return;
234
} else if (rssi_min % 2 != 0) {
235
igi_rssi_min = rssi_min + DIFF_RSSI_TO_IGI - 1;
236
} else {
237
igi_rssi_min = rssi_min + DIFF_RSSI_TO_IGI;
238
}
239
240
if ((lna_info->chk_period > 0) && (lna_info->chk_period <= ONE_SEC_MS))
241
max_check_time = chk_cnt * (ONE_SEC_MS / (lna_info->chk_period)) * 5;
242
else
243
max_check_time = chk_cnt * 5;
244
245
lna_sat_cnt_thd = (max_check_time * lna_info->chk_duty_cycle) / 100;
246
247
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
248
"check_time=%d, rssi_min=%d, igi_rssi_min=0x%x\nchk_cnt=%d, chk_period=%d, max_check_time=%d, lna_sat_cnt_thd=%d\n",
249
lna_info->check_time,
250
rssi_min,
251
igi_rssi_min,
252
chk_cnt,
253
lna_info->chk_period,
254
max_check_time,
255
lna_sat_cnt_thd);
256
257
odm_write_dig(dm, igi_rssi_min);
258
259
/*@adapt agc table 0 check saturation status*/
260
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
261
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
262
phydm_set_ofdm_agc_tab_path(dm, OFDM_AGC_TAB_0, RF_PATH_A);
263
else
264
#endif
265
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);
266
/*@open rf power detection ckt & set detection range */
267
#if (RTL8198F_SUPPORT)
268
if (dm->support_ic_type & ODM_RTL8198F) {
269
/*@set rf detection range (threshold)*/
270
config_phydm_write_rf_reg_8198f(dm, RF_PATH_A, 0x85,
271
0x3f, 0x3f);
272
config_phydm_write_rf_reg_8198f(dm, RF_PATH_B, 0x85,
273
0x3f, 0x3f);
274
config_phydm_write_rf_reg_8198f(dm, RF_PATH_C, 0x85,
275
0x3f, 0x3f);
276
config_phydm_write_rf_reg_8198f(dm, RF_PATH_D, 0x85,
277
0x3f, 0x3f);
278
/*@open rf power detection ckt*/
279
config_phydm_write_rf_reg_8198f(dm, RF_PATH_A, 0x86, 0x10, 1);
280
config_phydm_write_rf_reg_8198f(dm, RF_PATH_B, 0x86, 0x10, 1);
281
config_phydm_write_rf_reg_8198f(dm, RF_PATH_C, 0x86, 0x10, 1);
282
config_phydm_write_rf_reg_8198f(dm, RF_PATH_D, 0x86, 0x10, 1);
283
}
284
#elif (RTL8814B_SUPPORT)
285
if (dm->support_ic_type & ODM_RTL8814B) {
286
/*@set rf detection range (threshold)*/
287
config_phydm_write_rf_reg_8814b(dm, RF_PATH_A, 0x8B, 0x3, 0x3);
288
config_phydm_write_rf_reg_8814b(dm, RF_PATH_B, 0x8B, 0x3, 0x3);
289
config_phydm_write_rf_reg_8814b(dm, RF_PATH_C, 0x8B, 0x3, 0x3);
290
config_phydm_write_rf_reg_8814b(dm, RF_PATH_D, 0x8B, 0x3, 0x3);
291
/*@open rf power detection ckt*/
292
config_phydm_write_rf_reg_8814b(dm, RF_PATH_A, 0x8B, 0x4, 1);
293
config_phydm_write_rf_reg_8814b(dm, RF_PATH_B, 0x8B, 0x4, 1);
294
config_phydm_write_rf_reg_8814b(dm, RF_PATH_C, 0x8B, 0x4, 1);
295
config_phydm_write_rf_reg_8814b(dm, RF_PATH_D, 0x8B, 0x4, 1);
296
}
297
#else
298
odm_set_rf_reg(dm, RF_PATH_A, RF_0x86, 0x1f, 0x10);
299
odm_set_rf_reg(dm, RF_PATH_B, RF_0x86, 0x1f, 0x10);
300
#ifdef PHYDM_IC_ABOVE_3SS
301
odm_set_rf_reg(dm, RF_PATH_C, RF_0x86, 0x1f, 0x10);
302
#endif
303
#ifdef PHYDM_IC_ABOVE_4SS
304
odm_set_rf_reg(dm, RF_PATH_D, RF_0x86, 0x1f, 0x10);
305
#endif
306
#endif
307
308
/*@check saturation status*/
309
for (i = 0; i < chk_cnt; i++) {
310
#if (RTL8198F_SUPPORT)
311
if (dm->support_ic_type & ODM_RTL8198F) {
312
sat_status_a = config_phydm_read_rf_reg_8198f(dm, RF_PATH_A,
313
RF_0xae,
314
0xe0000);
315
sat_status_b = config_phydm_read_rf_reg_8198f(dm, RF_PATH_B,
316
RF_0xae,
317
0xe0000);
318
sat_status_c = config_phydm_read_rf_reg_8198f(dm, RF_PATH_C,
319
RF_0xae,
320
0xe0000);
321
sat_status_d = config_phydm_read_rf_reg_8198f(dm, RF_PATH_D,
322
RF_0xae,
323
0xe0000);
324
}
325
#elif (RTL8814B_SUPPORT)
326
if (dm->support_ic_type & ODM_RTL8814B) {
327
/*@read peak detector info from 8814B rf reg*/
328
sat_status_a = config_phydm_read_rf_reg_8814b(dm, RF_PATH_A,
329
RF_0xae,
330
0xc0000);
331
sat_status_b = config_phydm_read_rf_reg_8814b(dm, RF_PATH_B,
332
RF_0xae,
333
0xc0000);
334
sat_status_c = config_phydm_read_rf_reg_8814b(dm, RF_PATH_C,
335
RF_0xae,
336
0xc0000);
337
sat_status_d = config_phydm_read_rf_reg_8814b(dm, RF_PATH_D,
338
RF_0xae,
339
0xc0000);
340
}
341
#else
342
sat_status_a = odm_get_rf_reg(dm, RF_PATH_A, RF_0xae, 0xc0000);
343
sat_status_b = odm_get_rf_reg(dm, RF_PATH_B, RF_0xae, 0xc0000);
344
#ifdef PHYDM_IC_ABOVE_3SS
345
sat_status_c = odm_get_rf_reg(dm, RF_PATH_C, RF_0xae, 0xc0000);
346
#endif
347
#ifdef PHYDM_IC_ABOVE_4SS
348
sat_status_d = odm_get_rf_reg(dm, RF_PATH_D, RF_0xae, 0xc0000);
349
#endif
350
#endif
351
352
if (sat_status_a != 0)
353
lna_info->sat_cnt_acc_patha++;
354
if (sat_status_b != 0)
355
lna_info->sat_cnt_acc_pathb++;
356
#ifdef PHYDM_IC_ABOVE_3SS
357
if (sat_status_c != 0)
358
lna_info->sat_cnt_acc_pathc++;
359
#endif
360
#ifdef PHYDM_IC_ABOVE_4SS
361
if (sat_status_d != 0)
362
lna_info->sat_cnt_acc_pathd++;
363
#endif
364
365
if (lna_info->sat_cnt_acc_patha >= lna_sat_cnt_thd ||
366
lna_info->sat_cnt_acc_pathb >= lna_sat_cnt_thd ||
367
#ifdef PHYDM_IC_ABOVE_3SS
368
lna_info->sat_cnt_acc_pathc >= lna_sat_cnt_thd ||
369
#endif
370
#ifdef PHYDM_IC_ABOVE_4SS
371
lna_info->sat_cnt_acc_pathd >= lna_sat_cnt_thd ||
372
#endif
373
0) {
374
lna_info->cur_sat_status = 1;
375
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
376
"cur_sat_status=%d, check_time=%d\n",
377
lna_info->cur_sat_status,
378
lna_info->check_time);
379
break;
380
}
381
lna_info->cur_sat_status = 0;
382
}
383
384
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
385
"cur_sat_status=%d, pre_sat_status=%d, sat_cnt_acc_patha=%d, sat_cnt_acc_pathb=%d\n",
386
lna_info->cur_sat_status,
387
lna_info->pre_sat_status,
388
lna_info->sat_cnt_acc_patha,
389
lna_info->sat_cnt_acc_pathb);
390
391
#ifdef PHYDM_IC_ABOVE_4SS
392
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
393
"cur_sat_status=%d, pre_sat_status=%d, sat_cnt_acc_pathc=%d, sat_cnt_acc_pathd=%d\n",
394
lna_info->cur_sat_status,
395
lna_info->pre_sat_status,
396
lna_info->sat_cnt_acc_pathc,
397
lna_info->sat_cnt_acc_pathd);
398
#endif
399
/*@agc table decision*/
400
if (lna_info->cur_sat_status) {
401
if (!lna_info->dis_agc_table_swh)
402
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
403
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
404
phydm_set_ofdm_agc_tab_path(dm,
405
OFDM_AGC_TAB_2,
406
RF_PATH_A);
407
else
408
#endif
409
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_2);
410
else
411
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
412
"disable set to AGC Tab%d\n", OFDM_AGC_TAB_2);
413
lna_info->check_time = 0;
414
lna_info->sat_cnt_acc_patha = 0;
415
lna_info->sat_cnt_acc_pathb = 0;
416
#ifdef PHYDM_IC_ABOVE_3SS
417
lna_info->sat_cnt_acc_pathc = 0;
418
#endif
419
#ifdef PHYDM_IC_ABOVE_4SS
420
lna_info->sat_cnt_acc_pathd = 0;
421
#endif
422
lna_info->pre_sat_status = lna_info->cur_sat_status;
423
424
} else if (lna_info->check_time <= (max_check_time - 1)) {
425
if (lna_info->pre_sat_status && !lna_info->dis_agc_table_swh)
426
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
427
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
428
phydm_set_ofdm_agc_tab_path(dm,
429
OFDM_AGC_TAB_2,
430
RF_PATH_A);
431
else
432
#endif
433
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_2);
434
435
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ckeck time not reached\n");
436
if (lna_info->dis_agc_table_swh)
437
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
438
"disable set to AGC Tab%d\n", OFDM_AGC_TAB_2);
439
lna_info->check_time++;
440
441
} else if (lna_info->check_time >= max_check_time) {
442
if (!lna_info->dis_agc_table_swh)
443
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
444
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
445
phydm_set_ofdm_agc_tab_path(dm,
446
OFDM_AGC_TAB_0,
447
RF_PATH_A);
448
else
449
#endif
450
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);
451
452
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ckeck time reached\n");
453
if (lna_info->dis_agc_table_swh)
454
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
455
"disable set to AGC Tab%d\n", OFDM_AGC_TAB_0);
456
lna_info->check_time = 0;
457
lna_info->sat_cnt_acc_patha = 0;
458
lna_info->sat_cnt_acc_pathb = 0;
459
#ifdef PHYDM_IC_ABOVE_3SS
460
lna_info->sat_cnt_acc_pathc = 0;
461
#endif
462
#ifdef PHYDM_IC_ABOVE_4SS
463
lna_info->sat_cnt_acc_pathd = 0;
464
#endif
465
lna_info->pre_sat_status = lna_info->cur_sat_status;
466
}
467
468
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
469
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
470
agc_tab = phydm_get_ofdm_agc_tab_path(dm, RF_PATH_A);
471
else
472
#endif
473
agc_tab = phydm_get_ofdm_agc_tab(dm);
474
475
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "use AGC tab %d\n", agc_tab);
476
477
/*@restore previous igi*/
478
odm_write_dig(dm, igi_restore);
479
lna_info->cur_timer_check_cnt++;
480
odm_set_timer(dm, &lna_info->phydm_lna_sat_chk_timer,
481
lna_info->chk_period);
482
}
483
484
void phydm_lna_sat_chk_callback(
485
void *dm_void
486
487
)
488
{
489
struct dm_struct *dm = (struct dm_struct *)dm_void;
490
491
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);
492
phydm_lna_sat_chk(dm);
493
}
494
495
void phydm_lna_sat_chk_timers(
496
void *dm_void,
497
u8 state)
498
{
499
struct dm_struct *dm = (struct dm_struct *)dm_void;
500
struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;
501
502
if (state == INIT_LNA_SAT_CHK_TIMMER) {
503
odm_initialize_timer(dm,
504
&lna_info->phydm_lna_sat_chk_timer,
505
(void *)phydm_lna_sat_chk_callback, NULL,
506
"phydm_lna_sat_chk_timer");
507
} else if (state == CANCEL_LNA_SAT_CHK_TIMMER) {
508
odm_cancel_timer(dm, &lna_info->phydm_lna_sat_chk_timer);
509
} else if (state == RELEASE_LNA_SAT_CHK_TIMMER) {
510
odm_release_timer(dm, &lna_info->phydm_lna_sat_chk_timer);
511
}
512
}
513
514
void phydm_lna_sat_chk_watchdog_type1(
515
void *dm_void)
516
{
517
struct dm_struct *dm = (struct dm_struct *)dm_void;
518
struct phydm_lna_sat_t *lna_info = &dm->dm_lna_sat_info;
519
520
u8 rssi_min = dm->rssi_min;
521
522
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n%s ==>\n", __func__);
523
524
if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK)) {
525
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
526
"func disable\n");
527
return;
528
}
529
530
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
531
"pre_timer_check_cnt=%d, cur_timer_check_cnt=%d\n",
532
lna_info->pre_timer_check_cnt,
533
lna_info->cur_timer_check_cnt);
534
535
if (lna_info->is_disable_lna_sat_chk) {
536
phydm_lna_sat_chk_init(dm);
537
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
538
"is_disable_lna_sat_chk=%d, return\n",
539
lna_info->is_disable_lna_sat_chk);
540
return;
541
}
542
543
if (!(dm->support_ic_type &
544
(ODM_RTL8197F | ODM_RTL8198F | ODM_RTL8814B))) {
545
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
546
"support_ic_type not 97F/98F/14B, return\n");
547
return;
548
}
549
550
if (rssi_min == 0 || rssi_min == 0xff) {
551
/*@adapt agc table 0 */
552
phydm_set_ofdm_agc_tab(dm, OFDM_AGC_TAB_0);
553
phydm_lna_sat_chk_init(dm);
554
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
555
"rssi_min=%d, return\n", rssi_min);
556
return;
557
}
558
559
if (lna_info->cur_timer_check_cnt == lna_info->pre_timer_check_cnt) {
560
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "fail, restart timer\n");
561
odm_set_timer(dm, &lna_info->phydm_lna_sat_chk_timer,
562
lna_info->chk_period);
563
} else {
564
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "Timer check pass\n");
565
}
566
lna_info->pre_timer_check_cnt = lna_info->cur_timer_check_cnt;
567
}
568
569
#endif /*@#ifdef PHYDM_LNA_SAT_CHK_TYPE1*/
570
571
#ifdef PHYDM_LNA_SAT_CHK_TYPE2
572
573
void phydm_bubble_sort(
574
void *dm_void,
575
u8 *array,
576
u16 array_length)
577
{
578
struct dm_struct *dm = (struct dm_struct *)dm_void;
579
u16 i, j;
580
u8 temp;
581
582
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
583
for (i = 0; i < (array_length - 1); i++) {
584
for (j = (i + 1); j < (array_length); j++) {
585
if (array[i] > array[j]) {
586
temp = array[i];
587
array[i] = array[j];
588
array[j] = temp;
589
}
590
}
591
}
592
}
593
594
void phydm_lna_sat_chk_type2_init(
595
void *dm_void)
596
{
597
struct dm_struct *dm = (struct dm_struct *)dm_void;
598
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
599
u8 real_shift = pinfo->total_bit_shift;
600
601
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
602
603
pinfo->total_cnt_snr = 1 << real_shift;
604
pinfo->is_sm_done = TRUE;
605
pinfo->is_snr_done = FALSE;
606
pinfo->cur_snr_mean = 0;
607
pinfo->cur_snr_var = 0;
608
pinfo->cur_lower_snr_mean = 0;
609
pinfo->pre_snr_mean = 0;
610
pinfo->pre_snr_var = 0;
611
pinfo->pre_lower_snr_mean = 0;
612
pinfo->nxt_state = ORI_TABLE_MONITOR;
613
pinfo->pre_state = ORI_TABLE_MONITOR;
614
}
615
616
void phydm_snr_collect(
617
void *dm_void,
618
u8 rx_snr)
619
{
620
struct dm_struct *dm = (struct dm_struct *)dm_void;
621
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
622
623
if (pinfo->is_sm_done) {
624
#if 0
625
/*PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);*/
626
#endif
627
628
/* @adapt only path-A for calculation */
629
pinfo->snr_statistic[pinfo->cnt_snr_statistic] = rx_snr;
630
631
if (pinfo->cnt_snr_statistic == (pinfo->total_cnt_snr - 1)) {
632
pinfo->is_snr_done = TRUE;
633
pinfo->cnt_snr_statistic = 0;
634
} else {
635
pinfo->cnt_snr_statistic++;
636
}
637
} else {
638
return;
639
}
640
}
641
642
void phydm_parsing_snr(void *dm_void, void *pktinfo_void, s8 *rx_snr)
643
{
644
struct dm_struct *dm = (struct dm_struct *)dm_void;
645
struct phydm_lna_sat_t *lna_t = &dm->dm_lna_sat_info;
646
struct phydm_perpkt_info_struct *pktinfo = NULL;
647
u8 target_macid = dm->rssi_min_macid;
648
649
if (!(dm->support_ability & ODM_BB_LNA_SAT_CHK))
650
return;
651
652
pktinfo = (struct phydm_perpkt_info_struct *)pktinfo_void;
653
654
if (!pktinfo->is_packet_match_bssid)
655
return;
656
657
if (lna_t->force_traget_macid != 0)
658
target_macid = lna_t->force_traget_macid;
659
660
if (target_macid != pktinfo->station_id)
661
return;
662
663
phydm_snr_collect(dm, rx_snr[0]); /*path-A B C D???*/
664
}
665
666
void phydm_snr_data_processing(
667
void *dm_void)
668
{
669
struct dm_struct *dm = (struct dm_struct *)dm_void;
670
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
671
u8 real_shift = pinfo->total_bit_shift;
672
u16 total_snr_cnt = pinfo->total_cnt_snr;
673
u16 total_loop_cnt = (total_snr_cnt - 1), i;
674
u32 temp;
675
u32 sum_snr_statistic = 0;
676
677
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
678
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
679
"total_loop_cnt=%d\n", total_loop_cnt);
680
681
for (i = 0; (i <= total_loop_cnt); i++) {
682
if (pinfo->is_snr_detail_en) {
683
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
684
"snr[%d]=%d\n", i, pinfo->snr_statistic[i]);
685
}
686
687
sum_snr_statistic += (u32)(pinfo->snr_statistic[i]);
688
689
pinfo->snr_statistic_sqr[i] = (u16)(pinfo->snr_statistic[i] * pinfo->snr_statistic[i]);
690
}
691
692
phydm_bubble_sort(dm, pinfo->snr_statistic, pinfo->total_cnt_snr);
693
694
/*update SNR's cur mean*/
695
pinfo->cur_snr_mean = (sum_snr_statistic >> real_shift);
696
697
for (i = 0; (i <= total_loop_cnt); i++) {
698
if (pinfo->snr_statistic[i] >= pinfo->cur_snr_mean)
699
temp = pinfo->snr_statistic[i] - pinfo->cur_snr_mean;
700
else
701
temp = pinfo->cur_snr_mean - pinfo->snr_statistic[i];
702
703
pinfo->cur_snr_var += (temp * temp);
704
}
705
706
/*update SNR's VAR*/
707
pinfo->cur_snr_var = (pinfo->cur_snr_var >> real_shift);
708
709
/*@acquire lower SNR's statistics*/
710
temp = 0;
711
pinfo->cnt_lower_snr_statistic = (total_snr_cnt >> pinfo->lwr_snr_ratio_bit_shift);
712
pinfo->cnt_lower_snr_statistic = MAX_2(pinfo->cnt_lower_snr_statistic, SNR_RPT_MAX);
713
714
for (i = 0; i < pinfo->cnt_lower_snr_statistic; i++)
715
temp += pinfo->snr_statistic[i];
716
717
pinfo->cur_lower_snr_mean = temp >> (real_shift - pinfo->lwr_snr_ratio_bit_shift);
718
}
719
720
boolean phydm_is_snr_improve(
721
void *dm_void)
722
{
723
struct dm_struct *dm = (struct dm_struct *)dm_void;
724
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
725
boolean is_snr_improve;
726
u8 cur_state = pinfo->nxt_state;
727
u32 cur_mean = pinfo->cur_snr_mean;
728
u32 pre_mean = pinfo->pre_snr_mean;
729
u32 cur_lower_mean = pinfo->cur_lower_snr_mean;
730
u32 pre_lower_mean = pinfo->pre_lower_snr_mean;
731
u32 cur_var = pinfo->cur_snr_var;
732
733
/*special case, zero VAR, interference is gone*/
734
/*@make sure pre_var is larger enough*/
735
if (cur_state == SAT_TABLE_MONITOR ||
736
cur_state == ORI_TABLE_TRAINING) {
737
if (cur_mean >= pre_mean) {
738
if (cur_var == 0)
739
return true;
740
}
741
}
742
#if 0
743
/*special case, mean degrade less than VAR improvement*/
744
/*@make sure pre_var is larger enough*/
745
if (cur_state == ORI_TABLE_MONITOR &&
746
cur_mean < pre_mean &&
747
cur_var < pre_var) {
748
diff_mean = pre_mean - cur_mean;
749
diff_var = pre_var - cur_var;
750
return (diff_var > (2 * diff_mean * diff_mean)) ? true : false;
751
}
752
753
#endif
754
if (cur_lower_mean >= (pre_lower_mean + pinfo->delta_snr_mean))
755
is_snr_improve = true;
756
else
757
is_snr_improve = false;
758
#if 0
759
/* @condition refine, mean is bigger enough or VAR is smaller enough*/
760
/* @1. from mean's view, mean improve delta_snr_mean(2), VAR not degrade lot*/
761
if (cur_mean > (pre_mean + pinfo->delta_snr_mean)) {
762
is_mean_improve = TRUE;
763
is_var_improve = (cur_var <= pre_var + dm->delta_snr_var)
764
? TRUE : FALSE;
765
766
} else if (cur_var + dm->delta_snr_var <= pre_var) {
767
is_var_improve = TRUE;
768
is_mean_improve = ((cur_mean + 1) >= pre_mean) ? TRUE : FALSE;
769
} else {
770
return false;
771
}
772
#endif
773
return is_snr_improve;
774
}
775
776
boolean phydm_is_snr_degrade(
777
void *dm_void)
778
{
779
struct dm_struct *dm = (struct dm_struct *)dm_void;
780
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
781
u32 cur_lower_mean = pinfo->cur_lower_snr_mean;
782
u32 pre_lower_mean = pinfo->pre_lower_snr_mean;
783
boolean is_degrade;
784
785
if (cur_lower_mean <= (pre_lower_mean - pinfo->delta_snr_mean))
786
is_degrade = TRUE;
787
else
788
is_degrade = FALSE;
789
#if 0
790
is_mean_dgrade = (pinfo->cur_snr_mean + pinfo->delta_snr_mean <= pinfo->pre_snr_mean) ? TRUE : FALSE;
791
is_var_degrade = (pinfo->cur_snr_var > (pinfo->pre_snr_var + pinfo->delta_snr_mean)) ? TRUE : FALSE;
792
793
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d\n",
794
__func__,
795
pinfo->cur_snr_mean,
796
pinfo->pre_snr_mean,
797
pinfo->cur_snr_var,
798
pinfo->pre_snr_var);
799
800
return (is_mean_dgrade & is_var_degrade);
801
#endif
802
return is_degrade;
803
}
804
805
boolean phydm_is_large_var(
806
void *dm_void)
807
{
808
struct dm_struct *dm = (struct dm_struct *)dm_void;
809
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
810
boolean is_large_var = (pinfo->cur_snr_var >= pinfo->snr_var_thd) ? TRUE : FALSE;
811
812
return is_large_var;
813
}
814
815
void phydm_update_pre_status(
816
void *dm_void)
817
{
818
struct dm_struct *dm = (struct dm_struct *)dm_void;
819
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
820
821
pinfo->pre_lower_snr_mean = pinfo->cur_lower_snr_mean;
822
pinfo->pre_snr_mean = pinfo->cur_snr_mean;
823
pinfo->pre_snr_var = pinfo->cur_snr_var;
824
}
825
826
void phydm_ori_table_monitor(
827
void *dm_void)
828
{
829
struct dm_struct *dm = (struct dm_struct *)dm_void;
830
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
831
832
if (phydm_is_large_var(dm)) {
833
pinfo->nxt_state = SAT_TABLE_TRAINING;
834
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
835
} else {
836
pinfo->nxt_state = ORI_TABLE_MONITOR;
837
/*switch to anti-sat table*/
838
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
839
}
840
phydm_update_pre_status(dm);
841
pinfo->pre_state = ORI_TABLE_MONITOR;
842
}
843
844
void phydm_sat_table_training(
845
void *dm_void)
846
{
847
struct dm_struct *dm = (struct dm_struct *)dm_void;
848
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
849
850
#if 0
851
if pre_state = ORI_TABLE_MONITOR || SAT_TABLE_TRY_FAIL,
852
/*@"pre" adapt ori-table, "cur" adapt sat-table*/
853
/*@adapt ori table*/
854
if (pinfo->pre_state == ORI_TABLE_MONITOR) {
855
pinfo->nxt_state = SAT_TABLE_TRAINING;
856
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
857
} else {
858
#endif
859
if (phydm_is_snr_improve(dm)) {
860
pinfo->nxt_state = SAT_TABLE_MONITOR;
861
} else {
862
pinfo->nxt_state = SAT_TABLE_TRY_FAIL;
863
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
864
}
865
/*@}*/
866
867
phydm_update_pre_status(dm);
868
pinfo->pre_state = SAT_TABLE_TRAINING;
869
}
870
871
void phydm_sat_table_try_fail(
872
void *dm_void)
873
{
874
struct dm_struct *dm = (struct dm_struct *)dm_void;
875
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
876
877
/* @if pre_state = SAT_TABLE_TRAINING, "pre" adapt sat-table, "cur" adapt ori-table */
878
/* @if pre_state = SAT_TABLE_TRY_FAIL, "pre" adapt ori-table, "cur" adapt ori-table */
879
880
if (phydm_is_large_var(dm)) {
881
if (phydm_is_snr_degrade(dm)) {
882
pinfo->nxt_state = SAT_TABLE_TRAINING;
883
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
884
} else {
885
pinfo->nxt_state = SAT_TABLE_TRY_FAIL;
886
}
887
} else {
888
pinfo->nxt_state = ORI_TABLE_MONITOR;
889
}
890
phydm_update_pre_status(dm);
891
pinfo->pre_state = SAT_TABLE_TRY_FAIL;
892
}
893
894
void phydm_sat_table_monitor(
895
void *dm_void)
896
{
897
struct dm_struct *dm = (struct dm_struct *)dm_void;
898
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
899
900
if (phydm_is_snr_improve(dm)) {
901
pinfo->sat_table_monitor_times = 0;
902
903
/* @if pre_state = SAT_TABLE_MONITOR, "pre" adapt sat-table, "cur" adapt sat-table */
904
if (pinfo->pre_state == SAT_TABLE_MONITOR) {
905
pinfo->nxt_state = ORI_TABLE_TRAINING;
906
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
907
//phydm_update_pre_status(dm);
908
} else {
909
pinfo->nxt_state = SAT_TABLE_MONITOR;
910
}
911
912
/* @if pre_state = SAT_TABLE_TRAINING, "pre" adapt sat-table, "cur" adapt sat-table */
913
/* @if pre_state = ORI_TABLE_TRAINING, "pre" adapt ori-table, "cur" adapt sat-table */
914
/*pre_state above is no need to update*/
915
} else {
916
if (pinfo->sat_table_monitor_times == pinfo->force_change_period) {
917
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s: sat_table_monitor_times=%d\n",
918
__func__, pinfo->sat_table_monitor_times);
919
920
pinfo->nxt_state = ORI_TABLE_TRAINING;
921
pinfo->sat_table_monitor_times = 0;
922
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
923
} else {
924
pinfo->nxt_state = SAT_TABLE_MONITOR;
925
pinfo->sat_table_monitor_times++;
926
}
927
}
928
phydm_update_pre_status(dm);
929
pinfo->pre_state = SAT_TABLE_MONITOR;
930
}
931
932
void phydm_ori_table_training(
933
void *dm_void)
934
{
935
struct dm_struct *dm = (struct dm_struct *)dm_void;
936
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
937
938
/* pre_state = SAT_TABLE_MONITOR, "pre" adapt sat-table, "cur" adapt ori-table */
939
940
if (phydm_is_snr_degrade(dm) == FALSE) {
941
pinfo->nxt_state = ORI_TABLE_MONITOR;
942
} else {
943
if (pinfo->pre_snr_var == 0)
944
pinfo->nxt_state = ORI_TABLE_TRY_FAIL;
945
else
946
pinfo->nxt_state = SAT_TABLE_MONITOR;
947
948
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
949
}
950
phydm_update_pre_status(dm);
951
pinfo->pre_state = ORI_TABLE_TRAINING;
952
}
953
954
void phydm_ori_table_try_fail(
955
void *dm_void)
956
{
957
struct dm_struct *dm = (struct dm_struct *)dm_void;
958
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
959
960
if (pinfo->pre_state == ORI_TABLE_TRY_FAIL) {
961
if (phydm_is_snr_improve(dm)) {
962
pinfo->nxt_state = ORI_TABLE_TRAINING;
963
pinfo->ori_table_try_fail_times = 0;
964
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
965
} else {
966
if (pinfo->ori_table_try_fail_times == pinfo->force_change_period) {
967
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
968
"%s: ori_table_try_fail_times=%d\n", __func__, pinfo->ori_table_try_fail_times);
969
970
pinfo->nxt_state = ORI_TABLE_TRY_FAIL;
971
pinfo->ori_table_try_fail_times = 0;
972
phydm_update_pre_status(dm);
973
} else {
974
pinfo->nxt_state = ORI_TABLE_TRY_FAIL;
975
pinfo->ori_table_try_fail_times++;
976
phydm_update_pre_status(dm);
977
//config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
978
}
979
}
980
} else {
981
pinfo->nxt_state = ORI_TABLE_TRY_FAIL;
982
pinfo->ori_table_try_fail_times = 0;
983
phydm_update_pre_status(dm);
984
//config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
985
}
986
987
#if 0
988
if (phydm_is_large_var(dm)) {
989
if (phydm_is_snr_degrade(dm)) {
990
pinfo->nxt_state = SAT_TABLE_TRAINING;
991
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
992
} else {
993
pinfo->nxt_state = SAT_TABLE_TRY_FAIL;
994
}
995
} else {
996
pinfo->nxt_state = ORI_TABLE_MONITOR;
997
}
998
999
phydm_update_pre_status(dm);
1000
#endif
1001
pinfo->pre_state = ORI_TABLE_TRY_FAIL;
1002
}
1003
1004
char *phydm_lna_sat_state_msg(
1005
void *dm_void,
1006
IN u8 state)
1007
{
1008
char *dbg_message;
1009
1010
switch (state) {
1011
case ORI_TABLE_MONITOR:
1012
dbg_message = "ORI_TABLE_MONITOR";
1013
break;
1014
1015
case SAT_TABLE_TRAINING:
1016
dbg_message = "SAT_TABLE_TRAINING";
1017
break;
1018
1019
case SAT_TABLE_TRY_FAIL:
1020
dbg_message = "SAT_TABLE_TRY_FAIL";
1021
break;
1022
1023
case SAT_TABLE_MONITOR:
1024
dbg_message = "SAT_TABLE_MONITOR";
1025
break;
1026
1027
case ORI_TABLE_TRAINING:
1028
dbg_message = "ORI_TABLE_TRAINING";
1029
break;
1030
1031
case ORI_TABLE_TRY_FAIL:
1032
dbg_message = "ORI_TABLE_TRY_FAIL";
1033
break;
1034
1035
default:
1036
dbg_message = "ORI_TABLE_MONITOR";
1037
break;
1038
}
1039
1040
return dbg_message;
1041
}
1042
1043
void phydm_lna_sat_type2_sm(
1044
void *dm_void)
1045
{
1046
struct dm_struct *dm = (struct dm_struct *)dm_void;
1047
struct phydm_lna_sat_t *pinfo = &dm->dm_lna_sat_info;
1048
u8 state = pinfo->nxt_state;
1049
u8 agc_tab = (u8)odm_get_bb_reg(dm, 0x958, 0x1f);
1050
char *dbg_message, *nxt_dbg_message;
1051
u8 real_shift = pinfo->total_bit_shift;
1052
1053
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "\n\n%s ==>\n", __func__);
1054
1055
if ((dm->support_ic_type & ODM_RTL8822B) == FALSE) {
1056
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ODM_BB_LNA_SAT_CHK_TYPE2 only support 22B.\n");
1057
return;
1058
}
1059
1060
if ((dm->support_ability & ODM_BB_LNA_SAT_CHK) == FALSE) {
1061
phydm_lna_sat_chk_type2_init(dm);
1062
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "ODM_BB_LNA_SAT_CHK_TYPE2 is NOT supported, cur table=%d\n", agc_tab);
1063
return;
1064
}
1065
1066
if (pinfo->is_snr_done)
1067
phydm_snr_data_processing(dm);
1068
else
1069
return;
1070
1071
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "cur agc table %d\n", agc_tab);
1072
1073
if (pinfo->is_force_lna_sat_table != AUTO_AGC_TABLE) {
1074
/*reset state machine*/
1075
pinfo->nxt_state = ORI_TABLE_MONITOR;
1076
if (pinfo->is_snr_done) {
1077
if (pinfo->is_force_lna_sat_table == DEFAULT_AGC_TABLE)
1078
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
1079
else if (pinfo->is_force_lna_sat_table == LNA_SAT_AGC_TABLE)
1080
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, LNA_SAT_AGC_TABLE);
1081
else
1082
config_phydm_switch_agc_tab_8822b(dm, *dm->channel, DEFAULT_AGC_TABLE);
1083
1084
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
1085
"%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d,cur_lower_mean=%d, pre_lower_mean=%d, cnt_lower_snr=%d\n",
1086
__func__,
1087
pinfo->cur_snr_mean,
1088
pinfo->pre_snr_mean,
1089
pinfo->cur_snr_var,
1090
pinfo->pre_snr_var,
1091
pinfo->cur_lower_snr_mean,
1092
pinfo->pre_lower_snr_mean,
1093
pinfo->cnt_lower_snr_statistic);
1094
1095
pinfo->is_snr_done = FALSE;
1096
pinfo->is_sm_done = TRUE;
1097
phydm_update_pre_status(dm);
1098
} else {
1099
return;
1100
}
1101
} else if (pinfo->is_snr_done) {
1102
PHYDM_DBG(dm, DBG_LNA_SAT_CHK,
1103
"%s: cur_mean=%d, pre_mean=%d, cur_var=%d, pre_var=%d,cur_lower_mean=%d, pre_lower_mean=%d, cnt_lower_snr=%d\n",
1104
__func__,
1105
pinfo->cur_snr_mean,
1106
pinfo->pre_snr_mean,
1107
pinfo->cur_snr_var,
1108
pinfo->pre_snr_var,
1109
pinfo->cur_lower_snr_mean,
1110
pinfo->pre_lower_snr_mean,
1111
pinfo->cnt_lower_snr_statistic);
1112
1113
switch (state) {
1114
case ORI_TABLE_MONITOR:
1115
dbg_message = "ORI_TABLE_MONITOR";
1116
phydm_ori_table_monitor(dm);
1117
break;
1118
1119
case SAT_TABLE_TRAINING:
1120
dbg_message = "SAT_TABLE_TRAINING";
1121
phydm_sat_table_training(dm);
1122
break;
1123
1124
case SAT_TABLE_TRY_FAIL:
1125
dbg_message = "SAT_TABLE_TRY_FAIL";
1126
phydm_sat_table_try_fail(dm);
1127
break;
1128
1129
case SAT_TABLE_MONITOR:
1130
dbg_message = "SAT_TABLE_MONITOR";
1131
phydm_sat_table_monitor(dm);
1132
break;
1133
1134
case ORI_TABLE_TRAINING:
1135
dbg_message = "ORI_TABLE_TRAINING";
1136
phydm_ori_table_training(dm);
1137
break;
1138
1139
case ORI_TABLE_TRY_FAIL:
1140
dbg_message = "ORI_TABLE_TRAINING";
1141
phydm_ori_table_try_fail(dm);
1142
break;
1143
1144
default:
1145
dbg_message = "ORI_TABLE_MONITOR";
1146
phydm_ori_table_monitor(dm);
1147
break;
1148
}
1149
1150
dbg_message = phydm_lna_sat_state_msg(dm, state);
1151
nxt_dbg_message = phydm_lna_sat_state_msg(dm, pinfo->nxt_state);
1152
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "state: [%s]->[%s]\n",
1153
dbg_message, nxt_dbg_message);
1154
1155
pinfo->is_snr_done = FALSE;
1156
pinfo->is_sm_done = TRUE;
1157
pinfo->total_cnt_snr = 1 << real_shift;
1158
1159
} else {
1160
return;
1161
}
1162
}
1163
1164
1165
#endif /*@#ifdef PHYDM_LNA_SAT_CHK_TYPE2*/
1166
1167
void phydm_lna_sat_debug(
1168
void *dm_void,
1169
char input[][16],
1170
u32 *_used,
1171
char *output,
1172
u32 *_out_len)
1173
{
1174
struct dm_struct *dm = (struct dm_struct *)dm_void;
1175
struct phydm_lna_sat_t *lna_t = &dm->dm_lna_sat_info;
1176
char help[] = "-h";
1177
char monitor[] = "-m";
1178
u32 var1[10] = {0};
1179
u32 used = *_used;
1180
u32 out_len = *_out_len;
1181
u8 i;
1182
u8 agc_tab = 0;
1183
1184
if ((strcmp(input[1], help) == 0)) {
1185
PDM_SNPF(out_len, used, output + used, out_len - used,
1186
"monitor: -m\n");
1187
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1188
PDM_SNPF(out_len, used, output + used, out_len - used,
1189
"{0} {lna_sat_chk_en}\n");
1190
PDM_SNPF(out_len, used, output + used, out_len - used,
1191
"{1} {agc_table_switch_en}\n");
1192
PDM_SNPF(out_len, used, output + used, out_len - used,
1193
"{2} {chk_cnt per callback}\n");
1194
PDM_SNPF(out_len, used, output + used, out_len - used,
1195
"{3} {chk_period(ms)}\n");
1196
PDM_SNPF(out_len, used, output + used, out_len - used,
1197
"{4} {chk_duty_cycle(%)}\n");
1198
#endif
1199
} else if ((strcmp(input[1], monitor) == 0)) {
1200
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1201
#if (RTL8198F_SUPPORT || RTL8814B_SUPPORT)
1202
if (dm->support_ic_type & (ODM_RTL8198F | ODM_RTL8814B))
1203
agc_tab = phydm_get_ofdm_agc_tab_path(dm, RF_PATH_A);
1204
else
1205
#endif
1206
agc_tab = phydm_get_ofdm_agc_tab(dm);
1207
1208
PDM_SNPF(out_len, used, output + used, out_len - used,
1209
"%s%d, %s%d, %s%d, %s%d\n",
1210
"check_time = ", lna_t->check_time,
1211
"pre_sat_status = ", lna_t->pre_sat_status,
1212
"cur_sat_status = ", lna_t->cur_sat_status,
1213
"current AGC tab = ", agc_tab);
1214
#endif
1215
} else {
1216
PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
1217
1218
for (i = 1; i < 10; i++) {
1219
if (input[i + 1])
1220
PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL,
1221
&var1[i]);
1222
}
1223
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1224
if (var1[0] == 0) {
1225
if (var1[1] == 1)
1226
lna_t->is_disable_lna_sat_chk = false;
1227
else if (var1[1] == 0)
1228
lna_t->is_disable_lna_sat_chk = true;
1229
1230
PDM_SNPF(out_len, used, output + used, out_len - used,
1231
"dis_lna_sat_chk=%d\n",
1232
lna_t->is_disable_lna_sat_chk);
1233
} else if (var1[0] == 1) {
1234
if (var1[1] == 1)
1235
lna_t->dis_agc_table_swh = false;
1236
else if (var1[1] == 0)
1237
lna_t->dis_agc_table_swh = true;
1238
1239
PDM_SNPF(out_len, used, output + used, out_len - used,
1240
"dis_agc_table_swh=%d\n",
1241
lna_t->dis_agc_table_swh);
1242
1243
} else if (var1[0] == 2) {
1244
lna_t->chk_cnt = (u8)var1[1];
1245
PDM_SNPF(out_len, used, output + used, out_len - used,
1246
"chk_cnt=%d\n", lna_t->chk_cnt);
1247
} else if (var1[0] == 3) {
1248
lna_t->chk_period = var1[1];
1249
PDM_SNPF(out_len, used, output + used, out_len - used,
1250
"chk_period=%d\n", lna_t->chk_period);
1251
} else if (var1[0] == 4) {
1252
lna_t->chk_duty_cycle = (u8)var1[1];
1253
PDM_SNPF(out_len, used, output + used, out_len - used,
1254
"chk_duty_cycle=%d\n",
1255
lna_t->chk_duty_cycle);
1256
}
1257
#endif
1258
#ifdef PHYDM_LNA_SAT_CHK_TYPE2
1259
if (var1[0] == 1)
1260
lna_t->force_traget_macid = var1[1];
1261
#endif
1262
}
1263
*_used = used;
1264
*_out_len = out_len;
1265
}
1266
1267
void phydm_lna_sat_chk_watchdog(
1268
void *dm_void)
1269
{
1270
struct dm_struct *dm = (struct dm_struct *)dm_void;
1271
struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;
1272
1273
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "%s ==>\n", __func__);
1274
1275
if (lna_sat->lna_sat_type == LNA_SAT_WITH_PEAK_DET) {
1276
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1277
phydm_lna_sat_chk_watchdog_type1(dm);
1278
#endif
1279
} else if (lna_sat->lna_sat_type == LNA_SAT_WITH_TRAIN) {
1280
#ifdef PHYDM_LNA_SAT_CHK_TYPE2
1281
1282
#endif
1283
}
1284
1285
}
1286
1287
void phydm_lna_sat_config(
1288
void *dm_void)
1289
{
1290
struct dm_struct *dm = (struct dm_struct *)dm_void;
1291
struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;
1292
1293
#if (RTL8822B_SUPPORT == 1)
1294
if (dm->support_ic_type & (ODM_RTL8822B))
1295
lna_sat->lna_sat_type = LNA_SAT_WITH_TRAIN;
1296
#endif
1297
1298
#if (RTL8197F_SUPPORT || RTL8192F_SUPPORT ||\
1299
RTL8198F_SUPPORT || RTL8814B_SUPPORT)
1300
if (dm->support_ic_type &
1301
(ODM_RTL8197F | ODM_RTL8192F | ODM_RTL8198F | ODM_RTL8814B))
1302
lna_sat->lna_sat_type = LNA_SAT_WITH_PEAK_DET;
1303
#endif
1304
1305
PHYDM_DBG(dm, DBG_LNA_SAT_CHK, "[%s] lna_sat_type=%d\n",
1306
__func__, lna_sat->lna_sat_type);
1307
}
1308
1309
void phydm_lna_sat_check_init(
1310
void *dm_void)
1311
{
1312
struct dm_struct *dm = (struct dm_struct *)dm_void;
1313
struct phydm_lna_sat_t *lna_sat = &dm->dm_lna_sat_info;
1314
1315
if ((dm->support_ability & ODM_BB_LNA_SAT_CHK))
1316
return;
1317
1318
/*@2018.04.17 Johnson*/
1319
phydm_lna_sat_config(dm);
1320
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1321
lna_sat->chk_period = LNA_CHK_PERIOD;
1322
lna_sat->chk_cnt = LNA_CHK_CNT;
1323
lna_sat->chk_duty_cycle = LNA_CHK_DUTY_CYCLE;
1324
lna_sat->dis_agc_table_swh = false;
1325
#endif
1326
/*@2018.04.17 Johnson end*/
1327
1328
if (lna_sat->lna_sat_type == LNA_SAT_WITH_PEAK_DET) {
1329
#ifdef PHYDM_LNA_SAT_CHK_TYPE1
1330
phydm_lna_sat_chk_init(dm);
1331
#endif
1332
} else if (lna_sat->lna_sat_type == LNA_SAT_WITH_TRAIN) {
1333
#ifdef PHYDM_LNA_SAT_CHK_TYPE2
1334
phydm_lna_sat_chk_type2_init(dm);
1335
#endif
1336
}
1337
}
1338
1339
#endif /*@#ifdef PHYDM_LNA_SAT_CHK_SUPPORT*/
1340
1341