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 ******************************************************************************/
16 #include "odm_precomp.h"
18 static bool CheckCondition(const u32 Condition, const u32 Hex)
20 u32 _board = (Hex & 0x000000FF);
21 u32 _interface = (Hex & 0x0000FF00) >> 8;
22 u32 _platform = (Hex & 0x00FF0000) >> 16;
25 if (Condition == 0xCDCDCDCD)
28 cond = Condition & 0x000000FF;
29 if ((_board == cond) && cond != 0x00)
32 cond = Condition & 0x0000FF00;
34 if ((_interface & cond) == 0 && cond != 0x07)
37 cond = Condition & 0x00FF0000;
39 if ((_platform & cond) == 0 && cond != 0x0F)
44 /******************************************************************************
46 ******************************************************************************/
48 static u32 Array_AGC_TAB_1T_8723A[] = {
211 #define READ_NEXT_PAIR(v1, v2, i) \
213 i += 2; v1 = Array[i]; v2 = Array[i+1]; \
216 void ODM_ReadAndConfig_AGC_TAB_1T_8723A(struct dm_odm_t *pDM_Odm)
222 u8 interfaceValue = pDM_Odm->SupportInterface;
223 u8 board = pDM_Odm->BoardType;
224 u32 ArrayLen = sizeof(Array_AGC_TAB_1T_8723A)/sizeof(u32);
225 u32 *Array = Array_AGC_TAB_1T_8723A;
228 hex += interfaceValue << 8;
229 hex += platform << 16;
231 for (i = 0; i < ArrayLen; i += 2) {
235 /* This (offset, data) pair meets the condition. */
236 if (v1 < 0xCDCDCDCD) {
237 odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2);
240 if (!CheckCondition(Array[i], hex)) {
241 /* Discard the following (offset, data) pairs. */
242 READ_NEXT_PAIR(v1, v2, i);
243 while (v2 != 0xDEAD &&
245 v2 != 0xCDCD && i < ArrayLen - 2)
246 READ_NEXT_PAIR(v1, v2, i);
247 i -= 2; /* prevent from for-loop += 2 */
249 /* Configure matched pairs and skip to end of if-else. */
250 READ_NEXT_PAIR(v1, v2, i);
251 while (v2 != 0xDEAD &&
253 v2 != 0xCDCD && i < ArrayLen - 2) {
254 odm_ConfigBB_AGC_8723A(pDM_Odm, v1, bMaskDWord, v2);
255 READ_NEXT_PAIR(v1, v2, i);
257 while (v2 != 0xDEAD && i < ArrayLen - 2)
258 READ_NEXT_PAIR(v1, v2, i);
264 /******************************************************************************
266 ******************************************************************************/
268 static u32 Array_PHY_REG_1T_8723A[] = {
465 void ODM_ReadAndConfig_PHY_REG_1T_8723A(struct dm_odm_t *pDM_Odm)
470 u8 interfaceValue = pDM_Odm->SupportInterface;
471 u8 board = pDM_Odm->BoardType;
472 u32 ArrayLen = sizeof(Array_PHY_REG_1T_8723A)/sizeof(u32);
473 u32 *Array = Array_PHY_REG_1T_8723A;
476 hex += interfaceValue << 8;
477 hex += platform << 16;
479 for (i = 0; i < ArrayLen; i += 2) {
483 /* This (offset, data) pair meets the condition. */
484 if (v1 < 0xCDCDCDCD) {
485 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2);
488 if (!CheckCondition(Array[i], hex)) {
489 /* Discard the following (offset, data) pairs. */
490 READ_NEXT_PAIR(v1, v2, i);
491 while (v2 != 0xDEAD &&
493 v2 != 0xCDCD && i < ArrayLen - 2)
494 READ_NEXT_PAIR(v1, v2, i);
495 i -= 2; /* prevent from for-loop += 2 */
497 /* Configure matched pairs and skip to end of if-else. */
498 READ_NEXT_PAIR(v1, v2, i);
499 while (v2 != 0xDEAD &&
501 v2 != 0xCDCD && i < ArrayLen - 2) {
502 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2);
503 READ_NEXT_PAIR(v1, v2, i);
505 while (v2 != 0xDEAD && i < ArrayLen - 2)
506 READ_NEXT_PAIR(v1, v2, i);
512 /******************************************************************************
514 ******************************************************************************/
516 static u32 Array_PHY_REG_MP_8723A[] = {
521 void ODM_ReadAndConfig_PHY_REG_MP_8723A(struct dm_odm_t *pDM_Odm)
526 u8 interfaceValue = pDM_Odm->SupportInterface;
527 u8 board = pDM_Odm->BoardType;
528 u32 ArrayLen = sizeof(Array_PHY_REG_MP_8723A)/sizeof(u32);
529 u32 *Array = Array_PHY_REG_MP_8723A;
532 hex += interfaceValue << 8;
533 hex += platform << 16;
535 for (i = 0; i < ArrayLen; i += 2) {
539 /* This (offset, data) pair meets the condition. */
540 if (v1 < 0xCDCDCDCD) {
541 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2);
544 if (!CheckCondition(Array[i], hex)) {
545 /* Discard the following (offset, data) pairs. */
546 READ_NEXT_PAIR(v1, v2, i);
547 while (v2 != 0xDEAD &&
549 v2 != 0xCDCD && i < ArrayLen - 2)
550 READ_NEXT_PAIR(v1, v2, i);
551 i -= 2; /* prevent from for-loop += 2 */
553 /* Configure matched pairs and skip to end of if-else. */
554 READ_NEXT_PAIR(v1, v2, i);
555 while (v2 != 0xDEAD &&
557 v2 != 0xCDCD && i < ArrayLen - 2) {
558 odm_ConfigBB_PHY_8723A(pDM_Odm, v1, bMaskDWord, v2);
559 READ_NEXT_PAIR(v1, v2, i);
561 while (v2 != 0xDEAD && i < ArrayLen - 2)
562 READ_NEXT_PAIR(v1, v2, i);