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 struct dm_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;
37 /* Value Defined Check =============== */
38 /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
40 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
42 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
45 /* Bit Defined Check ================ */
46 /* We don't care [31:28] and [23:20] */
49 driver1 &= 0x000F0FFF;
51 if ((cond1 & driver1) == cond1) {
54 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE */
57 if ((cond1 & BIT0) != 0) /* GLNA */
58 bitMask |= 0x000000FF;
59 if ((cond1 & BIT1) != 0) /* GPA */
60 bitMask |= 0x0000FF00;
61 if ((cond1 & BIT2) != 0) /* ALNA */
62 bitMask |= 0x00FF0000;
63 if ((cond1 & BIT3) != 0) /* APA */
64 bitMask |= 0xFF000000;
66 /* BoardType of each RF path is matched */
67 if ((cond2 & bitMask) == (driver2 & bitMask))
73 static bool CheckNegative(
74 struct dm_odm_t *pDM_Odm, const u32 Condition1, const u32 Condition2
80 /******************************************************************************
82 ******************************************************************************/
84 static u32 Array_MP_8723B_AGC_TAB[] = {
219 void ODM_ReadAndConfig_MP_8723B_AGC_TAB(struct dm_odm_t *pDM_Odm)
222 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_AGC_TAB);
223 u32 *Array = Array_MP_8723B_AGC_TAB;
225 for (i = 0; i < ArrayLen; i += 2) {
229 /* This (offset, data) pair doesn't care the condition. */
230 if (v1 < 0x40000000) {
231 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
234 /* This line is the beginning of branch. */
235 bool bMatched = true;
236 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
238 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
240 READ_NEXT_PAIR(v1, v2, i);
241 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
243 READ_NEXT_PAIR(v1, v2, i);
244 READ_NEXT_PAIR(v1, v2, i);
246 READ_NEXT_PAIR(v1, v2, i);
247 if (!CheckNegative(pDM_Odm, v1, v2))
251 READ_NEXT_PAIR(v1, v2, i);
255 /* Condition isn't matched.
256 * Discard the following (offset, data) pairs.
258 while (v1 < 0x40000000 && i < ArrayLen-2)
259 READ_NEXT_PAIR(v1, v2, i);
261 i -= 2; /* prevent from for-loop += 2 */
263 /* Configure matched pairs and skip to end of if-else. */
264 while (v1 < 0x40000000 && i < ArrayLen-2) {
265 odm_ConfigBB_AGC_8723B(pDM_Odm, v1, bMaskDWord, v2);
266 READ_NEXT_PAIR(v1, v2, i);
269 /* Keeps reading until ENDIF. */
270 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
271 while (cCond != COND_ENDIF && i < ArrayLen-2) {
272 READ_NEXT_PAIR(v1, v2, i);
273 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
280 /******************************************************************************
282 ******************************************************************************/
284 static u32 Array_MP_8723B_PHY_REG[] = {
481 void ODM_ReadAndConfig_MP_8723B_PHY_REG(struct dm_odm_t *pDM_Odm)
484 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_PHY_REG);
485 u32 *Array = Array_MP_8723B_PHY_REG;
487 for (i = 0; i < ArrayLen; i += 2) {
491 /* This (offset, data) pair doesn't care the condition. */
492 if (v1 < 0x40000000) {
493 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
496 /* This line is the beginning of branch. */
497 bool bMatched = true;
498 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
500 if (cCond == COND_ELSE) { /* ELSE, ENDIF */
502 READ_NEXT_PAIR(v1, v2, i);
503 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
505 READ_NEXT_PAIR(v1, v2, i);
506 READ_NEXT_PAIR(v1, v2, i);
508 READ_NEXT_PAIR(v1, v2, i);
509 if (!CheckNegative(pDM_Odm, v1, v2))
513 READ_NEXT_PAIR(v1, v2, i);
517 /* Condition isn't matched.
518 * Discard the following (offset, data) pairs.
520 while (v1 < 0x40000000 && i < ArrayLen-2)
521 READ_NEXT_PAIR(v1, v2, i);
523 i -= 2; /* prevent from for-loop += 2 */
524 } else { /* Configure matched pairs and skip to end of if-else. */
525 while (v1 < 0x40000000 && i < ArrayLen-2) {
526 odm_ConfigBB_PHY_8723B(pDM_Odm, v1, bMaskDWord, v2);
527 READ_NEXT_PAIR(v1, v2, i);
530 /* Keeps reading until ENDIF. */
531 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
532 while (cCond != COND_ENDIF && i < ArrayLen-2) {
533 READ_NEXT_PAIR(v1, v2, i);
534 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
541 /******************************************************************************
543 ******************************************************************************/
545 static u32 Array_MP_8723B_PHY_REG_PG[] = {
546 0, 0x00000e08, 0x0000ff00, 0x00003800,
547 0, 0x0000086c, 0xffffff00, 0x32343600,
548 0, 0x00000e00, 0xffffffff, 0x40424444,
549 0, 0x00000e04, 0xffffffff, 0x28323638,
550 0, 0x00000e10, 0xffffffff, 0x38404244,
551 0, 0x00000e14, 0xffffffff, 0x26303436
554 void ODM_ReadAndConfig_MP_8723B_PHY_REG_PG(struct dm_odm_t *pDM_Odm)
557 u32 *Array = Array_MP_8723B_PHY_REG_PG;
559 pDM_Odm->PhyRegPgVersion = 1;
560 pDM_Odm->PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
562 for (i = 0; i < ARRAY_SIZE(Array_MP_8723B_PHY_REG_PG); i += 4) {
568 odm_ConfigBB_PHY_REG_PG_8723B(pDM_Odm, v1, v2, v3, v4);