]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blame - drivers/staging/rtl8723au/hal/HalHWImg8723A_BB.c
Merge tag 'pinctrl-v4.1-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[mirror_ubuntu-zesty-kernel.git] / drivers / staging / rtl8723au / hal / HalHWImg8723A_BB.c
CommitLineData
f7c92d2c
LF
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
18static 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;
6bd70089 33 cond >>= 8;
f7c92d2c
LF
34 if ((_interface & cond) == 0 && cond != 0x07)
35 return false;
36
37 cond = Condition & 0x00FF0000;
6bd70089 38 cond >>= 16;
f7c92d2c
LF
39 if ((_platform & cond) == 0 && cond != 0x0F)
40 return false;
41 return true;
42}
43
44/******************************************************************************
45* AGC_TAB_1T.TXT
46******************************************************************************/
47
48static 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
216void ODM_ReadAndConfig_AGC_TAB_1T_8723A(struct dm_odm_t *pDM_Odm)
217{
f7c92d2c
LF
218 u32 hex;
219 u32 i;
220 u8 platform = 0x04;
f7c92d2c
LF
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;
9d693e3a 226 hex += ODM_ITRF_USB << 8;
f7c92d2c
LF
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) {
539b61bf 235 odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
236 continue;
237 } else {
238 if (!CheckCondition(Array[i], hex)) {
2f3cf84f 239 /* Discard the following (offset, data) pairs */
f7c92d2c
LF
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 {
2f3cf84f
JS
247 /* Configure matched pairs and skip to
248 end of if-else. */
f7c92d2c
LF
249 READ_NEXT_PAIR(v1, v2, i);
250 while (v2 != 0xDEAD &&
251 v2 != 0xCDEF &&
252 v2 != 0xCDCD && i < ArrayLen - 2) {
539b61bf 253 odm_ConfigBB_AGC_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
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
267static 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
464void 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;
f7c92d2c
LF
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;
9d693e3a 474 hex += ODM_ITRF_USB << 8;
f7c92d2c
LF
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) {
2f3cf84f 483 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
484 continue;
485 } else {
486 if (!CheckCondition(Array[i], hex)) {
2f3cf84f 487 /* Discard the following (offset, data) pairs */
f7c92d2c
LF
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 {
2f3cf84f
JS
495 /* Configure matched pairs and skip to
496 end of if-else. */
f7c92d2c
LF
497 READ_NEXT_PAIR(v1, v2, i);
498 while (v2 != 0xDEAD &&
499 v2 != 0xCDEF &&
500 v2 != 0xCDCD && i < ArrayLen - 2) {
2f3cf84f 501 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
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
515static u32 Array_PHY_REG_MP_8723A[] = {
516 0xC30, 0x69E9AC4A,
517 0xC3C, 0x0A979718,
518};
519
520void ODM_ReadAndConfig_PHY_REG_MP_8723A(struct dm_odm_t *pDM_Odm)
521{
2f3cf84f
JS
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;
f7c92d2c
LF
528
529 hex += board;
9d693e3a 530 hex += ODM_ITRF_USB << 8;
f7c92d2c
LF
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) {
2f3cf84f 539 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
540 continue;
541 } else {
542 if (!CheckCondition(Array[i], hex)) {
2f3cf84f 543 /* Discard the following (offset, data) pairs */
f7c92d2c
LF
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 {
2f3cf84f
JS
551 /* Configure matched pairs and skip to
552 end of if-else. */
f7c92d2c
LF
553 READ_NEXT_PAIR(v1, v2, i);
554 while (v2 != 0xDEAD &&
555 v2 != 0xCDEF &&
556 v2 != 0xCDCD && i < ArrayLen - 2) {
2f3cf84f 557 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, v2);
f7c92d2c
LF
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}