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 /*@===========================================================
17 * include files
18 *============================================================
19 */
20 #include "mp_precomp.h"
21 #include "phydm_precomp.h"
22
_sqrt(u64 x)23 u64 _sqrt(u64 x)
24 {
25 u64 i = 0;
26 u64 j = (x >> 1) + 1;
27
28 while (i <= j) {
29 u64 mid = (i + j) >> 1;
30
31 u64 sq = mid * mid;
32
33 if (sq == x)
34 return mid;
35 else if (sq < x)
36 i = mid + 1;
37 else
38 j = mid - 1;
39 }
40
41 return j;
42 }
43
halrf_get_psd_data(struct dm_struct * dm,u32 point)44 u32 halrf_get_psd_data(
45 struct dm_struct *dm,
46 u32 point)
47 {
48 struct _hal_rf_ *rf = &(dm->rf_table);
49 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
50 u32 psd_val = 0, psd_reg, psd_report, psd_point, psd_start, i, delay_time = 0;
51
52 #if (DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)
53 if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO) {
54 if (psd->average == 0)
55 delay_time = 100;
56 else
57 delay_time = 0;
58 }
59 #endif
60 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
61 if (dm->support_interface == ODM_ITRF_PCIE) {
62 if (psd->average == 0)
63 delay_time = 1000;
64 else
65 delay_time = 100;
66 }
67 #endif
68
69 if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C)) {
70 psd_reg = R_0x910;
71 psd_report = R_0xf44;
72 } else {
73 psd_reg = R_0x808;
74 psd_report = R_0x8b4;
75 }
76
77 if (dm->support_ic_type & ODM_RTL8710B) {
78 psd_point = 0xeffffc00;
79 psd_start = 0x10000000;
80 } else {
81 psd_point = 0xffbffc00;
82 psd_start = 0x00400000;
83 }
84
85 psd_val = odm_get_bb_reg(dm, psd_reg, MASKDWORD);
86
87 psd_val &= psd_point;
88 psd_val |= point;
89
90 odm_set_bb_reg(dm, psd_reg, MASKDWORD, psd_val);
91
92 psd_val |= psd_start;
93
94 odm_set_bb_reg(dm, psd_reg, MASKDWORD, psd_val);
95
96 for (i = 0; i < delay_time; i++)
97 ODM_delay_us(1);
98
99 psd_val = odm_get_bb_reg(dm, psd_report, MASKDWORD);
100
101 if (dm->support_ic_type & (ODM_RTL8821C | ODM_RTL8710B)) {
102 psd_val &= MASKL3BYTES;
103 psd_val = psd_val / 32;
104 } else {
105 psd_val &= MASKLWORD;
106 }
107
108 return psd_val;
109 }
110
halrf_psd(struct dm_struct * dm,u32 point,u32 start_point,u32 stop_point,u32 average)111 void halrf_psd(
112 struct dm_struct *dm,
113 u32 point,
114 u32 start_point,
115 u32 stop_point,
116 u32 average)
117 {
118 struct _hal_rf_ *rf = &(dm->rf_table);
119 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
120
121 u32 i = 0, j = 0, k = 0;
122 u32 psd_reg, avg_org, point_temp, average_tmp, mode;
123 u64 data_tatal = 0, data_temp[64] = {0};
124
125 psd->buf_size = 256;
126
127 mode = average >> 16;
128
129 if (mode == 2)
130 average_tmp = 1;
131 else
132 average_tmp = average & 0xffff;
133
134 if (dm->support_ic_type & (ODM_RTL8812 | ODM_RTL8821 | ODM_RTL8814A | ODM_RTL8822B | ODM_RTL8821C))
135 psd_reg = R_0x910;
136 else
137 psd_reg = R_0x808;
138
139 #if 0
140 dbg_print("[PSD]point=%d, start_point=%d, stop_point=%d, average=%d, average_tmp=%d, buf_size=%d\n",
141 point, start_point, stop_point, average, average_tmp, psd->buf_size);
142 #endif
143
144 for (i = 0; i < psd->buf_size; i++)
145 psd->psd_data[i] = 0;
146
147 if (dm->support_ic_type & ODM_RTL8710B)
148 avg_org = odm_get_bb_reg(dm, psd_reg, 0x30000);
149 else
150 avg_org = odm_get_bb_reg(dm, psd_reg, 0x3000);
151
152 if (mode == 1) {
153 if (dm->support_ic_type & ODM_RTL8710B)
154 odm_set_bb_reg(dm, psd_reg, 0x30000, 0x1);
155 else
156 odm_set_bb_reg(dm, psd_reg, 0x3000, 0x1);
157 }
158
159 #if 0
160 if (avg_temp == 0)
161 avg = 1;
162 else if (avg_temp == 1)
163 avg = 8;
164 else if (avg_temp == 2)
165 avg = 16;
166 else if (avg_temp == 3)
167 avg = 32;
168 #endif
169
170 i = start_point;
171 while (i < stop_point) {
172 data_tatal = 0;
173
174 if (i >= point)
175 point_temp = i - point;
176 else
177 point_temp = i;
178
179 for (k = 0; k < average_tmp; k++) {
180 data_temp[k] = halrf_get_psd_data(dm, point_temp);
181 data_tatal = data_tatal + (data_temp[k] * data_temp[k]);
182
183 #if 0
184 if ((k % 20) == 0)
185 dbg_print("\n ");
186
187 dbg_print("0x%x ", data_temp[k]);
188 #endif
189 }
190 #if 0
191 /*dbg_print("\n");*/
192 #endif
193
194 data_tatal = phydm_division64((data_tatal * 100), average_tmp);
195 psd->psd_data[j] = (u32)_sqrt(data_tatal);
196
197 i++;
198 j++;
199 }
200
201 #if 0
202 for (i = 0; i < psd->buf_size; i++) {
203 if ((i % 20) == 0)
204 dbg_print("\n ");
205
206 dbg_print("0x%x ", psd->psd_data[i]);
207 }
208 dbg_print("\n\n");
209 #endif
210
211 if (dm->support_ic_type & ODM_RTL8710B)
212 odm_set_bb_reg(dm, psd_reg, 0x30000, avg_org);
213 else
214 odm_set_bb_reg(dm, psd_reg, 0x3000, avg_org);
215 }
216
backup_bb_register(struct dm_struct * dm,u32 * bb_backup,u32 * backup_bb_reg,u32 counter)217 void backup_bb_register(struct dm_struct *dm, u32 *bb_backup, u32 *backup_bb_reg, u32 counter)
218 {
219 u32 i ;
220
221 for (i = 0; i < counter; i++)
222 bb_backup[i] = odm_get_bb_reg(dm, backup_bb_reg[i], MASKDWORD);
223 }
224
restore_bb_register(struct dm_struct * dm,u32 * bb_backup,u32 * backup_bb_reg,u32 counter)225 void restore_bb_register(struct dm_struct *dm, u32 *bb_backup, u32 *backup_bb_reg, u32 counter)
226 {
227 u32 i ;
228
229 for (i = 0; i < counter; i++)
230 odm_set_bb_reg(dm, backup_bb_reg[i], MASKDWORD, bb_backup[i]);
231 }
232
233
234
_halrf_psd_iqk_init(struct dm_struct * dm)235 void _halrf_psd_iqk_init(struct dm_struct *dm)
236 {
237 odm_set_bb_reg(dm, 0x1b04, MASKDWORD, 0x0);
238 odm_set_bb_reg(dm, 0x1b08, MASKDWORD, 0x80);
239 odm_set_bb_reg(dm, 0x1b0c, 0xc00, 0x3);
240 odm_set_bb_reg(dm, 0x1b14, MASKDWORD, 0x0);
241 odm_set_bb_reg(dm, 0x1b18, BIT(0), 0x1);
242
243 if (dm->support_ic_type & ODM_RTL8197G)
244 odm_set_bb_reg(dm, 0x1b20, MASKDWORD, 0x00040008);
245 if (dm->support_ic_type & ODM_RTL8198F)
246 odm_set_bb_reg(dm, 0x1b20, MASKDWORD, 0x00000000);
247
248 if (dm->support_ic_type & (ODM_RTL8197G | ODM_RTL8198F)) {
249 odm_set_bb_reg(dm, 0x1b24, MASKDWORD, 0x00030000);
250 odm_set_bb_reg(dm, 0x1b28, MASKDWORD, 0x00000000);
251 odm_set_bb_reg(dm, 0x1b2c, MASKDWORD, 0x00180018);
252 odm_set_bb_reg(dm, 0x1b30, MASKDWORD, 0x20000000);
253 /*odm_set_bb_reg(dm, 0x1b38, MASKDWORD, 0x20000000);*/
254 /*odm_set_bb_reg(dm, 0x1b3c, MASKDWORD, 0x20000000);*/
255 }
256
257 odm_set_bb_reg(dm, 0x1b1c, 0xfff, 0xd21);
258 odm_set_bb_reg(dm, 0x1b1c, 0xfff00000, 0x821);
259 odm_set_bb_reg(dm, 0x1b28, MASKDWORD, 0x0);
260 odm_set_bb_reg(dm, 0x1bcc, 0x3f, 0x3f);
261 }
262
_halrf_iqk_psd_init_8723f(void * dm_void,boolean onoff)263 void _halrf_iqk_psd_init_8723f(void *dm_void, boolean onoff)
264 {
265 struct dm_struct *dm = (struct dm_struct *)dm_void;
266 u8 s;
267
268 s = (u8)odm_get_bb_reg(dm, 0x1884, BIT(20));
269
270 if (onoff) {
271 /*01_8723F_AFE_ON_BB_settings.txt*/
272 odm_set_bb_reg(dm, 0x1c38, MASKDWORD, 0x0);
273 odm_set_bb_reg(dm, R_0x1830, BIT(30), 0x0);
274 odm_set_bb_reg(dm, R_0x1860, 0xF0000000, 0xf);
275 odm_set_bb_reg(dm, R_0x1860, 0x0FFFF000, 0x0041);
276 odm_set_bb_reg(dm, 0x09f0, 0x0000FFFF, 0xbbbb);
277 odm_set_bb_reg(dm, 0x1d40, BIT(3), 0x1);
278 odm_set_bb_reg(dm, 0x1d40, 0x00000007, 0x3);
279 odm_set_bb_reg(dm, 0x09b4, 0x00000700, 0x3);
280 odm_set_bb_reg(dm, 0x09b4, 0x00003800, 0x3);
281 odm_set_bb_reg(dm, 0x09b4, 0x0001C000, 0x3);
282 odm_set_bb_reg(dm, 0x09b4, 0x000E0000, 0x3);
283 odm_set_bb_reg(dm, R_0x1c20, BIT(5), 0x1);
284 odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0x0);
285 odm_set_bb_reg(dm, R_0x1e28, 0x0000000F, 0x1);
286 odm_set_bb_reg(dm, R_0x824, 0x000F0000, 0x1);
287 odm_set_bb_reg(dm, R_0x1cd0, 0xF0000000, 0x7);
288 odm_set_bb_reg(dm, R_0x2a24, BIT(13), 0x1);
289 odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x1);
290 odm_set_bb_reg(dm, R_0x1864, BIT(31), 0x1);
291 odm_set_bb_reg(dm, R_0x180c, BIT(27), 0x1);
292 odm_set_bb_reg(dm, R_0x180c, BIT(30), 0x1);
293 odm_set_bb_reg(dm, R_0x1e24, BIT(17), 0x1);
294 odm_set_bb_reg(dm, R_0x1880, BIT(21), 0x0);
295 odm_set_bb_reg(dm, R_0x1c38, MASKDWORD, 0xffffffff);
296 /*02_IQK_Preset.txt*/
297 //odm_set_rf_reg(dm, RF_PATH_A, 0x05, BIT(0), 0x0);
298 //odm_set_rf_reg(dm, RF_PATH_B, 0x05, BIT(0), 0x0);
299 odm_set_bb_reg(dm, R_0x1b08, MASKDWORD, 0x00000080);
300 //odm_set_bb_reg(dm, R_0x1bd8, MASKDWORD, 0x00000002);
301 //switch path 10 od 0x1b38 0x1/0x3 [1:0]
302 if (s == 0)
303 odm_set_bb_reg(dm, R_0x1b00, MASKDWORD, 0x00000008);
304 else
305 odm_set_bb_reg(dm, R_0x1b00, MASKDWORD, 0x0000000a);
306
307 odm_set_bb_reg(dm, R_0x1b18, MASKDWORD, 0x40010101);
308 odm_set_bb_reg(dm, R_0x1b14, MASKDWORD, 0x40010100);
309 //odm_set_bb_reg(dm, R_0x1b1c, MASKDWORD, 0xA2103C00);
310 odm_set_bb_reg(dm, R_0x1b0c, 0x00000C00, 0x2);
311 odm_set_bb_reg(dm, R_0x1bcc, 0x0000003F, 0x3f);
312 //DbgPrint("[PSD][8723F]iqkpsd init!\n");
313 } else {
314 /*10_IQK_Reg_PSD_Restore.txt*/
315 //odm_set_bb_reg(dm, R_0x1b1c, MASKDWORD, 0xA2103C00);
316 odm_set_bb_reg(dm, R_0x1b08, MASKDWORD, 0x00000000);
317 odm_set_bb_reg(dm, R_0x1b38, BIT(0), 0x0);
318 odm_set_bb_reg(dm, R_0x1bcc, 0x0000003F, 0x0);
319 //odm_set_rf_reg(dm, RF_PATH_A, 0x05, BIT(0), 0x1);
320 //odm_set_rf_reg(dm, RF_PATH_B, 0x05, BIT(0), 0x1);
321 /*11_8723F_restore_AFE_BB_settings.txt*/
322 odm_set_bb_reg(dm, 0x1c38, MASKDWORD, 0x0);
323 odm_set_bb_reg(dm, R_0x1830, BIT(30), 0x1);
324 odm_set_bb_reg(dm, R_0x1e24, BIT(31), 0x1);
325 odm_set_bb_reg(dm, R_0x2a24, BIT(13), 0x0);
326 odm_set_bb_reg(dm, R_0x1c68, BIT(24), 0x0);
327 odm_set_bb_reg(dm, R_0x1864, BIT(31), 0x0);
328 odm_set_bb_reg(dm, R_0x180c, BIT(27), 0x0);
329 odm_set_bb_reg(dm, R_0x180c, BIT(30), 0x0);
330 odm_set_bb_reg(dm, R_0x1880, BIT(21), 0x0);
331 odm_set_bb_reg(dm, R_0x1c38, MASKDWORD, 0xffa1005e);
332 //DbgPrint("[PSD][8723F]iqkpsd resotre!\n");
333 }
334 }
335
halrf_get_iqk_psd_data(void * dm_void,u32 point)336 u64 halrf_get_iqk_psd_data(void *dm_void, u32 point)
337 {
338 struct dm_struct *dm = (struct dm_struct *)dm_void;
339 struct _hal_rf_ *rf = &(dm->rf_table);
340 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
341 u64 psd_val, psd_val1, psd_val2;
342 u32 psd_point, i, delay_time = 0;
343
344 #if (DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)
345 if (dm->support_interface == ODM_ITRF_USB || dm->support_interface == ODM_ITRF_SDIO) {
346 if (dm->support_ic_type & ODM_RTL8822C)
347 delay_time = 1000;
348 else if (dm->support_ic_type & ODM_RTL8723F)
349 delay_time = 1000;
350 else
351 delay_time = 0;
352 }
353 #endif
354 #if (DEV_BUS_TYPE == RT_PCI_INTERFACE)
355 if (dm->support_interface == ODM_ITRF_PCIE) {
356 if (dm->support_ic_type & ODM_RTL8822C)
357 delay_time = 1000;
358 else
359 delay_time = 150;
360 }
361 #endif
362 psd_point = odm_get_bb_reg(dm, R_0x1b2c, MASKDWORD);
363
364 psd_point &= 0xF000FFFF;
365
366 point &= 0xFFF;
367
368 psd_point = psd_point | (point << 16);
369
370 odm_set_bb_reg(dm, R_0x1b2c, MASKDWORD, psd_point);
371
372 odm_set_bb_reg(dm, R_0x1b34, BIT(0), 0x1);
373
374 odm_set_bb_reg(dm, R_0x1b34, BIT(0), 0x0);
375
376 for (i = 0; i < delay_time; i++)
377 ODM_delay_us(1);
378
379 if (dm->support_ic_type & (ODM_RTL8197G | ODM_RTL8198F)) {
380 if (dm->support_ic_type & ODM_RTL8197G)
381 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x001a0001);
382 else
383 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x00250001);
384
385 psd_val1 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
386
387 psd_val1 = (psd_val1 & 0x001f0000) >> 16;
388
389 if (dm->support_ic_type & ODM_RTL8197G)
390 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x001b0001);
391 else
392 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x002e0001);
393
394 psd_val2 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
395
396 psd_val = (psd_val1 << 27) + (psd_val2 >> 5);
397 } else if (dm->support_ic_type & ODM_RTL8723F) {
398 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x00210001);
399 psd_val1 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
400 psd_val1 = (psd_val1 & 0x00FF0000) >> 16;
401 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x00220001);
402 psd_val2 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
403 //psd_val = (psd_val1 << 27) + (psd_val2 >> 5);
404 psd_val = (psd_val1 << 32) + psd_val2;
405 } else {
406 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x00250001);
407
408 psd_val1 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
409
410 psd_val1 = (psd_val1 & 0x07FF0000) >> 16;
411
412 odm_set_bb_reg(dm, R_0x1bd4, MASKDWORD, 0x002e0001);
413
414 psd_val2 = odm_get_bb_reg(dm, R_0x1bfc, MASKDWORD);
415
416 psd_val = (psd_val1 << 21) + (psd_val2 >> 11);
417 }
418
419 return psd_val;
420 }
421
halrf_iqk_psd(struct dm_struct * dm,u32 point,u32 start_point,u32 stop_point,u32 average)422 void halrf_iqk_psd(
423 struct dm_struct *dm,
424 u32 point,
425 u32 start_point,
426 u32 stop_point,
427 u32 average)
428 {
429 struct _hal_rf_ *rf = &(dm->rf_table);
430 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
431
432 u32 i = 0, j = 0, k = 0;
433 u32 psd_reg, avg_org, point_temp, average_tmp = 32, mode, reg_tmp = 5;
434 u64 data_tatal = 0, data_temp[64] = {0};
435 s32 s_point_tmp;
436
437 psd->buf_size = 256;
438
439 mode = average >> 16;
440
441 if (mode == 2) {
442 if (dm->support_ic_type & (ODM_RTL8822C | ODM_RTL8723F))
443 average_tmp = 1; //HW average
444 else {
445 reg_tmp = odm_get_bb_reg(dm, R_0x1b1c, 0x000e0000);
446 if (reg_tmp == 0)
447 average_tmp = 1;
448 else if (reg_tmp == 3)
449 average_tmp = 8;
450 else if (reg_tmp == 4)
451 average_tmp = 16;
452 else if (reg_tmp == 5)
453 average_tmp = 32;
454 odm_set_bb_reg(dm, R_0x1b1c, 0x000e0000, 0x0);
455 }
456 } else {
457 reg_tmp = odm_get_bb_reg(dm, R_0x1b1c, 0x000e0000);
458 if (reg_tmp == 0)
459 average_tmp = 1;
460 else if (reg_tmp == 3)
461 average_tmp = 8;
462 else if (reg_tmp == 4)
463 average_tmp = 16;
464 else if (reg_tmp == 5)
465 average_tmp = 32;
466 #ifndef RTL8723F_SUPPORT
467 odm_set_bb_reg(dm, R_0x1b1c, 0x000e0000, 0x0);
468 #endif
469 }
470
471 #if 0
472 DbgPrint("[PSD]point=%d, start_point=%d, stop_point=%d, average=0x%x, average_tmp=%d, buf_size=%d, mode=%d\n",
473 point, start_point, stop_point, average, average_tmp, psd->buf_size, mode);
474 #endif
475
476 for (i = 0; i < psd->buf_size; i++)
477 psd->psd_data[i] = 0;
478
479 i = start_point;
480
481 #ifndef RTL8723F_SUPPORT
482 while (i < stop_point) {
483 data_tatal = 0;
484
485 if (i >= point)
486 point_temp = i - point;
487 else
488 {
489 if (dm->support_ic_type & ODM_RTL8814B)
490 {
491 s_point_tmp = i - point - 1;
492 point_temp = s_point_tmp & 0xfff;
493 }
494 else
495 point_temp = i;
496 }
497
498 for (k = 0; k < average_tmp; k++) {
499 data_temp[k] = halrf_get_iqk_psd_data(dm, point_temp);
500 /*data_tatal = data_tatal + (data_temp[k] * data_temp[k]);*/
501 data_tatal = data_tatal + data_temp[k];
502
503 #if 0
504 if ((k % 20) == 0)
505 DbgPrint("\n ");
506
507 DbgPrint("0x%x ", data_temp[k]);
508 #endif
509 }
510
511 data_tatal = phydm_division64((data_tatal * 10), average_tmp);
512 psd->psd_data[j] = (u32)data_tatal;
513
514 i++;
515 j++;
516 }
517
518 if (dm->support_ic_type & (ODM_RTL8814B | ODM_RTL8198F | ODM_RTL8197G))
519 odm_set_bb_reg(dm, R_0x1b1c, 0x000e0000, reg_tmp);
520 #else
521 while (i < stop_point) {
522 data_tatal = 0;
523
524 if (i >= point)
525 point_temp = i - point;
526 else
527 point_temp = i + 0xB00;
528 //-640:0xD80,640:0x280,0x280+0xB00 =0xD80
529 //point_temp = i + 0xC00;
530 //-512:0xE00,512:0x200,0x200+0xC00 = 0xE00
531
532 data_temp[k] = halrf_get_iqk_psd_data(dm, point_temp);
533 data_tatal = data_temp[k];
534 psd->psd_data[j] = (u32)data_tatal;
535 i++;
536 j++;
537 }
538
539 #endif
540 #if 0
541 DbgPrint("\n [iqk psd]psd result:\n");
542
543 for (i = 0; i < psd->buf_size; i++) {
544 if ((i % 20) == 0)
545 DbgPrint("\n ");
546
547 DbgPrint("0x%x ", psd->psd_data[i]);
548 }
549 DbgPrint("\n\n");
550 #endif
551 }
552
553
554 u32
halrf_psd_init(void * dm_void)555 halrf_psd_init(
556 void *dm_void)
557 {
558 enum rt_status ret_status = RT_STATUS_SUCCESS;
559 struct dm_struct *dm = (struct dm_struct *)dm_void;
560 struct _hal_rf_ *rf = &(dm->rf_table);
561 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
562 #ifndef RTL8723F_SUPPORT
563 #if 0
564 u32 bb_backup[12];
565 u32 backup_bb_reg[12] = {0x1b04, 0x1b08, 0x1b0c, 0x1b14, 0x1b18,
566 0x1b1c, 0x1b28, 0x1bcc, 0x1b2c, 0x1b34,
567 0x1bd4, 0x1bfc};
568 #endif
569 #else
570 u32 bb_backup[11];
571 u32 backup_bb_reg[11] = {0x09f0, 0x09b4, 0x1c38, 0x1860, 0x1cd0,
572 0x824, 0x2a24, 0x1d40, 0x1c20, 0x1880, 0x180c};
573 #endif
574 if (psd->psd_progress) {
575 ret_status = RT_STATUS_PENDING;
576 } else {
577 psd->psd_progress = 1;
578 if (dm->support_ic_type & ODM_RTL8723F) {
579 backup_bb_register(dm, bb_backup, backup_bb_reg, 11);
580 _halrf_iqk_psd_init_8723f(dm, true);
581 halrf_iqk_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
582 _halrf_iqk_psd_init_8723f(dm, false);
583 restore_bb_register(dm, bb_backup, backup_bb_reg, 11);
584 } else if (dm->support_ic_type &
585 (ODM_RTL8822C | ODM_RTL8814B | ODM_RTL8198F | ODM_RTL8197G)) {
586 /*backup_bb_register(dm, bb_backup, backup_bb_reg, 12);*/
587 _halrf_psd_iqk_init(dm);
588 halrf_iqk_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
589 /*restore_bb_register(dm, bb_backup, backup_bb_reg, 12);*/
590 } else
591 halrf_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
592 psd->psd_progress = 0;
593 }
594 return ret_status;
595 }
596
597 u32
halrf_psd_query(void * dm_void,u32 * outbuf,u32 buf_size)598 halrf_psd_query(
599 void *dm_void,
600 u32 *outbuf,
601 u32 buf_size)
602 {
603 enum rt_status ret_status = RT_STATUS_SUCCESS;
604 struct dm_struct *dm = (struct dm_struct *)dm_void;
605 struct _hal_rf_ *rf = &(dm->rf_table);
606 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
607
608 if (psd->psd_progress)
609 ret_status = RT_STATUS_PENDING;
610 else
611 odm_move_memory(dm, outbuf, psd->psd_data,
612 sizeof(u32) * psd->buf_size);
613
614 return ret_status;
615 }
616
617 u32
halrf_psd_init_query(void * dm_void,u32 * outbuf,u32 point,u32 start_point,u32 stop_point,u32 average,u32 buf_size)618 halrf_psd_init_query(
619 void *dm_void,
620 u32 *outbuf,
621 u32 point,
622 u32 start_point,
623 u32 stop_point,
624 u32 average,
625 u32 buf_size)
626 {
627 enum rt_status ret_status = RT_STATUS_SUCCESS;
628 struct dm_struct *dm = (struct dm_struct *)dm_void;
629 struct _hal_rf_ *rf = &(dm->rf_table);
630 struct _halrf_psd_data *psd = &(rf->halrf_psd_data);
631
632 psd->point = point;
633 psd->start_point = start_point;
634 psd->stop_point = stop_point;
635 psd->average = average;
636
637 if (psd->psd_progress) {
638 ret_status = RT_STATUS_PENDING;
639 } else {
640 psd->psd_progress = 1;
641 halrf_psd(dm, psd->point, psd->start_point, psd->stop_point, psd->average);
642 odm_move_memory(dm, outbuf, psd->psd_data, 0x400);
643 psd->psd_progress = 0;
644 }
645
646 return ret_status;
647 }
648