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 /*Image2HeaderVersion: 3.5.2*/
17 #include "mp_precomp.h"
18 #include "../phydm_precomp.h"
19
20 #if (RTL8188F_SUPPORT == 1)
21 static boolean
check_positive(struct dm_struct * dm,const u32 condition1,const u32 condition2,const u32 condition3,const u32 condition4)22 check_positive(
23 struct dm_struct *dm,
24 const u32 condition1,
25 const u32 condition2,
26 const u32 condition3,
27 const u32 condition4
28 )
29 {
30 u8 _board_type = ((dm->board_type & BIT(4)) >> 4) << 0 | /* _GLNA*/
31 ((dm->board_type & BIT(3)) >> 3) << 1 | /* _GPA*/
32 ((dm->board_type & BIT(7)) >> 7) << 2 | /* _ALNA*/
33 ((dm->board_type & BIT(6)) >> 6) << 3 | /* _APA */
34 ((dm->board_type & BIT(2)) >> 2) << 4 | /* _BT*/
35 ((dm->board_type & BIT(1)) >> 1) << 5 | /* _NGFF*/
36 ((dm->board_type & BIT(5)) >> 5) << 6; /* _TRSWT*/
37
38 u32 cond1 = condition1, cond2 = condition2, cond3 = condition3, cond4 = condition4;
39
40 u8 cut_version_for_para = (dm->cut_version == ODM_CUT_A) ? 15 : dm->cut_version;
41 u8 pkg_type_for_para = (dm->package_type == 0) ? 15 : dm->package_type;
42
43 u32 driver1 = cut_version_for_para << 24 |
44 (dm->support_interface & 0xF0) << 16 |
45 dm->support_platform << 16 |
46 pkg_type_for_para << 12 |
47 (dm->support_interface & 0x0F) << 8 |
48 _board_type;
49
50 u32 driver2 = (dm->type_glna & 0xFF) << 0 |
51 (dm->type_gpa & 0xFF) << 8 |
52 (dm->type_alna & 0xFF) << 16 |
53 (dm->type_apa & 0xFF) << 24;
54
55 u32 driver3 = 0;
56
57 u32 driver4 = (dm->type_glna & 0xFF00) >> 8 |
58 (dm->type_gpa & 0xFF00) |
59 (dm->type_alna & 0xFF00) << 8 |
60 (dm->type_apa & 0xFF00) << 16;
61
62 PHYDM_DBG(dm, ODM_COMP_INIT,
63 "===> %s (cond1, cond2, cond3, cond4) = (0x%X 0x%X 0x%X 0x%X)\n",
64 __func__, cond1, cond2, cond3, cond4);
65 PHYDM_DBG(dm, ODM_COMP_INIT,
66 "===> %s (driver1, driver2, driver3, driver4) = (0x%X 0x%X 0x%X 0x%X)\n",
67 __func__, driver1, driver2, driver3, driver4);
68
69 PHYDM_DBG(dm, ODM_COMP_INIT,
70 " (Platform, Interface) = (0x%X, 0x%X)\n",
71 dm->support_platform, dm->support_interface);
72 PHYDM_DBG(dm, ODM_COMP_INIT,
73 " (Board, Package) = (0x%X, 0x%X)\n", dm->board_type,
74 dm->package_type);
75
76
77 /*============== value Defined Check ===============*/
78 /*QFN type [15:12] and cut version [27:24] need to do value check*/
79
80 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
81 return false;
82 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
83 return false;
84
85 /*=============== Bit Defined Check ================*/
86 /* We don't care [31:28] */
87
88 cond1 &= 0x00FF0FFF;
89 driver1 &= 0x00FF0FFF;
90
91 if ((cond1 & driver1) == cond1) {
92 u32 bit_mask = 0;
93
94 if ((cond1 & 0x0F) == 0) /* board_type is DONTCARE*/
95 return true;
96
97 if ((cond1 & BIT(0)) != 0) /*GLNA*/
98 bit_mask |= 0x000000FF;
99 if ((cond1 & BIT(1)) != 0) /*GPA*/
100 bit_mask |= 0x0000FF00;
101 if ((cond1 & BIT(2)) != 0) /*ALNA*/
102 bit_mask |= 0x00FF0000;
103 if ((cond1 & BIT(3)) != 0) /*APA*/
104 bit_mask |= 0xFF000000;
105
106 if (((cond2 & bit_mask) == (driver2 & bit_mask)) && ((cond4 & bit_mask) == (driver4 & bit_mask))) /* board_type of each RF path is matched*/
107 return true;
108 else
109 return false;
110 } else
111 return false;
112 }
113
114 /******************************************************************************
115 * agc_tab.TXT
116 ******************************************************************************/
117
118 u32 array_mp_8188f_agc_tab[] = {
119 0xC78, 0xFC000001,
120 0xC78, 0xFB010001,
121 0xC78, 0xFA020001,
122 0xC78, 0xF9030001,
123 0xC78, 0xF8040001,
124 0xC78, 0xF7050001,
125 0xC78, 0xF6060001,
126 0xC78, 0xF5070001,
127 0xC78, 0xF4080001,
128 0xC78, 0xF3090001,
129 0xC78, 0xF20A0001,
130 0xC78, 0xF10B0001,
131 0xC78, 0xF00C0001,
132 0xC78, 0xEF0D0001,
133 0xC78, 0xEE0E0001,
134 0xC78, 0xED0F0001,
135 0xC78, 0xEC100001,
136 0xC78, 0xEB110001,
137 0xC78, 0xEA120001,
138 0xC78, 0xE9130001,
139 0xC78, 0xE8140001,
140 0xC78, 0xE7150001,
141 0xC78, 0xE6160001,
142 0xC78, 0xE5170001,
143 0xC78, 0xE4180001,
144 0xC78, 0xE3190001,
145 0xC78, 0xE21A0001,
146 0xC78, 0xE11B0001,
147 0xC78, 0xE01C0001,
148 0xC78, 0xC21D0001,
149 0xC78, 0xC11E0001,
150 0xC78, 0xC01F0001,
151 0xC78, 0xA5200001,
152 0xC78, 0xA4210001,
153 0xC78, 0xA3220001,
154 0xC78, 0xA2230001,
155 0xC78, 0xA1240001,
156 0xC78, 0xA0250001,
157 0xC78, 0x65260001,
158 0xC78, 0x64270001,
159 0xC78, 0x63280001,
160 0xC78, 0x62290001,
161 0xC78, 0x612A0001,
162 0xC78, 0x442B0001,
163 0xC78, 0x432C0001,
164 0xC78, 0x422D0001,
165 0xC78, 0x412E0001,
166 0xC78, 0x402F0001,
167 0xC78, 0x21300001,
168 0xC78, 0x20310001,
169 0xC78, 0x05320001,
170 0xC78, 0x04330001,
171 0xC78, 0x03340001,
172 0xC78, 0x02350001,
173 0xC78, 0x01360001,
174 0xC78, 0x00370001,
175 0xC78, 0x00380001,
176 0xC78, 0x00390001,
177 0xC78, 0x003A0001,
178 0xC78, 0x003B0001,
179 0xC78, 0x003C0001,
180 0xC78, 0x003D0001,
181 0xC78, 0x003E0001,
182 0xC78, 0x003F0001,
183 0xC50, 0x69553422,
184 0xC50, 0x69553420,
185
186 };
187
188 void
odm_read_and_config_mp_8188f_agc_tab(struct dm_struct * dm)189 odm_read_and_config_mp_8188f_agc_tab(struct dm_struct *dm)
190 {
191 u32 i = 0;
192 u8 c_cond;
193 boolean is_matched = true, is_skipped = false;
194 u32 array_len = sizeof(array_mp_8188f_agc_tab) / sizeof(u32);
195 u32 *array = array_mp_8188f_agc_tab;
196
197 u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;
198
199 PHYDM_DBG(dm, ODM_COMP_INIT, "===> %s\n", __func__);
200
201 while ((i + 1) < array_len) {
202 v1 = array[i];
203 v2 = array[i + 1];
204
205 if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
206 if (v1 & BIT(31)) {/* positive condition*/
207 c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
208 if (c_cond == COND_ENDIF) {/*end*/
209 is_matched = true;
210 is_skipped = false;
211 PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n");
212 } else if (c_cond == COND_ELSE) { /*else*/
213 is_matched = is_skipped ? false : true;
214 PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n");
215 } else {/*if , else if*/
216 pre_v1 = v1;
217 pre_v2 = v2;
218 PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n");
219 }
220 } else if (v1 & BIT(30)) { /*negative condition*/
221 if (is_skipped == false) {
222 if (check_positive(dm, pre_v1, pre_v2, v1, v2)) {
223 is_matched = true;
224 is_skipped = true;
225 } else {
226 is_matched = false;
227 is_skipped = false;
228 }
229 } else
230 is_matched = false;
231 }
232 } else {
233 if (is_matched)
234 odm_config_bb_agc_8188f(dm, v1, MASKDWORD, v2);
235 }
236 i = i + 2;
237 }
238 }
239
240 u32
odm_get_version_mp_8188f_agc_tab(void)241 odm_get_version_mp_8188f_agc_tab(void)
242 {
243 return 39;
244 }
245
246 /******************************************************************************
247 * phy_reg.TXT
248 ******************************************************************************/
249
250 u32 array_mp_8188f_phy_reg[] = {
251 0x800, 0x80045700,
252 0x804, 0x00000001,
253 0x808, 0x0000FC00,
254 0x80C, 0x0000000A,
255 0x810, 0x10001331,
256 0x814, 0x020C3D10,
257 0x818, 0x00200385,
258 0x81C, 0x00000000,
259 0x820, 0x01000100,
260 0x824, 0x00390204,
261 0x828, 0x00000000,
262 0x82C, 0x00000000,
263 0x830, 0x00000000,
264 0x834, 0x00000000,
265 0x838, 0x00000000,
266 0x83C, 0x00000000,
267 0x840, 0x00010000,
268 0x844, 0x00000000,
269 0x848, 0x00000000,
270 0x84C, 0x00000000,
271 0x850, 0x00030000,
272 0x854, 0x00000000,
273 0x858, 0x569A569A,
274 0x85C, 0x569A569A,
275 0x860, 0x00000130,
276 0x864, 0x00000000,
277 0x868, 0x00000000,
278 0x86C, 0x27272700,
279 0x870, 0x00000000,
280 0x874, 0x25004000,
281 0x878, 0x00000808,
282 0x87C, 0x004F0201,
283 0x880, 0xB0000B1E,
284 0x884, 0x00000007,
285 0x888, 0x00000000,
286 0x88C, 0xCCC000C0,
287 0x890, 0x00000800,
288 0x894, 0xFFFFFFFE,
289 0x898, 0x40302010,
290 0x89C, 0x00706050,
291 0x900, 0x00000000,
292 0x904, 0x00000023,
293 0x908, 0x00000000,
294 0x90C, 0x81121111,
295 0x910, 0x00000002,
296 0x914, 0x00000201,
297 0x948, 0x99000000,
298 0x94C, 0x00000010,
299 0x950, 0x20003000,
300 0x954, 0x4A880000,
301 0x958, 0x4BC5D87A,
302 0x95C, 0x04EB9B79,
303 0x96C, 0x00000003,
304 0xA00, 0x00D046C8,
305 0xA04, 0x80FF800C,
306 0x80000400, 0x00000000, 0x40000000, 0x00000000,
307 0xA08, 0x8C038300,
308 0xA0000000, 0x00000000,
309 0xA08, 0x8C898300,
310 0xB0000000, 0x00000000,
311 0xA0C, 0x2E7F120F,
312 0xA10, 0x9500BB78,
313 0xA14, 0x1114D028,
314 0xA18, 0x00881117,
315 0xA1C, 0x89140F00,
316 0xA20, 0xD1D80000,
317 0xA24, 0x5A7DA0BD,
318 0xA28, 0x0000223B,
319 0xA2C, 0x00D30000,
320 0xA70, 0x101FBF00,
321 0xA74, 0x00000007,
322 0x80000400, 0x00000000, 0x40000000, 0x00000000,
323 0xA78, 0x00008900,
324 0xA0000000, 0x00000000,
325 0xA78, 0x00000900,
326 0xB0000000, 0x00000000,
327 0xA7C, 0x225B0606,
328 0xA80, 0x218075B1,
329 0xA84, 0x00120000,
330 0xA88, 0x040C0000,
331 0xA8C, 0x12345678,
332 0xA90, 0xABCDEF00,
333 0xA94, 0x001B1B89,
334 0xA98, 0x05100000,
335 0xA9C, 0x3F000000,
336 0xAA0, 0x00000000,
337 0xB2C, 0x00000000,
338 0xC00, 0x48071D40,
339 0xC04, 0x03A05611,
340 0xC08, 0x000000E4,
341 0xC0C, 0x6C6C6C6C,
342 0xC10, 0x18800000,
343 0xC14, 0x40000100,
344 0xC18, 0x08800000,
345 0xC1C, 0x40000100,
346 0xC20, 0x00000000,
347 0xC24, 0x00000000,
348 0xC28, 0x00000000,
349 0xC2C, 0x00000000,
350 0xC30, 0x69E9CC4A,
351 0xC34, 0x31000040,
352 0xC38, 0x21688080,
353 0xC3C, 0x00001714,
354 0xC40, 0x1F78403F,
355 0xC44, 0x00010036,
356 0xC48, 0xEC020107,
357 0xC4C, 0x007F037F,
358 0xC50, 0x69553420,
359 0xC54, 0x43BC0094,
360 0xC58, 0x00013169,
361 0xC5C, 0x00250492,
362 0xC60, 0x00000000,
363 0xC64, 0x7112848B,
364 0xC68, 0x47C07BFF,
365 0xC6C, 0x00000036,
366 0xC70, 0x2C7F000D,
367 0xC74, 0x020600DB,
368 0xC78, 0x0000001F,
369 0xC7C, 0x00B91612,
370 0xC80, 0x390000E4,
371 0x80000400, 0x00000000, 0x40000000, 0x00000000,
372 0xC84, 0x21F60000,
373 0xA0000000, 0x00000000,
374 0xC84, 0x11F60000,
375 0xB0000000, 0x00000000,
376 0xC88, 0x40000100,
377 0xC8C, 0x20200000,
378 0xC90, 0x00091521,
379 0xC94, 0x00000000,
380 0xC98, 0x00121820,
381 0xC9C, 0x00007F7F,
382 0xCA0, 0x00000000,
383 0xCA4, 0x000300A0,
384 0xCA8, 0x00000000,
385 0xCAC, 0x00000000,
386 0xCB0, 0x00000000,
387 0xCB4, 0x00000000,
388 0xCB8, 0x00000000,
389 0xCBC, 0x28000000,
390 0xCC0, 0x00000000,
391 0xCC4, 0x00000000,
392 0xCC8, 0x00000000,
393 0xCCC, 0x00000000,
394 0xCD0, 0x00000000,
395 0xCD4, 0x00000000,
396 0xCD8, 0x64B22427,
397 0xCDC, 0x00766932,
398 0xCE0, 0x00222222,
399 0xCE4, 0x10000000,
400 0xCE8, 0x37644302,
401 0xCEC, 0x2F97D40C,
402 0xD00, 0x04030740,
403 0xD04, 0x40020401,
404 0xD08, 0x0000907F,
405 0xD0C, 0x20010201,
406 0xD10, 0xA0633333,
407 0xD14, 0x3333BC53,
408 0xD18, 0x7A8F5B6F,
409 0xD2C, 0xCB979975,
410 0xD30, 0x00000000,
411 0xD34, 0x40608000,
412 0xD38, 0x98000000,
413 0xD3C, 0x40127353,
414 0xD40, 0x00000000,
415 0xD44, 0x00000000,
416 0xD48, 0x00000000,
417 0xD4C, 0x00000000,
418 0xD50, 0x6437140A,
419 0xD54, 0x00000000,
420 0xD58, 0x00000282,
421 0xD5C, 0x30032064,
422 0xD60, 0x4653DE68,
423 0xD64, 0x04518A3C,
424 0xD68, 0x00002101,
425 0xD6C, 0x2A201C16,
426 0xD70, 0x1812362E,
427 0xD74, 0x322C2220,
428 0xD78, 0x000E3C24,
429 0xE00, 0x2D2D2D2D,
430 0xE04, 0x2D2D2D2D,
431 0xE08, 0x0390272D,
432 0xE10, 0x2D2D2D2D,
433 0xE14, 0x2D2D2D2D,
434 0xE18, 0x2D2D2D2D,
435 0xE1C, 0x2D2D2D2D,
436 0xE28, 0x00000000,
437 0xE30, 0x1000DC1F,
438 0xE34, 0x10008C1F,
439 0xE38, 0x02140102,
440 0xE3C, 0x681604C2,
441 0xE40, 0x01007C00,
442 0xE44, 0x01004800,
443 0xE48, 0xFB000000,
444 0xE4C, 0x000028D1,
445 0xE50, 0x1000DC1F,
446 0xE54, 0x10008C1F,
447 0xE58, 0x02140102,
448 0xE5C, 0x28160D05,
449 0xE60, 0x00000008,
450 0xE60, 0x021400A0,
451 0xE64, 0x281600A0,
452 0xE6C, 0x01C00010,
453 0xE70, 0x01C00010,
454 0xE74, 0x02000010,
455 0xE78, 0x02000010,
456 0xE7C, 0x02000010,
457 0xE80, 0x02000010,
458 0xE84, 0x01C00010,
459 0xE88, 0x02000010,
460 0xE8C, 0x01C00010,
461 0xED0, 0x01C00010,
462 0xED4, 0x01C00010,
463 0xED8, 0x01C00010,
464 0xEDC, 0x00000010,
465 0xEE0, 0x00000010,
466 0xEEC, 0x03C00010,
467 0xF14, 0x00000003,
468 0xF4C, 0x00000000,
469 0xF00, 0x00000300,
470
471 };
472
473 void
odm_read_and_config_mp_8188f_phy_reg(struct dm_struct * dm)474 odm_read_and_config_mp_8188f_phy_reg(struct dm_struct *dm)
475 {
476 u32 i = 0;
477 u8 c_cond;
478 boolean is_matched = true, is_skipped = false;
479 u32 array_len = sizeof(array_mp_8188f_phy_reg) / sizeof(u32);
480 u32 *array = array_mp_8188f_phy_reg;
481
482 u32 v1 = 0, v2 = 0, pre_v1 = 0, pre_v2 = 0;
483
484 PHYDM_DBG(dm, ODM_COMP_INIT, "===> %s\n", __func__);
485
486 while ((i + 1) < array_len) {
487 v1 = array[i];
488 v2 = array[i + 1];
489
490 if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/
491 if (v1 & BIT(31)) {/* positive condition*/
492 c_cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28);
493 if (c_cond == COND_ENDIF) {/*end*/
494 is_matched = true;
495 is_skipped = false;
496 PHYDM_DBG(dm, ODM_COMP_INIT, "ENDIF\n");
497 } else if (c_cond == COND_ELSE) { /*else*/
498 is_matched = is_skipped ? false : true;
499 PHYDM_DBG(dm, ODM_COMP_INIT, "ELSE\n");
500 } else {/*if , else if*/
501 pre_v1 = v1;
502 pre_v2 = v2;
503 PHYDM_DBG(dm, ODM_COMP_INIT, "IF or ELSE IF\n");
504 }
505 } else if (v1 & BIT(30)) { /*negative condition*/
506 if (is_skipped == false) {
507 if (check_positive(dm, pre_v1, pre_v2, v1, v2)) {
508 is_matched = true;
509 is_skipped = true;
510 } else {
511 is_matched = false;
512 is_skipped = false;
513 }
514 } else
515 is_matched = false;
516 }
517 } else {
518 if (is_matched)
519 odm_config_bb_phy_8188f(dm, v1, MASKDWORD, v2);
520 }
521 i = i + 2;
522 }
523 }
524
525 u32
odm_get_version_mp_8188f_phy_reg(void)526 odm_get_version_mp_8188f_phy_reg(void)
527 {
528 return 39;
529 }
530
531 /******************************************************************************
532 * phy_reg_pg.TXT
533 ******************************************************************************/
534
535 u32 array_mp_8188f_phy_reg_pg[] = {
536 0, 0, 0, 0x00000e08, 0x0000ff00, 0x00004000,
537 0, 0, 0, 0x0000086c, 0xffffff00, 0x32363800,
538 0, 0, 0, 0x00000e00, 0xffffffff, 0x34363636,
539 0, 0, 0, 0x00000e04, 0xffffffff, 0x28303234,
540 0, 0, 0, 0x00000e10, 0xffffffff, 0x30343434,
541 0, 0, 0, 0x00000e14, 0xffffffff, 0x26262830
542 };
543
544 void
odm_read_and_config_mp_8188f_phy_reg_pg(struct dm_struct * dm)545 odm_read_and_config_mp_8188f_phy_reg_pg(struct dm_struct *dm)
546 {
547 u32 i = 0;
548 u32 array_len = sizeof(array_mp_8188f_phy_reg_pg) / sizeof(u32);
549 u32 *array = array_mp_8188f_phy_reg_pg;
550
551 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
552 void *adapter = dm->adapter;
553 HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));
554
555 PlatformZeroMemory(hal_data->BufOfLinesPwrByRate, MAX_LINES_HWCONFIG_TXT * MAX_BYTES_LINE_HWCONFIG_TXT);
556 hal_data->nLinesReadPwrByRate = array_len / 6;
557 #endif
558
559 PHYDM_DBG(dm, ODM_COMP_INIT, "===> %s\n", __func__);
560
561 dm->phy_reg_pg_version = 1;
562 dm->phy_reg_pg_value_type = PHY_REG_PG_EXACT_VALUE;
563
564 for (i = 0; i < array_len; i += 6) {
565 u32 v1 = array[i];
566 u32 v2 = array[i + 1];
567 u32 v3 = array[i + 2];
568 u32 v4 = array[i + 3];
569 u32 v5 = array[i + 4];
570 u32 v6 = array[i + 5];
571
572 odm_config_bb_phy_reg_pg_8188f(dm, v1, v2, v3, v4, v5, v6);
573
574 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
575 rsprintf((char *)hal_data->BufOfLinesPwrByRate[i / 6], 100, "%s, %s, %s, 0x%X, 0x%08X, 0x%08X,",
576 (v1 == 0 ? "2.4G" : " 5G"), (v2 == 0 ? "A" : "B"), (v3 == 0 ? "1Tx" : "2Tx"), v4, v5, v6);
577 #endif
578 }
579 }
580
581
582
583 #endif /* end of HWIMG_SUPPORT*/
584
585