Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halrf_kfree.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
/*@============================================================*/
27
/*@include files*/
28
/*@============================================================*/
29
#include "mp_precomp.h"
30
#include "phydm_precomp.h"
31
32
/*@<YuChen, 150720> Add for KFree Feature Requested by RF David.*/
33
/*@This is a phydm API*/
34
35
void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data)
36
{
37
struct dm_struct *dm = (struct dm_struct *)dm_void;
38
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
39
boolean is_odd;
40
u32 tx_gain_bitmask = (BIT(17) | BIT(16) | BIT(15));
41
42
if ((data % 2) != 0) { /*odd->positive*/
43
data = data - 1;
44
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 1);
45
is_odd = true;
46
} else { /*even->negative*/
47
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 0);
48
is_odd = false;
49
}
50
RF_DBG(dm, DBG_RF_MP, "phy_ConfigKFree8814A(): RF_0x55[19]= %d\n",
51
is_odd);
52
switch (data) {
53
case 0:
54
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
55
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0);
56
cali_info->kfree_offset[e_rf_path] = 0;
57
break;
58
case 2:
59
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);
60
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0);
61
cali_info->kfree_offset[e_rf_path] = 0;
62
break;
63
case 4:
64
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
65
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1);
66
cali_info->kfree_offset[e_rf_path] = 1;
67
break;
68
case 6:
69
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);
70
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1);
71
cali_info->kfree_offset[e_rf_path] = 1;
72
break;
73
case 8:
74
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
75
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2);
76
cali_info->kfree_offset[e_rf_path] = 2;
77
break;
78
case 10:
79
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);
80
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2);
81
cali_info->kfree_offset[e_rf_path] = 2;
82
break;
83
case 12:
84
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
85
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3);
86
cali_info->kfree_offset[e_rf_path] = 3;
87
break;
88
case 14:
89
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);
90
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3);
91
cali_info->kfree_offset[e_rf_path] = 3;
92
break;
93
case 16:
94
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
95
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4);
96
cali_info->kfree_offset[e_rf_path] = 4;
97
break;
98
case 18:
99
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);
100
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4);
101
cali_info->kfree_offset[e_rf_path] = 4;
102
break;
103
case 20:
104
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);
105
odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 5);
106
cali_info->kfree_offset[e_rf_path] = 5;
107
break;
108
109
default:
110
break;
111
}
112
113
if (!is_odd) {
114
/*that means Kfree offset is negative, we need to record it.*/
115
cali_info->kfree_offset[e_rf_path] =
116
(-1) * cali_info->kfree_offset[e_rf_path];
117
RF_DBG(dm, DBG_RF_MP,
118
"phy_ConfigKFree8814A(): kfree_offset = %d\n",
119
cali_info->kfree_offset[e_rf_path]);
120
} else {
121
RF_DBG(dm, DBG_RF_MP,
122
"phy_ConfigKFree8814A(): kfree_offset = %d\n",
123
cali_info->kfree_offset[e_rf_path]);
124
}
125
}
126
127
void phydm_get_thermal_trim_offset_8821c(void *dm_void)
128
{
129
struct dm_struct *dm = (struct dm_struct *)dm_void;
130
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
131
132
u8 pg_therm = 0xff;
133
134
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_21C, &pg_therm, false);
135
136
if (pg_therm != 0xff) {
137
pg_therm = pg_therm & 0x1f;
138
if ((pg_therm & BIT(0)) == 0)
139
power_trim_info->thermal = (-1 * (pg_therm >> 1));
140
else
141
power_trim_info->thermal = (pg_therm >> 1);
142
143
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
144
}
145
146
RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal trim flag:0x%02x\n",
147
power_trim_info->flag);
148
149
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
150
RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal:%d\n",
151
power_trim_info->thermal);
152
}
153
154
void phydm_get_power_trim_offset_8821c(void *dm_void)
155
{
156
struct dm_struct *dm = (struct dm_struct *)dm_void;
157
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
158
159
u8 pg_power = 0xff, i;
160
161
odm_efuse_one_byte_read(dm, PPG_2G_TXAB_21C, &pg_power, false);
162
163
if (pg_power != 0xff) {
164
power_trim_info->bb_gain[0][0] = pg_power;
165
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_21C, &pg_power, false);
166
power_trim_info->bb_gain[1][0] = pg_power;
167
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_21C, &pg_power, false);
168
power_trim_info->bb_gain[2][0] = pg_power;
169
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_21C, &pg_power, false);
170
power_trim_info->bb_gain[3][0] = pg_power;
171
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_21C, &pg_power, false);
172
power_trim_info->bb_gain[4][0] = pg_power;
173
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_21C, &pg_power, false);
174
power_trim_info->bb_gain[5][0] = pg_power;
175
power_trim_info->flag =
176
power_trim_info->flag | KFREE_FLAG_ON |
177
KFREE_FLAG_ON_2G | KFREE_FLAG_ON_5G;
178
}
179
180
RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c power trim flag:0x%02x\n",
181
power_trim_info->flag);
182
183
if (power_trim_info->flag & KFREE_FLAG_ON) {
184
for (i = 0; i < KFREE_BAND_NUM; i++)
185
RF_DBG(dm, DBG_RF_MP,
186
"[kfree] 8821c pwr_trim->bb_gain[%d][0]=0x%X\n",
187
i, power_trim_info->bb_gain[i][0]);
188
}
189
}
190
191
void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg,
192
u8 data)
193
{
194
struct dm_struct *dm = (struct dm_struct *)dm_void;
195
u8 wlg, btg;
196
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));
197
u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) |
198
BIT(16) | BIT(15) | BIT(14));
199
200
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);
201
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1);
202
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1);
203
odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1);
204
205
if (wlg_btg) {
206
wlg = data & 0xf;
207
btg = (data & 0xf0) >> 4;
208
209
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (wlg & BIT(0)));
210
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (wlg >> 1));
211
212
odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (btg & BIT(0)));
213
odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (btg >> 1));
214
} else {
215
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), data & BIT(0));
216
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,
217
((data & 0x1f) >> 1));
218
}
219
220
RF_DBG(dm, DBG_RF_MP,
221
"[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n",
222
odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask),
223
odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask));
224
}
225
226
void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data)
227
{
228
struct dm_struct *dm = (struct dm_struct *)dm_void;
229
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));
230
u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) |
231
BIT(16) | BIT(15) | BIT(14));
232
233
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);
234
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1);
235
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1);
236
odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1);
237
238
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
239
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (data >> 1));
240
241
odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (data & BIT(0)));
242
odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (data >> 1));
243
244
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0);
245
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 0);
246
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 0);
247
odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 0);
248
249
RF_DBG(dm, DBG_RF_MP,
250
"[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n",
251
odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask),
252
odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask));
253
}
254
255
void phydm_get_thermal_trim_offset_8822b(void *dm_void)
256
{
257
struct dm_struct *dm = (struct dm_struct *)dm_void;
258
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
259
260
u8 pg_therm = 0xff;
261
262
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_22B, &pg_therm, false);
263
264
if (pg_therm != 0xff) {
265
pg_therm = pg_therm & 0x1f;
266
if ((pg_therm & BIT(0)) == 0)
267
power_trim_info->thermal = (-1 * (pg_therm >> 1));
268
else
269
power_trim_info->thermal = (pg_therm >> 1);
270
271
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
272
}
273
274
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal trim flag:0x%02x\n",
275
power_trim_info->flag);
276
277
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
278
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal:%d\n",
279
power_trim_info->thermal);
280
}
281
282
void phydm_get_power_trim_offset_8822b(void *dm_void)
283
{
284
struct dm_struct *dm = (struct dm_struct *)dm_void;
285
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
286
287
u8 pg_power = 0xff, i, j;
288
289
odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);
290
291
if (pg_power != 0xff) {
292
/*Path A*/
293
odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);
294
power_trim_info->bb_gain[0][0] = (pg_power & 0xf);
295
296
/*Path B*/
297
odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);
298
power_trim_info->bb_gain[0][1] = ((pg_power & 0xf0) >> 4);
299
300
power_trim_info->flag |= KFREE_FLAG_ON_2G;
301
power_trim_info->flag |= KFREE_FLAG_ON;
302
}
303
304
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false);
305
306
if (pg_power != 0xff) {
307
/*Path A*/
308
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false);
309
power_trim_info->bb_gain[1][0] = pg_power;
310
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22B, &pg_power, false);
311
power_trim_info->bb_gain[2][0] = pg_power;
312
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22B, &pg_power, false);
313
power_trim_info->bb_gain[3][0] = pg_power;
314
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22B, &pg_power, false);
315
power_trim_info->bb_gain[4][0] = pg_power;
316
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22B, &pg_power, false);
317
power_trim_info->bb_gain[5][0] = pg_power;
318
319
/*Path B*/
320
odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22B, &pg_power, false);
321
power_trim_info->bb_gain[1][1] = pg_power;
322
odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22B, &pg_power, false);
323
power_trim_info->bb_gain[2][1] = pg_power;
324
odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22B, &pg_power, false);
325
power_trim_info->bb_gain[3][1] = pg_power;
326
odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22B, &pg_power, false);
327
power_trim_info->bb_gain[4][1] = pg_power;
328
odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22B, &pg_power, false);
329
power_trim_info->bb_gain[5][1] = pg_power;
330
331
power_trim_info->flag |= KFREE_FLAG_ON_5G;
332
power_trim_info->flag |= KFREE_FLAG_ON;
333
}
334
335
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b power trim flag:0x%02x\n",
336
power_trim_info->flag);
337
338
if (!(power_trim_info->flag & KFREE_FLAG_ON))
339
return;
340
341
for (i = 0; i < KFREE_BAND_NUM; i++) {
342
for (j = 0; j < 2; j++)
343
RF_DBG(dm, DBG_RF_MP,
344
"[kfree] 8822b PwrTrim->bb_gain[%d][%d]=0x%X\n",
345
i, j, power_trim_info->bb_gain[i][j]);
346
}
347
}
348
349
void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias)
350
{
351
struct dm_struct *dm = (struct dm_struct *)dm_void;
352
u32 rf_reg_51 = 0, rf_reg_52 = 0, rf_reg_3f = 0;
353
u32 tx_pa_bias_bmask = (BIT(12) | BIT(11) | BIT(10) | BIT(9));
354
355
rf_reg_51 = odm_get_rf_reg(dm, e_rf_path, RF_0x51, RFREGOFFSETMASK);
356
rf_reg_52 = odm_get_rf_reg(dm, e_rf_path, RF_0x52, RFREGOFFSETMASK);
357
358
RF_DBG(dm, DBG_RF_MP,
359
"[kfree] 8822b 2g rf(0x51)=0x%X rf(0x52)=0x%X path=%d\n",
360
rf_reg_51, rf_reg_52, e_rf_path);
361
362
#if 0
363
/*rf3f => rf52[19:17] = rf3f[2:0] rf52[16:15] = rf3f[4:3] rf52[3:0] = rf3f[8:5]*/
364
/*rf3f => rf51[6:3] = rf3f[12:9] rf52[13] = rf3f[13]*/
365
#endif
366
rf_reg_3f = ((rf_reg_52 & 0xe0000) >> 17) |
367
(((rf_reg_52 & 0x18000) >> 15) << 3) |
368
((rf_reg_52 & 0xf) << 5) |
369
(((rf_reg_51 & 0x78) >> 3) << 9) |
370
(((rf_reg_52 & 0x2000) >> 13) << 13);
371
372
RF_DBG(dm, DBG_RF_MP,
373
"[kfree] 8822b 2g original pa_bias=%d rf_reg_3f=0x%X path=%d\n",
374
tx_pa_bias, rf_reg_3f, e_rf_path);
375
376
tx_pa_bias = (s8)((rf_reg_3f & tx_pa_bias_bmask) >> 9) + tx_pa_bias;
377
378
if (tx_pa_bias < 0)
379
tx_pa_bias = 0;
380
else if (tx_pa_bias > 7)
381
tx_pa_bias = 7;
382
383
rf_reg_3f = ((rf_reg_3f & 0xfe1ff) | (tx_pa_bias << 9));
384
385
RF_DBG(dm, DBG_RF_MP,
386
"[kfree] 8822b 2g 0x%X 0x%X pa_bias=%d rfreg_3f=0x%X path=%d\n",
387
PPG_PABIAS_2GA_22B, PPG_PABIAS_2GB_22B,
388
tx_pa_bias, rf_reg_3f, e_rf_path);
389
390
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x1);
391
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);
392
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);
393
odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(0), 0x1);
394
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);
395
odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(1), 0x1);
396
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);
397
odm_set_rf_reg(dm, e_rf_path, RF_0x33, (BIT(1) | BIT(0)), 0x3);
398
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);
399
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x0);
400
401
RF_DBG(dm, DBG_RF_MP,
402
"[kfree] 8822b 2g tx pa bias rf_0x3f(0x%X) path=%d\n",
403
odm_get_rf_reg(dm, e_rf_path, RF_0x3f,
404
(BIT(12) | BIT(11) | BIT(10) | BIT(9))),
405
e_rf_path);
406
}
407
408
void phydm_get_pa_bias_offset_8822b(void *dm_void)
409
{
410
struct dm_struct *dm = (struct dm_struct *)dm_void;
411
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
412
413
u8 pg_pa_bias = 0xff, e_rf_path = 0;
414
s8 tx_pa_bias[2] = {0};
415
416
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B, &pg_pa_bias, false);
417
418
if (pg_pa_bias != 0xff) {
419
/*paht a*/
420
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B,
421
&pg_pa_bias, false);
422
pg_pa_bias = pg_pa_bias & 0xf;
423
424
if ((pg_pa_bias & BIT(0)) == 0)
425
tx_pa_bias[0] = (-1 * (pg_pa_bias >> 1));
426
else
427
tx_pa_bias[0] = (pg_pa_bias >> 1);
428
429
/*paht b*/
430
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22B,
431
&pg_pa_bias, false);
432
pg_pa_bias = pg_pa_bias & 0xf;
433
434
if ((pg_pa_bias & BIT(0)) == 0)
435
tx_pa_bias[1] = (-1 * (pg_pa_bias >> 1));
436
else
437
tx_pa_bias[1] = (pg_pa_bias >> 1);
438
439
RF_DBG(dm, DBG_RF_MP,
440
"[kfree] 8822b 2g PathA_pa_bias:%d PathB_pa_bias:%d\n",
441
tx_pa_bias[0], tx_pa_bias[1]);
442
443
for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)
444
phydm_set_pa_bias_to_rf_8822b(dm, e_rf_path,
445
tx_pa_bias[e_rf_path]);
446
447
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
448
} else {
449
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 2g tx pa bias no pg\n");
450
}
451
}
452
453
void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data)
454
{
455
struct dm_struct *dm = (struct dm_struct *)dm_void;
456
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));
457
458
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);
459
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);
460
odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);
461
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);
462
463
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
464
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,
465
((data & 0x1f) >> 1));
466
467
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 0x55[19:14]=0x%X path=%d\n",
468
odm_get_rf_reg(dm, e_rf_path, RF_0x55,
469
(BIT(19) | BIT(18) | BIT(17) | BIT(16) |
470
BIT(15) | BIT(14))), e_rf_path);
471
}
472
473
void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data)
474
{
475
struct dm_struct *dm = (struct dm_struct *)dm_void;
476
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));
477
478
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);
479
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);
480
odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);
481
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);
482
483
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
484
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,
485
((data & 0x1f) >> 1));
486
487
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0);
488
odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);
489
odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);
490
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 0);
491
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(7), 0);
492
493
RF_DBG(dm, DBG_RF_MP,
494
"[kfree] 8822b clear power trim 0x55[19:14]=0x%X path=%d\n",
495
odm_get_rf_reg(dm, e_rf_path, RF_0x55,
496
(BIT(19) | BIT(18) | BIT(17) | BIT(16) |
497
BIT(15) | BIT(14))), e_rf_path);
498
}
499
500
void phydm_get_thermal_trim_offset_8710b(void *dm_void)
501
{
502
struct dm_struct *dm = (struct dm_struct *)dm_void;
503
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
504
505
u8 pg_therm = 0xff;
506
507
odm_efuse_one_byte_read(dm, 0x0EF, &pg_therm, false);
508
509
if (pg_therm != 0xff) {
510
pg_therm = pg_therm & 0x1f;
511
if ((pg_therm & BIT(0)) == 0)
512
power_trim_info->thermal = (-1 * (pg_therm >> 1));
513
else
514
power_trim_info->thermal = (pg_therm >> 1);
515
516
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
517
}
518
519
RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal trim flag:0x%02x\n",
520
power_trim_info->flag);
521
522
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
523
RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal:%d\n",
524
power_trim_info->thermal);
525
}
526
527
void phydm_get_power_trim_offset_8710b(void *dm_void)
528
{
529
struct dm_struct *dm = (struct dm_struct *)dm_void;
530
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
531
532
u8 pg_power = 0xff;
533
534
odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false);
535
536
if (pg_power != 0xff) {
537
/*Path A*/
538
odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false);
539
power_trim_info->bb_gain[0][0] = (pg_power & 0xf);
540
541
power_trim_info->flag |= KFREE_FLAG_ON_2G;
542
power_trim_info->flag |= KFREE_FLAG_ON;
543
}
544
545
RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b power trim flag:0x%02x\n",
546
power_trim_info->flag);
547
548
if (power_trim_info->flag & KFREE_FLAG_ON)
549
RF_DBG(dm, DBG_RF_MP,
550
"[kfree] 8710b power_trim_data->bb_gain[0][0]=0x%X\n",
551
power_trim_info->bb_gain[0][0]);
552
}
553
554
void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data)
555
{
556
struct dm_struct *dm = (struct dm_struct *)dm_void;
557
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15));
558
559
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
560
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, ((data & 0xf) >> 1));
561
562
RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b 0x55[19:14]=0x%X path=%d\n",
563
odm_get_rf_reg(dm, e_rf_path, RF_0x55,
564
(BIT(19) | BIT(18) | BIT(17) | BIT(16) |
565
BIT(15) | BIT(14))), e_rf_path);
566
}
567
568
void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data)
569
{
570
struct dm_struct *dm = (struct dm_struct *)dm_void;
571
u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));
572
573
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
574
odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,
575
((data & 0x1f) >> 1));
576
577
RF_DBG(dm, DBG_RF_MP,
578
"[kfree] 8710b clear power trim 0x55[19:14]=0x%X path=%d\n",
579
odm_get_rf_reg(dm, e_rf_path, RF_0x55,
580
(BIT(19) | BIT(18) | BIT(17) | BIT(16) |
581
BIT(15) | BIT(14))), e_rf_path);
582
}
583
584
void phydm_get_thermal_trim_offset_8192f(void *dm_void)
585
{
586
struct dm_struct *dm = (struct dm_struct *)dm_void;
587
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
588
589
u8 pg_therm = 0xff;
590
591
odm_efuse_one_byte_read(dm, 0x1EF, &pg_therm, false);
592
593
if (pg_therm != 0xff) {
594
pg_therm = pg_therm & 0x1f;
595
if ((pg_therm & BIT(0)) == 0)
596
power_trim_info->thermal = (-1 * (pg_therm >> 1));
597
else
598
power_trim_info->thermal = (pg_therm >> 1);
599
600
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
601
}
602
603
RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal trim flag:0x%02x\n",
604
power_trim_info->flag);
605
606
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
607
RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal:%d\n",
608
power_trim_info->thermal);
609
}
610
611
void phydm_get_power_trim_offset_8192f(void *dm_void)
612
{
613
struct dm_struct *dm = (struct dm_struct *)dm_void;
614
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
615
616
u8 pg_power1 = 0xff, pg_power2 = 0xff, pg_power3 = 0xff, i, j;
617
618
odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false); /*CH4-9*/
619
620
if (pg_power1 != 0xff) {
621
/*Path A*/
622
odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false);
623
power_trim_info->bb_gain[1][0] = (pg_power1 & 0xf);
624
/*Path B*/
625
odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false);
626
power_trim_info->bb_gain[1][1] = ((pg_power1 & 0xf0) >> 4);
627
628
power_trim_info->flag |= KFREE_FLAG_ON_2G;
629
power_trim_info->flag |= KFREE_FLAG_ON;
630
}
631
632
odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false); /*CH1-3*/
633
634
if (pg_power2 != 0xff) {
635
/*Path A*/
636
odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false);
637
power_trim_info->bb_gain[0][0] = (pg_power2 & 0xf);
638
/*Path B*/
639
odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false);
640
power_trim_info->bb_gain[0][1] = ((pg_power2 & 0xf0) >> 4);
641
642
power_trim_info->flag |= KFREE_FLAG_ON_2G;
643
power_trim_info->flag |= KFREE_FLAG_ON;
644
} else {
645
power_trim_info->bb_gain[0][0] = (pg_power1 & 0xf);
646
power_trim_info->bb_gain[0][1] = ((pg_power1 & 0xf0) >> 4);
647
}
648
649
odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false); /*CH10-14*/
650
651
if (pg_power3 != 0xff) {
652
/*Path A*/
653
odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false);
654
power_trim_info->bb_gain[2][0] = (pg_power3 & 0xf);
655
/*Path B*/
656
odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false);
657
power_trim_info->bb_gain[2][1] = ((pg_power3 & 0xf0) >> 4);
658
659
power_trim_info->flag |= KFREE_FLAG_ON_2G;
660
power_trim_info->flag |= KFREE_FLAG_ON;
661
} else {
662
power_trim_info->bb_gain[2][0] = (pg_power1 & 0xf);
663
power_trim_info->bb_gain[2][1] = ((pg_power1 & 0xf0) >> 4);
664
}
665
666
RF_DBG(dm, DBG_RF_MP, "[kfree] 8192F power trim flag:0x%02x\n",
667
power_trim_info->flag);
668
669
if (!(power_trim_info->flag & KFREE_FLAG_ON))
670
return;
671
672
for (i = 0; i < KFREE_CH_NUM; i++) {
673
for (j = 0; j < 2; j++)
674
RF_DBG(dm, DBG_RF_MP,
675
"[kfree] 8192F PwrTrim->bb_gain[%d][%d]=0x%X\n",
676
i, j, power_trim_info->bb_gain[i][j]);
677
}
678
}
679
680
void phydm_set_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 channel_idx,
681
u8 data)
682
{
683
struct dm_struct *dm = (struct dm_struct *)dm_void;
684
685
/*power_trim based on 55[19:14]*/
686
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);
687
/*enable 55[14] for 0.5db step*/
688
odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);
689
/*enter power_trim debug mode*/
690
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1);
691
/*write enable*/
692
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);
693
694
if (e_rf_path == 0) {
695
if (channel_idx == 0) {
696
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);
697
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
698
699
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);
700
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
701
702
} else if (channel_idx == 1) {
703
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);
704
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
705
706
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);
707
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
708
} else if (channel_idx == 2) {
709
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);
710
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
711
712
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);
713
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
714
}
715
} else if (e_rf_path == 1) {
716
if (channel_idx == 0) {
717
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);
718
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
719
720
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);
721
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
722
} else if (channel_idx == 1) {
723
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);
724
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
725
726
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);
727
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
728
} else if (channel_idx == 2) {
729
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);
730
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
731
732
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);
733
odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);
734
}
735
}
736
737
/*leave power_trim debug mode*/
738
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);
739
/*write disable*/
740
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);
741
742
RF_DBG(dm, DBG_RF_MP,
743
"[kfree] 8192F 0x55[19:14]=0x%X path=%d channel=%d\n",
744
odm_get_rf_reg(dm, e_rf_path, RF_0x55,
745
(BIT(19) | BIT(18) | BIT(17) | BIT(16) |
746
BIT(15) | BIT(14))), e_rf_path, channel_idx);
747
}
748
749
#if 0
750
/*
751
void phydm_clear_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 data)
752
{
753
struct dm_struct *dm = (struct dm_struct *)dm_void;
754
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
755
756
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));
757
odm_set_rf_reg(dm, e_rf_path, RF_0x55, (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)), ((data & 0x1f) >> 1));
758
759
RF_DBG(dm, DBG_RF_MP,
760
"[kfree] 8192F clear power trim 0x55[19:14]=0x%X path=%d\n",
761
odm_get_rf_reg(dm, e_rf_path, RF_0x55, (BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14))),
762
e_rf_path
763
);
764
}
765
*/
766
#endif
767
768
void phydm_get_thermal_trim_offset_8198f(void *dm_void)
769
{
770
struct dm_struct *dm = (struct dm_struct *)dm_void;
771
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
772
773
u8 pg_therm = 0;
774
775
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_98F, &pg_therm, false);
776
777
if (pg_therm != 0) {
778
pg_therm = pg_therm & 0x1f;
779
if ((pg_therm & BIT(0)) == 0)
780
power_trim_info->thermal = (-1 * (pg_therm >> 1));
781
else
782
power_trim_info->thermal = (pg_therm >> 1);
783
784
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
785
}
786
787
RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal trim flag:0x%02x\n",
788
power_trim_info->flag);
789
790
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
791
RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal:%d\n",
792
power_trim_info->thermal);
793
}
794
795
void phydm_get_power_trim_offset_8198f(void *dm_void)
796
{
797
struct dm_struct *dm = (struct dm_struct *)dm_void;
798
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
799
800
u8 pg_power = 0, i, j;
801
802
odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_98F, &pg_power, false);
803
804
if (pg_power != 0) {
805
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
806
power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;
807
808
odm_efuse_one_byte_read(dm, PPG_2GL_TXCD_98F, &pg_power, false);
809
power_trim_info->bb_gain[0][2] = pg_power & 0xf;
810
power_trim_info->bb_gain[0][3] = (pg_power & 0xf0) >> 4;
811
812
odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_98F, &pg_power, false);
813
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
814
power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;
815
816
odm_efuse_one_byte_read(dm, PPG_2GM_TXCD_98F, &pg_power, false);
817
power_trim_info->bb_gain[1][2] = pg_power & 0xf;
818
power_trim_info->bb_gain[1][3] = (pg_power & 0xf0) >> 4;
819
820
odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_98F, &pg_power, false);
821
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
822
power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;
823
824
odm_efuse_one_byte_read(dm, PPG_2GH_TXCD_98F, &pg_power, false);
825
power_trim_info->bb_gain[2][2] = pg_power & 0xf;
826
power_trim_info->bb_gain[2][3] = (pg_power & 0xf0) >> 4;
827
828
power_trim_info->flag =
829
power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_2G;
830
}
831
832
RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f power trim flag:0x%02x\n",
833
power_trim_info->flag);
834
835
if (power_trim_info->flag & KFREE_FLAG_ON) {
836
for (i = 0; i < KFREE_BAND_NUM; i++) {
837
for (j = 0; j < MAX_RF_PATH; j++) {
838
RF_DBG(dm, DBG_RF_MP,
839
"[kfree] 8198f pwr_trim->bb_gain[%d][%d]=0x%X\n",
840
i, j, power_trim_info->bb_gain[i][j]);
841
}
842
}
843
}
844
}
845
846
void phydm_get_pa_bias_offset_8198f(void *dm_void)
847
{
848
struct dm_struct *dm = (struct dm_struct *)dm_void;
849
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
850
851
u8 pg_pa_bias = 0, i;
852
u8 tx_pa_bias[4] = {0};
853
854
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_98F, &pg_pa_bias, false);
855
856
if (pg_pa_bias != 0) {
857
/*paht ab*/
858
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_98F,
859
&pg_pa_bias, false);
860
tx_pa_bias[0] = pg_pa_bias & 0xf;
861
tx_pa_bias[1] = ((pg_pa_bias & 0xf0) >> 4);
862
863
/*paht cd*/
864
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GCD_98F,
865
&pg_pa_bias, false);
866
tx_pa_bias[2] = pg_pa_bias & 0xf;
867
tx_pa_bias[3] = ((pg_pa_bias & 0xf0) >> 4);
868
869
for (i = RF_PATH_A; i < 4; i++) {
870
if ((tx_pa_bias[i] & 0x1) == 1)
871
tx_pa_bias[i] = tx_pa_bias[i] & 0xe;
872
else
873
tx_pa_bias[i] = tx_pa_bias[i] | 0x1;
874
}
875
876
RF_DBG(dm, DBG_RF_MP,
877
"[kfree] 8198f PathA_pa_bias:0x%x PathB_pa_bias:0x%x\n",
878
tx_pa_bias[0], tx_pa_bias[1]);
879
880
RF_DBG(dm, DBG_RF_MP,
881
"[kfree] 8198f PathC_pa_bias:0x%x PathD_pa_bias:0x%x\n",
882
tx_pa_bias[2], tx_pa_bias[3]);
883
884
for (i = RF_PATH_A; i < 4; i++)
885
odm_set_rf_reg(dm, i, 0x60, 0x0000f000, tx_pa_bias[i]);
886
887
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
888
} else {
889
RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f tx pa bias no pg\n");
890
}
891
}
892
893
void phydm_get_set_lna_offset_8198f(void *dm_void)
894
{
895
struct dm_struct *dm = (struct dm_struct *)dm_void;
896
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
897
898
u8 pg_pa_bias = 0, i;
899
u8 cg[4] = {0}, cs[4] = {0};
900
u32 rf_reg;
901
902
odm_efuse_one_byte_read(dm, PPG_LNA_2GA_98F, &pg_pa_bias, false);
903
904
if (pg_pa_bias != 0) {
905
odm_efuse_one_byte_read(dm, PPG_LNA_2GA_98F,
906
&pg_pa_bias, false);
907
cg[0] = (pg_pa_bias & 0xc) >> 2;
908
cs[0] = pg_pa_bias & 0x3;
909
910
odm_efuse_one_byte_read(dm, PPG_LNA_2GB_98F,
911
&pg_pa_bias, false);
912
cg[1] = (pg_pa_bias & 0xc) >> 2;
913
cs[1] = pg_pa_bias & 0x3;
914
915
odm_efuse_one_byte_read(dm, PPG_LNA_2GC_98F,
916
&pg_pa_bias, false);
917
cg[2] = (pg_pa_bias & 0xc) >> 2;
918
cs[2] = pg_pa_bias & 0x3;
919
920
odm_efuse_one_byte_read(dm, PPG_LNA_2GD_98F,
921
&pg_pa_bias, false);
922
cg[3] = (pg_pa_bias & 0xc) >> 2;
923
cs[3] = pg_pa_bias & 0x3;
924
925
for (i = RF_PATH_A; i < 4; i++) {
926
RF_DBG(dm, DBG_RF_MP,
927
"[kfree] 8198f lna cg[%d]=0x%x cs[%d]=0x%x\n",
928
i, cg[i], i, cs[i]);
929
odm_set_rf_reg(dm, i, 0xdf, RFREGOFFSETMASK, 0x2);
930
931
if (cg[i] == 0x3) {
932
rf_reg = odm_get_rf_reg(dm, i, 0x86, (BIT(19) | BIT(18)));
933
rf_reg = rf_reg + 1;
934
if (rf_reg >= 0x3)
935
rf_reg = 0x3;
936
odm_set_rf_reg(dm, i, 0x86, (BIT(19) | BIT(18)), rf_reg);
937
RF_DBG(dm, DBG_RF_MP,
938
"[kfree] 8198f lna CG set rf 0x86 [19:18]=0x%x path=%d\n", rf_reg, i);
939
}
940
if (cs[i] == 0x3) {
941
rf_reg = odm_get_rf_reg(dm, i, 0x86, (BIT(17) | BIT(16)));
942
rf_reg = rf_reg + 1;
943
if (rf_reg >= 0x3)
944
rf_reg = 0x3;
945
odm_set_rf_reg(dm, i, 0x86, (BIT(17) | BIT(16)), rf_reg);
946
RF_DBG(dm, DBG_RF_MP,
947
"[kfree] 8198f lna CS set rf 0x86 [17:16]=0x%x path=%d\n", rf_reg, i);
948
}
949
}
950
951
power_trim_info->lna_flag |= LNA_FLAG_ON;
952
} else {
953
RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f lna no pg\n");
954
}
955
}
956
957
958
void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data)
959
{
960
struct dm_struct *dm = (struct dm_struct *)dm_void;
961
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
962
u32 band, i;
963
s8 pwr_offset[3];
964
965
RF_DBG(dm, DBG_RF_MP,
966
"[kfree] %s:Set kfree to rf 0x33\n", __func__);
967
968
/*power_trim based on 55[19:14]*/
969
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);
970
/*enable 55[14] for 0.5db step*/
971
odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);
972
/*enter power_trim debug mode*/
973
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);
974
/*write enable*/
975
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);
976
977
for (i =0; i < 3; i++)
978
pwr_offset[i] = power_trim_info->bb_gain[i][e_rf_path];
979
980
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);
981
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]);
982
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);
983
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]);
984
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);
985
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]);
986
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);
987
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]);
988
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);
989
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]);
990
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);
991
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]);
992
993
/*leave power_trim debug mode*/
994
/*odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);*/
995
/*write disable*/
996
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);
997
998
}
999
1000
void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data)
1001
{
1002
struct dm_struct *dm = (struct dm_struct *)dm_void;
1003
1004
RF_DBG(dm, DBG_RF_MP,
1005
"[kfree] %s:Clear kfree to rf 0x55\n", __func__);
1006
#if 0
1007
/*power_trim based on 55[19:14]*/
1008
odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);
1009
/*enable 55[14] for 0.5db step*/
1010
odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);
1011
/*enter power_trim debug mode*/
1012
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);
1013
/*write enable*/
1014
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);
1015
1016
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);
1017
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1018
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);
1019
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1020
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);
1021
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1022
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);
1023
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1024
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);
1025
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1026
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);
1027
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);
1028
1029
/*leave power_trim debug mode*/
1030
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);
1031
/*enable 55[14] for 0.5db step*/
1032
odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0);
1033
/*write disable*/
1034
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);
1035
#else
1036
1037
odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1);
1038
/*odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0);*/
1039
1040
#endif
1041
1042
}
1043
1044
void phydm_get_set_thermal_trim_offset_8822c(void *dm_void)
1045
{
1046
struct dm_struct *dm = (struct dm_struct *)dm_void;
1047
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1048
1049
u8 pg_therm = 0xff, thermal[2] = {0};
1050
1051
odm_efuse_one_byte_read(dm, PPG_THERMAL_A_OFFSET_22C, &pg_therm, false);
1052
1053
if (pg_therm != 0xff) {
1054
/*s0*/
1055
pg_therm = pg_therm & 0x1f;
1056
1057
thermal[RF_PATH_A] =
1058
((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);
1059
1060
odm_set_rf_reg(dm, RF_PATH_A, RF_0x43, 0x000f0000, thermal[RF_PATH_A]);
1061
1062
/*s1*/
1063
odm_efuse_one_byte_read(dm, PPG_THERMAL_B_OFFSET_22C, &pg_therm, false);
1064
1065
pg_therm = pg_therm & 0x1f;
1066
1067
thermal[RF_PATH_B] = ((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);
1068
1069
odm_set_rf_reg(dm, RF_PATH_B, RF_0x43, 0x000f0000, thermal[RF_PATH_B]);
1070
1071
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
1072
1073
}
1074
1075
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c thermal trim flag:0x%02x\n",
1076
power_trim_info->flag);
1077
1078
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
1079
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c thermalA:%d thermalB:%d\n",
1080
thermal[RF_PATH_A],
1081
thermal[RF_PATH_B]);
1082
}
1083
1084
void phydm_set_power_trim_offset_8822c(void *dm_void)
1085
{
1086
struct dm_struct *dm = (struct dm_struct *)dm_void;
1087
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1088
u8 e_rf_path;
1089
1090
for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)
1091
{
1092
odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 1);
1093
1094
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);
1095
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1096
power_trim_info->bb_gain[0][e_rf_path]);
1097
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x1);
1098
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1099
power_trim_info->bb_gain[1][e_rf_path]);
1100
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x2);
1101
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1102
power_trim_info->bb_gain[2][e_rf_path]);
1103
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x3);
1104
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1105
power_trim_info->bb_gain[2][e_rf_path]);
1106
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x4);
1107
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1108
power_trim_info->bb_gain[3][e_rf_path]);
1109
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x5);
1110
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1111
power_trim_info->bb_gain[4][e_rf_path]);
1112
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x6);
1113
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1114
power_trim_info->bb_gain[5][e_rf_path]);
1115
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x7);
1116
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1117
power_trim_info->bb_gain[6][e_rf_path]);
1118
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x8);
1119
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1120
power_trim_info->bb_gain[7][e_rf_path]);
1121
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x9);
1122
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1123
power_trim_info->bb_gain[3][e_rf_path]);
1124
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xa);
1125
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1126
power_trim_info->bb_gain[4][e_rf_path]);
1127
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xb);
1128
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1129
power_trim_info->bb_gain[5][e_rf_path]);
1130
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xc);
1131
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1132
power_trim_info->bb_gain[6][e_rf_path]);
1133
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xd);
1134
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1135
power_trim_info->bb_gain[7][e_rf_path]);
1136
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xe);
1137
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1138
power_trim_info->bb_gain[7][e_rf_path]);
1139
1140
odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 0);
1141
}
1142
}
1143
1144
void phydm_get_set_power_trim_offset_8822c(void *dm_void)
1145
{
1146
struct dm_struct *dm = (struct dm_struct *)dm_void;
1147
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1148
1149
u8 pg_power = 0xff, i, j;
1150
u8 pg_power1, pg_power2 , pg_power3, pg_power4, pg_power5;
1151
1152
odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power1, false);
1153
odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power2, false);
1154
odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power3, false);
1155
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power4, false);
1156
odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power5, false);
1157
1158
if (pg_power1 != 0xff || pg_power2 != 0xff || pg_power3 != 0xff ||
1159
pg_power4 != 0xff || pg_power5 != 0xff) {
1160
odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power, false);
1161
if (pg_power == 0xff)
1162
pg_power = 0;
1163
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
1164
power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;
1165
1166
odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power, false);
1167
if (pg_power == 0xff)
1168
pg_power = 0;
1169
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
1170
power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;
1171
1172
odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power, false);
1173
if (pg_power == 0xff)
1174
pg_power = 0;
1175
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
1176
power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;
1177
1178
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power, false);
1179
if (pg_power == 0xff)
1180
pg_power = 0;
1181
power_trim_info->bb_gain[3][0] = pg_power & 0x1f;
1182
odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power, false);
1183
if (pg_power == 0xff)
1184
pg_power = 0;
1185
power_trim_info->bb_gain[3][1] = pg_power & 0x1f;
1186
1187
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power, false);
1188
if (pg_power == 0xff)
1189
pg_power = 0;
1190
power_trim_info->bb_gain[4][0] = pg_power & 0x1f;
1191
odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power, false);
1192
if (pg_power == 0xff)
1193
pg_power = 0;
1194
power_trim_info->bb_gain[4][1] = pg_power & 0x1f;
1195
1196
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power, false);
1197
if (pg_power == 0xff)
1198
pg_power = 0;
1199
power_trim_info->bb_gain[5][0] = pg_power & 0x1f;
1200
odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22C, &pg_power, false);
1201
if (pg_power == 0xff)
1202
pg_power = 0;
1203
power_trim_info->bb_gain[5][1] = pg_power & 0x1f;
1204
1205
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22C, &pg_power, false);
1206
if (pg_power == 0xff)
1207
pg_power = 0;
1208
power_trim_info->bb_gain[6][0] = pg_power & 0x1f;
1209
odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22C, &pg_power, false);
1210
if (pg_power == 0xff)
1211
pg_power = 0;
1212
power_trim_info->bb_gain[6][1] = pg_power & 0x1f;
1213
1214
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22C, &pg_power, false);
1215
if (pg_power == 0xff)
1216
pg_power = 0;
1217
power_trim_info->bb_gain[7][0] = pg_power & 0x1f;
1218
odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22C, &pg_power, false);
1219
if (pg_power == 0xff)
1220
pg_power = 0;
1221
power_trim_info->bb_gain[7][1] = pg_power & 0x1f;
1222
1223
power_trim_info->flag =
1224
power_trim_info->flag | KFREE_FLAG_ON |
1225
KFREE_FLAG_ON_2G |
1226
KFREE_FLAG_ON_5G;
1227
1228
phydm_set_power_trim_offset_8822c(dm);
1229
}
1230
1231
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c power trim flag:0x%02x\n",
1232
power_trim_info->flag);
1233
1234
if (power_trim_info->flag & KFREE_FLAG_ON) {
1235
for (i = 0; i < KFREE_BAND_NUM; i++) {
1236
for (j = 0; j < 2; j++) {
1237
RF_DBG(dm, DBG_RF_MP,
1238
"[kfree] 8822c pwr_trim->bb_gain[%d][%d]=0x%X\n",
1239
i, j, power_trim_info->bb_gain[i][j]);
1240
}
1241
}
1242
}
1243
}
1244
1245
void phydm_get_tssi_trim_offset_8822c(void *dm_void)
1246
{
1247
struct dm_struct *dm = (struct dm_struct *)dm_void;
1248
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1249
1250
u8 i, j = 0;
1251
u8 pg_power[16] = {0};
1252
1253
odm_efuse_one_byte_read(dm, TSSI_2GM_TXA_22C, &pg_power[0], false);
1254
odm_efuse_one_byte_read(dm, TSSI_2GM_TXB_22C, &pg_power[1], false);
1255
odm_efuse_one_byte_read(dm, TSSI_2GH_TXA_22C, &pg_power[2], false);
1256
odm_efuse_one_byte_read(dm, TSSI_2GH_TXB_22C, &pg_power[3], false);
1257
odm_efuse_one_byte_read(dm, TSSI_5GL1_TXA_22C, &pg_power[4], false);
1258
odm_efuse_one_byte_read(dm, TSSI_5GL1_TXB_22C, &pg_power[5], false);
1259
odm_efuse_one_byte_read(dm, TSSI_5GL2_TXA_22C, &pg_power[6], false);
1260
odm_efuse_one_byte_read(dm, TSSI_5GL2_TXB_22C, &pg_power[7], false);
1261
odm_efuse_one_byte_read(dm, TSSI_5GM1_TXA_22C, &pg_power[8], false);
1262
odm_efuse_one_byte_read(dm, TSSI_5GM1_TXB_22C, &pg_power[9], false);
1263
odm_efuse_one_byte_read(dm, TSSI_5GM2_TXA_22C, &pg_power[10], false);
1264
odm_efuse_one_byte_read(dm, TSSI_5GM2_TXB_22C, &pg_power[11], false);
1265
odm_efuse_one_byte_read(dm, TSSI_5GH1_TXA_22C, &pg_power[12], false);
1266
odm_efuse_one_byte_read(dm, TSSI_5GH1_TXB_22C, &pg_power[13], false);
1267
odm_efuse_one_byte_read(dm, TSSI_5GH2_TXA_22C, &pg_power[14], false);
1268
odm_efuse_one_byte_read(dm, TSSI_5GH2_TXB_22C, &pg_power[15], false);
1269
1270
for (i = 0; i < 16; i++) {
1271
if (pg_power[i] == 0xff)
1272
j++;
1273
}
1274
1275
if (j == 15) {
1276
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c tssi trim no PG\n");
1277
return;
1278
} else {
1279
power_trim_info->tssi_trim[0][0] = (s8)pg_power[0];
1280
power_trim_info->tssi_trim[0][1] = (s8)pg_power[1];
1281
power_trim_info->tssi_trim[1][0] = (s8)pg_power[0];
1282
power_trim_info->tssi_trim[1][1] = (s8)pg_power[1];
1283
power_trim_info->tssi_trim[2][0] = (s8)pg_power[2];
1284
power_trim_info->tssi_trim[2][1] = (s8)pg_power[3];
1285
power_trim_info->tssi_trim[3][0] = (s8)pg_power[4];
1286
power_trim_info->tssi_trim[3][1] = (s8)pg_power[5];
1287
power_trim_info->tssi_trim[4][0] = (s8)pg_power[6];
1288
power_trim_info->tssi_trim[4][1] = (s8)pg_power[7];
1289
power_trim_info->tssi_trim[5][0] = (s8)pg_power[8];
1290
power_trim_info->tssi_trim[5][1] = (s8)pg_power[9];
1291
power_trim_info->tssi_trim[6][0] = (s8)pg_power[10];
1292
power_trim_info->tssi_trim[6][1] = (s8)pg_power[11];
1293
power_trim_info->tssi_trim[7][0] = (s8)pg_power[12];
1294
power_trim_info->tssi_trim[7][1] = (s8)pg_power[13];
1295
power_trim_info->tssi_trim[8][0] = (s8)pg_power[14];
1296
power_trim_info->tssi_trim[8][1] = (s8)pg_power[15];
1297
1298
power_trim_info->flag =
1299
power_trim_info->flag | TSSI_TRIM_FLAG_ON;
1300
1301
if (power_trim_info->flag & TSSI_TRIM_FLAG_ON) {
1302
for (i = 0; i < KFREE_BAND_NUM; i++) {
1303
for (j = 0; j < 2; j++) {
1304
RF_DBG(dm, DBG_RF_MP,
1305
"[kfree] 8822c tssi_trim[%d][%d]=0x%X\n",
1306
i, j, power_trim_info->tssi_trim[i][j]);
1307
}
1308
}
1309
}
1310
}
1311
}
1312
1313
s8 phydm_get_tssi_trim_de_8822c(void *dm_void, u8 path)
1314
{
1315
struct dm_struct *dm = (struct dm_struct *)dm_void;
1316
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1317
1318
u8 channel = *dm->channel, group = 0;
1319
1320
if (channel >= 1 && channel <= 3)
1321
group = 0;
1322
else if (channel >= 4 && channel <= 9)
1323
group = 1;
1324
else if (channel >= 10 && channel <= 14)
1325
group = 2;
1326
else if (channel >= 36 && channel <= 50)
1327
group = 3;
1328
else if (channel >= 52 && channel <= 64)
1329
group = 4;
1330
else if (channel >= 100 && channel <= 118)
1331
group = 5;
1332
else if (channel >= 120 && channel <= 144)
1333
group = 6;
1334
else if (channel >= 149 && channel <= 165)
1335
group = 7;
1336
else if (channel >= 167 && channel <= 177)
1337
group = 8;
1338
else {
1339
RF_DBG(dm, DBG_RF_MP, "[kfree] Channel(%d) is not exist in Group\n",
1340
channel);
1341
return 0;
1342
}
1343
1344
return power_trim_info->tssi_trim[group][path];
1345
}
1346
1347
1348
1349
void phydm_get_set_pa_bias_offset_8822c(void *dm_void)
1350
{
1351
struct dm_struct *dm = (struct dm_struct *)dm_void;
1352
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1353
1354
u8 pg_pa_bias = 0xff;
1355
1356
RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);
1357
1358
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C, &pg_pa_bias, false);
1359
1360
if (pg_pa_bias != 0xff) {
1361
/*2G s0*/
1362
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C,
1363
&pg_pa_bias, false);
1364
pg_pa_bias = pg_pa_bias & 0xf;
1365
1366
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s0 pa_bias=0x%x\n", pg_pa_bias);
1367
1368
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);
1369
1370
/*2G s1*/
1371
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22C,
1372
&pg_pa_bias, false);
1373
pg_pa_bias = pg_pa_bias & 0xf;
1374
1375
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s1 pa_bias=0x%x\n", pg_pa_bias);
1376
1377
odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x0000f000, pg_pa_bias);
1378
1379
/*5G s0*/
1380
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C,
1381
&pg_pa_bias, false);
1382
pg_pa_bias = pg_pa_bias & 0xf;
1383
1384
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s0 pa_bias=0x%x\n", pg_pa_bias);
1385
1386
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);
1387
1388
/*5G s1*/
1389
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GB_22C,
1390
&pg_pa_bias, false);
1391
pg_pa_bias = pg_pa_bias & 0xf;
1392
1393
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s1 pa_bias=0x%x\n", pg_pa_bias);
1394
1395
odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x000f0000, pg_pa_bias);
1396
1397
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
1398
} else {
1399
RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c tx pa bias no pg\n");
1400
}
1401
1402
}
1403
1404
void phydm_get_set_thermal_trim_offset_8812f(void *dm_void)
1405
{
1406
struct dm_struct *dm = (struct dm_struct *)dm_void;
1407
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1408
1409
u8 pg_therm = 0xff, thermal[2] = {0};
1410
1411
odm_efuse_one_byte_read(dm, PPG_THERMAL_A_OFFSET_22C, &pg_therm, false);
1412
1413
if (pg_therm != 0xff) {
1414
/*s0*/
1415
pg_therm = pg_therm & 0x1f;
1416
1417
thermal[RF_PATH_A] =
1418
((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);
1419
1420
odm_set_rf_reg(dm, RF_PATH_A, RF_0x43, 0x000f0000, thermal[RF_PATH_A]);
1421
1422
/*s1*/
1423
odm_efuse_one_byte_read(dm, PPG_THERMAL_B_OFFSET_22C, &pg_therm, false);
1424
1425
pg_therm = pg_therm & 0x1f;
1426
1427
thermal[RF_PATH_B] = ((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);
1428
1429
odm_set_rf_reg(dm, RF_PATH_B, RF_0x43, 0x000f0000, thermal[RF_PATH_B]);
1430
1431
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
1432
1433
}
1434
1435
RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f thermal trim flag:0x%02x\n",
1436
power_trim_info->flag);
1437
1438
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
1439
RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f thermalA:%d thermalB:%d\n",
1440
thermal[RF_PATH_A],
1441
thermal[RF_PATH_B]);
1442
}
1443
1444
void phydm_set_power_trim_offset_8812f(void *dm_void)
1445
{
1446
struct dm_struct *dm = (struct dm_struct *)dm_void;
1447
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1448
u8 e_rf_path;
1449
1450
for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)
1451
{
1452
odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 1);
1453
1454
#if 0
1455
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);
1456
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1457
power_trim_info->bb_gain[0][e_rf_path]);
1458
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x1);
1459
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1460
power_trim_info->bb_gain[1][e_rf_path]);
1461
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x2);
1462
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1463
power_trim_info->bb_gain[2][e_rf_path]);
1464
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x3);
1465
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1466
power_trim_info->bb_gain[2][e_rf_path]);
1467
#endif
1468
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x4);
1469
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1470
power_trim_info->bb_gain[3][e_rf_path]);
1471
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x5);
1472
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1473
power_trim_info->bb_gain[4][e_rf_path]);
1474
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x6);
1475
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1476
power_trim_info->bb_gain[5][e_rf_path]);
1477
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x7);
1478
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1479
power_trim_info->bb_gain[6][e_rf_path]);
1480
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x8);
1481
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1482
power_trim_info->bb_gain[7][e_rf_path]);
1483
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x9);
1484
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1485
power_trim_info->bb_gain[3][e_rf_path]);
1486
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xa);
1487
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1488
power_trim_info->bb_gain[4][e_rf_path]);
1489
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xb);
1490
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1491
power_trim_info->bb_gain[5][e_rf_path]);
1492
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xc);
1493
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1494
power_trim_info->bb_gain[6][e_rf_path]);
1495
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xd);
1496
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1497
power_trim_info->bb_gain[7][e_rf_path]);
1498
odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xe);
1499
odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,
1500
power_trim_info->bb_gain[7][e_rf_path]);
1501
1502
odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 0);
1503
}
1504
}
1505
1506
void phydm_get_set_power_trim_offset_8812f(void *dm_void)
1507
{
1508
struct dm_struct *dm = (struct dm_struct *)dm_void;
1509
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1510
1511
u8 pg_power = 0xff, i, j;
1512
u8 pg_power1 = 0, pg_power2 = 0, pg_power3 = 0;
1513
u8 pg_power4 = 0, pg_power5 = 0;
1514
1515
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power1, false);
1516
odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power2, false);
1517
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power3, false);
1518
odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power4, false);
1519
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power5, false);
1520
1521
if (pg_power1 != 0xff || pg_power2 != 0xff || pg_power3 != 0xff ||
1522
pg_power4 != 0xff || pg_power5 != 0xff) {
1523
#if 0
1524
odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power, false);
1525
if (pg_power == 0xff)
1526
pg_power = 0;
1527
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
1528
power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;
1529
1530
odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power, false);
1531
if (pg_power == 0xff)
1532
pg_power = 0;
1533
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
1534
power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;
1535
1536
odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power, false);
1537
if (pg_power == 0xff)
1538
pg_power = 0;
1539
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
1540
power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;
1541
#endif
1542
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power, false);
1543
if (pg_power == 0xff)
1544
pg_power = 0;
1545
power_trim_info->bb_gain[3][0] = pg_power & 0x1f;
1546
odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power, false);
1547
if (pg_power == 0xff)
1548
pg_power = 0;
1549
power_trim_info->bb_gain[3][1] = pg_power & 0x1f;
1550
1551
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power, false);
1552
if (pg_power == 0xff)
1553
pg_power = 0;
1554
power_trim_info->bb_gain[4][0] = pg_power & 0x1f;
1555
odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power, false);
1556
if (pg_power == 0xff)
1557
pg_power = 0;
1558
power_trim_info->bb_gain[4][1] = pg_power & 0x1f;
1559
1560
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power, false);
1561
if (pg_power == 0xff)
1562
pg_power = 0;
1563
power_trim_info->bb_gain[5][0] = pg_power & 0x1f;
1564
odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22C, &pg_power, false);
1565
if (pg_power == 0xff)
1566
pg_power = 0;
1567
power_trim_info->bb_gain[5][1] = pg_power & 0x1f;
1568
1569
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22C, &pg_power, false);
1570
if (pg_power == 0xff)
1571
pg_power = 0;
1572
power_trim_info->bb_gain[6][0] = pg_power & 0x1f;
1573
odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22C, &pg_power, false);
1574
if (pg_power == 0xff)
1575
pg_power = 0;
1576
power_trim_info->bb_gain[6][1] = pg_power & 0x1f;
1577
1578
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22C, &pg_power, false);
1579
if (pg_power == 0xff)
1580
pg_power = 0;
1581
power_trim_info->bb_gain[7][0] = pg_power & 0x1f;
1582
odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22C, &pg_power, false);
1583
if (pg_power == 0xff)
1584
pg_power = 0;
1585
power_trim_info->bb_gain[7][1] = pg_power & 0x1f;
1586
1587
power_trim_info->flag =
1588
power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_5G;
1589
1590
phydm_set_power_trim_offset_8812f(dm);
1591
}
1592
1593
RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f power trim flag:0x%02x\n",
1594
power_trim_info->flag);
1595
1596
if (power_trim_info->flag & KFREE_FLAG_ON) {
1597
for (i = 0; i < KFREE_BAND_NUM; i++) {
1598
for (j = 0; j < 2; j++) {
1599
RF_DBG(dm, DBG_RF_MP,
1600
"[kfree] 8812f pwr_trim->bb_gain[%d][%d]=0x%X\n",
1601
i, j, power_trim_info->bb_gain[i][j]);
1602
}
1603
}
1604
}
1605
}
1606
1607
void phydm_get_tssi_trim_offset_8812f(void *dm_void)
1608
{
1609
struct dm_struct *dm = (struct dm_struct *)dm_void;
1610
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1611
1612
u8 i, j = 0;
1613
u8 pg_power[16] = {0};
1614
1615
#if 0
1616
odm_efuse_one_byte_read(dm, TSSI_2GM_TXA_22C, &pg_power[0], false);
1617
odm_efuse_one_byte_read(dm, TSSI_2GM_TXB_22C, &pg_power[1], false);
1618
odm_efuse_one_byte_read(dm, TSSI_2GH_TXA_22C, &pg_power[2], false);
1619
odm_efuse_one_byte_read(dm, TSSI_2GH_TXB_22C, &pg_power[3], false);
1620
#endif
1621
odm_efuse_one_byte_read(dm, TSSI_5GL1_TXA_22C, &pg_power[4], false);
1622
odm_efuse_one_byte_read(dm, TSSI_5GL1_TXB_22C, &pg_power[5], false);
1623
odm_efuse_one_byte_read(dm, TSSI_5GL2_TXA_22C, &pg_power[6], false);
1624
odm_efuse_one_byte_read(dm, TSSI_5GL2_TXB_22C, &pg_power[7], false);
1625
odm_efuse_one_byte_read(dm, TSSI_5GM1_TXA_22C, &pg_power[8], false);
1626
odm_efuse_one_byte_read(dm, TSSI_5GM1_TXB_22C, &pg_power[9], false);
1627
odm_efuse_one_byte_read(dm, TSSI_5GM2_TXA_22C, &pg_power[10], false);
1628
odm_efuse_one_byte_read(dm, TSSI_5GM2_TXB_22C, &pg_power[11], false);
1629
odm_efuse_one_byte_read(dm, TSSI_5GH1_TXA_22C, &pg_power[12], false);
1630
odm_efuse_one_byte_read(dm, TSSI_5GH1_TXB_22C, &pg_power[13], false);
1631
odm_efuse_one_byte_read(dm, TSSI_5GH2_TXA_22C, &pg_power[14], false);
1632
odm_efuse_one_byte_read(dm, TSSI_5GH2_TXB_22C, &pg_power[15], false);
1633
1634
for (i = 4; i < 16; i++) {
1635
if (pg_power[i] == 0xff)
1636
j++;
1637
}
1638
1639
if (j == 12) {
1640
RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f tssi trim no PG\n");
1641
return;
1642
} else {
1643
#if 0
1644
power_trim_info->tssi_trim[0][0] = (s8)pg_power[0];
1645
power_trim_info->tssi_trim[0][1] = (s8)pg_power[1];
1646
power_trim_info->tssi_trim[1][0] = (s8)pg_power[0];
1647
power_trim_info->tssi_trim[1][1] = (s8)pg_power[1];
1648
power_trim_info->tssi_trim[2][0] = (s8)pg_power[2];
1649
power_trim_info->tssi_trim[2][1] = (s8)pg_power[3];
1650
#endif
1651
power_trim_info->tssi_trim[3][0] = (s8)pg_power[4];
1652
power_trim_info->tssi_trim[3][1] = (s8)pg_power[5];
1653
power_trim_info->tssi_trim[4][0] = (s8)pg_power[6];
1654
power_trim_info->tssi_trim[4][1] = (s8)pg_power[7];
1655
power_trim_info->tssi_trim[5][0] = (s8)pg_power[8];
1656
power_trim_info->tssi_trim[5][1] = (s8)pg_power[9];
1657
power_trim_info->tssi_trim[6][0] = (s8)pg_power[10];
1658
power_trim_info->tssi_trim[6][1] = (s8)pg_power[11];
1659
power_trim_info->tssi_trim[7][0] = (s8)pg_power[12];
1660
power_trim_info->tssi_trim[7][1] = (s8)pg_power[13];
1661
power_trim_info->tssi_trim[8][0] = (s8)pg_power[14];
1662
power_trim_info->tssi_trim[8][1] = (s8)pg_power[15];
1663
1664
power_trim_info->flag =
1665
power_trim_info->flag | TSSI_TRIM_FLAG_ON;
1666
1667
if (power_trim_info->flag & TSSI_TRIM_FLAG_ON) {
1668
for (i = 0; i < KFREE_BAND_NUM; i++) {
1669
for (j = 0; j < 2; j++) {
1670
RF_DBG(dm, DBG_RF_MP,
1671
"[kfree] 8812f tssi_trim[%d][%d]=0x%X\n",
1672
i, j, power_trim_info->tssi_trim[i][j]);
1673
}
1674
}
1675
}
1676
}
1677
}
1678
1679
s8 phydm_get_tssi_trim_de_8812f(void *dm_void, u8 path)
1680
{
1681
struct dm_struct *dm = (struct dm_struct *)dm_void;
1682
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1683
1684
u8 channel = *dm->channel, group = 0;
1685
1686
if (channel >= 1 && channel <= 3)
1687
group = 0;
1688
else if (channel >= 4 && channel <= 9)
1689
group = 1;
1690
else if (channel >= 10 && channel <= 14)
1691
group = 2;
1692
else if (channel >= 36 && channel <= 50)
1693
group = 3;
1694
else if (channel >= 52 && channel <= 64)
1695
group = 4;
1696
else if (channel >= 100 && channel <= 118)
1697
group = 5;
1698
else if (channel >= 120 && channel <= 144)
1699
group = 6;
1700
else if (channel >= 149 && channel <= 165)
1701
group = 7;
1702
else if (channel >= 167 && channel <= 177)
1703
group = 8;
1704
else {
1705
RF_DBG(dm, DBG_RF_MP, "[kfree] Channel(%d) is not exist in Group\n",
1706
channel);
1707
return 0;
1708
}
1709
1710
return power_trim_info->tssi_trim[group][path];
1711
}
1712
1713
void phydm_get_set_pa_bias_offset_8812f(void *dm_void)
1714
{
1715
struct dm_struct *dm = (struct dm_struct *)dm_void;
1716
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1717
1718
u8 pg_pa_bias = 0xff;
1719
1720
RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);
1721
1722
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C, &pg_pa_bias, false);
1723
1724
if (pg_pa_bias != 0xff) {
1725
#if 0
1726
/*2G s0*/
1727
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C,
1728
&pg_pa_bias, false);
1729
pg_pa_bias = pg_pa_bias & 0xf;
1730
1731
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s0 pa_bias=0x%x\n", pg_pa_bias);
1732
1733
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);
1734
1735
/*2G s1*/
1736
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22C,
1737
&pg_pa_bias, false);
1738
pg_pa_bias = pg_pa_bias & 0xf;
1739
1740
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s1 pa_bias=0x%x\n", pg_pa_bias);
1741
1742
odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x0000f000, pg_pa_bias);
1743
#endif
1744
1745
/*5G s0*/
1746
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C,
1747
&pg_pa_bias, false);
1748
pg_pa_bias = pg_pa_bias & 0xf;
1749
1750
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s0 pa_bias=0x%x\n", pg_pa_bias);
1751
1752
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);
1753
1754
/*5G s1*/
1755
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GB_22C,
1756
&pg_pa_bias, false);
1757
pg_pa_bias = pg_pa_bias & 0xf;
1758
1759
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s1 pa_bias=0x%x\n", pg_pa_bias);
1760
1761
odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x000f0000, pg_pa_bias);
1762
1763
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
1764
} else {
1765
RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f tx pa bias no pg\n");
1766
}
1767
1768
}
1769
1770
void phydm_get_thermal_trim_offset_8195b(void *dm_void)
1771
{
1772
struct dm_struct *dm = (struct dm_struct *)dm_void;
1773
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1774
1775
u8 pg_therm = 0xff;
1776
1777
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_95B, &pg_therm, false);
1778
1779
if (pg_therm != 0xff) {
1780
pg_therm = pg_therm & 0x1f;
1781
if ((pg_therm & BIT(0)) == 0)
1782
power_trim_info->thermal = (-1 * (pg_therm >> 1));
1783
else
1784
power_trim_info->thermal = (pg_therm >> 1);
1785
1786
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
1787
}
1788
1789
RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b thermal trim flag:0x%02x\n",
1790
power_trim_info->flag);
1791
1792
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
1793
RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b thermal:%d\n",
1794
power_trim_info->thermal);
1795
}
1796
1797
void phydm_set_power_trim_rf_8195b(void *dm_void)
1798
{
1799
struct dm_struct *dm = (struct dm_struct *)dm_void;
1800
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1801
u32 band, i;
1802
s8 pwr_offset[3];
1803
1804
RF_DBG(dm, DBG_RF_MP,
1805
"[kfree] %s:Set kfree to rf 0x33\n", __func__);
1806
1807
odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 1);
1808
1809
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x0);
1810
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1811
power_trim_info->bb_gain[0][RF_PATH_A]);
1812
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x1);
1813
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1814
power_trim_info->bb_gain[1][RF_PATH_A]);
1815
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x2);
1816
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1817
power_trim_info->bb_gain[2][RF_PATH_A]);
1818
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x4);
1819
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1820
power_trim_info->bb_gain[3][RF_PATH_A]);
1821
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x5);
1822
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1823
power_trim_info->bb_gain[4][RF_PATH_A]);
1824
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x6);
1825
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1826
power_trim_info->bb_gain[5][RF_PATH_A]);
1827
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x7);
1828
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1829
power_trim_info->bb_gain[6][RF_PATH_A]);
1830
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x8);
1831
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1832
power_trim_info->bb_gain[7][RF_PATH_A]);
1833
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0xe);
1834
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1835
power_trim_info->bb_gain[7][RF_PATH_A]);
1836
1837
odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 0);
1838
1839
}
1840
1841
void phydm_get_set_power_trim_offset_8195b(void *dm_void)
1842
{
1843
struct dm_struct *dm = (struct dm_struct *)dm_void;
1844
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1845
1846
u8 pg_power = 0xff, i, j;
1847
1848
odm_efuse_one_byte_read(dm, PPG_2GL_TXA_95B, &pg_power, false);
1849
1850
if (pg_power != 0xff) {
1851
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
1852
1853
odm_efuse_one_byte_read(dm, PPG_2GM_TXA_95B, &pg_power, false);
1854
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
1855
1856
odm_efuse_one_byte_read(dm, PPG_2GH_TXA_95B, &pg_power, false);
1857
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
1858
1859
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_95B, &pg_power, false);
1860
power_trim_info->bb_gain[3][0] = pg_power & 0x1f;
1861
1862
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_95B, &pg_power, false);
1863
power_trim_info->bb_gain[4][0] = pg_power & 0x1f;
1864
1865
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_95B, &pg_power, false);
1866
power_trim_info->bb_gain[5][0] = pg_power & 0x1f;
1867
1868
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_95B, &pg_power, false);
1869
power_trim_info->bb_gain[6][0] = pg_power & 0x1f;
1870
1871
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_95B, &pg_power, false);
1872
power_trim_info->bb_gain[7][0] = pg_power & 0x1f;
1873
1874
phydm_set_power_trim_rf_8195b(dm);
1875
1876
power_trim_info->flag =
1877
power_trim_info->flag |
1878
KFREE_FLAG_ON | KFREE_FLAG_ON_2G | KFREE_FLAG_ON_5G;
1879
}
1880
1881
RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b power trim flag:0x%02x\n",
1882
power_trim_info->flag);
1883
1884
if (power_trim_info->flag & KFREE_FLAG_ON) {
1885
for (i = 0; i < KFREE_BAND_NUM; i++) {
1886
for (j = 0; j < 1; j++) {
1887
RF_DBG(dm, DBG_RF_MP,
1888
"[kfree] 8195b pwr_trim->bb_gain[%d][%d]=0x%X\n",
1889
i, j, power_trim_info->bb_gain[i][j]);
1890
}
1891
}
1892
}
1893
}
1894
1895
void phydm_get_set_pa_bias_offset_8195b(void *dm_void)
1896
{
1897
struct dm_struct *dm = (struct dm_struct *)dm_void;
1898
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1899
1900
u8 pg_pa_bias = 0xff;
1901
1902
RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);
1903
1904
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B, &pg_pa_bias, false);
1905
1906
if (pg_pa_bias != 0xff) {
1907
/*2G*/
1908
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B,
1909
&pg_pa_bias, false);
1910
pg_pa_bias = pg_pa_bias & 0xf;
1911
1912
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G pa_bias=0x%x\n", pg_pa_bias);
1913
1914
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);
1915
1916
/*5G*/
1917
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_95B,
1918
&pg_pa_bias, false);
1919
pg_pa_bias = pg_pa_bias & 0xf;
1920
1921
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G pa_bias=0x%x\n", pg_pa_bias);
1922
1923
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);
1924
1925
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
1926
} else {
1927
RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b tx pa bias no pg\n");
1928
}
1929
}
1930
1931
void phydm_get_thermal_trim_offset_8721d(void *dm_void)
1932
{
1933
struct dm_struct *dm = (struct dm_struct *)dm_void;
1934
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1935
1936
u8 pg_therm = 0xff;
1937
1938
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_8721D, &pg_therm, false);
1939
1940
if (pg_therm != 0xff) {
1941
pg_therm = pg_therm & 0x1f;
1942
if ((pg_therm & BIT(0)) == 0)
1943
power_trim_info->thermal = (-1 * (pg_therm >> 1));
1944
else
1945
power_trim_info->thermal = (pg_therm >> 1);
1946
1947
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
1948
}
1949
1950
RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d thermal trim flag:0x%02x\n",
1951
power_trim_info->flag);
1952
1953
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
1954
RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d thermal:%d\n",
1955
power_trim_info->thermal);
1956
}
1957
1958
void phydm_set_power_trim_rf_8721d(void *dm_void, u8 pg_band)
1959
{
1960
struct dm_struct *dm = (struct dm_struct *)dm_void;
1961
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
1962
1963
RF_DBG(dm, DBG_RF_MP, "[kfree] %s:Set kfree to rf 0x33\n", __func__);
1964
1965
odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 1);
1966
if (pg_band == 1) {
1967
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x0);
1968
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1969
power_trim_info->bb_gain[0][RF_PATH_A]);
1970
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x1);
1971
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1972
power_trim_info->bb_gain[1][RF_PATH_A]);
1973
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x2);
1974
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1975
power_trim_info->bb_gain[2][RF_PATH_A]);
1976
} else if (pg_band == 2) {
1977
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x4);
1978
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1979
power_trim_info->bb_gain[3][RF_PATH_A]);
1980
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x5);
1981
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1982
power_trim_info->bb_gain[4][RF_PATH_A]);
1983
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x6);
1984
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1985
power_trim_info->bb_gain[5][RF_PATH_A]);
1986
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x7);
1987
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1988
power_trim_info->bb_gain[6][RF_PATH_A]);
1989
odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x8);
1990
odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,
1991
power_trim_info->bb_gain[7][RF_PATH_A]);
1992
}
1993
odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 0);
1994
}
1995
1996
void phydm_get_set_power_trim_offset_8721d(void *dm_void)
1997
{
1998
struct dm_struct *dm = (struct dm_struct *)dm_void;
1999
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2000
2001
u8 pg_power = 0xff, pg_power_5g = 0xff, i, j;
2002
u8 pg_band = 0;
2003
2004
odm_efuse_one_byte_read(dm, PPG_2G_TXA_8721D, &pg_power, false);
2005
odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_8721D, &pg_power_5g, false);
2006
2007
if (pg_power != 0xff) {
2008
pg_band = 1;
2009
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
2010
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
2011
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
2012
2013
phydm_set_power_trim_rf_8721d(dm, pg_band);
2014
2015
power_trim_info->flag =
2016
power_trim_info->flag |
2017
KFREE_FLAG_ON | KFREE_FLAG_ON_2G;
2018
}
2019
if (pg_power_5g != 0xff) {
2020
pg_band = 2;
2021
power_trim_info->bb_gain[3][0] = pg_power_5g & 0x1f;
2022
2023
odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_8721D,
2024
&pg_power_5g, false);
2025
power_trim_info->bb_gain[4][0] = pg_power_5g & 0x1f;
2026
2027
odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_8721D,
2028
&pg_power_5g, false);
2029
power_trim_info->bb_gain[5][0] = pg_power_5g & 0x1f;
2030
2031
odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_8721D,
2032
&pg_power_5g, false);
2033
power_trim_info->bb_gain[6][0] = pg_power_5g & 0x1f;
2034
2035
odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_8721D,
2036
&pg_power_5g, false);
2037
power_trim_info->bb_gain[7][0] = pg_power_5g & 0x1f;
2038
2039
phydm_set_power_trim_rf_8721d(dm, pg_band);
2040
2041
power_trim_info->flag =
2042
power_trim_info->flag |
2043
KFREE_FLAG_ON | KFREE_FLAG_ON_5G;
2044
}
2045
2046
RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d power trim flag:0x%02x\n",
2047
power_trim_info->flag);
2048
2049
if (power_trim_info->flag & KFREE_FLAG_ON) {
2050
for (i = 0; i < KFREE_BAND_NUM; i++) {
2051
for (j = 0; j < 1; j++) {
2052
RF_DBG(dm, DBG_RF_MP,
2053
"[kfree] 8721d pwr_trim->bb_gain[%d][%d]=0x%X\n",
2054
i, j, power_trim_info->bb_gain[i][j]);
2055
}
2056
}
2057
}
2058
}
2059
2060
void phydm_get_set_pa_bias_offset_8721d(void *dm_void)
2061
{
2062
struct dm_struct *dm = (struct dm_struct *)dm_void;
2063
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2064
2065
u8 pg_pa_bias = 0xff;
2066
#if 0
2067
RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);
2068
2069
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B, &pg_pa_bias, false);
2070
2071
if (pg_pa_bias != 0xff) {
2072
/*2G*/
2073
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B,
2074
&pg_pa_bias, false);
2075
pg_pa_bias = pg_pa_bias & 0xf;
2076
2077
RF_DBG(dm, DBG_RF_MP, "[kfree] 2G pa_bias=0x%x\n", pg_pa_bias);
2078
2079
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);
2080
2081
/*5G*/
2082
odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_95B,
2083
&pg_pa_bias, false);
2084
pg_pa_bias = pg_pa_bias & 0xf;
2085
2086
RF_DBG(dm, DBG_RF_MP, "[kfree] 5G pa_bias=0x%x\n", pg_pa_bias);
2087
2088
odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);
2089
2090
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
2091
} else {
2092
RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d tx pa bias no pg\n");
2093
}
2094
#endif
2095
}
2096
2097
void phydm_get_thermal_trim_offset_8197g(void *dm_void)
2098
{
2099
struct dm_struct *dm = (struct dm_struct *)dm_void;
2100
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2101
2102
u8 pg_therm = 0;
2103
2104
odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_97G, &pg_therm, false);
2105
2106
if (pg_therm != 0) {
2107
pg_therm = pg_therm & 0x1f;
2108
if ((pg_therm & BIT(0)) == 0)
2109
power_trim_info->thermal = (-1 * (pg_therm >> 1));
2110
else
2111
power_trim_info->thermal = (pg_therm >> 1);
2112
2113
power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;
2114
}
2115
2116
RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g thermal trim flag:0x%02x\n",
2117
power_trim_info->flag);
2118
2119
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
2120
RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g thermal:%d\n",
2121
power_trim_info->thermal);
2122
}
2123
2124
void phydm_set_power_trim_offset_8197g(void *dm_void)
2125
{
2126
struct dm_struct *dm = (struct dm_struct *)dm_void;
2127
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2128
u8 e_rf_path;
2129
2130
for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)
2131
{
2132
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);
2133
2134
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 0);
2135
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2136
power_trim_info->bb_gain[0][e_rf_path]);
2137
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 1);
2138
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2139
power_trim_info->bb_gain[0][e_rf_path]);
2140
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 2);
2141
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2142
power_trim_info->bb_gain[1][e_rf_path]);
2143
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 3);
2144
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2145
power_trim_info->bb_gain[1][e_rf_path]);
2146
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 4);
2147
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2148
power_trim_info->bb_gain[2][e_rf_path]);
2149
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 5);
2150
odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,
2151
power_trim_info->bb_gain[2][e_rf_path]);
2152
2153
odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);
2154
}
2155
2156
}
2157
2158
void phydm_get_set_power_trim_offset_8197g(void *dm_void)
2159
{
2160
struct dm_struct *dm = (struct dm_struct *)dm_void;
2161
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2162
2163
u8 pg_power = 0, i, j;
2164
2165
odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_97G, &pg_power, false);
2166
2167
if (pg_power != 0) {
2168
power_trim_info->bb_gain[0][0] = pg_power & 0xf;
2169
power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;
2170
2171
odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_97G, &pg_power, false);
2172
power_trim_info->bb_gain[1][0] = pg_power & 0xf;
2173
power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;
2174
2175
odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_97G, &pg_power, false);
2176
power_trim_info->bb_gain[2][0] = pg_power & 0xf;
2177
power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;
2178
2179
phydm_set_power_trim_offset_8197g(dm);
2180
2181
power_trim_info->flag =
2182
power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_2G;
2183
}
2184
2185
RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g power trim flag:0x%02x\n",
2186
power_trim_info->flag);
2187
2188
if (power_trim_info->flag & KFREE_FLAG_ON) {
2189
for (i = 0; i < KFREE_BAND_NUM; i++) {
2190
for (j = 0; j < MAX_RF_PATH; j++) {
2191
RF_DBG(dm, DBG_RF_MP,
2192
"[kfree] 8197g pwr_trim->bb_gain[%d][%d]=0x%X\n",
2193
i, j, power_trim_info->bb_gain[i][j]);
2194
}
2195
}
2196
}
2197
}
2198
2199
void phydm_get_set_pa_bias_offset_8197g(void *dm_void)
2200
{
2201
struct dm_struct *dm = (struct dm_struct *)dm_void;
2202
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2203
2204
u8 pg_pa_bias = 0xff, i;
2205
u8 tx_pa_bias[4] = {0};
2206
2207
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_97G, &pg_pa_bias, false);
2208
2209
if (pg_pa_bias != 0xff) {
2210
/*paht ab*/
2211
odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_97G,
2212
&pg_pa_bias, false);
2213
tx_pa_bias[0] = pg_pa_bias & 0xf;
2214
tx_pa_bias[1] = ((pg_pa_bias & 0xf0) >> 4);
2215
2216
RF_DBG(dm, DBG_RF_MP,
2217
"[kfree] 8197g PathA_pa_bias:0x%x PathB_pa_bias:0x%x\n",
2218
tx_pa_bias[0], tx_pa_bias[1]);
2219
2220
for (i = RF_PATH_A; i < 2; i++)
2221
odm_set_rf_reg(dm, i, 0x60, 0x0000f000, tx_pa_bias[i]);
2222
2223
power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;
2224
} else {
2225
RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g tx pa bias no pg\n");
2226
}
2227
}
2228
2229
void phydm_get_set_lna_offset_8197g(void *dm_void)
2230
{
2231
struct dm_struct *dm = (struct dm_struct *)dm_void;
2232
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2233
2234
u8 pg_lna[2] = {0}, i, pg_lna_tmp = 0;
2235
u32 rf_reg;
2236
2237
odm_efuse_one_byte_read(dm, PPG_LNA_2GA_97G, &pg_lna_tmp, false);
2238
2239
if (pg_lna_tmp != 0) {
2240
odm_efuse_one_byte_read(dm, PPG_LNA_2GA_97G,
2241
&pg_lna[0], false);
2242
2243
odm_efuse_one_byte_read(dm, PPG_LNA_2GB_97G,
2244
&pg_lna[1], false);
2245
2246
for (i = RF_PATH_A; i < 2; i++) {
2247
RF_DBG(dm, DBG_RF_MP,
2248
"[kfree] 8197g lna\n");
2249
odm_set_rf_reg(dm, i, 0x88, 0x00000f00, pg_lna[i]);
2250
}
2251
2252
power_trim_info->lna_flag |= LNA_FLAG_ON;
2253
} else {
2254
RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g lna no pg\n");
2255
}
2256
}
2257
2258
s8 phydm_get_tssi_trim_de(void *dm_void, u8 path)
2259
{
2260
struct dm_struct *dm = (struct dm_struct *)dm_void;
2261
2262
if (dm->support_ic_type & ODM_RTL8822C)
2263
return phydm_get_tssi_trim_de_8822c(dm, path);
2264
else if (dm->support_ic_type & ODM_RTL8812F)
2265
return phydm_get_tssi_trim_de_8812f(dm, path);
2266
else
2267
return 0;
2268
}
2269
2270
void phydm_do_new_kfree(void *dm_void)
2271
{
2272
struct dm_struct *dm = (struct dm_struct *)dm_void;
2273
2274
if (dm->support_ic_type & ODM_RTL8822C) {
2275
phydm_get_set_thermal_trim_offset_8822c(dm);
2276
phydm_get_set_power_trim_offset_8822c(dm);
2277
phydm_get_set_pa_bias_offset_8822c(dm);
2278
phydm_get_tssi_trim_offset_8822c(dm);
2279
}
2280
2281
if (dm->support_ic_type & ODM_RTL8812F) {
2282
phydm_get_set_thermal_trim_offset_8812f(dm);
2283
phydm_get_set_power_trim_offset_8812f(dm);
2284
phydm_get_set_pa_bias_offset_8812f(dm);
2285
phydm_get_tssi_trim_offset_8812f(dm);
2286
}
2287
2288
if (dm->support_ic_type & ODM_RTL8195B) {
2289
phydm_get_thermal_trim_offset_8195b(dm);
2290
phydm_get_set_power_trim_offset_8195b(dm);
2291
phydm_get_set_pa_bias_offset_8195b(dm);
2292
}
2293
2294
if (dm->support_ic_type & ODM_RTL8721D) {
2295
phydm_get_thermal_trim_offset_8721d(dm);
2296
phydm_get_set_power_trim_offset_8721d(dm);
2297
/*phydm_get_set_pa_bias_offset_8721d(dm);*/
2298
}
2299
2300
if (dm->support_ic_type & ODM_RTL8198F)
2301
phydm_get_set_lna_offset_8198f(dm);
2302
2303
if (dm->support_ic_type & ODM_RTL8197G) {
2304
phydm_get_thermal_trim_offset_8197g(dm);
2305
phydm_get_set_power_trim_offset_8197g(dm);
2306
phydm_get_set_pa_bias_offset_8197g(dm);
2307
/*phydm_get_tssi_trim_offset_8197g(dm);*/
2308
/*phydm_get_set_lna_offset_8197g(dm);*/
2309
}
2310
}
2311
2312
void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data)
2313
{
2314
struct dm_struct *dm = (struct dm_struct *)dm_void;
2315
2316
if (dm->support_ic_type & ODM_RTL8814A)
2317
phydm_set_kfree_to_rf_8814a(dm, e_rf_path, data);
2318
2319
if ((dm->support_ic_type & ODM_RTL8821C) &&
2320
(*dm->band_type == ODM_BAND_2_4G))
2321
phydm_set_kfree_to_rf_8821c(dm, e_rf_path, true, data);
2322
else if (dm->support_ic_type & ODM_RTL8821C)
2323
phydm_set_kfree_to_rf_8821c(dm, e_rf_path, false, data);
2324
2325
if (dm->support_ic_type & ODM_RTL8822B)
2326
phydm_set_kfree_to_rf_8822b(dm, e_rf_path, data);
2327
2328
if (dm->support_ic_type & ODM_RTL8710B)
2329
phydm_set_kfree_to_rf_8710b(dm, e_rf_path, data);
2330
2331
if (dm->support_ic_type & ODM_RTL8198F)
2332
phydm_set_kfree_to_rf_8198f(dm, e_rf_path, data);
2333
}
2334
2335
void phydm_clear_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data)
2336
{
2337
struct dm_struct *dm = (struct dm_struct *)dm_void;
2338
2339
if (dm->support_ic_type & ODM_RTL8822B)
2340
phydm_clear_kfree_to_rf_8822b(dm, e_rf_path, 1);
2341
2342
if (dm->support_ic_type & ODM_RTL8821C)
2343
phydm_clear_kfree_to_rf_8821c(dm, e_rf_path, 1);
2344
2345
if (dm->support_ic_type & ODM_RTL8198F)
2346
phydm_clear_kfree_to_rf_8198f(dm, e_rf_path, 0);
2347
}
2348
2349
void phydm_get_thermal_trim_offset(void *dm_void)
2350
{
2351
struct dm_struct *dm = (struct dm_struct *)dm_void;
2352
2353
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2354
void *adapter = dm->adapter;
2355
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2356
PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;
2357
u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];
2358
2359
if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)
2360
RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");
2361
#endif
2362
2363
if (dm->support_ic_type & ODM_RTL8821C)
2364
phydm_get_thermal_trim_offset_8821c(dm_void);
2365
else if (dm->support_ic_type & ODM_RTL8822B)
2366
phydm_get_thermal_trim_offset_8822b(dm_void);
2367
else if (dm->support_ic_type & ODM_RTL8710B)
2368
phydm_get_thermal_trim_offset_8710b(dm_void);
2369
else if (dm->support_ic_type & ODM_RTL8192F)
2370
phydm_get_thermal_trim_offset_8192f(dm_void);
2371
else if (dm->support_ic_type & ODM_RTL8198F)
2372
phydm_get_thermal_trim_offset_8198f(dm_void);
2373
}
2374
2375
void phydm_get_power_trim_offset(void *dm_void)
2376
{
2377
struct dm_struct *dm = (struct dm_struct *)dm_void;
2378
2379
#if 0 //(DM_ODM_SUPPORT_TYPE & ODM_WIN) // 2017 MH DM Should use the same code.s
2380
void *adapter = dm->adapter;
2381
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2382
PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;
2383
u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];
2384
2385
if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO(adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)
2386
RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");
2387
#endif
2388
2389
if (dm->support_ic_type & ODM_RTL8821C)
2390
phydm_get_power_trim_offset_8821c(dm_void);
2391
else if (dm->support_ic_type & ODM_RTL8822B)
2392
phydm_get_power_trim_offset_8822b(dm_void);
2393
else if (dm->support_ic_type & ODM_RTL8710B)
2394
phydm_get_power_trim_offset_8710b(dm_void);
2395
else if (dm->support_ic_type & ODM_RTL8192F)
2396
phydm_get_power_trim_offset_8192f(dm_void);
2397
else if (dm->support_ic_type & ODM_RTL8198F)
2398
phydm_get_power_trim_offset_8198f(dm_void);
2399
}
2400
2401
void phydm_get_pa_bias_offset(void *dm_void)
2402
{
2403
struct dm_struct *dm = (struct dm_struct *)dm_void;
2404
2405
#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
2406
void *adapter = dm->adapter;
2407
HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
2408
PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;
2409
u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];
2410
2411
if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)
2412
RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");
2413
#endif
2414
2415
if (dm->support_ic_type & ODM_RTL8822B)
2416
phydm_get_pa_bias_offset_8822b(dm_void);
2417
2418
if (dm->support_ic_type & ODM_RTL8198F)
2419
phydm_get_pa_bias_offset_8198f(dm);
2420
}
2421
2422
s8 phydm_get_thermal_offset(void *dm_void)
2423
{
2424
struct dm_struct *dm = (struct dm_struct *)dm_void;
2425
struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;
2426
2427
if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)
2428
return power_trim_info->thermal;
2429
else
2430
return 0;
2431
}
2432
2433
void phydm_do_kfree(void *dm_void, u8 channel_to_sw)
2434
{
2435
struct dm_struct *dm = (struct dm_struct *)dm_void;
2436
struct odm_power_trim_data *pwrtrim = &dm->power_trim_data;
2437
u8 channel_idx = 0, rfpath = 0, max_path = 0, kfree_band_num = 0;
2438
u8 i, j;
2439
s8 bb_gain;
2440
2441
if (dm->support_ic_type & ODM_RTL8814A)
2442
max_path = 4; /*0~3*/
2443
else if (dm->support_ic_type &
2444
(ODM_RTL8812 | ODM_RTL8822B | ODM_RTL8192F)) {
2445
max_path = 2; /*0~1*/
2446
kfree_band_num = KFREE_BAND_NUM;
2447
} else if (dm->support_ic_type & ODM_RTL8821C) {
2448
max_path = 1;
2449
kfree_band_num = KFREE_BAND_NUM;
2450
} else if (dm->support_ic_type & ODM_RTL8710B) {
2451
max_path = 1;
2452
kfree_band_num = 1;
2453
} else if (dm->support_ic_type & ODM_RTL8198F) {
2454
max_path = 4;
2455
kfree_band_num = 3;
2456
}
2457
2458
if (dm->support_ic_type &
2459
(ODM_RTL8192F | ODM_RTL8822B | ODM_RTL8821C |
2460
ODM_RTL8814A | ODM_RTL8710B)) {
2461
for (i = 0; i < kfree_band_num; i++) {
2462
for (j = 0; j < max_path; j++)
2463
RF_DBG(dm, DBG_RF_MP,
2464
"[kfree] PwrTrim->gain[%d][%d]=0x%X\n",
2465
i, j, pwrtrim->bb_gain[i][j]);
2466
}
2467
}
2468
if (*dm->band_type == ODM_BAND_2_4G &&
2469
pwrtrim->flag & KFREE_FLAG_ON_2G) {
2470
if (!(dm->support_ic_type & ODM_RTL8192F)) {
2471
if (channel_to_sw >= 1 && channel_to_sw <= 14)
2472
channel_idx = PHYDM_2G;
2473
for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {
2474
RF_DBG(dm, DBG_RF_MP,
2475
"[kfree] %s:chnl=%d PATH=%d gain:0x%X\n",
2476
__func__, channel_to_sw, rfpath,
2477
pwrtrim->bb_gain[channel_idx][rfpath]);
2478
bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];
2479
phydm_set_kfree_to_rf(dm, rfpath, bb_gain);
2480
}
2481
} else if (dm->support_ic_type & ODM_RTL8192F) {
2482
if (channel_to_sw >= 1 && channel_to_sw <= 3)
2483
channel_idx = 0;
2484
if (channel_to_sw >= 4 && channel_to_sw <= 9)
2485
channel_idx = 1;
2486
if (channel_to_sw >= 10 && channel_to_sw <= 14)
2487
channel_idx = 2;
2488
for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {
2489
RF_DBG(dm, DBG_RF_MP,
2490
"[kfree] %s:chnl=%d PATH=%d gain:0x%X\n",
2491
__func__, channel_to_sw, rfpath,
2492
pwrtrim->bb_gain[channel_idx][rfpath]);
2493
bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];
2494
phydm_set_kfree_to_rf_8192f(dm, rfpath,
2495
channel_idx,
2496
bb_gain);
2497
}
2498
}
2499
} else if (*dm->band_type == ODM_BAND_5G &&
2500
pwrtrim->flag & KFREE_FLAG_ON_5G) {
2501
if (channel_to_sw >= 36 && channel_to_sw <= 48)
2502
channel_idx = PHYDM_5GLB1;
2503
if (channel_to_sw >= 52 && channel_to_sw <= 64)
2504
channel_idx = PHYDM_5GLB2;
2505
if (channel_to_sw >= 100 && channel_to_sw <= 120)
2506
channel_idx = PHYDM_5GMB1;
2507
if (channel_to_sw >= 122 && channel_to_sw <= 144)
2508
channel_idx = PHYDM_5GMB2;
2509
if (channel_to_sw >= 149 && channel_to_sw <= 177)
2510
channel_idx = PHYDM_5GHB;
2511
2512
for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {
2513
RF_DBG(dm, DBG_RF_MP,
2514
"[kfree] %s: channel=%d PATH=%d bb_gain:0x%X\n",
2515
__func__, channel_to_sw, rfpath,
2516
pwrtrim->bb_gain[channel_idx][rfpath]);
2517
bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];
2518
phydm_set_kfree_to_rf(dm, rfpath, bb_gain);
2519
}
2520
} else {
2521
RF_DBG(dm, DBG_RF_MP, "[kfree] Set default Register\n");
2522
if (!(dm->support_ic_type & ODM_RTL8192F)) {
2523
for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {
2524
bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];
2525
phydm_clear_kfree_to_rf(dm, rfpath, bb_gain);
2526
}
2527
}
2528
#if 0
2529
/*else if(dm->support_ic_type & ODM_RTL8192F){
2530
if (channel_to_sw >= 1 && channel_to_sw <= 3)
2531
channel_idx = 0;
2532
if (channel_to_sw >= 4 && channel_to_sw <= 9)
2533
channel_idx = 1;
2534
if (channel_to_sw >= 9 && channel_to_sw <= 14)
2535
channel_idx = 2;
2536
for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++)
2537
phydm_clear_kfree_to_rf_8192f(dm, rfpath, pwrtrim->bb_gain[channel_idx][rfpath]);
2538
}*/
2539
#endif
2540
}
2541
}
2542
2543
void phydm_config_new_kfree(void *dm_void)
2544
{
2545
struct dm_struct *dm = (struct dm_struct *)dm_void;
2546
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
2547
2548
if (cali_info->reg_rf_kfree_enable == 2) {
2549
RF_DBG(dm, DBG_RF_MP,
2550
"[kfree] %s: reg_rf_kfree_enable == 2, Disable\n",
2551
__func__);
2552
return;
2553
} else if (cali_info->reg_rf_kfree_enable == 1 ||
2554
cali_info->reg_rf_kfree_enable == 0) {
2555
RF_DBG(dm, DBG_RF_MP,
2556
"[kfree] %s: reg_rf_kfree_enable == true\n", __func__);
2557
2558
phydm_do_new_kfree(dm);
2559
}
2560
}
2561
2562
void phydm_config_kfree(void *dm_void, u8 channel_to_sw)
2563
{
2564
struct dm_struct *dm = (struct dm_struct *)dm_void;
2565
struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
2566
struct odm_power_trim_data *pwrtrim = &dm->power_trim_data;
2567
2568
RF_DBG(dm, DBG_RF_MP, "===>[kfree] phy_ConfigKFree()\n");
2569
2570
if (cali_info->reg_rf_kfree_enable == 2) {
2571
RF_DBG(dm, DBG_RF_MP,
2572
"[kfree] %s: reg_rf_kfree_enable == 2, Disable\n",
2573
__func__);
2574
return;
2575
} else if (cali_info->reg_rf_kfree_enable == 1 ||
2576
cali_info->reg_rf_kfree_enable == 0) {
2577
RF_DBG(dm, DBG_RF_MP,
2578
"[kfree] %s: reg_rf_kfree_enable == true\n", __func__);
2579
/*Make sure the targetval is defined*/
2580
if (!(pwrtrim->flag & KFREE_FLAG_ON)) {
2581
RF_DBG(dm, DBG_RF_MP,
2582
"[kfree] %s: efuse is 0xff, KFree not work\n",
2583
__func__);
2584
return;
2585
}
2586
#if 0
2587
/*if kfree_table[0] == 0xff, means no Kfree*/
2588
#endif
2589
phydm_do_kfree(dm, channel_to_sw);
2590
}
2591
RF_DBG(dm, DBG_RF_MP, "<===[kfree] phy_ConfigKFree()\n");
2592
}
2593
2594