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