Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
nu11secur1ty
GitHub Repository: nu11secur1ty/Kali-Linux
Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/rtl8814a/halrf_iqk_8814a.c
1308 views
1
/******************************************************************************
2
*
3
* Copyright(c) 2007 - 2017 Realtek Corporation.
4
*
5
* This program is free software; you can redistribute it and/or modify it
6
* under the terms of version 2 of the GNU General Public License as
7
* published by the Free Software Foundation.
8
*
9
* This program is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12
* more details.
13
*
14
*****************************************************************************/
15
16
#include "mp_precomp.h"
17
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
18
#if RT_PLATFORM == PLATFORM_MACOSX
19
#include "phydm_precomp.h"
20
#else
21
#include "../phydm_precomp.h"
22
#endif
23
#else
24
#include "../../phydm_precomp.h"
25
#endif
26
27
#if (RTL8814A_SUPPORT == 1)
28
29
/*---------------------------Define Local Constant---------------------------*/
30
31
/*---------------------------Define Local Constant---------------------------*/
32
33
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
34
void do_iqk_8814a(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
35
u8 threshold)
36
{
37
struct dm_struct *dm = (struct dm_struct *)dm_void;
38
39
odm_reset_iqk_result(dm);
40
dm->rf_calibrate_info.thermal_value_iqk = thermal_value;
41
halrf_iqk_trigger(dm, false);
42
}
43
#else
44
/*Originally config->do_iqk is hooked phy_iq_calibrate_8814a, but do_iqk_8814a and phy_iq_calibrate_8814a have different arguments*/
45
void do_iqk_8814a(void *dm_void, u8 delta_thermal_index, u8 thermal_value,
46
u8 threshold)
47
{
48
struct dm_struct *dm = (struct dm_struct *)dm_void;
49
boolean is_recovery = (boolean)delta_thermal_index;
50
51
halrf_iqk_trigger(dm, is_recovery);
52
}
53
#endif
54
/* 1 7. IQK */
55
56
void _iqk_iqk_fail_report_8814a(struct dm_struct *dm)
57
{
58
struct dm_iqk_info *iqk_info = &dm->IQK_info;
59
u8 i, j;
60
61
for (i = 0; i < 2; i++) {
62
for (j = 0; j < 4; j++) {
63
if (iqk_info->iqk_fail[i][j])
64
#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
65
RF_DBG(dm, DBG_RF_IQK,
66
"[IQK]please check S%d %s\n", j,
67
(i == 0) ? "TXIQK" : "RXIQK");
68
#else
69
panic_printk("[IQK]please check S%d %s\n", j, (i == 0) ? "TXIQK" : "RXIQK");
70
#endif
71
}
72
}
73
}
74
75
void _iqk_backup_mac_bb_8814a(struct dm_struct *dm, u32 *MAC_backup,
76
u32 *BB_backup, u32 *backup_mac_reg,
77
u32 *backup_bb_reg)
78
{
79
u32 i;
80
/* save MACBB default value */
81
for (i = 0; i < MAC_REG_NUM_8814; i++)
82
MAC_backup[i] = odm_read_4byte(dm, backup_mac_reg[i]);
83
for (i = 0; i < BB_REG_NUM_8814; i++)
84
BB_backup[i] = odm_read_4byte(dm, backup_bb_reg[i]);
85
86
RF_DBG(dm, DBG_RF_IQK, "BackupMacBB Success!!!!\n");
87
}
88
89
void _iqk_backup_rf_8814a(struct dm_struct *dm, u32 RF_backup[][4],
90
u32 *backup_rf_reg)
91
{
92
u32 i;
93
/* Save RF Parameters */
94
for (i = 0; i < RF_REG_NUM_8814; i++) {
95
RF_backup[i][RF_PATH_A] = odm_get_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK);
96
RF_backup[i][RF_PATH_B] = odm_get_rf_reg(dm, RF_PATH_B, backup_rf_reg[i], RFREGOFFSETMASK);
97
RF_backup[i][RF_PATH_C] = odm_get_rf_reg(dm, RF_PATH_C, backup_rf_reg[i], RFREGOFFSETMASK);
98
RF_backup[i][RF_PATH_D] = odm_get_rf_reg(dm, RF_PATH_D, backup_rf_reg[i], RFREGOFFSETMASK);
99
}
100
101
RF_DBG(dm, DBG_RF_IQK, "BackupRF Success!!!!\n");
102
}
103
104
void _iqk_afe_setting_8814a(struct dm_struct *dm, boolean do_iqk)
105
{
106
if (do_iqk) {
107
/* IQK AFE setting RX_WAIT_CCA mode */
108
odm_write_4byte(dm, 0xc60, 0x0e808003);
109
odm_write_4byte(dm, 0xe60, 0x0e808003);
110
odm_write_4byte(dm, 0x1860, 0x0e808003);
111
odm_write_4byte(dm, 0x1a60, 0x0e808003);
112
odm_set_bb_reg(dm, R_0x90c, BIT(13), 0x1);
113
114
odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x3);
115
odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x0);
116
117
odm_set_bb_reg(dm, R_0x804, BIT(2), 0x1);
118
odm_set_bb_reg(dm, R_0x804, BIT(2), 0x0);
119
120
RF_DBG(dm, DBG_RF_IQK, "AFE IQK mode Success!!!!\n");
121
} else {
122
odm_write_4byte(dm, 0xc60, 0x07808003);
123
odm_write_4byte(dm, 0xe60, 0x07808003);
124
odm_write_4byte(dm, 0x1860, 0x07808003);
125
odm_write_4byte(dm, 0x1a60, 0x07808003);
126
odm_set_bb_reg(dm, R_0x90c, BIT(13), 0x1);
127
128
odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x3);
129
odm_set_bb_reg(dm, R_0x764, BIT(10) | BIT(9), 0x0);
130
131
odm_set_bb_reg(dm, R_0x804, BIT(2), 0x1);
132
odm_set_bb_reg(dm, R_0x804, BIT(2), 0x0);
133
134
RF_DBG(dm, DBG_RF_IQK, "AFE Normal mode Success!!!!\n");
135
}
136
}
137
138
void _iqk_restore_mac_bb_8814a(struct dm_struct *dm, u32 *MAC_backup,
139
u32 *BB_backup, u32 *backup_mac_reg,
140
u32 *backup_bb_reg)
141
{
142
u32 i;
143
/* Reload MacBB Parameters */
144
for (i = 0; i < MAC_REG_NUM_8814; i++)
145
odm_write_4byte(dm, backup_mac_reg[i], MAC_backup[i]);
146
for (i = 0; i < BB_REG_NUM_8814; i++)
147
odm_write_4byte(dm, backup_bb_reg[i], BB_backup[i]);
148
RF_DBG(dm, DBG_RF_IQK, "RestoreMacBB Success!!!!\n");
149
}
150
151
void _iqk_restore_rf_8814a(struct dm_struct *dm, u32 *backup_rf_reg,
152
u32 RF_backup[][4])
153
{
154
u32 i;
155
156
odm_set_rf_reg(dm, RF_PATH_A, RF_0xef, RFREGOFFSETMASK, 0x0);
157
odm_set_rf_reg(dm, RF_PATH_B, RF_0xef, RFREGOFFSETMASK, 0x0);
158
odm_set_rf_reg(dm, RF_PATH_C, RF_0xef, RFREGOFFSETMASK, 0x0);
159
odm_set_rf_reg(dm, RF_PATH_D, RF_0xef, RFREGOFFSETMASK, 0x0);
160
161
odm_set_rf_reg(dm, RF_PATH_A, RF_0x8f, RFREGOFFSETMASK, 0x88001);
162
odm_set_rf_reg(dm, RF_PATH_B, RF_0x8f, RFREGOFFSETMASK, 0x88001);
163
odm_set_rf_reg(dm, RF_PATH_C, RF_0x8f, RFREGOFFSETMASK, 0x88001);
164
odm_set_rf_reg(dm, RF_PATH_D, RF_0x8f, RFREGOFFSETMASK, 0x88001);
165
166
for (i = 0; i < RF_REG_NUM_8814; i++) {
167
odm_set_rf_reg(dm, RF_PATH_A, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_A]);
168
odm_set_rf_reg(dm, RF_PATH_B, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_B]);
169
odm_set_rf_reg(dm, RF_PATH_C, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_C]);
170
odm_set_rf_reg(dm, RF_PATH_D, backup_rf_reg[i], RFREGOFFSETMASK, RF_backup[i][RF_PATH_D]);
171
}
172
173
RF_DBG(dm, DBG_RF_IQK, "RestoreRF Success!!!!\n");
174
}
175
176
void phy_reset_iqk_result_8814a(struct dm_struct *dm)
177
{
178
odm_write_4byte(dm, 0x1b00, 0xf8000000);
179
odm_write_4byte(dm, 0x1b38, 0x20000000);
180
odm_write_4byte(dm, 0x1b00, 0xf8000002);
181
odm_write_4byte(dm, 0x1b38, 0x20000000);
182
odm_write_4byte(dm, 0x1b00, 0xf8000004);
183
odm_write_4byte(dm, 0x1b38, 0x20000000);
184
odm_write_4byte(dm, 0x1b00, 0xf8000006);
185
odm_write_4byte(dm, 0x1b38, 0x20000000);
186
odm_write_4byte(dm, 0xc10, 0x100);
187
odm_write_4byte(dm, 0xe10, 0x100);
188
odm_write_4byte(dm, 0x1810, 0x100);
189
odm_write_4byte(dm, 0x1a10, 0x100);
190
}
191
192
void _iqk_reset_nctl_8814a(struct dm_struct *dm)
193
{
194
odm_write_4byte(dm, 0x1b00, 0xf8000000);
195
odm_write_4byte(dm, 0x1b80, 0x00000006);
196
odm_write_4byte(dm, 0x1b00, 0xf8000000);
197
odm_write_4byte(dm, 0x1b80, 0x00000002);
198
RF_DBG(dm, DBG_RF_IQK, "ResetNCTL Success!!!!\n");
199
}
200
201
void _iqk_configure_mac_8814a(struct dm_struct *dm)
202
{
203
/* ========MAC register setting======== */
204
odm_write_1byte(dm, 0x522, 0x3f);
205
odm_set_bb_reg(dm, R_0x550, BIT(11) | BIT(3), 0x0);
206
odm_write_1byte(dm, 0x808, 0x00); /* RX ante off */
207
odm_set_bb_reg(dm, R_0x838, 0xf, 0xe); /* CCA off */
208
odm_set_bb_reg(dm, R_0xa14, BIT(9) | BIT(8), 0x3); /* CCK RX path off */
209
odm_write_4byte(dm, 0xcb0, 0x77777777);
210
odm_write_4byte(dm, 0xeb0, 0x77777777);
211
odm_write_4byte(dm, 0x18b4, 0x77777777);
212
odm_write_4byte(dm, 0x1ab4, 0x77777777);
213
odm_set_bb_reg(dm, R_0x1abc, 0x0ff00000, 0x77);
214
odm_set_bb_reg(dm, R_0x910, BIT(23) | BIT(22), 0x0);
215
/*by YN*/
216
odm_set_bb_reg(dm, R_0xcbc, 0xf, 0x0);
217
}
218
219
void _lok_one_shot(void *dm_void)
220
{
221
struct dm_struct *dm = (struct dm_struct *)dm_void;
222
struct dm_iqk_info *iqk_info = &dm->IQK_info;
223
u8 path = 0, delay_count = 0, ii;
224
boolean LOK_notready = false;
225
u32 LOK_temp1 = 0, LOK_temp2 = 0;
226
227
RF_DBG(dm, DBG_RF_IQK, "============ LOK ============\n");
228
for (path = 0; path <= 3; path++) {
229
RF_DBG(dm, DBG_RF_IQK, "==========S%d LOK ==========\n", path);
230
231
odm_set_bb_reg(dm, R_0x9a4, BIT(21) | BIT(20), path); /* ADC Clock source */
232
odm_write_4byte(dm, 0x1b00, (0xf8000001 | (1 << (4 + path)))); /* LOK: CMD ID = 0 {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081} */
233
ODM_delay_ms(LOK_delay);
234
delay_count = 0;
235
LOK_notready = true;
236
237
while (LOK_notready) {
238
LOK_notready = (boolean)odm_get_bb_reg(dm, R_0x1b00, BIT(0));
239
ODM_delay_ms(1);
240
delay_count++;
241
if (delay_count >= 10) {
242
RF_DBG(dm, DBG_RF_IQK, "S%d LOK timeout!!!\n",
243
path);
244
245
_iqk_reset_nctl_8814a(dm);
246
break;
247
}
248
}
249
RF_DBG(dm, DBG_RF_IQK, "S%d ==> delay_count = 0x%x\n", path,
250
delay_count);
251
252
if (!LOK_notready) {
253
odm_write_4byte(dm, 0x1b00, 0xf8000000 | (path << 1));
254
odm_write_4byte(dm, 0x1bd4, 0x003f0001);
255
LOK_temp2 = (odm_get_bb_reg(dm, R_0x1bfc, 0x003e0000) + 0x10) & 0x1f;
256
LOK_temp1 = (odm_get_bb_reg(dm, R_0x1bfc, 0x0000003e) + 0x10) & 0x1f;
257
258
for (ii = 1; ii < 5; ii++) {
259
LOK_temp1 = LOK_temp1 + ((LOK_temp1 & BIT(4 - ii)) << (ii * 2));
260
LOK_temp2 = LOK_temp2 + ((LOK_temp2 & BIT(4 - ii)) << (ii * 2));
261
}
262
RF_DBG(dm, DBG_RF_IQK,
263
"LOK_temp1 = 0x%x, LOK_temp2 = 0x%x\n",
264
LOK_temp1 >> 4, LOK_temp2 >> 4);
265
266
odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, 0x07c00, LOK_temp1 >> 4);
267
odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, 0xf8000, LOK_temp2 >> 4);
268
269
RF_DBG(dm, DBG_RF_IQK, "==>S%d fill LOK\n", path);
270
271
} else {
272
RF_DBG(dm, DBG_RF_IQK, "==>S%d LOK Fail!!!\n", path);
273
odm_set_rf_reg(dm, (enum rf_path)path, RF_0x8, RFREGOFFSETMASK, 0x08400);
274
}
275
iqk_info->lok_fail[path] = LOK_notready;
276
}
277
RF_DBG(dm, DBG_RF_IQK,
278
"LOK0_notready = %d, LOK1_notready = %d, LOK2_notready = %d, LOK3_notready = %d\n",
279
iqk_info->lok_fail[0], iqk_info->lok_fail[1],
280
iqk_info->lok_fail[2], iqk_info->lok_fail[3]);
281
}
282
283
void _iqk_one_shot(void *dm_void)
284
{
285
struct dm_struct *dm = (struct dm_struct *)dm_void;
286
struct dm_iqk_info *iqk_info = &dm->IQK_info;
287
u8 path = 0, delay_count = 0, cal_retry = 0, idx;
288
boolean notready = true, fail = true;
289
u32 IQK_CMD = 0x0;
290
u16 iqk_apply[4] = {0xc94, 0xe94, 0x1894, 0x1a94};
291
292
for (idx = 0; idx <= 1; idx++) { /* ii = 0:TXK, 1: RXK */
293
294
if (idx == TX_IQK) {
295
RF_DBG(dm, DBG_RF_IQK,
296
"============ WBTXIQK ============\n");
297
} else if (idx == RX_IQK) {
298
RF_DBG(dm, DBG_RF_IQK,
299
"============ WBRXIQK ============\n");
300
}
301
302
for (path = 0; path <= 3; path++) {
303
RF_DBG(dm, DBG_RF_IQK, "==========S%d IQK ==========\n",
304
path);
305
cal_retry = 0;
306
fail = true;
307
while (fail) {
308
odm_set_bb_reg(dm, R_0x9a4, BIT(21) | BIT(20), path);
309
if (idx == TX_IQK) {
310
IQK_CMD = (0xf8000001 | (*dm->band_width + 3) << 8 | (1 << (4 + path)));
311
312
RF_DBG(dm, DBG_RF_IQK, "TXK_Trigger = 0x%x\n", IQK_CMD);
313
/*{0xf8000311, 0xf8000321, 0xf8000341, 0xf8000381} ==> 20 WBTXK (CMD = 3)*/
314
/*{0xf8000411, 0xf8000421, 0xf8000441, 0xf8000481} ==> 40 WBTXK (CMD = 4)*/
315
/*{0xf8000511, 0xf8000521, 0xf8000541, 0xf8000581} ==> 80 WBTXK (CMD = 5)*/
316
} else if (idx == RX_IQK) {
317
if (*dm->band_type == ODM_BAND_2_4G) {
318
odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(11), 0x1);
319
odm_set_rf_reg(dm, (enum rf_path)path, RF_0x56, 0xfffff, 0x51ce1);
320
switch (path) {
321
case 0:
322
case 1:
323
odm_write_4byte(dm, 0xeb0, 0x54775477);
324
break;
325
case 2:
326
odm_write_4byte(dm, 0x18b4, 0x54775477);
327
break;
328
case 3:
329
odm_write_4byte(dm, 0x1abc, 0x75400000);
330
odm_write_4byte(dm, 0x1ab4, 0x77777777);
331
break;
332
}
333
}
334
IQK_CMD = (0xf8000001 | (9 - *dm->band_width) << 8 | (1 << (4 + path)));
335
RF_DBG(dm, DBG_RF_IQK, "TXK_Trigger = 0x%x\n", IQK_CMD);
336
/*{0xf8000911, 0xf8000921, 0xf8000941, 0xf8000981} ==> 20 WBRXK (CMD = 9)*/
337
/*{0xf8000811, 0xf8000821, 0xf8000841, 0xf8000881} ==> 40 WBRXK (CMD = 8)*/
338
/*{0xf8000711, 0xf8000721, 0xf8000741, 0xf8000781} ==> 80 WBRXK (CMD = 7)*/
339
}
340
341
odm_write_4byte(dm, 0x1b00, IQK_CMD);
342
ODM_delay_ms(WBIQK_delay);
343
344
delay_count = 0;
345
notready = true;
346
while (notready) {
347
notready = (boolean)odm_get_bb_reg(dm, R_0x1b00, BIT(0));
348
if (!notready) {
349
fail = (boolean)odm_get_bb_reg(dm, R_0x1b08, BIT(26));
350
break;
351
}
352
ODM_delay_ms(1);
353
delay_count++;
354
if (delay_count >= 20) {
355
RF_DBG(dm, DBG_RF_IQK, "S%d IQK timeout!!!\n", path);
356
_iqk_reset_nctl_8814a(dm);
357
break;
358
}
359
}
360
if (fail)
361
cal_retry++;
362
if (cal_retry > 3)
363
break;
364
}
365
RF_DBG(dm, DBG_RF_IQK, "S%d ==> 0x1b00 = 0x%x\n", path,
366
odm_read_4byte(dm, 0x1b00));
367
RF_DBG(dm, DBG_RF_IQK, "S%d ==> 0x1b08 = 0x%x\n", path,
368
odm_read_4byte(dm, 0x1b08));
369
RF_DBG(dm, DBG_RF_IQK,
370
"S%d ==> delay_count = 0x%x, cal_retry = %x\n",
371
path, delay_count, cal_retry);
372
373
odm_write_4byte(dm, 0x1b00, 0xf8000000 | (path << 1));
374
if (!fail) {
375
if (idx == TX_IQK)
376
iqk_info->iqc_matrix[idx][path] = odm_read_4byte(dm, 0x1b38);
377
else if (idx == RX_IQK) {
378
odm_write_4byte(dm, 0x1b3c, 0x20000000);
379
iqk_info->iqc_matrix[idx][path] = odm_read_4byte(dm, 0x1b3c);
380
}
381
RF_DBG(dm, DBG_RF_IQK, "S%d_IQC = 0x%x\n", path,
382
iqk_info->iqc_matrix[idx][path]);
383
}
384
385
if (idx == RX_IQK) {
386
if (iqk_info->iqk_fail[TX_IQK][path] == false) /* TXIQK success in RXIQK */
387
odm_write_4byte(dm, 0x1b38, iqk_info->iqc_matrix[TX_IQK][path]);
388
else
389
odm_set_bb_reg(dm, iqk_apply[path], BIT(0), 0x0);
390
391
if (fail)
392
odm_set_bb_reg(dm, iqk_apply[path], (BIT(11) | BIT(10)), 0x0);
393
394
if (*dm->band_type == ODM_BAND_2_4G)
395
odm_set_rf_reg(dm, (enum rf_path)path, RF_0xdf, BIT(11), 0x0);
396
}
397
398
iqk_info->iqk_fail[idx][path] = fail;
399
}
400
RF_DBG(dm, DBG_RF_IQK,
401
"IQK0_fail = %d, IQK1_fail = %d, IQK2_fail = %d, IQK3_fail = %d\n",
402
iqk_info->iqk_fail[idx][0], iqk_info->iqk_fail[idx][1],
403
iqk_info->iqk_fail[idx][2], iqk_info->iqk_fail[idx][3]);
404
}
405
}
406
407
void _iqk_tx_8814a(struct dm_struct *dm, u8 chnl_idx)
408
{
409
RF_DBG(dm, DBG_RF_IQK, "band_width = %d, ExtPA2G = %d\n",
410
*dm->band_width, dm->ext_pa);
411
RF_DBG(dm, DBG_RF_IQK, "Interface = %d, band_type = %d\n",
412
dm->support_interface, *dm->band_type);
413
RF_DBG(dm, DBG_RF_IQK, "cut_version = %x\n", dm->cut_version);
414
415
odm_set_rf_reg(dm, RF_PATH_A, RF_0x58, BIT(19), 0x1);
416
odm_set_rf_reg(dm, RF_PATH_B, RF_0x58, BIT(19), 0x1);
417
odm_set_rf_reg(dm, RF_PATH_C, RF_0x58, BIT(19), 0x1);
418
odm_set_rf_reg(dm, RF_PATH_D, RF_0x58, BIT(19), 0x1);
419
420
odm_set_bb_reg(dm, R_0xc94, (BIT(11) | BIT(10) | BIT(0)), 0x401);
421
odm_set_bb_reg(dm, R_0xe94, (BIT(11) | BIT(10) | BIT(0)), 0x401);
422
odm_set_bb_reg(dm, R_0x1894, (BIT(11) | BIT(10) | BIT(0)), 0x401);
423
odm_set_bb_reg(dm, R_0x1a94, (BIT(11) | BIT(10) | BIT(0)), 0x401);
424
425
if (*dm->band_type == ODM_BAND_5G)
426
odm_write_4byte(dm, 0x1b00, 0xf8000ff1);
427
else
428
odm_write_4byte(dm, 0x1b00, 0xf8000ef1);
429
430
ODM_delay_ms(1);
431
432
odm_write_4byte(dm, 0x810, 0x20101063);
433
odm_write_4byte(dm, 0x90c, 0x0B00C000);
434
435
_lok_one_shot(dm);
436
_iqk_one_shot(dm);
437
}
438
439
void phy_iq_calibrate_8814a_init(void *dm_void)
440
{
441
struct dm_struct *dm = (struct dm_struct *)dm_void;
442
struct dm_iqk_info *iqk_info = &dm->IQK_info;
443
u8 ii, jj;
444
static boolean firstrun = true;
445
if (firstrun) {
446
firstrun = false;
447
RF_DBG(dm, DBG_RF_IQK, "=====>%s\n", __func__);
448
for (jj = 0; jj < 2; jj++) {
449
for (ii = 0; ii < NUM; ii++) {
450
iqk_info->lok_fail[ii] = true;
451
iqk_info->iqk_fail[jj][ii] = true;
452
iqk_info->iqc_matrix[jj][ii] = 0x20000000;
453
}
454
}
455
}
456
}
457
458
void _phy_iq_calibrate_8814a(struct dm_struct *dm, u8 channel)
459
{
460
struct dm_iqk_info *iqk_info = &dm->IQK_info;
461
u32 MAC_backup[MAC_REG_NUM_8814], BB_backup[BB_REG_NUM_8814], RF_backup[RF_REG_NUM_8814][4];
462
u32 backup_mac_reg[MAC_REG_NUM_8814] = {0x520, 0x550};
463
u32 backup_bb_reg[BB_REG_NUM_8814] = {0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0,
464
0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc, 0x910};
465
u32 backup_rf_reg[RF_REG_NUM_8814] = {0x0};
466
u8 chnl_idx = odm_get_right_chnl_place_for_iqk(channel);
467
468
iqk_info->iqk_times++;
469
470
_iqk_backup_mac_bb_8814a(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg);
471
_iqk_afe_setting_8814a(dm, true);
472
_iqk_backup_rf_8814a(dm, RF_backup, backup_rf_reg);
473
_iqk_configure_mac_8814a(dm);
474
_iqk_tx_8814a(dm, chnl_idx);
475
_iqk_reset_nctl_8814a(dm); /* for 3-wire to BB use */
476
_iqk_afe_setting_8814a(dm, false);
477
_iqk_restore_mac_bb_8814a(dm, MAC_backup, BB_backup, backup_mac_reg, backup_bb_reg);
478
_iqk_restore_rf_8814a(dm, backup_rf_reg, RF_backup);
479
}
480
481
/*IQK version:0xf*/
482
/*do not bypass path A IQK result*/
483
void phy_iq_calibrate_8814a(void *dm_void, boolean is_recovery)
484
{
485
struct dm_struct *dm = (struct dm_struct *)dm_void;
486
struct _hal_rf_ *rf = &(dm->rf_table);
487
488
phy_iq_calibrate_8814a_init(dm);
489
_phy_iq_calibrate_8814a(dm, *dm->channel);
490
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
491
_iqk_iqk_fail_report_8814a(dm);
492
#endif
493
}
494
495
#endif
496
497