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