• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
CheckCondition(const u32 Condition,const u32 Hex)18 static 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;
33 	cond = cond >> 8;
34 	if ((_interface & cond) == 0 && cond != 0x07)
35 		return false;
36 
37 	cond = Condition & 0x00FF0000;
38 	cond = cond >> 16;
39 	if ((_platform & cond) == 0 && cond != 0x0F)
40 		return false;
41 	return true;
42 }
43 
44 /******************************************************************************
45 *                           RadioA_1T.TXT
46 ******************************************************************************/
47 
48 static u32 Array_RadioA_1T_8723A[] = {
49 	0x000, 0x00030159,
50 	0x001, 0x00031284,
51 	0x002, 0x00098000,
52 	0xFF0F011F, 0xABCD,
53 	0x003, 0x00018C63,
54 	0xCDCDCDCD, 0xCDCD,
55 	0x003, 0x00039C63,
56 	0xFF0F011F, 0xDEAD,
57 	0x004, 0x000210E7,
58 	0x009, 0x0002044F,
59 	0x00A, 0x0001A3F1,
60 	0x00B, 0x00014787,
61 	0x00C, 0x000896FE,
62 	0x00D, 0x0000E02C,
63 	0x00E, 0x00039CE7,
64 	0x00F, 0x00000451,
65 	0x019, 0x00000000,
66 	0x01A, 0x00030355,
67 	0x01B, 0x00060A00,
68 	0x01C, 0x000FC378,
69 	0x01D, 0x000A1250,
70 	0x01E, 0x0000024F,
71 	0x01F, 0x00000000,
72 	0x020, 0x0000B614,
73 	0x021, 0x0006C000,
74 	0x022, 0x00000000,
75 	0x023, 0x00001558,
76 	0x024, 0x00000060,
77 	0x025, 0x00000483,
78 	0x026, 0x0004F000,
79 	0x027, 0x000EC7D9,
80 	0x028, 0x00057730,
81 	0x029, 0x00004783,
82 	0x02A, 0x00000001,
83 	0x02B, 0x00021334,
84 	0x02A, 0x00000000,
85 	0x02B, 0x00000054,
86 	0x02A, 0x00000001,
87 	0x02B, 0x00000808,
88 	0x02B, 0x00053333,
89 	0x02C, 0x0000000C,
90 	0x02A, 0x00000002,
91 	0x02B, 0x00000808,
92 	0x02B, 0x0005B333,
93 	0x02C, 0x0000000D,
94 	0x02A, 0x00000003,
95 	0x02B, 0x00000808,
96 	0x02B, 0x00063333,
97 	0x02C, 0x0000000D,
98 	0x02A, 0x00000004,
99 	0x02B, 0x00000808,
100 	0x02B, 0x0006B333,
101 	0x02C, 0x0000000D,
102 	0x02A, 0x00000005,
103 	0x02B, 0x00000808,
104 	0x02B, 0x00073333,
105 	0x02C, 0x0000000D,
106 	0x02A, 0x00000006,
107 	0x02B, 0x00000709,
108 	0x02B, 0x0005B333,
109 	0x02C, 0x0000000D,
110 	0x02A, 0x00000007,
111 	0x02B, 0x00000709,
112 	0x02B, 0x00063333,
113 	0x02C, 0x0000000D,
114 	0x02A, 0x00000008,
115 	0x02B, 0x0000060A,
116 	0x02B, 0x0004B333,
117 	0x02C, 0x0000000D,
118 	0x02A, 0x00000009,
119 	0x02B, 0x0000060A,
120 	0x02B, 0x00053333,
121 	0x02C, 0x0000000D,
122 	0x02A, 0x0000000A,
123 	0x02B, 0x0000060A,
124 	0x02B, 0x0005B333,
125 	0x02C, 0x0000000D,
126 	0x02A, 0x0000000B,
127 	0x02B, 0x0000060A,
128 	0x02B, 0x00063333,
129 	0x02C, 0x0000000D,
130 	0x02A, 0x0000000C,
131 	0x02B, 0x0000060A,
132 	0x02B, 0x0006B333,
133 	0x02C, 0x0000000D,
134 	0x02A, 0x0000000D,
135 	0x02B, 0x0000060A,
136 	0x02B, 0x00073333,
137 	0x02C, 0x0000000D,
138 	0x02A, 0x0000000E,
139 	0x02B, 0x0000050B,
140 	0x02B, 0x00066666,
141 	0x02C, 0x0000001A,
142 	0x02A, 0x000E0000,
143 	0x010, 0x0004000F,
144 	0x011, 0x000E31FC,
145 	0x010, 0x0006000F,
146 	0x011, 0x000FF9F8,
147 	0x010, 0x0002000F,
148 	0x011, 0x000203F9,
149 	0x010, 0x0003000F,
150 	0x011, 0x000FF500,
151 	0x010, 0x00000000,
152 	0x011, 0x00000000,
153 	0x010, 0x0008000F,
154 	0x011, 0x0003F100,
155 	0x010, 0x0009000F,
156 	0x011, 0x00023100,
157 	0x012, 0x00032000,
158 	0x012, 0x00071000,
159 	0x012, 0x000B0000,
160 	0x012, 0x000FC000,
161 	0x013, 0x000287B3,
162 	0x013, 0x000244B7,
163 	0x013, 0x000204AB,
164 	0x013, 0x0001C49F,
165 	0x013, 0x00018493,
166 	0x013, 0x0001429B,
167 	0x013, 0x00010299,
168 	0x013, 0x0000C29C,
169 	0x013, 0x000081A0,
170 	0x013, 0x000040AC,
171 	0x013, 0x00000020,
172 	0x014, 0x0001944C,
173 	0x014, 0x00059444,
174 	0x014, 0x0009944C,
175 	0x014, 0x000D9444,
176 	0xFF0F011F, 0xABCD,
177 	0x015, 0x0000F424,
178 	0x015, 0x0004F424,
179 	0x015, 0x0008F424,
180 	0x015, 0x000CF424,
181 	0xCDCDCDCD, 0xCDCD,
182 	0x015, 0x0000F474,
183 	0x015, 0x0004F477,
184 	0x015, 0x0008F455,
185 	0x015, 0x000CF455,
186 	0xFF0F011F, 0xDEAD,
187 	0x016, 0x00000339,
188 	0x016, 0x00040339,
189 	0x016, 0x00080339,
190 	0xFF0F011F, 0xABCD,
191 	0x016, 0x000C0356,
192 	0xCDCDCDCD, 0xCDCD,
193 	0x016, 0x000C0366,
194 	0xFF0F011F, 0xDEAD,
195 	0x000, 0x00010159,
196 	0x018, 0x0000F401,
197 	0x0FE, 0x00000000,
198 	0x0FE, 0x00000000,
199 	0x01F, 0x00000003,
200 	0x0FE, 0x00000000,
201 	0x0FE, 0x00000000,
202 	0x01E, 0x00000247,
203 	0x01F, 0x00000000,
204 	0x000, 0x00030159,
205 };
206 
ODM_ReadAndConfig_RadioA_1T_8723A(struct dm_odm_t * pDM_Odm)207 void ODM_ReadAndConfig_RadioA_1T_8723A(struct dm_odm_t *pDM_Odm)
208 {
209 	#define READ_NEXT_PAIR(v1, v2, i)			\
210 		 do {						\
211 			 i += 2; v1 = Array[i]; v2 = Array[i+1];\
212 		 } while (0)
213 
214 	u32     hex         = 0;
215 	u32     i           = 0;
216 	u8     platform    = 0x04;
217 	u8     interfaceValue   = pDM_Odm->SupportInterface;
218 	u8     board       = pDM_Odm->BoardType;
219 	u32     ArrayLen    = sizeof(Array_RadioA_1T_8723A)/sizeof(u32);
220 	u32 *Array = Array_RadioA_1T_8723A;
221 
222 	hex += board;
223 	hex += interfaceValue << 8;
224 	hex += platform << 16;
225 	hex += 0xFF000000;
226 
227 	for (i = 0; i < ArrayLen; i += 2) {
228 		u32 v1 = Array[i];
229 		u32 v2 = Array[i+1];
230 
231 		/*  This (offset, data) pair meets the condition. */
232 		if (v1 < 0xCDCDCDCD) {
233 			odm_ConfigRFReg_8723A(pDM_Odm, v1, v2, RF_PATH_A, v1);
234 			continue;
235 		} else {
236 			if (!CheckCondition(Array[i], hex)) {
237 				/*  Discard the following (offset, data) pairs. */
238 				READ_NEXT_PAIR(v1, v2, i);
239 				while (v2 != 0xDEAD &&
240 				       v2 != 0xCDEF &&
241 				       v2 != 0xCDCD && i < ArrayLen - 2)
242 					READ_NEXT_PAIR(v1, v2, i);
243 				i -= 2; /*  prevent from for-loop += 2 */
244 			} else {
245 				/*  Configure matched pairs and skip to end of if-else. */
246 				READ_NEXT_PAIR(v1, v2, i);
247 				while (v2 != 0xDEAD &&
248 				       v2 != 0xCDEF &&
249 				       v2 != 0xCDCD && i < ArrayLen - 2) {
250 					odm_ConfigRFReg_8723A(pDM_Odm, v1, v2,
251 							      RF_PATH_A, v1);
252 					READ_NEXT_PAIR(v1, v2, i);
253 				}
254 
255 				while (v2 != 0xDEAD && i < ArrayLen - 2)
256 					READ_NEXT_PAIR(v1, v2, i);
257 			}
258 		}
259 	}
260 }
261