Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / rtl8723au / hal / HalHWImg8723A_BB.c
1 /******************************************************************************
2 *
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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 "odm_precomp.h"
17
18 static bool CheckCondition(const u32  Condition, const u32  Hex)
19 {
20         u32 _board     = (Hex & 0x000000FF);
21         u32 _interface = (Hex & 0x0000FF00) >> 8;
22         u32 _platform  = (Hex & 0x00FF0000) >> 16;
23         u32 cond = Condition;
24
25         if (Condition == 0xCDCDCDCD)
26                 return true;
27
28         cond = Condition & 0x000000FF;
29         if ((_board == cond) && cond != 0x00)
30                 return false;
31
32         cond = Condition & 0x0000FF00;
33         cond >>= 8;
34         if ((_interface & cond) == 0 && cond != 0x07)
35                 return false;
36
37         cond = Condition & 0x00FF0000;
38         cond >>= 16;
39         if ((_platform & cond) == 0 && cond != 0x0F)
40                 return false;
41         return true;
42 }
43
44 /******************************************************************************
45 *                           AGC_TAB_1T.TXT
46 ******************************************************************************/
47
48 static u32 Array_AGC_TAB_1T_8723A[] = {
49         0xC78, 0x7B000001,
50         0xC78, 0x7B010001,
51         0xC78, 0x7B020001,
52         0xC78, 0x7B030001,
53         0xC78, 0x7B040001,
54         0xC78, 0x7B050001,
55         0xC78, 0x7A060001,
56         0xC78, 0x79070001,
57         0xC78, 0x78080001,
58         0xC78, 0x77090001,
59         0xC78, 0x760A0001,
60         0xC78, 0x750B0001,
61         0xC78, 0x740C0001,
62         0xC78, 0x730D0001,
63         0xC78, 0x720E0001,
64         0xC78, 0x710F0001,
65         0xC78, 0x70100001,
66         0xC78, 0x6F110001,
67         0xC78, 0x6E120001,
68         0xC78, 0x6D130001,
69         0xC78, 0x6C140001,
70         0xC78, 0x6B150001,
71         0xC78, 0x6A160001,
72         0xC78, 0x69170001,
73         0xC78, 0x68180001,
74         0xC78, 0x67190001,
75         0xC78, 0x661A0001,
76         0xC78, 0x651B0001,
77         0xC78, 0x641C0001,
78         0xC78, 0x631D0001,
79         0xC78, 0x621E0001,
80         0xC78, 0x611F0001,
81         0xC78, 0x60200001,
82         0xC78, 0x49210001,
83         0xC78, 0x48220001,
84         0xC78, 0x47230001,
85         0xC78, 0x46240001,
86         0xC78, 0x45250001,
87         0xC78, 0x44260001,
88         0xC78, 0x43270001,
89         0xC78, 0x42280001,
90         0xC78, 0x41290001,
91         0xC78, 0x402A0001,
92         0xC78, 0x262B0001,
93         0xC78, 0x252C0001,
94         0xC78, 0x242D0001,
95         0xC78, 0x232E0001,
96         0xC78, 0x222F0001,
97         0xC78, 0x21300001,
98         0xC78, 0x20310001,
99         0xC78, 0x06320001,
100         0xC78, 0x05330001,
101         0xC78, 0x04340001,
102         0xC78, 0x03350001,
103         0xC78, 0x02360001,
104         0xC78, 0x01370001,
105         0xC78, 0x00380001,
106         0xC78, 0x00390001,
107         0xC78, 0x003A0001,
108         0xC78, 0x003B0001,
109         0xC78, 0x003C0001,
110         0xC78, 0x003D0001,
111         0xC78, 0x003E0001,
112         0xC78, 0x003F0001,
113         0xC78, 0x7B400001,
114         0xC78, 0x7B410001,
115         0xC78, 0x7B420001,
116         0xC78, 0x7B430001,
117         0xC78, 0x7B440001,
118         0xC78, 0x7B450001,
119         0xC78, 0x7A460001,
120         0xC78, 0x79470001,
121         0xC78, 0x78480001,
122         0xC78, 0x77490001,
123         0xC78, 0x764A0001,
124         0xC78, 0x754B0001,
125         0xC78, 0x744C0001,
126         0xC78, 0x734D0001,
127         0xC78, 0x724E0001,
128         0xC78, 0x714F0001,
129         0xC78, 0x70500001,
130         0xC78, 0x6F510001,
131         0xC78, 0x6E520001,
132         0xC78, 0x6D530001,
133         0xC78, 0x6C540001,
134         0xC78, 0x6B550001,
135         0xC78, 0x6A560001,
136         0xC78, 0x69570001,
137         0xC78, 0x68580001,
138         0xC78, 0x67590001,
139         0xC78, 0x665A0001,
140         0xC78, 0x655B0001,
141         0xC78, 0x645C0001,
142         0xC78, 0x635D0001,
143         0xC78, 0x625E0001,
144         0xC78, 0x615F0001,
145         0xC78, 0x60600001,
146         0xC78, 0x49610001,
147         0xC78, 0x48620001,
148         0xC78, 0x47630001,
149         0xC78, 0x46640001,
150         0xC78, 0x45650001,
151         0xC78, 0x44660001,
152         0xC78, 0x43670001,
153         0xC78, 0x42680001,
154         0xC78, 0x41690001,
155         0xC78, 0x406A0001,
156         0xC78, 0x266B0001,
157         0xC78, 0x256C0001,
158         0xC78, 0x246D0001,
159         0xC78, 0x236E0001,
160         0xC78, 0x226F0001,
161         0xC78, 0x21700001,
162         0xC78, 0x20710001,
163         0xC78, 0x06720001,
164         0xC78, 0x05730001,
165         0xC78, 0x04740001,
166         0xC78, 0x03750001,
167         0xC78, 0x02760001,
168         0xC78, 0x01770001,
169         0xC78, 0x00780001,
170         0xC78, 0x00790001,
171         0xC78, 0x007A0001,
172         0xC78, 0x007B0001,
173         0xC78, 0x007C0001,
174         0xC78, 0x007D0001,
175         0xC78, 0x007E0001,
176         0xC78, 0x007F0001,
177         0xC78, 0x3800001E,
178         0xC78, 0x3801001E,
179         0xC78, 0x3802001E,
180         0xC78, 0x3803001E,
181         0xC78, 0x3804001E,
182         0xC78, 0x3805001E,
183         0xC78, 0x3806001E,
184         0xC78, 0x3807001E,
185         0xC78, 0x3808001E,
186         0xC78, 0x3C09001E,
187         0xC78, 0x3E0A001E,
188         0xC78, 0x400B001E,
189         0xC78, 0x440C001E,
190         0xC78, 0x480D001E,
191         0xC78, 0x4C0E001E,
192         0xC78, 0x500F001E,
193         0xC78, 0x5210001E,
194         0xC78, 0x5611001E,
195         0xC78, 0x5A12001E,
196         0xC78, 0x5E13001E,
197         0xC78, 0x6014001E,
198         0xC78, 0x6015001E,
199         0xC78, 0x6016001E,
200         0xC78, 0x6217001E,
201         0xC78, 0x6218001E,
202         0xC78, 0x6219001E,
203         0xC78, 0x621A001E,
204         0xC78, 0x621B001E,
205         0xC78, 0x621C001E,
206         0xC78, 0x621D001E,
207         0xC78, 0x621E001E,
208         0xC78, 0x621F001E,
209 };
210
211 #define READ_NEXT_PAIR(v1, v2, i)                       \
212         do {                                            \
213                 i += 2; v1 = Array[i]; v2 = Array[i+1]; \
214         } while (0)
215
216 void ODM_ReadAndConfig_AGC_TAB_1T_8723A(struct dm_odm_t *pDM_Odm)
217 {
218         u32 hex;
219         u32 i;
220         u8 platform = 0x04;
221         u8 board = pDM_Odm->BoardType;
222         u32 ArrayLen = sizeof(Array_AGC_TAB_1T_8723A)/sizeof(u32);
223         u32 *Array = Array_AGC_TAB_1T_8723A;
224
225         hex = board;
226         hex += ODM_ITRF_USB << 8;
227         hex += platform << 16;
228         hex += 0xFF000000;
229         for (i = 0; i < ArrayLen; i += 2) {
230                 u32 v1 = Array[i];
231                 u32 v2 = Array[i+1];
232
233                 /*  This (offset, data) pair meets the condition. */
234                 if (v1 < 0xCDCDCDCD) {
235                         odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
236                         continue;
237                 } else {
238                         if (!CheckCondition(Array[i], hex)) {
239                                 /* Discard the following (offset, data) pairs */
240                                 READ_NEXT_PAIR(v1, v2, i);
241                                 while (v2 != 0xDEAD &&
242                                        v2 != 0xCDEF &&
243                                        v2 != 0xCDCD && i < ArrayLen - 2)
244                                         READ_NEXT_PAIR(v1, v2, i);
245                                 i -= 2; /*  prevent from for-loop += 2 */
246                         } else {
247                                 /*  Configure matched pairs and skip to
248                                     end of if-else. */
249                                 READ_NEXT_PAIR(v1, v2, i);
250                                 while (v2 != 0xDEAD &&
251                                        v2 != 0xCDEF &&
252                                        v2 != 0xCDCD && i < ArrayLen - 2) {
253                                         odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
254                                         READ_NEXT_PAIR(v1, v2, i);
255                                 }
256                                 while (v2 != 0xDEAD && i < ArrayLen - 2)
257                                         READ_NEXT_PAIR(v1, v2, i);
258                         }
259                 }
260         }
261 }
262
263 /******************************************************************************
264 *                           PHY_REG_1T.TXT
265 ******************************************************************************/
266
267 static u32 Array_PHY_REG_1T_8723A[] = {
268         0x800, 0x80040000,
269         0x804, 0x00000003,
270         0x808, 0x0000FC00,
271         0x80C, 0x0000000A,
272         0x810, 0x10001331,
273         0x814, 0x020C3D10,
274         0x818, 0x02200385,
275         0x81C, 0x00000000,
276         0x820, 0x01000100,
277         0x824, 0x00390004,
278         0x828, 0x00000000,
279         0x82C, 0x00000000,
280         0x830, 0x00000000,
281         0x834, 0x00000000,
282         0x838, 0x00000000,
283         0x83C, 0x00000000,
284         0x840, 0x00010000,
285         0x844, 0x00000000,
286         0x848, 0x00000000,
287         0x84C, 0x00000000,
288         0x850, 0x00000000,
289         0x854, 0x00000000,
290         0x858, 0x569A569A,
291         0x85C, 0x001B25A4,
292         0x860, 0x66F60110,
293         0x864, 0x061F0130,
294         0x868, 0x00000000,
295         0x86C, 0x32323200,
296         0x870, 0x07000760,
297         0x874, 0x22004000,
298         0x878, 0x00000808,
299         0x87C, 0x00000000,
300         0x880, 0xC0083070,
301         0x884, 0x000004D5,
302         0x888, 0x00000000,
303         0x88C, 0xCCC000C0,
304         0x890, 0x00000800,
305         0x894, 0xFFFFFFFE,
306         0x898, 0x40302010,
307         0x89C, 0x00706050,
308         0x900, 0x00000000,
309         0x904, 0x00000023,
310         0x908, 0x00000000,
311         0x90C, 0x81121111,
312         0xA00, 0x00D047C8,
313         0xA04, 0x80FF000C,
314         0xA08, 0x8C838300,
315         0xA0C, 0x2E68120F,
316         0xA10, 0x9500BB78,
317         0xA14, 0x11144028,
318         0xA18, 0x00881117,
319         0xA1C, 0x89140F00,
320         0xA20, 0x1A1B0000,
321         0xA24, 0x090E1317,
322         0xA28, 0x00000204,
323         0xA2C, 0x00D30000,
324         0xA70, 0x101FBF00,
325         0xA74, 0x00000007,
326         0xA78, 0x00000900,
327         0xC00, 0x48071D40,
328         0xC04, 0x03A05611,
329         0xC08, 0x000000E4,
330         0xC0C, 0x6C6C6C6C,
331         0xC10, 0x08800000,
332         0xC14, 0x40000100,
333         0xC18, 0x08800000,
334         0xC1C, 0x40000100,
335         0xC20, 0x00000000,
336         0xC24, 0x00000000,
337         0xC28, 0x00000000,
338         0xC2C, 0x00000000,
339         0xC30, 0x69E9AC44,
340         0xFF0F011F, 0xABCD,
341         0xC34, 0x469652CF,
342         0xCDCDCDCD, 0xCDCD,
343         0xC34, 0x469652AF,
344         0xFF0F011F, 0xDEAD,
345         0xC38, 0x49795994,
346         0xC3C, 0x0A97971C,
347         0xC40, 0x1F7C403F,
348         0xC44, 0x000100B7,
349         0xC48, 0xEC020107,
350         0xC4C, 0x007F037F,
351         0xC50, 0x69543420,
352         0xC54, 0x43BC0094,
353         0xC58, 0x69543420,
354         0xC5C, 0x433C0094,
355         0xC60, 0x00000000,
356         0xFF0F011F, 0xABCD,
357         0xC64, 0x7116848B,
358         0xCDCDCDCD, 0xCDCD,
359         0xC64, 0x7112848B,
360         0xFF0F011F, 0xDEAD,
361         0xC68, 0x47C00BFF,
362         0xC6C, 0x00000036,
363         0xC70, 0x2C7F000D,
364         0xC74, 0x018610DB,
365         0xC78, 0x0000001F,
366         0xC7C, 0x00B91612,
367         0xC80, 0x40000100,
368         0xC84, 0x20F60000,
369         0xC88, 0x40000100,
370         0xC8C, 0x20200000,
371         0xC90, 0x00121820,
372         0xC94, 0x00000000,
373         0xC98, 0x00121820,
374         0xC9C, 0x00007F7F,
375         0xCA0, 0x00000000,
376         0xCA4, 0x00000080,
377         0xCA8, 0x00000000,
378         0xCAC, 0x00000000,
379         0xCB0, 0x00000000,
380         0xCB4, 0x00000000,
381         0xCB8, 0x00000000,
382         0xCBC, 0x28000000,
383         0xCC0, 0x00000000,
384         0xCC4, 0x00000000,
385         0xCC8, 0x00000000,
386         0xCCC, 0x00000000,
387         0xCD0, 0x00000000,
388         0xCD4, 0x00000000,
389         0xCD8, 0x64B22427,
390         0xCDC, 0x00766932,
391         0xCE0, 0x00222222,
392         0xCE4, 0x00000000,
393         0xCE8, 0x37644302,
394         0xCEC, 0x2F97D40C,
395         0xD00, 0x00080740,
396         0xD04, 0x00020401,
397         0xD08, 0x0000907F,
398         0xD0C, 0x20010201,
399         0xD10, 0xA0633333,
400         0xD14, 0x3333BC43,
401         0xD18, 0x7A8F5B6B,
402         0xD2C, 0xCC979975,
403         0xD30, 0x00000000,
404         0xD34, 0x80608000,
405         0xD38, 0x00000000,
406         0xD3C, 0x00027293,
407         0xD40, 0x00000000,
408         0xD44, 0x00000000,
409         0xD48, 0x00000000,
410         0xD4C, 0x00000000,
411         0xD50, 0x6437140A,
412         0xD54, 0x00000000,
413         0xD58, 0x00000000,
414         0xD5C, 0x30032064,
415         0xD60, 0x4653DE68,
416         0xD64, 0x04518A3C,
417         0xD68, 0x00002101,
418         0xD6C, 0x2A201C16,
419         0xD70, 0x1812362E,
420         0xD74, 0x322C2220,
421         0xD78, 0x000E3C24,
422         0xE00, 0x2A2A2A2A,
423         0xE04, 0x2A2A2A2A,
424         0xE08, 0x03902A2A,
425         0xE10, 0x2A2A2A2A,
426         0xE14, 0x2A2A2A2A,
427         0xE18, 0x2A2A2A2A,
428         0xE1C, 0x2A2A2A2A,
429         0xE28, 0x00000000,
430         0xE30, 0x1000DC1F,
431         0xE34, 0x10008C1F,
432         0xE38, 0x02140102,
433         0xE3C, 0x681604C2,
434         0xE40, 0x01007C00,
435         0xE44, 0x01004800,
436         0xE48, 0xFB000000,
437         0xE4C, 0x000028D1,
438         0xE50, 0x1000DC1F,
439         0xE54, 0x10008C1F,
440         0xE58, 0x02140102,
441         0xE5C, 0x28160D05,
442         0xE60, 0x00000008,
443         0xE68, 0x001B25A4,
444         0xE6C, 0x631B25A0,
445         0xE70, 0x631B25A0,
446         0xE74, 0x081B25A0,
447         0xE78, 0x081B25A0,
448         0xE7C, 0x081B25A0,
449         0xE80, 0x081B25A0,
450         0xE84, 0x631B25A0,
451         0xE88, 0x081B25A0,
452         0xE8C, 0x631B25A0,
453         0xED0, 0x631B25A0,
454         0xED4, 0x631B25A0,
455         0xED8, 0x631B25A0,
456         0xEDC, 0x001B25A0,
457         0xEE0, 0x001B25A0,
458         0xEEC, 0x6B1B25A0,
459         0xF14, 0x00000003,
460         0xF4C, 0x00000000,
461         0xF00, 0x00000300,
462 };
463
464 void ODM_ReadAndConfig_PHY_REG_1T_8723A(struct dm_odm_t *pDM_Odm)
465 {
466         u32 hex = 0;
467         u32 i = 0;
468         u8  platform = 0x04;
469         u8  board = pDM_Odm->BoardType;
470         u32 ArrayLen = sizeof(Array_PHY_REG_1T_8723A)/sizeof(u32);
471         u32 *Array = Array_PHY_REG_1T_8723A;
472
473         hex += board;
474         hex += ODM_ITRF_USB << 8;
475         hex += platform << 16;
476         hex += 0xFF000000;
477         for (i = 0; i < ArrayLen; i += 2) {
478                 u32 v1 = Array[i];
479                 u32 v2 = Array[i+1];
480
481                 /*  This (offset, data) pair meets the condition. */
482                 if (v1 < 0xCDCDCDCD) {
483                         odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
484                         continue;
485                 } else {
486                         if (!CheckCondition(Array[i], hex)) {
487                                 /* Discard the following (offset, data) pairs */
488                                 READ_NEXT_PAIR(v1, v2, i);
489                                 while (v2 != 0xDEAD &&
490                                        v2 != 0xCDEF &&
491                                        v2 != 0xCDCD && i < ArrayLen - 2)
492                                         READ_NEXT_PAIR(v1, v2, i);
493                                 i -= 2; /*  prevent from for-loop += 2 */
494                         } else {
495                                 /*  Configure matched pairs and skip to
496                                     end of if-else. */
497                                 READ_NEXT_PAIR(v1, v2, i);
498                                 while (v2 != 0xDEAD &&
499                                        v2 != 0xCDEF &&
500                                        v2 != 0xCDCD && i < ArrayLen - 2) {
501                                         odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
502                                         READ_NEXT_PAIR(v1, v2, i);
503                                 }
504                                 while (v2 != 0xDEAD && i < ArrayLen - 2)
505                                         READ_NEXT_PAIR(v1, v2, i);
506                         }
507                 }
508         }
509 }
510
511 /******************************************************************************
512 *                           PHY_REG_MP.TXT
513 ******************************************************************************/
514
515 static u32 Array_PHY_REG_MP_8723A[] = {
516         0xC30, 0x69E9AC4A,
517         0xC3C, 0x0A979718,
518 };
519
520 void ODM_ReadAndConfig_PHY_REG_MP_8723A(struct dm_odm_t *pDM_Odm)
521 {
522         u32 hex = 0;
523         u32 i;
524         u8 platform = 0x04;
525         u8 board = pDM_Odm->BoardType;
526         u32 ArrayLen = sizeof(Array_PHY_REG_MP_8723A)/sizeof(u32);
527         u32 *Array = Array_PHY_REG_MP_8723A;
528
529         hex += board;
530         hex += ODM_ITRF_USB << 8;
531         hex += platform << 16;
532         hex += 0xFF000000;
533         for (i = 0; i < ArrayLen; i += 2) {
534                 u32 v1 = Array[i];
535                 u32 v2 = Array[i+1];
536
537                 /*  This (offset, data) pair meets the condition. */
538                 if (v1 < 0xCDCDCDCD) {
539                         odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
540                         continue;
541                 } else {
542                         if (!CheckCondition(Array[i], hex)) {
543                                 /* Discard the following (offset, data) pairs */
544                                 READ_NEXT_PAIR(v1, v2, i);
545                                 while (v2 != 0xDEAD &&
546                                        v2 != 0xCDEF &&
547                                        v2 != 0xCDCD && i < ArrayLen - 2)
548                                         READ_NEXT_PAIR(v1, v2, i);
549                                 i -= 2; /*  prevent from for-loop += 2 */
550                         } else {
551                                 /* Configure matched pairs and skip to
552                                    end of if-else. */
553                                 READ_NEXT_PAIR(v1, v2, i);
554                                 while (v2 != 0xDEAD &&
555                                        v2 != 0xCDEF &&
556                                        v2 != 0xCDCD && i < ArrayLen - 2) {
557                                         odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
558                                         READ_NEXT_PAIR(v1, v2, i);
559                                 }
560                                 while (v2 != 0xDEAD && i < ArrayLen - 2)
561                                         READ_NEXT_PAIR(v1, v2, i);
562                         }
563                 }
564         }
565 }