Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/rtl8814a/halrf_8814a_ap.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
*****************************************************************************/
15
16
#if !defined(__ECOS) && !defined(CONFIG_COMPAT_WIRELESS)
17
#include "mp_precomp.h"
18
#else
19
#include "../mp_precomp.h"
20
#endif
21
#include "../../phydm_precomp.h"
22
23
24
25
/*---------------------------Define Local Constant---------------------------*/
26
/* 2010/04/25 MH Define the max tx power tracking tx agc power. */
27
#define ODM_TXPWRTRACK_MAX_IDX8814A 6
28
29
/*---------------------------Define Local Constant---------------------------*/
30
31
32
/* 3============================================================
33
* 3 Tx Power Tracking
34
* 3============================================================ */
35
36
u8
37
check_rf_gain_offset(
38
struct dm_struct *dm,
39
enum pwrtrack_method method,
40
u8 rf_path
41
)
42
{
43
s8 upper_bound = 10, lower_bound = -5; /* 4'b1010 = 10 */
44
s8 final_rf_index = 0;
45
boolean is_positive = false;
46
u32 bit_mask = 0;
47
u8 final_ofdm_swing_index = 0, tx_scaling_upper_bound = 28, tx_scaling_lower_bound = 4;/* upper bound +2dB, lower bound -9dB */
48
struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);
49
50
if (method == MIX_MODE) { /* normal Tx power tracking */
51
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "is 8814 MP chip\n");
52
bit_mask = BIT(19);
53
cali_info->absolute_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] + cali_info->kfree_offset[rf_path];
54
55
if (cali_info->absolute_ofdm_swing_idx[rf_path] >= 0) /* check if RF_Index is positive or not */
56
is_positive = true;
57
else
58
is_positive = false;
59
60
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, is_positive);
61
62
bit_mask = BIT(18) | BIT(17) | BIT(16) | BIT(15);
63
final_rf_index = cali_info->absolute_ofdm_swing_idx[rf_path] / 2; /*TxBB 1 step equal 1dB, BB swing 1step equal 0.5dB*/
64
65
}
66
67
if (final_rf_index > upper_bound) { /* Upper bound = 10dB, if more htan upper bound, then move to bb swing max = +2dB */
68
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, upper_bound); /* set RF Reg0x55 per path */
69
70
final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path] - (upper_bound << 1));
71
72
if (final_ofdm_swing_index > tx_scaling_upper_bound) /* bb swing upper bound = +2dB */
73
final_ofdm_swing_index = tx_scaling_upper_bound;
74
75
return final_ofdm_swing_index;
76
} else if (final_rf_index < lower_bound) { /* lower bound = -5dB */
77
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, (-1) * (lower_bound)); /* set RF Reg0x55 per path */
78
79
final_ofdm_swing_index = cali_info->default_ofdm_index - ((lower_bound << 1) - cali_info->absolute_ofdm_swing_idx[rf_path]);
80
81
if (final_ofdm_swing_index < tx_scaling_lower_bound) /* bb swing lower bound = -10dB */
82
final_ofdm_swing_index = tx_scaling_lower_bound;
83
return final_ofdm_swing_index;
84
} else { /* normal case */
85
86
if (is_positive == true)
87
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, final_rf_index); /* set RF Reg0x55 per path */
88
else
89
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, bit_mask, (-1) * final_rf_index); /* set RF Reg0x55 per path */
90
91
final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path]) % 2;
92
return final_ofdm_swing_index;
93
}
94
95
return false;
96
}
97
98
99
void
100
odm_tx_pwr_track_set_pwr8814a(
101
struct dm_struct *dm,
102
enum pwrtrack_method method,
103
u8 rf_path,
104
u8 channel_mapped_index
105
)
106
{
107
u8 final_ofdm_swing_index = 0;
108
struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);
109
110
if (method == MIX_MODE) {
111
RF_DBG(dm, DBG_RF_TX_PWR_TRACK, "dm->default_ofdm_index=%d, dm->absolute_ofdm_swing_idx[rf_path]=%d, rf_path = %d\n",
112
cali_info->default_ofdm_index, cali_info->absolute_ofdm_swing_idx[rf_path], rf_path);
113
114
final_ofdm_swing_index = check_rf_gain_offset(dm, MIX_MODE, rf_path);
115
} else if (method == TSSI_MODE)
116
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, BIT(18) | BIT(17) | BIT(16) | BIT(15), 0);
117
else if (method == BBSWING) { /* use for mp driver clean power tracking status */
118
cali_info->absolute_ofdm_swing_idx[rf_path] = cali_info->absolute_ofdm_swing_idx[rf_path] + cali_info->kfree_offset[rf_path];
119
120
final_ofdm_swing_index = cali_info->default_ofdm_index + (cali_info->absolute_ofdm_swing_idx[rf_path]);
121
122
odm_set_rf_reg(dm, rf_path, REG_RF_TX_GAIN_OFFSET, BIT(18) | BIT(17) | BIT(16) | BIT(15), 0);
123
}
124
125
if ((method == MIX_MODE) || (method == BBSWING)) {
126
switch (rf_path) {
127
case RF_PATH_A:
128
129
odm_set_bb_reg(dm, REG_A_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); /* set BBswing */
130
131
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Path_A Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index);
132
break;
133
134
case RF_PATH_B:
135
136
odm_set_bb_reg(dm, REG_B_TX_SCALE_JAGUAR, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); /* set BBswing */
137
138
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Path_B Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index);
139
break;
140
141
case RF_PATH_C:
142
143
odm_set_bb_reg(dm, REG_C_TX_SCALE_JAGUAR2, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); /* set BBswing */
144
145
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Path_C Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index);
146
break;
147
148
case RF_PATH_D:
149
150
odm_set_bb_reg(dm, REG_D_TX_SCALE_JAGUAR2, 0xFFE00000, tx_scaling_table_jaguar[final_ofdm_swing_index]); /* set BBswing */
151
152
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"******Path_D Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index);
153
break;
154
155
default:
156
RF_DBG(dm, DBG_RF_TX_PWR_TRACK,"Wrong path name!!!!\n");
157
158
break;
159
}
160
}
161
return;
162
} /* odm_tx_pwr_track_set_pwr8814a */
163
164
void
165
get_delta_swing_table_8814a(
166
struct dm_struct *dm,
167
u8 **temperature_up_a,
168
u8 **temperature_down_a,
169
u8 **temperature_up_b,
170
u8 **temperature_down_b
171
)
172
{
173
struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);
174
u16 rate = *(dm->forced_data_rate);
175
u8 channel = *(dm->channel);
176
177
if (1 <= channel && channel <= 14) {
178
if (IS_CCK_RATE(rate)) {
179
*temperature_up_a = cali_info->delta_swing_table_idx_2g_cck_a_p;
180
*temperature_down_a = cali_info->delta_swing_table_idx_2g_cck_a_n;
181
*temperature_up_b = cali_info->delta_swing_table_idx_2g_cck_b_p;
182
*temperature_down_b = cali_info->delta_swing_table_idx_2g_cck_b_n;
183
} else {
184
*temperature_up_a = cali_info->delta_swing_table_idx_2ga_p;
185
*temperature_down_a = cali_info->delta_swing_table_idx_2ga_n;
186
*temperature_up_b = cali_info->delta_swing_table_idx_2gb_p;
187
*temperature_down_b = cali_info->delta_swing_table_idx_2gb_n;
188
}
189
} else if (36 <= channel && channel <= 64) {
190
*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[0];
191
*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[0];
192
*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[0];
193
*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[0];
194
} else if (100 <= channel && channel <= 144) {
195
*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[1];
196
*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[1];
197
*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[1];
198
*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[1];
199
} else if (149 <= channel && channel <= 177) {
200
*temperature_up_a = cali_info->delta_swing_table_idx_5ga_p[2];
201
*temperature_down_a = cali_info->delta_swing_table_idx_5ga_n[2];
202
*temperature_up_b = cali_info->delta_swing_table_idx_5gb_p[2];
203
*temperature_down_b = cali_info->delta_swing_table_idx_5gb_n[2];
204
} else {
205
*temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_default;
206
*temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_default;
207
*temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_default;
208
*temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_default;
209
}
210
211
return;
212
}
213
214
215
void
216
get_delta_swing_table_8814a_path_cd(
217
struct dm_struct *dm,
218
u8 **temperature_up_c,
219
u8 **temperature_down_c,
220
u8 **temperature_up_d,
221
u8 **temperature_down_d
222
)
223
{
224
struct dm_rf_calibration_struct *cali_info = &(dm->rf_calibrate_info);
225
u16 rate = *(dm->forced_data_rate);
226
u8 channel = *(dm->channel);
227
228
if (1 <= channel && channel <= 14) {
229
if (IS_CCK_RATE(rate)) {
230
*temperature_up_c = cali_info->delta_swing_table_idx_2g_cck_c_p;
231
*temperature_down_c = cali_info->delta_swing_table_idx_2g_cck_c_n;
232
*temperature_up_d = cali_info->delta_swing_table_idx_2g_cck_d_p;
233
*temperature_down_d = cali_info->delta_swing_table_idx_2g_cck_d_n;
234
} else {
235
*temperature_up_c = cali_info->delta_swing_table_idx_2gc_p;
236
*temperature_down_c = cali_info->delta_swing_table_idx_2gc_n;
237
*temperature_up_d = cali_info->delta_swing_table_idx_2gd_p;
238
*temperature_down_d = cali_info->delta_swing_table_idx_2gd_n;
239
}
240
} else if (36 <= channel && channel <= 64) {
241
*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[0];
242
*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[0];
243
*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[0];
244
*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[0];
245
} else if (100 <= channel && channel <= 144) {
246
*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[1];
247
*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[1];
248
*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[1];
249
*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[1];
250
} else if (149 <= channel && channel <= 177) {
251
*temperature_up_c = cali_info->delta_swing_table_idx_5gc_p[2];
252
*temperature_down_c = cali_info->delta_swing_table_idx_5gc_n[2];
253
*temperature_up_d = cali_info->delta_swing_table_idx_5gd_p[2];
254
*temperature_down_d = cali_info->delta_swing_table_idx_5gd_n[2];
255
} else {
256
*temperature_up_c = (u8 *)delta_swing_table_idx_2ga_p_default;
257
*temperature_down_c = (u8 *)delta_swing_table_idx_2ga_n_default;
258
*temperature_up_d = (u8 *)delta_swing_table_idx_2ga_p_default;
259
*temperature_down_d = (u8 *)delta_swing_table_idx_2ga_n_default;
260
}
261
262
return;
263
}
264
265
266
void configure_txpower_track_8814a(
267
struct txpwrtrack_cfg *config
268
)
269
{
270
config->swing_table_size_cck = ODM_CCK_TABLE_SIZE;
271
config->swing_table_size_ofdm = ODM_OFDM_TABLE_SIZE;
272
config->threshold_iqk = 8;
273
config->average_thermal_num = AVG_THERMAL_NUM_8814A;
274
config->rf_path_count = MAX_PATH_NUM_8814A;
275
config->thermal_reg_addr = RF_T_METER_8814A;
276
277
config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr8814a;
278
config->phy_lc_calibrate = halrf_lck_trigger;
279
config->do_iqk = do_iqk_8814a;
280
config->get_delta_swing_table = get_delta_swing_table_8814a;
281
config->get_delta_swing_table8814only = get_delta_swing_table_8814a_path_cd;
282
}
283
284
285
286
/* 1 7. IQK */
287
void
288
_phy_save_adda_registers_8814a(
289
struct dm_struct *dm,
290
u32 *adda_reg,
291
u32 *adda_backup,
292
u32 register_num
293
)
294
{
295
u32 i;
296
RF_DBG(dm, DBG_RF_IQK, "Save ADDA parameters.\n");
297
for (i = 0 ; i < register_num ; i++)
298
adda_backup[i] = odm_get_bb_reg(dm, adda_reg[i], MASKDWORD);
299
}
300
301
302
void
303
_phy_save_mac_registers_8814a(
304
struct dm_struct *dm,
305
u32 *mac_reg,
306
u32 *mac_backup
307
)
308
{
309
u32 i;
310
RF_DBG(dm, DBG_RF_IQK, "Save MAC parameters.\n");
311
for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++)
312
mac_backup[i] = odm_read_1byte(dm, mac_reg[i]);
313
mac_backup[i] = odm_read_4byte(dm, mac_reg[i]);
314
315
}
316
317
318
void
319
_phy_reload_adda_registers_8814a(
320
struct dm_struct *dm,
321
u32 *adda_reg,
322
u32 *adda_backup,
323
u32 regiester_num
324
)
325
{
326
u32 i;
327
RF_DBG(dm, DBG_RF_IQK, "Reload ADDA power saving parameters !\n");
328
for (i = 0 ; i < regiester_num; i++)
329
odm_set_bb_reg(dm, adda_reg[i], MASKDWORD, adda_backup[i]);
330
}
331
332
void
333
_phy_reload_mac_registers_8814a(
334
struct dm_struct *dm,
335
u32 *mac_reg,
336
u32 *mac_backup
337
)
338
{
339
u32 i;
340
RF_DBG(dm, DBG_RF_IQK, "Reload MAC parameters !\n");
341
for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++)
342
odm_write_1byte(dm, mac_reg[i], (u8)mac_backup[i]);
343
odm_write_4byte(dm, mac_reg[i], mac_backup[i]);
344
}
345
346
347
348
void
349
_phy_mac_setting_calibration_8814a(
350
struct dm_struct *dm,
351
u32 *mac_reg,
352
u32 *mac_backup
353
)
354
{
355
u32 i = 0;
356
RF_DBG(dm, DBG_RF_IQK, "MAC settings for Calibration.\n");
357
358
odm_write_1byte(dm, mac_reg[i], 0x3F);
359
360
for (i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++)
361
odm_write_1byte(dm, mac_reg[i], (u8)(mac_backup[i] & (~BIT(3))));
362
odm_write_1byte(dm, mac_reg[i], (u8)(mac_backup[i] & (~BIT(5))));
363
364
}
365
366
367
void
368
_phy_lc_calibrate_8814a(
369
struct dm_struct *dm,
370
boolean is2T
371
)
372
{
373
u32 /*rf_amode=0, rf_bmode=0,*/ lc_cal = 0, tmp = 0;
374
u32 cnt;
375
376
/* Check continuous TX and Packet TX */
377
u32 reg0x914 = odm_read_4byte(dm, REG_SINGLE_TONE_CONT_TX_JAGUAR);;
378
379
/* Backup RF reg18. */
380
381
if ((reg0x914 & 0x70000) == 0)
382
odm_write_1byte(dm, REG_TXPAUSE_8812, 0xFF);
383
384
/* 3 3. Read RF reg18 */
385
lc_cal = odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);
386
387
/* 3 4. Set LC calibration begin bit15 */
388
odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, 0x8000, 0x1);
389
390
ODM_delay_ms(100);
391
392
for (cnt = 0; cnt < 100; cnt++) {
393
if (odm_get_rf_reg(dm, RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)
394
break;
395
ODM_delay_ms(10);
396
}
397
RF_DBG(dm, DBG_RF_IQK, "retry cnt = %d\n", cnt);
398
399
400
/* 3 Restore original situation */
401
if ((reg0x914 & 70000) == 0)
402
odm_write_1byte(dm, REG_TXPAUSE_8812, 0x00);
403
404
/* Recover channel number */
405
odm_set_rf_reg(dm, RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal);
406
}
407
408
409
void
410
phy_lc_calibrate_8814a(
411
void *dm_void
412
)
413
{
414
struct dm_struct *dm = (struct dm_struct *)dm_void;
415
416
_phy_lc_calibrate_8814a(dm, true);
417
}
418
419
420
void _phy_set_rf_path_switch_8814a(
421
struct dm_struct *dm,
422
boolean is_main,
423
boolean is2T
424
)
425
{
426
if (is2T) { /* 92C */
427
if (is_main)
428
odm_set_bb_reg(dm, REG_FPGA0_XB_RF_INTERFACE_OE, BIT(5) | BIT(6), 0x1); /* 92C_Path_A */
429
else
430
odm_set_bb_reg(dm, REG_FPGA0_XB_RF_INTERFACE_OE, BIT(5) | BIT(6), 0x2); /* BT */
431
} else { /* 88C */
432
433
if (is_main)
434
odm_set_bb_reg(dm, REG_FPGA0_XA_RF_INTERFACE_OE, BIT(8) | BIT(9), 0x2); /* Main */
435
else
436
odm_set_bb_reg(dm, REG_FPGA0_XA_RF_INTERFACE_OE, BIT(8) | BIT(9), 0x1); /* Aux */
437
}
438
}
439
void phy_set_rf_path_switch_8814a(
440
struct dm_struct *dm,
441
boolean is_main
442
)
443
{
444
/* HAL_DATA_TYPE *hal_data = GET_HAL_DATA(adapter); */
445
446
#ifdef DISABLE_BB_RF
447
return;
448
#endif
449
450
{
451
/* For 88C 1T1R */
452
_phy_set_rf_path_switch_8814a(dm, is_main, false);
453
}
454
}
455
456