8723BU: Update 8723BU wifi driver to version v4.3.16_14189.20150519_BTCOEX2015119...
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / OUTSRC / rtl8723b / HalHWImg8723B_MAC.c
1 /****************************************************************************** \r
2\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. \r
4\r
5 * This program is free software; you can redistribute it and/or modify it \r
6 * under the terms of version 2 of the GNU General Public License as \r
7 * published by the Free Software Foundation. \r
8\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT \r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or \r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for \r
12 * more details. \r
13\r
14 * You should have received a copy of the GNU General Public License along with \r
15 * this program; if not, write to the Free Software Foundation, Inc., \r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA \r
17\r
18\r
19 ******************************************************************************/\r
20 \r
21 /*Image2HeaderVersion: 2.9*/\r
22 #include "Mp_Precomp.h"\r
23 #include "../phydm_precomp.h"\r
24 \r
25 #if (RTL8723B_SUPPORT == 1)\r
26 static BOOLEAN\r
27 CheckPositive(\r
28     IN  PDM_ODM_T     pDM_Odm,\r
29     IN  const u4Byte  Condition1,\r
30     IN  const u4Byte  Condition2\r
31     )\r
32 {\r
33     u1Byte    _BoardType = ((pDM_Odm->BoardType & BIT4) >> 4) << 0 | // _GLNA\r
34                            ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | // _GPA \r
35                            ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | // _ALNA\r
36                            ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | // _APA \r
37                            ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  // _BT  \r
38 \r
39         u4Byte    cond1   = Condition1, cond2 = Condition2;\r
40         u4Byte    driver1 = pDM_Odm->CutVersion       << 24 | \r
41                                 (pDM_Odm->SupportInterface & 0xF0) << 16 | \r
42                                 pDM_Odm->SupportPlatform  << 16 | \r
43                                 pDM_Odm->PackageType      << 12 | \r
44                                 (pDM_Odm->SupportInterface & 0x0F) << 8  |\r
45                                 _BoardType;\r
46 \r
47         u4Byte    driver2 = pDM_Odm->TypeGLNA <<  0 |  \r
48                                 pDM_Odm->TypeGPA  <<  8 | \r
49                                 pDM_Odm->TypeALNA << 16 | \r
50                                 pDM_Odm->TypeAPA  << 24; \r
51 \r
52     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
53                 ("===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", cond1, cond2));\r
54     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
55                 ("===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", driver1, driver2));\r
56 \r
57     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
58                 ("      (Platform, Interface) = (0x%X, 0x%X)\n", pDM_Odm->SupportPlatform, pDM_Odm->SupportInterface));\r
59     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_TRACE, \r
60                 ("      (Board, Package) = (0x%X, 0x%X)\n", pDM_Odm->BoardType, pDM_Odm->PackageType));\r
61 \r
62 \r
63         /*============== Value Defined Check ===============*/\r
64         /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/\r
65         \r
66         if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != (driver1 & 0x0000F000)))\r
67                 return FALSE;\r
68         if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != (driver1 & 0x0F000000)))\r
69                 return FALSE;\r
70 \r
71         /*=============== Bit Defined Check ================*/\r
72         /* We don't care [31:28] */\r
73 \r
74         cond1   &= 0x00FF0FFF; \r
75         driver1 &= 0x00FF0FFF; \r
76 \r
77         if ((cond1 & driver1) == cond1) {\r
78                 u4Byte bitMask = 0;\r
79 \r
80                 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/\r
81             return TRUE;\r
82 \r
83                 if ((cond1 & BIT0) != 0) /*GLNA*/\r
84             bitMask |= 0x000000FF;\r
85                 if ((cond1 & BIT1) != 0) /*GPA*/\r
86             bitMask |= 0x0000FF00;\r
87                 if ((cond1 & BIT2) != 0) /*ALNA*/\r
88             bitMask |= 0x00FF0000;\r
89                 if ((cond1 & BIT3) != 0) /*APA*/\r
90             bitMask |= 0xFF000000;\r
91 \r
92                 if ((cond2 & bitMask) == (driver2 & bitMask)) /* BoardType of each RF path is matched*/\r
93             return TRUE;\r
94                 else\r
95             return FALSE;\r
96                 } else\r
97         return FALSE;\r
98 }\r
99 static BOOLEAN\r
100 CheckNegative(\r
101     IN  PDM_ODM_T     pDM_Odm,\r
102     IN  const u4Byte  Condition1,\r
103     IN  const u4Byte  Condition2\r
104     )\r
105 {\r
106     return TRUE;\r
107 }\r
108 \r
109 /******************************************************************************\r
110 *                           MAC_REG.TXT\r
111 ******************************************************************************/\r
112 \r
113 u4Byte Array_MP_8723B_MAC_REG[] = { \r
114                 0x02F, 0x00000030,\r
115                 0x035, 0x00000000,\r
116                 0x039, 0x00000008,\r
117                 0x064, 0x00000000,\r
118                 0x067, 0x00000020,\r
119                 0x421, 0x0000000F,\r
120                 0x428, 0x0000000A,\r
121                 0x429, 0x00000010,\r
122                 0x430, 0x00000000,\r
123                 0x431, 0x00000000,\r
124                 0x432, 0x00000000,\r
125                 0x433, 0x00000001,\r
126                 0x434, 0x00000004,\r
127                 0x435, 0x00000005,\r
128                 0x436, 0x00000007,\r
129                 0x437, 0x00000008,\r
130                 0x43C, 0x00000004,\r
131                 0x43D, 0x00000005,\r
132                 0x43E, 0x00000007,\r
133                 0x43F, 0x00000008,\r
134                 0x440, 0x0000005D,\r
135                 0x441, 0x00000001,\r
136                 0x442, 0x00000000,\r
137                 0x444, 0x00000010,\r
138                 0x445, 0x00000000,\r
139                 0x446, 0x00000000,\r
140                 0x447, 0x00000000,\r
141                 0x448, 0x00000000,\r
142                 0x449, 0x000000F0,\r
143                 0x44A, 0x0000000F,\r
144                 0x44B, 0x0000003E,\r
145                 0x44C, 0x00000010,\r
146                 0x44D, 0x00000000,\r
147                 0x44E, 0x00000000,\r
148                 0x44F, 0x00000000,\r
149                 0x450, 0x00000000,\r
150                 0x451, 0x000000F0,\r
151                 0x452, 0x0000000F,\r
152                 0x453, 0x00000000,\r
153                 0x456, 0x0000005E,\r
154                 0x460, 0x00000066,\r
155                 0x461, 0x00000066,\r
156                 0x4C8, 0x000000FF,\r
157                 0x4C9, 0x00000008,\r
158                 0x4CC, 0x000000FF,\r
159                 0x4CD, 0x000000FF,\r
160                 0x4CE, 0x00000001,\r
161                 0x500, 0x00000026,\r
162                 0x501, 0x000000A2,\r
163                 0x502, 0x0000002F,\r
164                 0x503, 0x00000000,\r
165                 0x504, 0x00000028,\r
166                 0x505, 0x000000A3,\r
167                 0x506, 0x0000005E,\r
168                 0x507, 0x00000000,\r
169                 0x508, 0x0000002B,\r
170                 0x509, 0x000000A4,\r
171                 0x50A, 0x0000005E,\r
172                 0x50B, 0x00000000,\r
173                 0x50C, 0x0000004F,\r
174                 0x50D, 0x000000A4,\r
175                 0x50E, 0x00000000,\r
176                 0x50F, 0x00000000,\r
177                 0x512, 0x0000001C,\r
178                 0x514, 0x0000000A,\r
179                 0x516, 0x0000000A,\r
180                 0x525, 0x0000004F,\r
181                 0x550, 0x00000010,\r
182                 0x551, 0x00000010,\r
183                 0x559, 0x00000002,\r
184                 0x55C, 0x00000050,\r
185                 0x55D, 0x000000FF,\r
186                 0x605, 0x00000030,\r
187                 0x608, 0x0000000E,\r
188                 0x609, 0x0000002A,\r
189                 0x620, 0x000000FF,\r
190                 0x621, 0x000000FF,\r
191                 0x622, 0x000000FF,\r
192                 0x623, 0x000000FF,\r
193                 0x624, 0x000000FF,\r
194                 0x625, 0x000000FF,\r
195                 0x626, 0x000000FF,\r
196                 0x627, 0x000000FF,\r
197                 0x638, 0x00000050,\r
198                 0x63C, 0x0000000A,\r
199                 0x63D, 0x0000000A,\r
200                 0x63E, 0x0000000E,\r
201                 0x63F, 0x0000000E,\r
202                 0x640, 0x00000040,\r
203                 0x642, 0x00000040,\r
204                 0x643, 0x00000000,\r
205                 0x652, 0x000000C8,\r
206                 0x66E, 0x00000005,\r
207                 0x700, 0x00000021,\r
208                 0x701, 0x00000043,\r
209                 0x702, 0x00000065,\r
210                 0x703, 0x00000087,\r
211                 0x708, 0x00000021,\r
212                 0x709, 0x00000043,\r
213                 0x70A, 0x00000065,\r
214                 0x70B, 0x00000087,\r
215                 0x765, 0x00000018,\r
216                 0x76E, 0x00000004,\r
217 \r
218 };\r
219 \r
220 void\r
221 ODM_ReadAndConfig_MP_8723B_MAC_REG(\r
222         IN   PDM_ODM_T  pDM_Odm\r
223         )\r
224 {\r
225     u4Byte     i         = 0;\r
226     u1Byte     cCond;\r
227     BOOLEAN bMatched = TRUE, bSkipped = FALSE;\r
228     u4Byte     ArrayLen    = sizeof(Array_MP_8723B_MAC_REG)/sizeof(u4Byte);\r
229     pu4Byte    Array       = Array_MP_8723B_MAC_REG;\r
230         \r
231     ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("===> ODM_ReadAndConfig_MP_8723B_MAC_REG\n"));\r
232 \r
233         while ((i + 1) < ArrayLen) {\r
234                 u4Byte v1 = Array[i];\r
235                 u4Byte v2 = Array[i+1];\r
236 \r
237                 if (v1 & (BIT31 | BIT30)) {/*positive & negative condition*/\r
238                         if (v1 & BIT31) {/* positive condition*/\r
239                                 cCond  = (u1Byte)((v1 & (BIT29|BIT28)) >> 28);\r
240                                 if (cCond == COND_ENDIF) {/*end*/\r
241                                         bMatched = TRUE;\r
242                                         bSkipped = FALSE;\r
243                                 } else if (cCond == COND_ELSE) /*else*/\r
244                                         bMatched = bSkipped?FALSE:TRUE;\r
245                                 else {/*if , else if*/\r
246                                         if (bSkipped)\r
247                                                 bMatched = FALSE;\r
248                                         else {\r
249                                                 if (CheckPositive(pDM_Odm, v1, v2)) {\r
250                                                         bMatched = TRUE;\r
251                                                         bSkipped = TRUE;\r
252                                                 } else {\r
253                                                         bMatched = FALSE;\r
254                                                         bSkipped = FALSE;\r
255                                                 }\r
256                                         }\r
257                                 }\r
258                         } else if (v1 & BIT30) { /*negative condition*/\r
259                         /*do nothing*/\r
260                         }\r
261                 } else {\r
262                         if (bMatched)\r
263                                 odm_ConfigMAC_8723B(pDM_Odm, v1, (u1Byte)v2);\r
264                 }\r
265         i = i + 2;\r
266         }\r
267 }\r
268 \r
269 u4Byte\r
270 ODM_GetVersion_MP_8723B_MAC_REG(void)\r
271 {\r
272            return 18;\r
273 }\r
274 \r
275 #endif /* end of HWIMG_SUPPORT*/\r
276 \r