1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
14 ******************************************************************************/
17 #include "odm_precomp.h"
19 static bool CheckPositive(
20 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
24 ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA */
25 ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA */
26 ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA */
27 ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */
28 ((pDM_Odm->BoardType & BIT2) >> 2) << 4; /* _BT */
30 u32 cond1 = Condition1, cond2 = Condition2;
32 pDM_Odm->CutVersion << 24 |
33 pDM_Odm->SupportPlatform << 16 |
34 pDM_Odm->PackageType << 12 |
35 pDM_Odm->SupportInterface << 8 |
39 pDM_Odm->TypeGLNA << 0 |
40 pDM_Odm->TypeGPA << 8 |
41 pDM_Odm->TypeALNA << 16 |
42 pDM_Odm->TypeAPA << 24;
49 "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
59 "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
69 (" (Platform, Interface) = (0x%X, 0x%X)\n",
70 pDM_Odm->SupportPlatform,
71 pDM_Odm->SupportInterface
79 " (Board, Package) = (0x%X, 0x%X)\n",
86 /* Value Defined Check =============== */
87 /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
89 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
91 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
94 /* Bit Defined Check ================ */
95 /* We don't care [31:28] and [23:20] */
98 driver1 &= 0x000F0FFF;
100 if ((cond1 & driver1) == cond1) {
103 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE */
106 if ((cond1 & BIT0) != 0) /* GLNA */
107 bitMask |= 0x000000FF;
108 if ((cond1 & BIT1) != 0) /* GPA */
109 bitMask |= 0x0000FF00;
110 if ((cond1 & BIT2) != 0) /* ALNA */
111 bitMask |= 0x00FF0000;
112 if ((cond1 & BIT3) != 0) /* APA */
113 bitMask |= 0xFF000000;
115 /* BoardType of each RF path is matched */
116 if ((cond2 & bitMask) == (driver2 & bitMask))
122 static bool CheckNegative(
123 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
129 /******************************************************************************
131 ******************************************************************************/
133 static u32 Array_MP_8723B_AGC_TAB[] = {
268 void ODM_ReadAndConfig_MP_8723B_AGC_TAB(PDM_ODM_T pDM_Odm)
271 u32 ArrayLen = sizeof(Array_MP_8723B_AGC_TAB)/sizeof(u32);
272 u32 *Array = Array_MP_8723B_AGC_TAB;
278 ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n")
281 for (i = 0; i < ArrayLen; i += 2) {
285 /* This (offset, data) pair doesn't care the condition. */
286 if (v1 < 0x40000000) {
287 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
290 /* This line is the beginning of branch. */
291 bool bMatched = true;
292 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
294 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
296 READ_NEXT_PAIR(v1, v2, i);
297 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
299 READ_NEXT_PAIR(v1, v2, i);
300 READ_NEXT_PAIR(v1, v2, i);
302 READ_NEXT_PAIR(v1, v2, i);
303 if (!CheckNegative(pDM_Odm, v1, v2))
307 READ_NEXT_PAIR(v1, v2, i);
310 if (bMatched == false) {
311 /* Condition isn't matched.
312 * Discard the following (offset, data) pairs.
314 while (v1 < 0x40000000 && i < ArrayLen-2)
315 READ_NEXT_PAIR(v1, v2, i);
317 i -= 2; /* prevent from for-loop += 2 */
319 /* Configure matched pairs and skip to end of if-else. */
320 while (v1 < 0x40000000 && i < ArrayLen-2) {
321 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
322 READ_NEXT_PAIR(v1, v2, i);
325 /* Keeps reading until ENDIF. */
326 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
327 while (cCond != COND_ENDIF && i < ArrayLen-2) {
328 READ_NEXT_PAIR(v1, v2, i);
329 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
336 /******************************************************************************
338 ******************************************************************************/
340 static u32 Array_MP_8723B_PHY_REG[] = {
537 void ODM_ReadAndConfig_MP_8723B_PHY_REG(PDM_ODM_T pDM_Odm)
540 u32 ArrayLen = sizeof(Array_MP_8723B_PHY_REG)/sizeof(u32);
541 u32 *Array = Array_MP_8723B_PHY_REG;
547 ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n")
550 for (i = 0; i < ArrayLen; i += 2) {
554 /* This (offset, data) pair doesn't care the condition. */
555 if (v1 < 0x40000000) {
556 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
559 /* This line is the beginning of branch. */
560 bool bMatched = true;
561 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
563 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
565 READ_NEXT_PAIR(v1, v2, i);
566 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
568 READ_NEXT_PAIR(v1, v2, i);
569 READ_NEXT_PAIR(v1, v2, i);
571 READ_NEXT_PAIR(v1, v2, i);
572 if (!CheckNegative(pDM_Odm, v1, v2))
576 READ_NEXT_PAIR(v1, v2, i);
579 if (bMatched == false) {
580 /* Condition isn't matched.
581 * Discard the following (offset, data) pairs.
583 while (v1 < 0x40000000 && i < ArrayLen-2)
584 READ_NEXT_PAIR(v1, v2, i);
586 i -= 2; /* prevent from for-loop += 2 */
587 } else { /* Configure matched pairs and skip to end of if-else. */
588 while (v1 < 0x40000000 && i < ArrayLen-2) {
589 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
590 READ_NEXT_PAIR(v1, v2, i);
593 /* Keeps reading until ENDIF. */
594 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
595 while (cCond != COND_ENDIF && i < ArrayLen-2) {
596 READ_NEXT_PAIR(v1, v2, i);
597 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
604 /******************************************************************************
606 ******************************************************************************/
608 static u32 Array_MP_8723B_PHY_REG_PG[] = {
609 0, 0, 0, 0x00000e08, 0x0000ff00, 0x00003800,
610 0, 0, 0, 0x0000086c, 0xffffff00, 0x32343600,
611 0, 0, 0, 0x00000e00, 0xffffffff, 0x40424444,
612 0, 0, 0, 0x00000e04, 0xffffffff, 0x28323638,
613 0, 0, 0, 0x00000e10, 0xffffffff, 0x38404244,
614 0, 0, 0, 0x00000e14, 0xffffffff, 0x26303436
617 void ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(PDM_ODM_T pDM_Odm)
620 u32 ArrayLen = sizeof(Array_MP_8723B_PHY_REG_PG)/sizeof(u32);
621 u32 *Array = Array_MP_8723B_PHY_REG_PG;
627 ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG_PG\n")
630 pDM_Odm->PhyRegPgVersion = 1;
631 pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
633 for (i = 0; i < ArrayLen; i += 6) {
641 odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);