Linux-libre 5.3.12-gnu
[librecmc/linux-libre.git] / drivers / staging / rtl8723bs / hal / HalHWImg8723B_RF.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         /*  Value Defined Check =============== */
79         /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
80
81         if (
82                 ((cond1 & 0x0000F000) != 0) &&
83                 ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))
84         )
85                 return false;
86
87         if (
88                 ((cond1 & 0x0F000000) != 0) &&
89                 ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))
90         )
91                 return false;
92
93         /*  Bit Defined Check ================ */
94         /*  We don't care [31:28] and [23:20] */
95         cond1   &= 0x000F0FFF;
96         driver1 &= 0x000F0FFF;
97
98         if ((cond1 & driver1) == cond1) {
99                 u32 bitMask = 0;
100
101                 if ((cond1 & 0x0F) == 0) /*  BoardType is DONTCARE */
102                         return true;
103
104                 if ((cond1 & BIT0) != 0) /* GLNA */
105                         bitMask |= 0x000000FF;
106                 if ((cond1 & BIT1) != 0) /* GPA */
107                         bitMask |= 0x0000FF00;
108                 if ((cond1 & BIT2) != 0) /* ALNA */
109                         bitMask |= 0x00FF0000;
110                 if ((cond1 & BIT3) != 0) /* APA */
111                         bitMask |= 0xFF000000;
112
113                 /*  BoardType of each RF path is matched */
114                 if ((cond2 & bitMask) == (driver2 & bitMask))
115                         return true;
116
117                 return false;
118         }
119
120         return false;
121 }
122
123 static bool CheckNegative(
124         PDM_ODM_T pDM_Odm, const u32  Condition1, const u32 Condition2
125 )
126 {
127         return true;
128 }
129
130 /******************************************************************************
131 *                           RadioA.TXT
132 ******************************************************************************/
133
134 static u32 Array_MP_8723B_RadioA[] = {
135                 0x000, 0x00010000,
136                 0x0B0, 0x000DFFE0,
137                 0x0FE, 0x00000000,
138                 0x0FE, 0x00000000,
139                 0x0FE, 0x00000000,
140                 0x0B1, 0x00000018,
141                 0x0FE, 0x00000000,
142                 0x0FE, 0x00000000,
143                 0x0FE, 0x00000000,
144                 0x0B2, 0x00084C00,
145                 0x0B5, 0x0000D2CC,
146                 0x0B6, 0x000925AA,
147                 0x0B7, 0x00000010,
148                 0x0B8, 0x0000907F,
149                 0x05C, 0x00000002,
150                 0x07C, 0x00000002,
151                 0x07E, 0x00000005,
152                 0x08B, 0x0006FC00,
153                 0x0B0, 0x000FF9F0,
154                 0x01C, 0x000739D2,
155                 0x01E, 0x00000000,
156                 0x0DF, 0x00000780,
157                 0x050, 0x00067435,
158         0x80002000, 0x00000000, 0x40000000, 0x00000000,
159                 0x051, 0x0006B10E,
160         0x90003000, 0x00000000, 0x40000000, 0x00000000,
161                 0x051, 0x0006B10E,
162         0x90004000, 0x00000000, 0x40000000, 0x00000000,
163                 0x051, 0x0006B10E,
164         0xA0000000, 0x00000000,
165                 0x051, 0x0006B04E,
166         0xB0000000, 0x00000000,
167                 0x052, 0x000007D2,
168                 0x053, 0x00000000,
169                 0x054, 0x00050400,
170                 0x055, 0x0004026E,
171                 0x0DD, 0x0000004C,
172                 0x070, 0x00067435,
173         0x80002000, 0x00000000, 0x40000000, 0x00000000,
174                 0x071, 0x0006B10E,
175         0x90003000, 0x00000000, 0x40000000, 0x00000000,
176                 0x071, 0x0006B10E,
177         0x90004000, 0x00000000, 0x40000000, 0x00000000,
178                 0x071, 0x0006B10E,
179         0xA0000000, 0x00000000,
180                 0x071, 0x0006B04E,
181         0xB0000000, 0x00000000,
182                 0x072, 0x000007D2,
183                 0x073, 0x00000000,
184                 0x074, 0x00050400,
185                 0x075, 0x0004026E,
186                 0x0EF, 0x00000100,
187                 0x034, 0x0000ADD7,
188                 0x035, 0x00005C00,
189                 0x034, 0x00009DD4,
190                 0x035, 0x00005000,
191                 0x034, 0x00008DD1,
192                 0x035, 0x00004400,
193                 0x034, 0x00007DCE,
194                 0x035, 0x00003800,
195                 0x034, 0x00006CD1,
196                 0x035, 0x00004400,
197                 0x034, 0x00005CCE,
198                 0x035, 0x00003800,
199                 0x034, 0x000048CE,
200                 0x035, 0x00004400,
201                 0x034, 0x000034CE,
202                 0x035, 0x00003800,
203                 0x034, 0x00002451,
204                 0x035, 0x00004400,
205                 0x034, 0x0000144E,
206                 0x035, 0x00003800,
207                 0x034, 0x00000051,
208                 0x035, 0x00004400,
209                 0x0EF, 0x00000000,
210                 0x0EF, 0x00000100,
211                 0x0ED, 0x00000010,
212                 0x044, 0x0000ADD7,
213                 0x044, 0x00009DD4,
214                 0x044, 0x00008DD1,
215                 0x044, 0x00007DCE,
216                 0x044, 0x00006CC1,
217                 0x044, 0x00005CCE,
218                 0x044, 0x000044D1,
219                 0x044, 0x000034CE,
220                 0x044, 0x00002451,
221                 0x044, 0x0000144E,
222                 0x044, 0x00000051,
223                 0x0EF, 0x00000000,
224                 0x0ED, 0x00000000,
225                 0x07F, 0x00020080,
226                 0x0EF, 0x00002000,
227                 0x03B, 0x000380EF,
228                 0x03B, 0x000302FE,
229                 0x03B, 0x00028CE6,
230                 0x03B, 0x000200BC,
231                 0x03B, 0x000188A5,
232                 0x03B, 0x00010FBC,
233                 0x03B, 0x00008F71,
234                 0x03B, 0x00000900,
235                 0x0EF, 0x00000000,
236                 0x0ED, 0x00000001,
237                 0x040, 0x000380EF,
238                 0x040, 0x000302FE,
239                 0x040, 0x00028CE6,
240                 0x040, 0x000200BC,
241                 0x040, 0x000188A5,
242                 0x040, 0x00010FBC,
243                 0x040, 0x00008F71,
244                 0x040, 0x00000900,
245                 0x0ED, 0x00000000,
246                 0x082, 0x00080000,
247                 0x083, 0x00008000,
248                 0x084, 0x00048D80,
249                 0x085, 0x00068000,
250                 0x0A2, 0x00080000,
251                 0x0A3, 0x00008000,
252                 0x0A4, 0x00048D80,
253                 0x0A5, 0x00068000,
254                 0x0ED, 0x00000002,
255                 0x0EF, 0x00000002,
256                 0x056, 0x00000032,
257                 0x076, 0x00000032,
258                 0x001, 0x00000780,
259
260 };
261
262 void ODM_ReadAndConfig_MP_8723B_RadioA(PDM_ODM_T pDM_Odm)
263 {
264         u32 i = 0;
265         u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_RadioA);
266         u32 *Array = Array_MP_8723B_RadioA;
267
268         ODM_RT_TRACE(
269                 pDM_Odm,
270                 ODM_COMP_INIT,
271                 ODM_DBG_LOUD,
272                 ("===> ODM_ReadAndConfig_MP_8723B_RadioA\n")
273         );
274
275         for (i = 0; i < ArrayLen; i += 2) {
276                 u32 v1 = Array[i];
277                 u32 v2 = Array[i+1];
278
279                 /*  This (offset, data) pair doesn't care the condition. */
280                 if (v1 < 0x40000000) {
281                         odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
282                         continue;
283                 } else {
284                         /*  This line is the beginning of branch. */
285                         bool bMatched = true;
286                         u8  cCond  = (u8)((v1 & (BIT29|BIT28)) >> 28);
287
288                         if (cCond == COND_ELSE) { /*  ELSE, ENDIF */
289                                 bMatched = true;
290                                 READ_NEXT_PAIR(v1, v2, i);
291                         } else if (!CheckPositive(pDM_Odm, v1, v2)) {
292                                 bMatched = false;
293                                 READ_NEXT_PAIR(v1, v2, i);
294                                 READ_NEXT_PAIR(v1, v2, i);
295                         } else {
296                                 READ_NEXT_PAIR(v1, v2, i);
297                                 if (!CheckNegative(pDM_Odm, v1, v2))
298                                         bMatched = false;
299                                 else
300                                         bMatched = true;
301                                 READ_NEXT_PAIR(v1, v2, i);
302                         }
303
304                         if (!bMatched) {
305                                 /*  Condition isn't matched.
306                                 *   Discard the following (offset, data) pairs.
307                                 */
308                                 while (v1 < 0x40000000 && i < ArrayLen-2)
309                                         READ_NEXT_PAIR(v1, v2, i);
310
311                                 i -= 2; /*  prevent from for-loop += 2 */
312                         } else {
313                                 /*  Configure matched pairs and skip to end of if-else. */
314                                 while (v1 < 0x40000000 && i < ArrayLen-2) {
315                                         odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
316                                         READ_NEXT_PAIR(v1, v2, i);
317                                 }
318
319                                 /*  Keeps reading until ENDIF. */
320                                 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
321                                 while (cCond != COND_ENDIF && i < ArrayLen-2) {
322                                         READ_NEXT_PAIR(v1, v2, i);
323                                         cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
324                                 }
325                         }
326                 }
327         }
328 }
329
330 /******************************************************************************
331 *                           TxPowerTrack_SDIO.TXT
332 ******************************************************************************/
333
334 static u8 gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {
335         {
336                 0, 1, 1, 2, 2, 3, 4, 5, 5, 6,  6,  7,  7,  8,  8,  9,
337                 9, 10, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
338         },
339         {
340                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10,
341                 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
342         },
343         {
344                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  7,  8,  8,  9,  9, 10,
345                 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
346         },
347 };
348 static u8 gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {
349         {
350                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12,
351                 12, 13, 14, 15, 15, 16, 16, 17, 17, 18, 19, 20, 20, 20
352         },
353         {
354                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12,
355                 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 19, 20, 20, 20
356         },
357         {
358                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12,
359                 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21
360         },
361 };
362 static u8 gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {
363         {
364                 0, 1, 2, 3, 3, 4, 4, 5, 5, 6,  7,  8,  8,  9,  9, 10,
365                 10, 11, 11, 12, 12, 13, 13, 14, 14, 14, 14, 14, 14, 14
366         },
367         {
368                 0, 1, 2, 3, 3, 4, 5, 6, 6, 6,  7,  7,  8,  8,  9, 10,
369                 11, 11, 12, 13, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16
370         },
371         {
372                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 10, 11,
373                 11, 12, 13, 14, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16
374         },
375 };
376 static u8 gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_SDIO_8723B[][DELTA_SWINGIDX_SIZE] = {
377         {
378                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
379                 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
380         },
381         {
382                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12,
383                 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21
384         },
385         {
386                 0, 1, 2, 3, 3, 4, 5, 6, 6, 7,  8,  9,  9, 10, 11, 12,
387                 12, 13, 14, 15, 15, 16, 17, 18, 18, 19, 20, 21, 21, 21
388         },
389 };
390 static u8 gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B[] = {
391         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6, 6,  6,
392         7,  7,  7, 8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15
393 };
394 static u8 gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[] = {
395         0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,
396         9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15
397 };
398 static u8 gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B[] = {
399         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  6,  6,
400         7,  7,  7,  8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15
401 };
402 static u8 gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[] = {
403         0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,
404         9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15
405 };
406 static u8 gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {
407         0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,
408         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
409 };
410 static u8 gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {
411         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,
412         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
413 };
414 static u8 gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {
415         0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,
416         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
417 };
418 static u8 gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {
419         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,
420         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
421 };
422
423 void ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(PDM_ODM_T pDM_Odm)
424 {
425         PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
426
427         ODM_RT_TRACE(
428                 pDM_Odm,
429                 ODM_COMP_INIT,
430                 ODM_DBG_LOUD,
431                 ("===> ODM_ReadAndConfig_MP_MP_8723B\n")
432         );
433
434
435         memcpy(
436                 pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P,
437                 gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B,
438                 DELTA_SWINGIDX_SIZE
439         );
440         memcpy(
441                 pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N,
442                 gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B,
443                 DELTA_SWINGIDX_SIZE
444         );
445         memcpy(
446                 pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P,
447                 gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B,
448                 DELTA_SWINGIDX_SIZE
449         );
450         memcpy(
451                 pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N,
452                 gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B,
453                 DELTA_SWINGIDX_SIZE
454         );
455
456         memcpy(
457                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P,
458                 gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B,
459                 DELTA_SWINGIDX_SIZE
460         );
461         memcpy(
462                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N,
463                 gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B,
464                 DELTA_SWINGIDX_SIZE
465         );
466         memcpy(
467                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P,
468                 gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B,
469                 DELTA_SWINGIDX_SIZE
470         );
471         memcpy(
472                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N,
473                 gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B,
474                 DELTA_SWINGIDX_SIZE
475         );
476
477         memcpy(
478                 pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P,
479                 gDeltaSwingTableIdx_MP_5GA_P_TxPowerTrack_SDIO_8723B,
480                 DELTA_SWINGIDX_SIZE*3
481         );
482         memcpy(
483                 pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N,
484                 gDeltaSwingTableIdx_MP_5GA_N_TxPowerTrack_SDIO_8723B,
485                 DELTA_SWINGIDX_SIZE*3
486         );
487         memcpy(
488                 pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P,
489                 gDeltaSwingTableIdx_MP_5GB_P_TxPowerTrack_SDIO_8723B,
490                 DELTA_SWINGIDX_SIZE*3
491         );
492         memcpy(
493                 pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N,
494                 gDeltaSwingTableIdx_MP_5GB_N_TxPowerTrack_SDIO_8723B,
495                 DELTA_SWINGIDX_SIZE*3
496         );
497 }
498
499 /******************************************************************************
500 *                           TXPWR_LMT.TXT
501 ******************************************************************************/
502
503 static u8 *Array_MP_8723B_TXPWR_LMT[] = {
504         "FCC", "2.4G", "20M", "CCK", "1T", "01", "32",
505         "ETSI", "2.4G", "20M", "CCK", "1T", "01", "32",
506         "MKK", "2.4G", "20M", "CCK", "1T", "01", "32",
507         "FCC", "2.4G", "20M", "CCK", "1T", "02", "32",
508         "ETSI", "2.4G", "20M", "CCK", "1T", "02", "32",
509         "MKK", "2.4G", "20M", "CCK", "1T", "02", "32",
510         "FCC", "2.4G", "20M", "CCK", "1T", "03", "32",
511         "ETSI", "2.4G", "20M", "CCK", "1T", "03", "32",
512         "MKK", "2.4G", "20M", "CCK", "1T", "03", "32",
513         "FCC", "2.4G", "20M", "CCK", "1T", "04", "32",
514         "ETSI", "2.4G", "20M", "CCK", "1T", "04", "32",
515         "MKK", "2.4G", "20M", "CCK", "1T", "04", "32",
516         "FCC", "2.4G", "20M", "CCK", "1T", "05", "32",
517         "ETSI", "2.4G", "20M", "CCK", "1T", "05", "32",
518         "MKK", "2.4G", "20M", "CCK", "1T", "05", "32",
519         "FCC", "2.4G", "20M", "CCK", "1T", "06", "32",
520         "ETSI", "2.4G", "20M", "CCK", "1T", "06", "32",
521         "MKK", "2.4G", "20M", "CCK", "1T", "06", "32",
522         "FCC", "2.4G", "20M", "CCK", "1T", "07", "32",
523         "ETSI", "2.4G", "20M", "CCK", "1T", "07", "32",
524         "MKK", "2.4G", "20M", "CCK", "1T", "07", "32",
525         "FCC", "2.4G", "20M", "CCK", "1T", "08", "32",
526         "ETSI", "2.4G", "20M", "CCK", "1T", "08", "32",
527         "MKK", "2.4G", "20M", "CCK", "1T", "08", "32",
528         "FCC", "2.4G", "20M", "CCK", "1T", "09", "32",
529         "ETSI", "2.4G", "20M", "CCK", "1T", "09", "32",
530         "MKK", "2.4G", "20M", "CCK", "1T", "09", "32",
531         "FCC", "2.4G", "20M", "CCK", "1T", "10", "32",
532         "ETSI", "2.4G", "20M", "CCK", "1T", "10", "32",
533         "MKK", "2.4G", "20M", "CCK", "1T", "10", "32",
534         "FCC", "2.4G", "20M", "CCK", "1T", "11", "32",
535         "ETSI", "2.4G", "20M", "CCK", "1T", "11", "32",
536         "MKK", "2.4G", "20M", "CCK", "1T", "11", "32",
537         "FCC", "2.4G", "20M", "CCK", "1T", "12", "63",
538         "ETSI", "2.4G", "20M", "CCK", "1T", "12", "32",
539         "MKK", "2.4G", "20M", "CCK", "1T", "12", "32",
540         "FCC", "2.4G", "20M", "CCK", "1T", "13", "63",
541         "ETSI", "2.4G", "20M", "CCK", "1T", "13", "32",
542         "MKK", "2.4G", "20M", "CCK", "1T", "13", "32",
543         "FCC", "2.4G", "20M", "CCK", "1T", "14", "63",
544         "ETSI", "2.4G", "20M", "CCK", "1T", "14", "63",
545         "MKK", "2.4G", "20M", "CCK", "1T", "14", "32",
546         "FCC", "2.4G", "20M", "OFDM", "1T", "01", "28",
547         "ETSI", "2.4G", "20M", "OFDM", "1T", "01", "32",
548         "MKK", "2.4G", "20M", "OFDM", "1T", "01", "32",
549         "FCC", "2.4G", "20M", "OFDM", "1T", "02", "28",
550         "ETSI", "2.4G", "20M", "OFDM", "1T", "02", "32",
551         "MKK", "2.4G", "20M", "OFDM", "1T", "02", "32",
552         "FCC", "2.4G", "20M", "OFDM", "1T", "03", "32",
553         "ETSI", "2.4G", "20M", "OFDM", "1T", "03", "32",
554         "MKK", "2.4G", "20M", "OFDM", "1T", "03", "32",
555         "FCC", "2.4G", "20M", "OFDM", "1T", "04", "32",
556         "ETSI", "2.4G", "20M", "OFDM", "1T", "04", "32",
557         "MKK", "2.4G", "20M", "OFDM", "1T", "04", "32",
558         "FCC", "2.4G", "20M", "OFDM", "1T", "05", "32",
559         "ETSI", "2.4G", "20M", "OFDM", "1T", "05", "32",
560         "MKK", "2.4G", "20M", "OFDM", "1T", "05", "32",
561         "FCC", "2.4G", "20M", "OFDM", "1T", "06", "32",
562         "ETSI", "2.4G", "20M", "OFDM", "1T", "06", "32",
563         "MKK", "2.4G", "20M", "OFDM", "1T", "06", "32",
564         "FCC", "2.4G", "20M", "OFDM", "1T", "07", "32",
565         "ETSI", "2.4G", "20M", "OFDM", "1T", "07", "32",
566         "MKK", "2.4G", "20M", "OFDM", "1T", "07", "32",
567         "FCC", "2.4G", "20M", "OFDM", "1T", "08", "32",
568         "ETSI", "2.4G", "20M", "OFDM", "1T", "08", "32",
569         "MKK", "2.4G", "20M", "OFDM", "1T", "08", "32",
570         "FCC", "2.4G", "20M", "OFDM", "1T", "09", "32",
571         "ETSI", "2.4G", "20M", "OFDM", "1T", "09", "32",
572         "MKK", "2.4G", "20M", "OFDM", "1T", "09", "32",
573         "FCC", "2.4G", "20M", "OFDM", "1T", "10", "28",
574         "ETSI", "2.4G", "20M", "OFDM", "1T", "10", "32",
575         "MKK", "2.4G", "20M", "OFDM", "1T", "10", "32",
576         "FCC", "2.4G", "20M", "OFDM", "1T", "11", "28",
577         "ETSI", "2.4G", "20M", "OFDM", "1T", "11", "32",
578         "MKK", "2.4G", "20M", "OFDM", "1T", "11", "32",
579         "FCC", "2.4G", "20M", "OFDM", "1T", "12", "63",
580         "ETSI", "2.4G", "20M", "OFDM", "1T", "12", "32",
581         "MKK", "2.4G", "20M", "OFDM", "1T", "12", "32",
582         "FCC", "2.4G", "20M", "OFDM", "1T", "13", "63",
583         "ETSI", "2.4G", "20M", "OFDM", "1T", "13", "32",
584         "MKK", "2.4G", "20M", "OFDM", "1T", "13", "32",
585         "FCC", "2.4G", "20M", "OFDM", "1T", "14", "63",
586         "ETSI", "2.4G", "20M", "OFDM", "1T", "14", "63",
587         "MKK", "2.4G", "20M", "OFDM", "1T", "14", "63",
588         "FCC", "2.4G", "20M", "HT", "1T", "01", "26",
589         "ETSI", "2.4G", "20M", "HT", "1T", "01", "32",
590         "MKK", "2.4G", "20M", "HT", "1T", "01", "32",
591         "FCC", "2.4G", "20M", "HT", "1T", "02", "26",
592         "ETSI", "2.4G", "20M", "HT", "1T", "02", "32",
593         "MKK", "2.4G", "20M", "HT", "1T", "02", "32",
594         "FCC", "2.4G", "20M", "HT", "1T", "03", "32",
595         "ETSI", "2.4G", "20M", "HT", "1T", "03", "32",
596         "MKK", "2.4G", "20M", "HT", "1T", "03", "32",
597         "FCC", "2.4G", "20M", "HT", "1T", "04", "32",
598         "ETSI", "2.4G", "20M", "HT", "1T", "04", "32",
599         "MKK", "2.4G", "20M", "HT", "1T", "04", "32",
600         "FCC", "2.4G", "20M", "HT", "1T", "05", "32",
601         "ETSI", "2.4G", "20M", "HT", "1T", "05", "32",
602         "MKK", "2.4G", "20M", "HT", "1T", "05", "32",
603         "FCC", "2.4G", "20M", "HT", "1T", "06", "32",
604         "ETSI", "2.4G", "20M", "HT", "1T", "06", "32",
605         "MKK", "2.4G", "20M", "HT", "1T", "06", "32",
606         "FCC", "2.4G", "20M", "HT", "1T", "07", "32",
607         "ETSI", "2.4G", "20M", "HT", "1T", "07", "32",
608         "MKK", "2.4G", "20M", "HT", "1T", "07", "32",
609         "FCC", "2.4G", "20M", "HT", "1T", "08", "32",
610         "ETSI", "2.4G", "20M", "HT", "1T", "08", "32",
611         "MKK", "2.4G", "20M", "HT", "1T", "08", "32",
612         "FCC", "2.4G", "20M", "HT", "1T", "09", "32",
613         "ETSI", "2.4G", "20M", "HT", "1T", "09", "32",
614         "MKK", "2.4G", "20M", "HT", "1T", "09", "32",
615         "FCC", "2.4G", "20M", "HT", "1T", "10", "26",
616         "ETSI", "2.4G", "20M", "HT", "1T", "10", "32",
617         "MKK", "2.4G", "20M", "HT", "1T", "10", "32",
618         "FCC", "2.4G", "20M", "HT", "1T", "11", "26",
619         "ETSI", "2.4G", "20M", "HT", "1T", "11", "32",
620         "MKK", "2.4G", "20M", "HT", "1T", "11", "32",
621         "FCC", "2.4G", "20M", "HT", "1T", "12", "63",
622         "ETSI", "2.4G", "20M", "HT", "1T", "12", "32",
623         "MKK", "2.4G", "20M", "HT", "1T", "12", "32",
624         "FCC", "2.4G", "20M", "HT", "1T", "13", "63",
625         "ETSI", "2.4G", "20M", "HT", "1T", "13", "32",
626         "MKK", "2.4G", "20M", "HT", "1T", "13", "32",
627         "FCC", "2.4G", "20M", "HT", "1T", "14", "63",
628         "ETSI", "2.4G", "20M", "HT", "1T", "14", "63",
629         "MKK", "2.4G", "20M", "HT", "1T", "14", "63",
630         "FCC", "2.4G", "20M", "HT", "2T", "01", "30",
631         "ETSI", "2.4G", "20M", "HT", "2T", "01", "32",
632         "MKK", "2.4G", "20M", "HT", "2T", "01", "32",
633         "FCC", "2.4G", "20M", "HT", "2T", "02", "32",
634         "ETSI", "2.4G", "20M", "HT", "2T", "02", "32",
635         "MKK", "2.4G", "20M", "HT", "2T", "02", "32",
636         "FCC", "2.4G", "20M", "HT", "2T", "03", "32",
637         "ETSI", "2.4G", "20M", "HT", "2T", "03", "32",
638         "MKK", "2.4G", "20M", "HT", "2T", "03", "32",
639         "FCC", "2.4G", "20M", "HT", "2T", "04", "32",
640         "ETSI", "2.4G", "20M", "HT", "2T", "04", "32",
641         "MKK", "2.4G", "20M", "HT", "2T", "04", "32",
642         "FCC", "2.4G", "20M", "HT", "2T", "05", "32",
643         "ETSI", "2.4G", "20M", "HT", "2T", "05", "32",
644         "MKK", "2.4G", "20M", "HT", "2T", "05", "32",
645         "FCC", "2.4G", "20M", "HT", "2T", "06", "32",
646         "ETSI", "2.4G", "20M", "HT", "2T", "06", "32",
647         "MKK", "2.4G", "20M", "HT", "2T", "06", "32",
648         "FCC", "2.4G", "20M", "HT", "2T", "07", "32",
649         "ETSI", "2.4G", "20M", "HT", "2T", "07", "32",
650         "MKK", "2.4G", "20M", "HT", "2T", "07", "32",
651         "FCC", "2.4G", "20M", "HT", "2T", "08", "32",
652         "ETSI", "2.4G", "20M", "HT", "2T", "08", "32",
653         "MKK", "2.4G", "20M", "HT", "2T", "08", "32",
654         "FCC", "2.4G", "20M", "HT", "2T", "09", "32",
655         "ETSI", "2.4G", "20M", "HT", "2T", "09", "32",
656         "MKK", "2.4G", "20M", "HT", "2T", "09", "32",
657         "FCC", "2.4G", "20M", "HT", "2T", "10", "32",
658         "ETSI", "2.4G", "20M", "HT", "2T", "10", "32",
659         "MKK", "2.4G", "20M", "HT", "2T", "10", "32",
660         "FCC", "2.4G", "20M", "HT", "2T", "11", "30",
661         "ETSI", "2.4G", "20M", "HT", "2T", "11", "32",
662         "MKK", "2.4G", "20M", "HT", "2T", "11", "32",
663         "FCC", "2.4G", "20M", "HT", "2T", "12", "63",
664         "ETSI", "2.4G", "20M", "HT", "2T", "12", "32",
665         "MKK", "2.4G", "20M", "HT", "2T", "12", "32",
666         "FCC", "2.4G", "20M", "HT", "2T", "13", "63",
667         "ETSI", "2.4G", "20M", "HT", "2T", "13", "32",
668         "MKK", "2.4G", "20M", "HT", "2T", "13", "32",
669         "FCC", "2.4G", "20M", "HT", "2T", "14", "63",
670         "ETSI", "2.4G", "20M", "HT", "2T", "14", "63",
671         "MKK", "2.4G", "20M", "HT", "2T", "14", "63",
672         "FCC", "2.4G", "40M", "HT", "1T", "01", "63",
673         "ETSI", "2.4G", "40M", "HT", "1T", "01", "63",
674         "MKK", "2.4G", "40M", "HT", "1T", "01", "63",
675         "FCC", "2.4G", "40M", "HT", "1T", "02", "63",
676         "ETSI", "2.4G", "40M", "HT", "1T", "02", "63",
677         "MKK", "2.4G", "40M", "HT", "1T", "02", "63",
678         "FCC", "2.4G", "40M", "HT", "1T", "03", "26",
679         "ETSI", "2.4G", "40M", "HT", "1T", "03", "32",
680         "MKK", "2.4G", "40M", "HT", "1T", "03", "32",
681         "FCC", "2.4G", "40M", "HT", "1T", "04", "26",
682         "ETSI", "2.4G", "40M", "HT", "1T", "04", "32",
683         "MKK", "2.4G", "40M", "HT", "1T", "04", "32",
684         "FCC", "2.4G", "40M", "HT", "1T", "05", "32",
685         "ETSI", "2.4G", "40M", "HT", "1T", "05", "32",
686         "MKK", "2.4G", "40M", "HT", "1T", "05", "32",
687         "FCC", "2.4G", "40M", "HT", "1T", "06", "32",
688         "ETSI", "2.4G", "40M", "HT", "1T", "06", "32",
689         "MKK", "2.4G", "40M", "HT", "1T", "06", "32",
690         "FCC", "2.4G", "40M", "HT", "1T", "07", "32",
691         "ETSI", "2.4G", "40M", "HT", "1T", "07", "32",
692         "MKK", "2.4G", "40M", "HT", "1T", "07", "32",
693         "FCC", "2.4G", "40M", "HT", "1T", "08", "26",
694         "ETSI", "2.4G", "40M", "HT", "1T", "08", "32",
695         "MKK", "2.4G", "40M", "HT", "1T", "08", "32",
696         "FCC", "2.4G", "40M", "HT", "1T", "09", "26",
697         "ETSI", "2.4G", "40M", "HT", "1T", "09", "32",
698         "MKK", "2.4G", "40M", "HT", "1T", "09", "32",
699         "FCC", "2.4G", "40M", "HT", "1T", "10", "26",
700         "ETSI", "2.4G", "40M", "HT", "1T", "10", "32",
701         "MKK", "2.4G", "40M", "HT", "1T", "10", "32",
702         "FCC", "2.4G", "40M", "HT", "1T", "11", "26",
703         "ETSI", "2.4G", "40M", "HT", "1T", "11", "32",
704         "MKK", "2.4G", "40M", "HT", "1T", "11", "32",
705         "FCC", "2.4G", "40M", "HT", "1T", "12", "63",
706         "ETSI", "2.4G", "40M", "HT", "1T", "12", "32",
707         "MKK", "2.4G", "40M", "HT", "1T", "12", "32",
708         "FCC", "2.4G", "40M", "HT", "1T", "13", "63",
709         "ETSI", "2.4G", "40M", "HT", "1T", "13", "32",
710         "MKK", "2.4G", "40M", "HT", "1T", "13", "32",
711         "FCC", "2.4G", "40M", "HT", "1T", "14", "63",
712         "ETSI", "2.4G", "40M", "HT", "1T", "14", "63",
713         "MKK", "2.4G", "40M", "HT", "1T", "14", "63",
714         "FCC", "2.4G", "40M", "HT", "2T", "01", "63",
715         "ETSI", "2.4G", "40M", "HT", "2T", "01", "63",
716         "MKK", "2.4G", "40M", "HT", "2T", "01", "63",
717         "FCC", "2.4G", "40M", "HT", "2T", "02", "63",
718         "ETSI", "2.4G", "40M", "HT", "2T", "02", "63",
719         "MKK", "2.4G", "40M", "HT", "2T", "02", "63",
720         "FCC", "2.4G", "40M", "HT", "2T", "03", "30",
721         "ETSI", "2.4G", "40M", "HT", "2T", "03", "30",
722         "MKK", "2.4G", "40M", "HT", "2T", "03", "30",
723         "FCC", "2.4G", "40M", "HT", "2T", "04", "32",
724         "ETSI", "2.4G", "40M", "HT", "2T", "04", "30",
725         "MKK", "2.4G", "40M", "HT", "2T", "04", "30",
726         "FCC", "2.4G", "40M", "HT", "2T", "05", "32",
727         "ETSI", "2.4G", "40M", "HT", "2T", "05", "30",
728         "MKK", "2.4G", "40M", "HT", "2T", "05", "30",
729         "FCC", "2.4G", "40M", "HT", "2T", "06", "32",
730         "ETSI", "2.4G", "40M", "HT", "2T", "06", "30",
731         "MKK", "2.4G", "40M", "HT", "2T", "06", "30",
732         "FCC", "2.4G", "40M", "HT", "2T", "07", "32",
733         "ETSI", "2.4G", "40M", "HT", "2T", "07", "30",
734         "MKK", "2.4G", "40M", "HT", "2T", "07", "30",
735         "FCC", "2.4G", "40M", "HT", "2T", "08", "32",
736         "ETSI", "2.4G", "40M", "HT", "2T", "08", "30",
737         "MKK", "2.4G", "40M", "HT", "2T", "08", "30",
738         "FCC", "2.4G", "40M", "HT", "2T", "09", "32",
739         "ETSI", "2.4G", "40M", "HT", "2T", "09", "30",
740         "MKK", "2.4G", "40M", "HT", "2T", "09", "30",
741         "FCC", "2.4G", "40M", "HT", "2T", "10", "32",
742         "ETSI", "2.4G", "40M", "HT", "2T", "10", "30",
743         "MKK", "2.4G", "40M", "HT", "2T", "10", "30",
744         "FCC", "2.4G", "40M", "HT", "2T", "11", "30",
745         "ETSI", "2.4G", "40M", "HT", "2T", "11", "30",
746         "MKK", "2.4G", "40M", "HT", "2T", "11", "30",
747         "FCC", "2.4G", "40M", "HT", "2T", "12", "63",
748         "ETSI", "2.4G", "40M", "HT", "2T", "12", "32",
749         "MKK", "2.4G", "40M", "HT", "2T", "12", "32",
750         "FCC", "2.4G", "40M", "HT", "2T", "13", "63",
751         "ETSI", "2.4G", "40M", "HT", "2T", "13", "32",
752         "MKK", "2.4G", "40M", "HT", "2T", "13", "32",
753         "FCC", "2.4G", "40M", "HT", "2T", "14", "63",
754         "ETSI", "2.4G", "40M", "HT", "2T", "14", "63",
755         "MKK", "2.4G", "40M", "HT", "2T", "14", "63"
756 };
757
758 void ODM_ReadAndConfig_MP_8723B_TXPWR_LMT(PDM_ODM_T pDM_Odm)
759 {
760         u32 i = 0;
761         u8 **Array = Array_MP_8723B_TXPWR_LMT;
762
763         ODM_RT_TRACE(
764                 pDM_Odm,
765                 ODM_COMP_INIT,
766                 ODM_DBG_LOUD,
767                 ("===> ODM_ReadAndConfig_MP_8723B_TXPWR_LMT\n")
768         );
769
770         for (i = 0; i < ARRAY_SIZE(Array_MP_8723B_TXPWR_LMT); i += 7) {
771                 u8 *regulation = Array[i];
772                 u8 *band = Array[i+1];
773                 u8 *bandwidth = Array[i+2];
774                 u8 *rate = Array[i+3];
775                 u8 *rfPath = Array[i+4];
776                 u8 *chnl = Array[i+5];
777                 u8 *val = Array[i+6];
778
779                 odm_ConfigBB_TXPWR_LMT_8723B(
780                         pDM_Odm,
781                         regulation,
782                         band,
783                         bandwidth,
784                         rate,
785                         rfPath,
786                         chnl,
787                         val
788                 );
789         }
790 }