Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halphyrf_ce.c
1308 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
#include "mp_precomp.h"
27
#include "phydm_precomp.h"
28
29
#define CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _delta_thermal)\
30
do { \
31
u32 __offset = (u32)_offset; \
32
u32 __size = (u32)_size; \
33
for (__offset = 0; __offset < __size; __offset++) { \
34
if (_delta_thermal < \
35
thermal_threshold[_direction][__offset]) { \
36
if (__offset != 0) \
37
__offset--; \
38
break; \
39
} \
40
} \
41
if (__offset >= __size) \
42
__offset = __size - 1; \
43
} while (0)
44
45
void configure_txpower_track(void *dm_void, struct txpwrtrack_cfg *config)
46
{
47
struct dm_struct *dm = (struct dm_struct *)dm_void;
48
49
#if RTL8192E_SUPPORT
50
if (dm->support_ic_type == ODM_RTL8192E)
51
configure_txpower_track_8192e(config);
52
#endif
53
#if RTL8821A_SUPPORT
54
if (dm->support_ic_type == ODM_RTL8821)
55
configure_txpower_track_8821a(config);
56
#endif
57
#if RTL8812A_SUPPORT
58
if (dm->support_ic_type == ODM_RTL8812)
59
configure_txpower_track_8812a(config);
60
#endif
61
#if RTL8188E_SUPPORT
62
if (dm->support_ic_type == ODM_RTL8188E)
63
configure_txpower_track_8188e(config);
64
#endif
65
66
#if RTL8723B_SUPPORT
67
if (dm->support_ic_type == ODM_RTL8723B)
68
configure_txpower_track_8723b(config);
69
#endif
70
71
#if RTL8814A_SUPPORT
72
if (dm->support_ic_type == ODM_RTL8814A)
73
configure_txpower_track_8814a(config);
74
#endif
75
76
#if RTL8703B_SUPPORT
77
if (dm->support_ic_type == ODM_RTL8703B)
78
configure_txpower_track_8703b(config);
79
#endif
80
81
#if RTL8188F_SUPPORT
82
if (dm->support_ic_type == ODM_RTL8188F)
83
configure_txpower_track_8188f(config);
84
#endif
85
#if RTL8723D_SUPPORT
86
if (dm->support_ic_type == ODM_RTL8723D)
87
configure_txpower_track_8723d(config);
88
#endif
89
/*@ JJ ADD 20161014 */
90
#if RTL8710B_SUPPORT
91
if (dm->support_ic_type == ODM_RTL8710B)
92
configure_txpower_track_8710b(config);
93
#endif
94
#if RTL8822B_SUPPORT
95
if (dm->support_ic_type == ODM_RTL8822B)
96
configure_txpower_track_8822b(config);
97
#endif
98
#if RTL8821C_SUPPORT
99
if (dm->support_ic_type == ODM_RTL8821C)
100
configure_txpower_track_8821c(config);
101
#endif
102
103
#if RTL8192F_SUPPORT
104
if (dm->support_ic_type == ODM_RTL8192F)
105
configure_txpower_track_8192f(config);
106
#endif
107
108
#if RTL8822C_SUPPORT
109
if (dm->support_ic_type == ODM_RTL8822C)
110
configure_txpower_track_8822c(config);
111
#endif
112
113
#if RTL8814B_SUPPORT
114
if (dm->support_ic_type == ODM_RTL8814B)
115
configure_txpower_track_8814b(config);
116
#endif
117
118
119
}
120
121
/*@ **********************************************************************
122
* <20121113, Kordan> This function should be called when tx_agc changed.
123
* Otherwise the previous compensation is gone, because we record the
124
* delta of temperature between two TxPowerTracking watch dogs.
125
*
126
* NOTE: If Tx BB swing or Tx scaling is varified during run-time, still
127
* need to call this function.
128
* **********************************************************************
129
*/
130
void odm_clear_txpowertracking_state(void *dm_void)
131
{
132
struct dm_struct *dm = (struct dm_struct *)dm_void;
133
struct _hal_rf_ *rf = &dm->rf_table;
134
u8 p = 0;
135
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
136
137
cali_info->bb_swing_idx_cck_base = cali_info->default_cck_index;
138
cali_info->bb_swing_idx_cck = cali_info->default_cck_index;
139
dm->rf_calibrate_info.CCK_index = 0;
140
141
for (p = RF_PATH_A; p < MAX_RF_PATH; ++p) {
142
cali_info->bb_swing_idx_ofdm_base[p]
143
= cali_info->default_ofdm_index;
144
cali_info->bb_swing_idx_ofdm[p] = cali_info->default_ofdm_index;
145
cali_info->OFDM_index[p] = cali_info->default_ofdm_index;
146
147
cali_info->power_index_offset[p] = 0;
148
cali_info->delta_power_index[p] = 0;
149
cali_info->delta_power_index_last[p] = 0;
150
151
/* Initial Mix mode power tracking*/
152
cali_info->absolute_ofdm_swing_idx[p] = 0;
153
cali_info->remnant_ofdm_swing_idx[p] = 0;
154
cali_info->kfree_offset[p] = 0;
155
}
156
/* Initial Mix mode power tracking*/
157
cali_info->modify_tx_agc_flag_path_a = false;
158
cali_info->modify_tx_agc_flag_path_b = false;
159
cali_info->modify_tx_agc_flag_path_c = false;
160
cali_info->modify_tx_agc_flag_path_d = false;
161
cali_info->remnant_cck_swing_idx = 0;
162
cali_info->thermal_value = rf->eeprom_thermal;
163
cali_info->modify_tx_agc_value_cck = 0;
164
cali_info->modify_tx_agc_value_ofdm = 0;
165
}
166
167
void odm_get_tracking_table(void *dm_void, u8 thermal_value, u8 delta)
168
{
169
struct dm_struct *dm = (struct dm_struct *)dm_void;
170
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
171
struct _hal_rf_ *rf = &dm->rf_table;
172
struct txpwrtrack_cfg c = {0};
173
174
u8 p;
175
/* 4 1. TWO tables decide the final index of OFDM/CCK swing table. */
176
u8 *pwrtrk_tab_up_a = NULL;
177
u8 *pwrtrk_tab_down_a = NULL;
178
u8 *pwrtrk_tab_up_b = NULL;
179
u8 *pwrtrk_tab_down_b = NULL;
180
/*for 8814 add by Yu Chen*/
181
u8 *pwrtrk_tab_up_c = NULL;
182
u8 *pwrtrk_tab_down_c = NULL;
183
u8 *pwrtrk_tab_up_d = NULL;
184
u8 *pwrtrk_tab_down_d = NULL;
185
/*for Xtal Offset by James.Tung*/
186
s8 *xtal_tab_up = NULL;
187
s8 *xtal_tab_down = NULL;
188
189
configure_txpower_track(dm, &c);
190
191
(*c.get_delta_swing_table)(dm,
192
(u8 **)&pwrtrk_tab_up_a,
193
(u8 **)&pwrtrk_tab_down_a,
194
(u8 **)&pwrtrk_tab_up_b,
195
(u8 **)&pwrtrk_tab_down_b);
196
197
if (dm->support_ic_type & ODM_RTL8814A) /*for 8814 path C & D*/
198
(*c.get_delta_swing_table8814only)(dm,
199
(u8 **)&pwrtrk_tab_up_c,
200
(u8 **)&pwrtrk_tab_down_c,
201
(u8 **)&pwrtrk_tab_up_d,
202
(u8 **)&pwrtrk_tab_down_d);
203
/*for Xtal Offset*/
204
if (dm->support_ic_type &
205
(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B | ODM_RTL8192F))
206
(*c.get_delta_swing_xtal_table)(dm,
207
(s8 **)&xtal_tab_up,
208
(s8 **)&xtal_tab_down);
209
210
if (thermal_value > rf->eeprom_thermal) {
211
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
212
/*recording power index offset*/
213
cali_info->delta_power_index_last[p] =
214
cali_info->delta_power_index[p];
215
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
216
"******Temp is higher******\n");
217
switch (p) {
218
case RF_PATH_B:
219
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
220
"pwrtrk_tab_up_b[%d] = %d\n", delta,
221
pwrtrk_tab_up_b[delta]);
222
223
cali_info->delta_power_index[p] =
224
pwrtrk_tab_up_b[delta];
225
cali_info->absolute_ofdm_swing_idx[p] =
226
pwrtrk_tab_up_b[delta];
227
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
228
"absolute_ofdm_swing_idx[PATH_B] = %d\n",
229
cali_info->absolute_ofdm_swing_idx[p]);
230
break;
231
232
case RF_PATH_C:
233
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
234
"pwrtrk_tab_up_c[%d] = %d\n", delta,
235
pwrtrk_tab_up_c[delta]);
236
237
cali_info->delta_power_index[p] =
238
pwrtrk_tab_up_c[delta];
239
cali_info->absolute_ofdm_swing_idx[p] =
240
pwrtrk_tab_up_c[delta];
241
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
242
"absolute_ofdm_swing_idx[PATH_C] = %d\n",
243
cali_info->absolute_ofdm_swing_idx[p]);
244
break;
245
246
case RF_PATH_D:
247
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
248
"pwrtrk_tab_up_d[%d] = %d\n", delta,
249
pwrtrk_tab_up_d[delta]);
250
251
cali_info->delta_power_index[p] =
252
pwrtrk_tab_up_d[delta];
253
cali_info->absolute_ofdm_swing_idx[p] =
254
pwrtrk_tab_up_d[delta];
255
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
256
"absolute_ofdm_swing_idx[PATH_D] = %d\n",
257
cali_info->absolute_ofdm_swing_idx[p]);
258
break;
259
260
default:
261
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
262
"pwrtrk_tab_up_a[%d] = %d\n", delta,
263
pwrtrk_tab_up_a[delta]);
264
265
cali_info->delta_power_index[p] =
266
pwrtrk_tab_up_a[delta];
267
cali_info->absolute_ofdm_swing_idx[p] =
268
pwrtrk_tab_up_a[delta];
269
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
270
"absolute_ofdm_swing_idx[PATH_A] = %d\n",
271
cali_info->absolute_ofdm_swing_idx[p]);
272
break;
273
}
274
}
275
/* @JJ ADD 20161014 */
276
/*Save xtal_offset from Xtal table*/
277
if (dm->support_ic_type &
278
(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B |
279
ODM_RTL8192F)) {
280
/*recording last Xtal offset*/
281
cali_info->xtal_offset_last = cali_info->xtal_offset;
282
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
283
"[Xtal] xtal_tab_up[%d] = %d\n",
284
delta, xtal_tab_up[delta]);
285
cali_info->xtal_offset = xtal_tab_up[delta];
286
if (cali_info->xtal_offset_last != xtal_tab_up[delta])
287
cali_info->xtal_offset_eanble = 1;
288
}
289
} else {
290
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
291
/*recording power index offset*/
292
cali_info->delta_power_index_last[p] =
293
cali_info->delta_power_index[p];
294
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
295
"******Temp is lower******\n");
296
switch (p) {
297
case RF_PATH_B:
298
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
299
"pwrtrk_tab_down_b[%d] = %d\n", delta,
300
pwrtrk_tab_down_b[delta]);
301
cali_info->delta_power_index[p] =
302
-1 * pwrtrk_tab_down_b[delta];
303
cali_info->absolute_ofdm_swing_idx[p] =
304
-1 * pwrtrk_tab_down_b[delta];
305
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
306
"absolute_ofdm_swing_idx[PATH_B] = %d\n",
307
cali_info->absolute_ofdm_swing_idx[p]);
308
break;
309
310
case RF_PATH_C:
311
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
312
"pwrtrk_tab_down_c[%d] = %d\n", delta,
313
pwrtrk_tab_down_c[delta]);
314
cali_info->delta_power_index[p] =
315
-1 * pwrtrk_tab_down_c[delta];
316
cali_info->absolute_ofdm_swing_idx[p] =
317
-1 * pwrtrk_tab_down_c[delta];
318
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
319
"absolute_ofdm_swing_idx[PATH_C] = %d\n",
320
cali_info->absolute_ofdm_swing_idx[p]);
321
break;
322
323
case RF_PATH_D:
324
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
325
"pwrtrk_tab_down_d[%d] = %d\n", delta,
326
pwrtrk_tab_down_d[delta]);
327
cali_info->delta_power_index[p] =
328
-1 * pwrtrk_tab_down_d[delta];
329
cali_info->absolute_ofdm_swing_idx[p] =
330
-1 * pwrtrk_tab_down_d[delta];
331
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
332
"absolute_ofdm_swing_idx[PATH_D] = %d\n",
333
cali_info->absolute_ofdm_swing_idx[p]);
334
break;
335
336
default:
337
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
338
"pwrtrk_tab_down_a[%d] = %d\n", delta,
339
pwrtrk_tab_down_a[delta]);
340
cali_info->delta_power_index[p] =
341
-1 * pwrtrk_tab_down_a[delta];
342
cali_info->absolute_ofdm_swing_idx[p] =
343
-1 * pwrtrk_tab_down_a[delta];
344
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
345
"absolute_ofdm_swing_idx[PATH_A] = %d\n",
346
cali_info->absolute_ofdm_swing_idx[p]);
347
break;
348
}
349
}
350
/* @JJ ADD 20161014 */
351
if (dm->support_ic_type &
352
(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8710B |
353
ODM_RTL8192F)) {
354
/*recording last Xtal offset*/
355
cali_info->xtal_offset_last = cali_info->xtal_offset;
356
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
357
"[Xtal] xtal_tab_down[%d] = %d\n", delta,
358
xtal_tab_down[delta]);
359
/*Save xtal_offset from Xtal table*/
360
cali_info->xtal_offset = xtal_tab_down[delta];
361
if (cali_info->xtal_offset_last != xtal_tab_down[delta])
362
cali_info->xtal_offset_eanble = 1;
363
}
364
}
365
}
366
367
void odm_pwrtrk_method(void *dm_void)
368
{
369
struct dm_struct *dm = (struct dm_struct *)dm_void;
370
u8 p, idxforchnl = 0;
371
372
struct txpwrtrack_cfg c = {0};
373
374
configure_txpower_track(dm, &c);
375
376
if (dm->support_ic_type &
377
(ODM_RTL8188E | ODM_RTL8192E | ODM_RTL8821 | ODM_RTL8812 |
378
ODM_RTL8723B | ODM_RTL8814A | ODM_RTL8703B | ODM_RTL8188F |
379
ODM_RTL8822B | ODM_RTL8723D | ODM_RTL8821C | ODM_RTL8710B |
380
ODM_RTL8192F)) {
381
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
382
"***Enter PwrTrk MIX_MODE***\n");
383
for (p = RF_PATH_A; p < c.rf_path_count; p++)
384
(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);
385
} else {
386
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
387
"***Enter PwrTrk BBSWING_MODE***\n");
388
for (p = RF_PATH_A; p < c.rf_path_count; p++)
389
(*c.odm_tx_pwr_track_set_pwr)
390
(dm, BBSWING, p, idxforchnl);
391
}
392
}
393
394
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
395
void odm_txpowertracking_callback_thermal_meter(struct dm_struct *dm)
396
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
397
void odm_txpowertracking_callback_thermal_meter(void *dm_void)
398
#else
399
void odm_txpowertracking_callback_thermal_meter(void *adapter)
400
#endif
401
{
402
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
403
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
404
struct dm_struct *dm = &hal_data->DM_OutSrc;
405
#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
406
struct dm_struct *dm = (struct dm_struct *)dm_void;
407
#endif
408
409
struct _hal_rf_ *rf = &dm->rf_table;
410
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
411
struct dm_iqk_info *iqk_info = &dm->IQK_info;
412
413
u8 thermal_value = 0, delta, delta_lck, delta_iqk, p = 0, i = 0;
414
u8 thermal_value_avg_count = 0;
415
u32 thermal_value_avg = 0, regc80, regcd0, regcd4, regab4;
416
417
/* OFDM BB Swing should be less than +3.0dB, required by Arthur */
418
#if 0
419
u8 OFDM_min_index = 0;
420
#endif
421
#if 0
422
/* get_right_chnl_place_for_iqk(hal_data->current_channel) */
423
#endif
424
u8 power_tracking_type = rf->pwt_type;
425
s8 thermal_value_temp = 0;
426
427
struct txpwrtrack_cfg c = {0};
428
429
/* @4 2. Initialization ( 7 steps in total ) */
430
431
configure_txpower_track(dm, &c);
432
433
cali_info->txpowertracking_callback_cnt++;
434
cali_info->is_txpowertracking_init = true;
435
436
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
437
"\n\n\n===>%s bbsw_idx_cck_base=%d\n",
438
__func__, cali_info->bb_swing_idx_cck_base);
439
440
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
441
"bbsw_idx_ofdm_base[A]=%d default_ofdm_idx=%d\n",
442
cali_info->bb_swing_idx_ofdm_base[RF_PATH_A],
443
cali_info->default_ofdm_index);
444
445
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
446
"cali_info->txpowertrack_control=%d, rf->eeprom_thermal %d\n",
447
cali_info->txpowertrack_control, rf->eeprom_thermal);
448
449
/* 0x42: RF Reg[15:10] 88E */
450
thermal_value =
451
(u8)odm_get_rf_reg(dm, RF_PATH_A, c.thermal_reg_addr, 0xfc00);
452
453
thermal_value_temp = thermal_value + phydm_get_thermal_offset(dm);
454
455
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
456
"thermal_value_temp(%d) = ther_value(%d) + pwr_trim_ther(%d)\n",
457
thermal_value_temp, thermal_value,
458
phydm_get_thermal_offset(dm));
459
460
if (thermal_value_temp > 63)
461
thermal_value = 63;
462
else if (thermal_value_temp < 0)
463
thermal_value = 0;
464
else
465
thermal_value = thermal_value_temp;
466
467
/*@add log by zhao he, check c80/c94/c14/ca0 value*/
468
if (dm->support_ic_type &
469
(ODM_RTL8723D | ODM_RTL8710B)) {
470
regc80 = odm_get_bb_reg(dm, R_0xc80, MASKDWORD);
471
regcd0 = odm_get_bb_reg(dm, R_0xcd0, MASKDWORD);
472
regcd4 = odm_get_bb_reg(dm, R_0xcd4, MASKDWORD);
473
regab4 = odm_get_bb_reg(dm, R_0xab4, 0x000007FF);
474
RF_DBG(dm, DBG_RF_IQK,
475
"0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n",
476
regc80, regcd0, regcd4, regab4);
477
}
478
479
if (!cali_info->txpowertrack_control)
480
return;
481
482
if (rf->eeprom_thermal == 0xff) {
483
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
484
"no pg, hal_data->eeprom_thermal_meter = 0x%x\n",
485
rf->eeprom_thermal);
486
return;
487
}
488
489
/*@4 3. Initialize ThermalValues of rf_calibrate_info*/
490
491
if (cali_info->is_reloadtxpowerindex)
492
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
493
"reload ofdm index for band switch\n");
494
495
/*@4 4. Calculate average thermal meter*/
496
497
cali_info->thermal_value_avg[cali_info->thermal_value_avg_index]
498
= thermal_value;
499
500
cali_info->thermal_value_avg_index++;
501
/*Average times = c.average_thermal_num*/
502
if (cali_info->thermal_value_avg_index == c.average_thermal_num)
503
cali_info->thermal_value_avg_index = 0;
504
505
for (i = 0; i < c.average_thermal_num; i++) {
506
if (cali_info->thermal_value_avg[i]) {
507
thermal_value_avg += cali_info->thermal_value_avg[i];
508
thermal_value_avg_count++;
509
}
510
}
511
512
/* Calculate Average thermal_value after average enough times */
513
if (thermal_value_avg_count) {
514
thermal_value =
515
(u8)(thermal_value_avg / thermal_value_avg_count);
516
cali_info->thermal_value_delta
517
= thermal_value - rf->eeprom_thermal;
518
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
519
"AVG Thermal Meter = 0x%X, EFUSE Thermal base = 0x%X\n",
520
thermal_value, rf->eeprom_thermal);
521
}
522
523
/* @4 5. Calculate delta, delta_lck, delta_iqk. */
524
/* "delta" here is used to determine thermal value changes or not. */
525
if (thermal_value > cali_info->thermal_value)
526
delta = thermal_value - cali_info->thermal_value;
527
else
528
delta = cali_info->thermal_value - thermal_value;
529
530
if (thermal_value > cali_info->thermal_value_lck)
531
delta_lck = thermal_value - cali_info->thermal_value_lck;
532
else
533
delta_lck = cali_info->thermal_value_lck - thermal_value;
534
535
if (thermal_value > cali_info->thermal_value_iqk)
536
delta_iqk = thermal_value - cali_info->thermal_value_iqk;
537
else
538
delta_iqk = cali_info->thermal_value_iqk - thermal_value;
539
540
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
541
"(delta, delta_lck, delta_iqk) = (%d, %d, %d)\n", delta,
542
delta_lck, delta_iqk);
543
544
/*@4 6. If necessary, do LCK.*/
545
/* Wait sacn to do LCK by RF Jenyu*/
546
if (!(*dm->is_scan_in_process) && !iqk_info->rfk_forbidden) {
547
/* Delta temperature is equal to or larger than 20 centigrade.*/
548
if (delta_lck >= c.threshold_iqk) {
549
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
550
"delta_lck(%d) >= threshold_iqk(%d)\n",
551
delta_lck, c.threshold_iqk);
552
cali_info->thermal_value_lck = thermal_value;
553
554
/*Use RTLCK, close power tracking driver LCK*/
555
/*8821 don't do LCK*/
556
if (!(dm->support_ic_type &
557
(ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B)) &&
558
c.phy_lc_calibrate) {
559
(*c.phy_lc_calibrate)(dm);
560
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
561
"do pwrtrk lck\n");
562
}
563
}
564
}
565
566
/*@3 7. If necessary, move the index of swing table to adjust Tx power.*/
567
/* "delta" here is used to record the absolute value of difference. */
568
if (delta > 0 && cali_info->txpowertrack_control) {
569
if (thermal_value > rf->eeprom_thermal)
570
delta = thermal_value - rf->eeprom_thermal;
571
else
572
delta = rf->eeprom_thermal - thermal_value;
573
574
if (delta >= TXPWR_TRACK_TABLE_SIZE)
575
delta = TXPWR_TRACK_TABLE_SIZE - 1;
576
577
odm_get_tracking_table(dm, thermal_value, delta);
578
579
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
580
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
581
"\n[path-%d] Calculate pwr_idx_offset\n", p);
582
583
/*If Thermal value changes but table value is the same*/
584
if (cali_info->delta_power_index[p] ==
585
cali_info->delta_power_index_last[p])
586
cali_info->power_index_offset[p] = 0;
587
else
588
cali_info->power_index_offset[p] =
589
cali_info->delta_power_index[p] -
590
cali_info->delta_power_index_last[p];
591
592
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
593
"path-%d pwridx_diff%d=pwr_idx%d - last_idx%d\n",
594
p, cali_info->power_index_offset[p],
595
cali_info->delta_power_index[p],
596
cali_info->delta_power_index_last[p]);
597
#if 0
598
599
cali_info->OFDM_index[p] = cali_info->bb_swing_idx_ofdm_base[p] + cali_info->power_index_offset[p];
600
cali_info->CCK_index = cali_info->bb_swing_idx_cck_base + cali_info->power_index_offset[p];
601
602
cali_info->bb_swing_idx_cck = cali_info->CCK_index;
603
cali_info->bb_swing_idx_ofdm[p] = cali_info->OFDM_index[p];
604
605
/*************Print BB Swing base and index Offset*************/
606
607
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
608
"The 'CCK' final index(%d) = BaseIndex(%d) + power_index_offset(%d)\n",
609
cali_info->bb_swing_idx_cck,
610
cali_info->bb_swing_idx_cck_base,
611
cali_info->power_index_offset[p]);
612
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
613
"The 'OFDM' final index(%d) = BaseIndex[%d](%d) + power_index_offset(%d)\n",
614
cali_info->bb_swing_idx_ofdm[p], p,
615
cali_info->bb_swing_idx_ofdm_base[p],
616
cali_info->power_index_offset[p]);
617
618
/*4 7.1 Handle boundary conditions of index.*/
619
620
if (cali_info->OFDM_index[p] > c.swing_table_size_ofdm - 1)
621
cali_info->OFDM_index[p] = c.swing_table_size_ofdm - 1;
622
else if (cali_info->OFDM_index[p] <= OFDM_min_index)
623
cali_info->OFDM_index[p] = OFDM_min_index;
624
#endif
625
}
626
#if 0
627
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
628
"\n\n========================================================================================================\n");
629
630
if (cali_info->CCK_index > c.swing_table_size_cck - 1)
631
cali_info->CCK_index = c.swing_table_size_cck - 1;
632
else if (cali_info->CCK_index <= 0)
633
cali_info->CCK_index = 0;
634
#endif
635
} else {
636
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
637
"Thermal is unchanged thermal=%d last_thermal=%d\n",
638
thermal_value,
639
cali_info->thermal_value);
640
for (p = RF_PATH_A; p < c.rf_path_count; p++)
641
cali_info->power_index_offset[p] = 0;
642
}
643
644
#if 0
645
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
646
"TxPowerTracking: [CCK] Swing Current index: %d, Swing base index: %d\n",
647
cali_info->CCK_index,
648
cali_info->bb_swing_idx_cck_base); /*Print Swing base & current*/
649
650
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
651
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
652
"TxPowerTracking: [OFDM] Swing Current index: %d, Swing base index[%d]: %d\n",
653
cali_info->OFDM_index[p], p,
654
cali_info->bb_swing_idx_ofdm_base[p]);
655
}
656
#endif
657
658
if ((dm->support_ic_type & ODM_RTL8814A)) {
659
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "power_tracking_type=%d\n",
660
power_tracking_type);
661
662
if (power_tracking_type == 0) {
663
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
664
"***Enter PwrTrk MIX_MODE***\n");
665
for (p = RF_PATH_A; p < c.rf_path_count; p++)
666
(*c.odm_tx_pwr_track_set_pwr)
667
(dm, MIX_MODE, p, 0);
668
} else if (power_tracking_type == 1) {
669
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
670
"***Enter PwrTrk MIX(2G) TSSI(5G) MODE***\n");
671
for (p = RF_PATH_A; p < c.rf_path_count; p++)
672
(*c.odm_tx_pwr_track_set_pwr)
673
(dm, MIX_2G_TSSI_5G_MODE, p, 0);
674
} else if (power_tracking_type == 2) {
675
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
676
"***Enter PwrTrk MIX(5G) TSSI(2G)MODE***\n");
677
for (p = RF_PATH_A; p < c.rf_path_count; p++)
678
(*c.odm_tx_pwr_track_set_pwr)
679
(dm, MIX_5G_TSSI_2G_MODE, p, 0);
680
} else if (power_tracking_type == 3) {
681
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
682
"***Enter PwrTrk TSSI MODE***\n");
683
for (p = RF_PATH_A; p < c.rf_path_count; p++)
684
(*c.odm_tx_pwr_track_set_pwr)
685
(dm, TSSI_MODE, p, 0);
686
}
687
} else if ((cali_info->power_index_offset[RF_PATH_A] != 0 ||
688
cali_info->power_index_offset[RF_PATH_B] != 0 ||
689
cali_info->power_index_offset[RF_PATH_C] != 0 ||
690
cali_info->power_index_offset[RF_PATH_D] != 0)) {
691
#if 0
692
/* 4 7.2 Configure the Swing Table to adjust Tx Power. */
693
/*Always true after Tx Power is adjusted by power tracking.*/
694
695
cali_info->is_tx_power_changed = true;
696
/* 2012/04/23 MH According to Luke's suggestion, we can not write BB digital
697
* to increase TX power. Otherwise, EVM will be bad.
698
*
699
* 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.
700
*/
701
if (thermal_value > cali_info->thermal_value) {
702
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
703
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
704
"Temperature Increasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
705
p, cali_info->power_index_offset[p],
706
delta, thermal_value, rf->eeprom_thermal,
707
cali_info->thermal_value);
708
}
709
} else if (thermal_value < cali_info->thermal_value) { /*Low temperature*/
710
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
711
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
712
"Temperature Decreasing(%d): delta_pi: %d, delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",
713
p, cali_info->power_index_offset[p],
714
delta, thermal_value, rf->eeprom_thermal,
715
cali_info->thermal_value);
716
}
717
}
718
#endif
719
720
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
721
if (thermal_value > rf->eeprom_thermal) {
722
#else
723
if (thermal_value > dm->priv->pmib->dot11RFEntry.ther) {
724
#endif
725
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
726
"Temperature(%d) higher than PG value(%d)\n",
727
thermal_value, rf->eeprom_thermal);
728
729
odm_pwrtrk_method(dm);
730
} else {
731
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
732
"Temperature(%d) lower than PG value(%d)\n",
733
thermal_value, rf->eeprom_thermal);
734
735
odm_pwrtrk_method(dm);
736
}
737
738
#if 0
739
/*Record last time Power Tracking result as base.*/
740
cali_info->bb_swing_idx_cck_base = cali_info->bb_swing_idx_cck;
741
for (p = RF_PATH_A; p < c.rf_path_count; p++)
742
cali_info->bb_swing_idx_ofdm_base[p] = cali_info->bb_swing_idx_ofdm[p];
743
#endif
744
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
745
"cali_info->thermal_value = %d thermal_value= %d\n",
746
cali_info->thermal_value, thermal_value);
747
}
748
/*Record last Power Tracking Thermal value*/
749
cali_info->thermal_value = thermal_value;
750
751
if (dm->support_ic_type &
752
(ODM_RTL8703B | ODM_RTL8723D | ODM_RTL8192F | ODM_RTL8710B)) {
753
if (cali_info->xtal_offset_eanble != 0 &&
754
cali_info->txpowertrack_control &&
755
rf->eeprom_thermal != 0xff) {
756
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
757
"**********Enter Xtal Tracking**********\n");
758
759
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
760
if (thermal_value > rf->eeprom_thermal) {
761
#else
762
if (thermal_value > dm->priv->pmib->dot11RFEntry.ther) {
763
#endif
764
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
765
"Temperature(%d) higher than PG (%d)\n",
766
thermal_value, rf->eeprom_thermal);
767
(*c.odm_txxtaltrack_set_xtal)(dm);
768
} else {
769
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
770
"Temperature(%d) lower than PG (%d)\n",
771
thermal_value, rf->eeprom_thermal);
772
(*c.odm_txxtaltrack_set_xtal)(dm);
773
}
774
}
775
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
776
"**********End Xtal Tracking**********\n");
777
}
778
779
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
780
781
/* Wait sacn to do IQK by RF Jenyu*/
782
if (!(*dm->is_scan_in_process) && !iqk_info->rfk_forbidden &&
783
!cali_info->is_iqk_in_progress) {
784
if (!(dm->support_ic_type & ODM_RTL8723B)) {
785
/*Delta temperature is equal or larger than 20 Celsius*/
786
/*When threshold is 8*/
787
if (delta_iqk >= c.threshold_iqk) {
788
cali_info->thermal_value_iqk = thermal_value;
789
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
790
"delta_iqk(%d) >= threshold_iqk(%d)\n",
791
delta_iqk, c.threshold_iqk);
792
(*c.do_iqk)(dm, delta_iqk, thermal_value, 8);
793
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
794
"do pwrtrk iqk\n");
795
}
796
}
797
}
798
799
#if 0
800
if (cali_info->dpk_thermal[RF_PATH_A] != 0) {
801
if (diff_DPK[RF_PATH_A] >= c.threshold_dpk) {
802
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
803
odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[RF_PATH_A] / c.threshold_dpk));
804
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
805
} else if ((diff_DPK[RF_PATH_A] <= -1 * c.threshold_dpk)) {
806
s32 value = 0x20 + (diff_DPK[RF_PATH_A] / c.threshold_dpk);
807
808
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
809
odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);
810
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
811
} else {
812
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
813
odm_set_bb_reg(dm, R_0xcc4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);
814
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
815
}
816
}
817
if (cali_info->dpk_thermal[RF_PATH_B] != 0) {
818
if (diff_DPK[RF_PATH_B] >= c.threshold_dpk) {
819
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
820
odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), (diff_DPK[RF_PATH_B] / c.threshold_dpk));
821
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
822
} else if ((diff_DPK[RF_PATH_B] <= -1 * c.threshold_dpk)) {
823
s32 value = 0x20 + (diff_DPK[RF_PATH_B] / c.threshold_dpk);
824
825
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
826
odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), value);
827
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
828
} else {
829
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x1);
830
odm_set_bb_reg(dm, R_0xec4, BIT(14) | BIT(13) | BIT(12) | BIT(11) | BIT(10), 0);
831
odm_set_bb_reg(dm, R_0x82c, BIT(31), 0x0);
832
}
833
}
834
#endif
835
836
#endif
837
838
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===%s\n", __func__);
839
840
cali_info->tx_powercount = 0;
841
}
842
843
#if (RTL8822C_SUPPORT == 1 || RTL8814B_SUPPORT == 1)
844
void
845
odm_txpowertracking_new_callback_thermal_meter(void *dm_void)
846
{
847
struct dm_struct *dm = (struct dm_struct *)dm_void;
848
struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);
849
struct dm_iqk_info *iqk_info = &dm->IQK_info;
850
struct _hal_rf_ *rf = &dm->rf_table;
851
struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;
852
u8 thermal_value[MAX_RF_PATH] = {0}, delta[MAX_RF_PATH] = {0};
853
u8 delta_swing_table_idx_tup[DELTA_SWINGIDX_SIZE] = {0};
854
u8 delta_swing_table_idx_tdown[DELTA_SWINGIDX_SIZE] = {0};
855
u8 delta_LCK = 0, delta_IQK = 0, i = 0, j = 0, p;
856
u8 thermal_value_avg_count[MAX_RF_PATH] = {0};
857
u32 thermal_value_avg[MAX_RF_PATH] = {0};
858
s8 thermal_value_temp[MAX_RF_PATH] = {0};
859
u8 tracking_method = MIX_MODE;
860
861
struct txpwrtrack_cfg c;
862
863
u8 *delta_swing_table_idx_tup_a = NULL;
864
u8 *delta_swing_table_idx_tdown_a = NULL;
865
u8 *delta_swing_table_idx_tup_b = NULL;
866
u8 *delta_swing_table_idx_tdown_b = NULL;
867
u8 *delta_swing_table_idx_tup_c = NULL;
868
u8 *delta_swing_table_idx_tdown_c = NULL;
869
u8 *delta_swing_table_idx_tup_d = NULL;
870
u8 *delta_swing_table_idx_tdown_d = NULL;
871
872
configure_txpower_track(dm, &c);
873
874
(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_a, (u8 **)&delta_swing_table_idx_tdown_a,
875
(u8 **)&delta_swing_table_idx_tup_b, (u8 **)&delta_swing_table_idx_tdown_b);
876
877
if (dm->support_ic_type == ODM_RTL8814B) {
878
(*c.get_delta_swing_table)(dm, (u8 **)&delta_swing_table_idx_tup_c, (u8 **)&delta_swing_table_idx_tdown_c,
879
(u8 **)&delta_swing_table_idx_tup_d, (u8 **)&delta_swing_table_idx_tdown_d);
880
}
881
882
cali_info->txpowertracking_callback_cnt++;
883
cali_info->is_txpowertracking_init = true;
884
885
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
886
"===>odm_txpowertracking_callback_thermal_meter\n cali_info->bb_swing_idx_cck_base: %d, cali_info->bb_swing_idx_ofdm_base[A]: %d, cali_info->default_ofdm_index: %d\n",
887
cali_info->bb_swing_idx_cck_base, cali_info->bb_swing_idx_ofdm_base[RF_PATH_A], cali_info->default_ofdm_index);
888
889
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
890
"cali_info->txpowertrack_control=%d, tssi->thermal[RF_PATH_A]=%d tssi->thermal[RF_PATH_B]=%d\n",
891
cali_info->txpowertrack_control, tssi->thermal[RF_PATH_A], tssi->thermal[RF_PATH_B]);
892
893
if (dm->support_ic_type == ODM_RTL8822C) {
894
for (i = 0; i < c.rf_path_count; i++)
895
thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0x7e); /* 0x42: RF Reg[6:1] Thermal Trim*/
896
} else {
897
for (i = 0; i < c.rf_path_count; i++) {
898
thermal_value[i] = (u8)odm_get_rf_reg(dm, i, c.thermal_reg_addr, 0xfc00); /* 0x42: RF Reg[15:10]*/
899
thermal_value_temp[i] = (s8)thermal_value[i] + phydm_get_thermal_offset(dm);
900
901
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
902
"thermal_value_temp[%d](%d) = thermal_value[%d](%d) + power_time_thermal(%d)\n", i, thermal_value_temp[i], i, thermal_value[i], phydm_get_thermal_offset(dm));
903
904
if (thermal_value_temp[i] > 63)
905
thermal_value[i] = 63;
906
else if (thermal_value_temp[i] < 0)
907
thermal_value[i] = 0;
908
else
909
thermal_value[i] = thermal_value_temp[i];
910
}
911
}
912
913
if ((tssi->thermal[RF_PATH_A] == 0xff || tssi->thermal[RF_PATH_B] == 0xff) &&
914
cali_info->txpowertrack_control != 3) {
915
for (i = 0; i < c.rf_path_count; i++)
916
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "no pg, tssi->thermal[%d] = 0x%x\n",
917
i, tssi->thermal[i]);
918
return;
919
}
920
921
for (j = 0; j < c.rf_path_count; j++) {
922
cali_info->thermal_value_avg_path[j][cali_info->thermal_value_avg_index_path[j]] = thermal_value[j];
923
cali_info->thermal_value_avg_index_path[j]++;
924
if (cali_info->thermal_value_avg_index_path[j] == c.average_thermal_num) /*Average times = c.average_thermal_num*/
925
cali_info->thermal_value_avg_index_path[j] = 0;
926
927
928
for (i = 0; i < c.average_thermal_num; i++) {
929
if (cali_info->thermal_value_avg_path[j][i]) {
930
thermal_value_avg[j] += cali_info->thermal_value_avg_path[j][i];
931
thermal_value_avg_count[j]++;
932
}
933
}
934
935
if (thermal_value_avg_count[j]) { /* Calculate Average thermal_value after average enough times */
936
thermal_value[j] = (u8)(thermal_value_avg[j] / thermal_value_avg_count[j]);
937
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
938
"AVG Thermal Meter = 0x%X, tssi->thermal[%d] = 0x%x\n",
939
thermal_value[j], j, tssi->thermal[j]);
940
}
941
/* 4 5. Calculate delta, delta_LCK, delta_IQK. */
942
943
/* "delta" here is used to determine whether thermal value changes or not. */
944
delta[j] = (thermal_value[j] > cali_info->thermal_value_path[j]) ? (thermal_value[j] - cali_info->thermal_value_path[j]) : (cali_info->thermal_value_path[j] - thermal_value[j]);
945
delta_LCK = (thermal_value[0] > cali_info->thermal_value_lck) ? (thermal_value[0] - cali_info->thermal_value_lck) : (cali_info->thermal_value_lck - thermal_value[0]);
946
delta_IQK = (thermal_value[0] > cali_info->thermal_value_iqk) ? (thermal_value[0] - cali_info->thermal_value_iqk) : (cali_info->thermal_value_iqk - thermal_value[0]);
947
}
948
949
/*4 6. If necessary, do LCK.*/
950
951
for (i = 0; i < c.rf_path_count; i++)
952
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "(delta[%d], delta_LCK, delta_IQK) = (%d, %d, %d)\n", i, delta[i], delta_LCK, delta_IQK);
953
954
/* Wait sacn to do LCK by RF Jenyu*/
955
if( (*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {
956
/* Delta temperature is equal to or larger than 20 centigrade.*/
957
if (delta_LCK >= c.threshold_iqk) {
958
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_LCK(%d) >= threshold_iqk(%d)\n", delta_LCK, c.threshold_iqk);
959
cali_info->thermal_value_lck = thermal_value[RF_PATH_A];
960
961
/*Use RTLCK, so close power tracking driver LCK*/
962
if ((!(dm->support_ic_type & ODM_RTL8814A)) && (!(dm->support_ic_type & ODM_RTL8822B))) {
963
if (c.phy_lc_calibrate)
964
(*c.phy_lc_calibrate)(dm);
965
} else
966
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do not do LCK\n");
967
}
968
}
969
970
/*3 7. If necessary, move the index of swing table to adjust Tx power.*/
971
for (i = 0; i < c.rf_path_count; i++) {
972
if (i == RF_PATH_B) {
973
odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_b, DELTA_SWINGIDX_SIZE);
974
odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_b, DELTA_SWINGIDX_SIZE);
975
} else if (i == RF_PATH_C) {
976
odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_c, DELTA_SWINGIDX_SIZE);
977
odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_c, DELTA_SWINGIDX_SIZE);
978
} else if (i == RF_PATH_D) {
979
odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_d, DELTA_SWINGIDX_SIZE);
980
odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_d, DELTA_SWINGIDX_SIZE);
981
} else {
982
odm_move_memory(dm, delta_swing_table_idx_tup, delta_swing_table_idx_tup_a, DELTA_SWINGIDX_SIZE);
983
odm_move_memory(dm, delta_swing_table_idx_tdown, delta_swing_table_idx_tdown_a, DELTA_SWINGIDX_SIZE);
984
}
985
986
cali_info->delta_power_index_last[i] = cali_info->delta_power_index[i]; /*recording poer index offset*/
987
delta[i] = thermal_value[i] > tssi->thermal[i] ? (thermal_value[i] - tssi->thermal[i]) : (tssi->thermal[i] - thermal_value[i]);
988
989
if (delta[i] >= TXPWR_TRACK_TABLE_SIZE)
990
delta[i] = TXPWR_TRACK_TABLE_SIZE - 1;
991
992
if (thermal_value[i] > tssi->thermal[i]) {
993
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
994
"delta_swing_table_idx_tup[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tup[delta[i]], i);
995
996
cali_info->delta_power_index[i] = delta_swing_table_idx_tup[delta[i]];
997
cali_info->absolute_ofdm_swing_idx[i] = delta_swing_table_idx_tup[delta[i]]; /*Record delta swing for mix mode power tracking*/
998
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
999
"******Temp is higher and cali_info->absolute_ofdm_swing_idx[%d]=%d Path=%d\n", delta[i], cali_info->absolute_ofdm_swing_idx[i], i);
1000
} else {
1001
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
1002
"delta_swing_table_idx_tdown[%d]=%d Path=%d\n", delta[i], delta_swing_table_idx_tdown[delta[i]], i);
1003
cali_info->delta_power_index[i] = -1 * delta_swing_table_idx_tdown[delta[i]];
1004
cali_info->absolute_ofdm_swing_idx[i] = -1 * delta_swing_table_idx_tdown[delta[i]]; /*Record delta swing for mix mode power tracking*/
1005
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,
1006
"******Temp is lower and cali_info->absolute_ofdm_swing_idx[%d]=%d Path=%d\n", delta[i], cali_info->absolute_ofdm_swing_idx[i], i);
1007
}
1008
}
1009
1010
for (p = RF_PATH_A; p < c.rf_path_count; p++) {
1011
if (cali_info->delta_power_index[p] == cali_info->delta_power_index_last[p]) /*If Thermal value changes but lookup table value still the same*/
1012
cali_info->power_index_offset[p] = 0;
1013
else
1014
cali_info->power_index_offset[p] = cali_info->delta_power_index[p] - cali_info->delta_power_index_last[p]; /*Power index diff between 2 times Power Tracking*/
1015
}
1016
1017
#if 0
1018
if (dm->support_ic_type == ODM_RTL8822C) {
1019
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");
1020
for (p = RF_PATH_A; p < c.rf_path_count; p++)
1021
(*c.odm_tx_pwr_track_set_pwr)(dm, MIX_MODE, p, 0);
1022
} else {
1023
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking BBSWING_MODE**********\n");
1024
for (p = RF_PATH_A; p < c.rf_path_count; p++)
1025
(*c.odm_tx_pwr_track_set_pwr)(dm, BBSWING, p, 0);
1026
}
1027
#endif
1028
if (*dm->mp_mode == 1) {
1029
if (cali_info->txpowertrack_control == 1) {
1030
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");
1031
tracking_method = MIX_MODE;
1032
} else if (cali_info->txpowertrack_control == 3) {
1033
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");
1034
tracking_method = TSSI_MODE;
1035
}
1036
} else {
1037
if (rf->power_track_type >= 0 && rf->power_track_type <= 3) {
1038
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking MIX_MODE**********\n");
1039
tracking_method = MIX_MODE;
1040
} else if (rf->power_track_type >= 4 && rf->power_track_type <= 7) {
1041
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "**********Enter POWER Tracking TSSI_MODE**********\n");
1042
tracking_method = TSSI_MODE;
1043
}
1044
}
1045
1046
if (dm->support_ic_type == ODM_RTL8822C || dm->support_ic_type == ODM_RTL8814B)
1047
for (p = RF_PATH_A; p < c.rf_path_count; p++)
1048
(*c.odm_tx_pwr_track_set_pwr)(dm, tracking_method, p, 0);
1049
1050
/* Wait sacn to do IQK by RF Jenyu*/
1051
if ((*dm->is_scan_in_process == false) && (!iqk_info->rfk_forbidden)) {
1052
/*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/
1053
if (delta_IQK >= c.threshold_iqk) {
1054
cali_info->thermal_value_iqk = thermal_value[RF_PATH_A];
1055
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "delta_IQK(%d) >= threshold_iqk(%d)\n", delta_IQK, c.threshold_iqk);
1056
/*if (!cali_info->is_iqk_in_progress)*/
1057
/* (*c.do_iqk)(dm, delta_IQK, thermal_value[RF_PATH_A], 8);*/
1058
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do IQK\n");
1059
1060
/*if (!cali_info->is_iqk_in_progress)*/
1061
/* (*c.do_tssi_dck)(dm, true);*/
1062
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "Do TSSI DCK\n");
1063
}
1064
}
1065
1066
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "<===%s\n", __func__);
1067
1068
cali_info->tx_powercount = 0;
1069
}
1070
#endif
1071
1072
/*@3============================================================
1073
* 3 IQ Calibration
1074
* 3============================================================
1075
*/
1076
1077
void odm_reset_iqk_result(void *dm_void)
1078
{
1079
}
1080
1081
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1082
u8 odm_get_right_chnl_place_for_iqk(u8 chnl)
1083
{
1084
u8 channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = {
1085
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1086
36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
1087
100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122,
1088
124, 126, 128, 130, 132, 134, 136, 138, 140,
1089
149, 151, 153, 155, 157, 159, 161, 163, 165};
1090
u8 place = chnl;
1091
1092
if (chnl > 14) {
1093
for (place = 14; place < sizeof(channel_all); place++) {
1094
if (channel_all[place] == chnl)
1095
return place - 13;
1096
}
1097
}
1098
return 0;
1099
}
1100
#endif
1101
1102
void odm_iq_calibrate(struct dm_struct *dm)
1103
{
1104
void *adapter = dm->adapter;
1105
struct dm_iqk_info *iqk_info = &dm->IQK_info;
1106
1107
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1108
if (*dm->is_fcs_mode_enable)
1109
return;
1110
#endif
1111
1112
#if (DM_ODM_SUPPORT_TYPE & (ODM_CE))
1113
if (IS_HARDWARE_TYPE_8812AU(adapter))
1114
return;
1115
#endif
1116
1117
if (dm->is_linked && !iqk_info->rfk_forbidden) {
1118
if ((*dm->channel != dm->pre_channel) &&
1119
(!*dm->is_scan_in_process)) {
1120
dm->pre_channel = *dm->channel;
1121
dm->linked_interval = 0;
1122
}
1123
1124
if (dm->linked_interval < 3)
1125
dm->linked_interval++;
1126
1127
if (dm->linked_interval == 2)
1128
halrf_iqk_trigger(dm, false);
1129
} else {
1130
dm->linked_interval = 0;
1131
}
1132
}
1133
1134
void phydm_rf_init(void *dm_void)
1135
{
1136
struct dm_struct *dm = (struct dm_struct *)dm_void;
1137
1138
odm_txpowertracking_init(dm);
1139
1140
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1141
odm_clear_txpowertracking_state(dm);
1142
#endif
1143
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1144
#if (RTL8814A_SUPPORT == 1)
1145
if (dm->support_ic_type & ODM_RTL8814A)
1146
phy_iq_calibrate_8814a_init(dm);
1147
#endif
1148
#endif
1149
}
1150
1151
void phydm_rf_watchdog(void *dm_void)
1152
{
1153
struct dm_struct *dm = (struct dm_struct *)dm_void;
1154
1155
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1156
odm_txpowertracking_check(dm);
1157
#if 0
1158
/*if (dm->support_ic_type & ODM_IC_11AC_SERIES)*/
1159
/*odm_iq_calibrate(dm);*/
1160
#endif
1161
#endif
1162
}
1163
1164