1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
6 ******************************************************************************/
8 #include <linux/kernel.h>
9 #include "odm_precomp.h"
11 static bool CheckPositive(
12 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
16 ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | /* _GLNA */
17 ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /* _GPA */
18 ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /* _ALNA */
19 ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /* _APA */
20 ((pDM_Odm->BoardType & BIT2) >> 2) << 4; /* _BT */
22 u32 cond1 = Condition1, cond2 = Condition2;
24 pDM_Odm->CutVersion << 24 |
25 pDM_Odm->SupportPlatform << 16 |
26 pDM_Odm->PackageType << 12 |
27 pDM_Odm->SupportInterface << 8 |
31 pDM_Odm->TypeGLNA << 0 |
32 pDM_Odm->TypeGPA << 8 |
33 pDM_Odm->TypeALNA << 16 |
34 pDM_Odm->TypeAPA << 24;
41 "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
51 "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
61 (" (Platform, Interface) = (0x%X, 0x%X)\n",
62 pDM_Odm->SupportPlatform,
63 pDM_Odm->SupportInterface
71 " (Board, Package) = (0x%X, 0x%X)\n",
78 /* Value Defined Check =============== */
79 /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
81 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
83 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
86 /* Bit Defined Check ================ */
87 /* We don't care [31:28] and [23:20] */
90 driver1 &= 0x000F0FFF;
92 if ((cond1 & driver1) == cond1) {
95 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE */
98 if ((cond1 & BIT0) != 0) /* GLNA */
99 bitMask |= 0x000000FF;
100 if ((cond1 & BIT1) != 0) /* GPA */
101 bitMask |= 0x0000FF00;
102 if ((cond1 & BIT2) != 0) /* ALNA */
103 bitMask |= 0x00FF0000;
104 if ((cond1 & BIT3) != 0) /* APA */
105 bitMask |= 0xFF000000;
107 /* BoardType of each RF path is matched */
108 if ((cond2 & bitMask) == (driver2 & bitMask))
114 static bool CheckNegative(
115 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
121 /******************************************************************************
123 ******************************************************************************/
125 static u32 Array_MP_8723B_AGC_TAB[] = {
260 void ODM_ReadAndConfig_MP_8723B_AGC_TAB(PDM_ODM_T pDM_Odm)
263 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_AGC_TAB);
264 u32 *Array = Array_MP_8723B_AGC_TAB;
270 ("===> ODM_ReadAndConfig_MP_8723B_AGC_TAB\n")
273 for (i = 0; i < ArrayLen; i += 2) {
277 /* This (offset, data) pair doesn't care the condition. */
278 if (v1 < 0x40000000) {
279 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
282 /* This line is the beginning of branch. */
283 bool bMatched = true;
284 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
286 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
288 READ_NEXT_PAIR(v1, v2, i);
289 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
291 READ_NEXT_PAIR(v1, v2, i);
292 READ_NEXT_PAIR(v1, v2, i);
294 READ_NEXT_PAIR(v1, v2, i);
295 if (!CheckNegative(pDM_Odm, v1, v2))
299 READ_NEXT_PAIR(v1, v2, i);
302 if (bMatched == false) {
303 /* Condition isn't matched.
304 * Discard the following (offset, data) pairs.
306 while (v1 < 0x40000000 && i < ArrayLen-2)
307 READ_NEXT_PAIR(v1, v2, i);
309 i -= 2; /* prevent from for-loop += 2 */
311 /* Configure matched pairs and skip to end of if-else. */
312 while (v1 < 0x40000000 && i < ArrayLen-2) {
313 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
314 READ_NEXT_PAIR(v1, v2, i);
317 /* Keeps reading until ENDIF. */
318 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
319 while (cCond != COND_ENDIF && i < ArrayLen-2) {
320 READ_NEXT_PAIR(v1, v2, i);
321 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
328 /******************************************************************************
330 ******************************************************************************/
332 static u32 Array_MP_8723B_PHY_REG[] = {
529 void ODM_ReadAndConfig_MP_8723B_PHY_REG(PDM_ODM_T pDM_Odm)
532 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_PHY_REG);
533 u32 *Array = Array_MP_8723B_PHY_REG;
539 ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG\n")
542 for (i = 0; i < ArrayLen; i += 2) {
546 /* This (offset, data) pair doesn't care the condition. */
547 if (v1 < 0x40000000) {
548 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
551 /* This line is the beginning of branch. */
552 bool bMatched = true;
553 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
555 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
557 READ_NEXT_PAIR(v1, v2, i);
558 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
560 READ_NEXT_PAIR(v1, v2, i);
561 READ_NEXT_PAIR(v1, v2, i);
563 READ_NEXT_PAIR(v1, v2, i);
564 if (!CheckNegative(pDM_Odm, v1, v2))
568 READ_NEXT_PAIR(v1, v2, i);
571 if (bMatched == false) {
572 /* Condition isn't matched.
573 * Discard the following (offset, data) pairs.
575 while (v1 < 0x40000000 && i < ArrayLen-2)
576 READ_NEXT_PAIR(v1, v2, i);
578 i -= 2; /* prevent from for-loop += 2 */
579 } else { /* Configure matched pairs and skip to end of if-else. */
580 while (v1 < 0x40000000 && i < ArrayLen-2) {
581 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
582 READ_NEXT_PAIR(v1, v2, i);
585 /* Keeps reading until ENDIF. */
586 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
587 while (cCond != COND_ENDIF && i < ArrayLen-2) {
588 READ_NEXT_PAIR(v1, v2, i);
589 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
596 /******************************************************************************
598 ******************************************************************************/
600 static u32 Array_MP_8723B_PHY_REG_PG[] = {
601 0, 0, 0, 0x00000e08, 0x0000ff00, 0x00003800,
602 0, 0, 0, 0x0000086c, 0xffffff00, 0x32343600,
603 0, 0, 0, 0x00000e00, 0xffffffff, 0x40424444,
604 0, 0, 0, 0x00000e04, 0xffffffff, 0x28323638,
605 0, 0, 0, 0x00000e10, 0xffffffff, 0x38404244,
606 0, 0, 0, 0x00000e14, 0xffffffff, 0x26303436
609 void ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(PDM_ODM_T pDM_Odm)
612 u32 *Array = Array_MP_8723B_PHY_REG_PG;
618 ("===> ODM_ReadAndConfig_MP_8723B_PHY_REG_PG\n")
621 pDM_Odm->PhyRegPgVersion = 1;
622 pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
624 for (i = 0; i < ARRAY_SIZE(Array_MP_8723B_PHY_REG_PG); i += 6) {
632 odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4, v5, v6);