1
2
3
4
5
6
7
8#include <linux/kernel.h>
9#include "odm_precomp.h"
10
11static bool CheckPositive(
12 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
13)
14{
15 u8 _BoardType =
16 ((pDM_Odm->BoardType & BIT4) >> 4) << 0 |
17 ((pDM_Odm->BoardType & BIT3) >> 3) << 1 |
18 ((pDM_Odm->BoardType & BIT7) >> 7) << 2 |
19 ((pDM_Odm->BoardType & BIT6) >> 6) << 3 |
20 ((pDM_Odm->BoardType & BIT2) >> 2) << 4;
21
22 u32 cond1 = Condition1, cond2 = Condition2;
23 u32 driver1 =
24 pDM_Odm->CutVersion << 24 |
25 pDM_Odm->SupportPlatform << 16 |
26 pDM_Odm->PackageType << 12 |
27 pDM_Odm->SupportInterface << 8 |
28 _BoardType;
29
30 u32 driver2 =
31 pDM_Odm->TypeGLNA << 0 |
32 pDM_Odm->TypeGPA << 8 |
33 pDM_Odm->TypeALNA << 16 |
34 pDM_Odm->TypeAPA << 24;
35
36 ODM_RT_TRACE(
37 pDM_Odm,
38 ODM_COMP_INIT,
39 ODM_DBG_TRACE,
40 (
41 "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n",
42 cond1,
43 cond2
44 )
45 );
46 ODM_RT_TRACE(
47 pDM_Odm,
48 ODM_COMP_INIT,
49 ODM_DBG_TRACE,
50 (
51 "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n",
52 driver1,
53 driver2
54 )
55 );
56
57 ODM_RT_TRACE(
58 pDM_Odm,
59 ODM_COMP_INIT,
60 ODM_DBG_TRACE,
61 (
62 " (Platform, Interface) = (0x%X, 0x%X)\n",
63 pDM_Odm->SupportPlatform,
64 pDM_Odm->SupportInterface
65 )
66 );
67 ODM_RT_TRACE(
68 pDM_Odm,
69 ODM_COMP_INIT,
70 ODM_DBG_TRACE,
71 (
72 " (Board, Package) = (0x%X, 0x%X)\n",
73 pDM_Odm->BoardType,
74 pDM_Odm->PackageType
75 )
76 );
77
78
79
80
81
82 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))
83 return false;
84 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))
85 return false;
86
87
88
89
90 cond1 &= 0x000F0FFF;
91 driver1 &= 0x000F0FFF;
92
93 if ((cond1 & driver1) == cond1) {
94 u32 bitMask = 0;
95 if ((cond1 & 0x0F) == 0)
96 return true;
97
98 if ((cond1 & BIT0) != 0)
99 bitMask |= 0x000000FF;
100 if ((cond1 & BIT1) != 0)
101 bitMask |= 0x0000FF00;
102 if ((cond1 & BIT2) != 0)
103 bitMask |= 0x00FF0000;
104 if ((cond1 & BIT3) != 0)
105 bitMask |= 0xFF000000;
106
107 if ((cond2 & bitMask) == (driver2 & bitMask))
108 return true;
109 }
110 return false;
111}
112
113static bool CheckNegative(
114 PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
115)
116{
117 return true;
118}
119
120
121
122
123
124static u32 Array_MP_8723B_MAC_REG[] = {
125 0x02F, 0x00000030,
126 0x035, 0x00000000,
127 0x039, 0x00000008,
128 0x04E, 0x000000E0,
129 0x064, 0x00000000,
130 0x067, 0x00000020,
131 0x428, 0x0000000A,
132 0x429, 0x00000010,
133 0x430, 0x00000000,
134 0x431, 0x00000000,
135 0x432, 0x00000000,
136 0x433, 0x00000001,
137 0x434, 0x00000004,
138 0x435, 0x00000005,
139 0x436, 0x00000007,
140 0x437, 0x00000008,
141 0x43C, 0x00000004,
142 0x43D, 0x00000005,
143 0x43E, 0x00000007,
144 0x43F, 0x00000008,
145 0x440, 0x0000005D,
146 0x441, 0x00000001,
147 0x442, 0x00000000,
148 0x444, 0x00000010,
149 0x445, 0x00000000,
150 0x446, 0x00000000,
151 0x447, 0x00000000,
152 0x448, 0x00000000,
153 0x449, 0x000000F0,
154 0x44A, 0x0000000F,
155 0x44B, 0x0000003E,
156 0x44C, 0x00000010,
157 0x44D, 0x00000000,
158 0x44E, 0x00000000,
159 0x44F, 0x00000000,
160 0x450, 0x00000000,
161 0x451, 0x000000F0,
162 0x452, 0x0000000F,
163 0x453, 0x00000000,
164 0x456, 0x0000005E,
165 0x460, 0x00000066,
166 0x461, 0x00000066,
167 0x4C8, 0x000000FF,
168 0x4C9, 0x00000008,
169 0x4CC, 0x000000FF,
170 0x4CD, 0x000000FF,
171 0x4CE, 0x00000001,
172 0x500, 0x00000026,
173 0x501, 0x000000A2,
174 0x502, 0x0000002F,
175 0x503, 0x00000000,
176 0x504, 0x00000028,
177 0x505, 0x000000A3,
178 0x506, 0x0000005E,
179 0x507, 0x00000000,
180 0x508, 0x0000002B,
181 0x509, 0x000000A4,
182 0x50A, 0x0000005E,
183 0x50B, 0x00000000,
184 0x50C, 0x0000004F,
185 0x50D, 0x000000A4,
186 0x50E, 0x00000000,
187 0x50F, 0x00000000,
188 0x512, 0x0000001C,
189 0x514, 0x0000000A,
190 0x516, 0x0000000A,
191 0x525, 0x0000004F,
192 0x550, 0x00000010,
193 0x551, 0x00000010,
194 0x559, 0x00000002,
195 0x55C, 0x00000050,
196 0x55D, 0x000000FF,
197 0x605, 0x00000030,
198 0x608, 0x0000000E,
199 0x609, 0x0000002A,
200 0x620, 0x000000FF,
201 0x621, 0x000000FF,
202 0x622, 0x000000FF,
203 0x623, 0x000000FF,
204 0x624, 0x000000FF,
205 0x625, 0x000000FF,
206 0x626, 0x000000FF,
207 0x627, 0x000000FF,
208 0x638, 0x00000050,
209 0x63C, 0x0000000A,
210 0x63D, 0x0000000A,
211 0x63E, 0x0000000E,
212 0x63F, 0x0000000E,
213 0x640, 0x00000040,
214 0x642, 0x00000040,
215 0x643, 0x00000000,
216 0x652, 0x000000C8,
217 0x66E, 0x00000005,
218 0x700, 0x00000021,
219 0x701, 0x00000043,
220 0x702, 0x00000065,
221 0x703, 0x00000087,
222 0x708, 0x00000021,
223 0x709, 0x00000043,
224 0x70A, 0x00000065,
225 0x70B, 0x00000087,
226 0x765, 0x00000018,
227 0x76E, 0x00000004,
228
229};
230
231void ODM_ReadAndConfig_MP_8723B_MAC_REG(PDM_ODM_T pDM_Odm)
232{
233 u32 i = 0;
234 u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_MAC_REG);
235 u32 *Array = Array_MP_8723B_MAC_REG;
236
237 ODM_RT_TRACE(
238 pDM_Odm,
239 ODM_COMP_INIT,
240 ODM_DBG_LOUD,
241 ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n")
242 );
243
244 for (i = 0; i < ArrayLen; i += 2) {
245 u32 v1 = Array[i];
246 u32 v2 = Array[i+1];
247
248
249 if (v1 < 0x40000000) {
250 odm_ConfigMAC_8723B(pDM_Odm, v1, (u8)v2);
251 continue;
252 } else {
253
254 bool bMatched = true;
255 u8 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
256
257 if (cCond == COND_ELSE) {
258 bMatched = true;
259 READ_NEXT_PAIR(v1, v2, i);
260 } else if (!CheckPositive(pDM_Odm, v1, v2)) {
261 bMatched = false;
262 READ_NEXT_PAIR(v1, v2, i);
263 READ_NEXT_PAIR(v1, v2, i);
264 } else {
265 READ_NEXT_PAIR(v1, v2, i);
266 if (!CheckNegative(pDM_Odm, v1, v2))
267 bMatched = false;
268 else
269 bMatched = true;
270 READ_NEXT_PAIR(v1, v2, i);
271 }
272
273 if (!bMatched) {
274
275 while (v1 < 0x40000000 && i < ArrayLen-2)
276 READ_NEXT_PAIR(v1, v2, i);
277
278 i -= 2;
279 } else {
280 while (v1 < 0x40000000 && i < ArrayLen-2) {
281 odm_ConfigMAC_8723B(pDM_Odm, v1, (u8)v2);
282 READ_NEXT_PAIR(v1, v2, i);
283 }
284
285
286 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
287 while (cCond != COND_ENDIF && i < ArrayLen-2) {
288 READ_NEXT_PAIR(v1, v2, i);
289 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
290 }
291 }
292 }
293 }
294}
295