Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8723bs / hal / HalHWImg8723B_MAC.c
1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3 *
4 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5 *
6 ******************************************************************************/
7
8 #include <linux/kernel.h>
9 #include "odm_precomp.h"
10
11 static 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 | /*  _GLNA */
17                 ((pDM_Odm->BoardType & BIT3) >> 3) << 1 | /*  _GPA */
18                 ((pDM_Odm->BoardType & BIT7) >> 7) << 2 | /*  _ALNA */
19                 ((pDM_Odm->BoardType & BIT6) >> 6) << 3 | /*  _APA */
20                 ((pDM_Odm->BoardType & BIT2) >> 2) << 4;  /*  _BT */
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         /*  Value Defined Check =============== */
80         /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
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         /*  Bit Defined Check ================ */
88         /*  We don't care [31:28] and [23:20] */
89         /*  */
90         cond1   &= 0x000F0FFF;
91         driver1 &= 0x000F0FFF;
92
93         if ((cond1 & driver1) == cond1) {
94                 u32 bitMask = 0;
95                 if ((cond1 & 0x0F) == 0) /*  BoardType is DONTCARE */
96                         return true;
97
98                 if ((cond1 & BIT0) != 0) /* GLNA */
99                         bitMask |= 0x000000FF;
100                 if ((cond1 & BIT1) != 0) /* GPA */
101                         bitMask |= 0x0000FF00;
102                 if ((cond1 & BIT2) != 0) /* ALNA */
103                         bitMask |= 0x00FF0000;
104                 if ((cond1 & BIT3) != 0) /* APA */
105                         bitMask |= 0xFF000000;
106
107                 if ((cond2 & bitMask) == (driver2 & bitMask)) /*  BoardType of each RF path is matched */
108                         return true;
109         }
110         return false;
111 }
112
113 static bool CheckNegative(
114         PDM_ODM_T pDM_Odm, const u32 Condition1, const u32 Condition2
115 )
116 {
117         return true;
118 }
119
120 /******************************************************************************
121 *                           MAC_REG.TXT
122 ******************************************************************************/
123
124 static 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
231 void 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                 /*  This (offset, data) pair doesn't care the condition. */
249                 if (v1 < 0x40000000) {
250                         odm_ConfigMAC_8723B(pDM_Odm, v1, (u8)v2);
251                         continue;
252                 } else {
253                         /*  This line is the beginning of branch. */
254                         bool bMatched = true;
255                         u8  cCond  = (u8)((v1 & (BIT29|BIT28)) >> 28);
256
257                         if (cCond == COND_ELSE) { /*  ELSE, ENDIF */
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                                 /*  Condition isn't matched. Discard the following (offset, data) pairs. */
275                                 while (v1 < 0x40000000 && i < ArrayLen-2)
276                                         READ_NEXT_PAIR(v1, v2, i);
277
278                                 i -= 2; /*  prevent from for-loop += 2 */
279                         } else { /*  Configure matched pairs and skip to end of if-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                                 /*  Keeps reading until ENDIF. */
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 }