GNU Linux-libre 6.7.9-gnu
[releases.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         struct dm_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         /*  Value Defined Check =============== */
37         /* QFN Type [15:12] and Cut Version [27:24] need to do value check */
38
39         if (
40                 ((cond1 & 0x0000F000) != 0) &&
41                 ((cond1 & 0x0000F000) != (driver1 & 0x0000F000))
42         )
43                 return false;
44
45         if (
46                 ((cond1 & 0x0F000000) != 0) &&
47                 ((cond1 & 0x0F000000) != (driver1 & 0x0F000000))
48         )
49                 return false;
50
51         /*  Bit Defined Check ================ */
52         /*  We don't care [31:28] and [23:20] */
53         cond1   &= 0x000F0FFF;
54         driver1 &= 0x000F0FFF;
55
56         if ((cond1 & driver1) == cond1) {
57                 u32 bitMask = 0;
58
59                 if ((cond1 & 0x0F) == 0) /*  BoardType is DONTCARE */
60                         return true;
61
62                 if ((cond1 & BIT0) != 0) /* GLNA */
63                         bitMask |= 0x000000FF;
64                 if ((cond1 & BIT1) != 0) /* GPA */
65                         bitMask |= 0x0000FF00;
66                 if ((cond1 & BIT2) != 0) /* ALNA */
67                         bitMask |= 0x00FF0000;
68                 if ((cond1 & BIT3) != 0) /* APA */
69                         bitMask |= 0xFF000000;
70
71                 /*  BoardType of each RF path is matched */
72                 if ((cond2 & bitMask) == (driver2 & bitMask))
73                         return true;
74
75                 return false;
76         }
77
78         return false;
79 }
80
81 static bool CheckNegative(
82         struct dm_odm_t *pDM_Odm, const u32  Condition1, const u32 Condition2
83 )
84 {
85         return true;
86 }
87
88 /******************************************************************************
89 *                           RadioA.TXT
90 ******************************************************************************/
91
92 static u32 Array_MP_8723B_RadioA[] = {
93                 0x000, 0x00010000,
94                 0x0B0, 0x000DFFE0,
95                 0x0FE, 0x00000000,
96                 0x0FE, 0x00000000,
97                 0x0FE, 0x00000000,
98                 0x0B1, 0x00000018,
99                 0x0FE, 0x00000000,
100                 0x0FE, 0x00000000,
101                 0x0FE, 0x00000000,
102                 0x0B2, 0x00084C00,
103                 0x0B5, 0x0000D2CC,
104                 0x0B6, 0x000925AA,
105                 0x0B7, 0x00000010,
106                 0x0B8, 0x0000907F,
107                 0x05C, 0x00000002,
108                 0x07C, 0x00000002,
109                 0x07E, 0x00000005,
110                 0x08B, 0x0006FC00,
111                 0x0B0, 0x000FF9F0,
112                 0x01C, 0x000739D2,
113                 0x01E, 0x00000000,
114                 0x0DF, 0x00000780,
115                 0x050, 0x00067435,
116         0x80002000, 0x00000000, 0x40000000, 0x00000000,
117                 0x051, 0x0006B10E,
118         0x90003000, 0x00000000, 0x40000000, 0x00000000,
119                 0x051, 0x0006B10E,
120         0x90004000, 0x00000000, 0x40000000, 0x00000000,
121                 0x051, 0x0006B10E,
122         0xA0000000, 0x00000000,
123                 0x051, 0x0006B04E,
124         0xB0000000, 0x00000000,
125                 0x052, 0x000007D2,
126                 0x053, 0x00000000,
127                 0x054, 0x00050400,
128                 0x055, 0x0004026E,
129                 0x0DD, 0x0000004C,
130                 0x070, 0x00067435,
131         0x80002000, 0x00000000, 0x40000000, 0x00000000,
132                 0x071, 0x0006B10E,
133         0x90003000, 0x00000000, 0x40000000, 0x00000000,
134                 0x071, 0x0006B10E,
135         0x90004000, 0x00000000, 0x40000000, 0x00000000,
136                 0x071, 0x0006B10E,
137         0xA0000000, 0x00000000,
138                 0x071, 0x0006B04E,
139         0xB0000000, 0x00000000,
140                 0x072, 0x000007D2,
141                 0x073, 0x00000000,
142                 0x074, 0x00050400,
143                 0x075, 0x0004026E,
144                 0x0EF, 0x00000100,
145                 0x034, 0x0000ADD7,
146                 0x035, 0x00005C00,
147                 0x034, 0x00009DD4,
148                 0x035, 0x00005000,
149                 0x034, 0x00008DD1,
150                 0x035, 0x00004400,
151                 0x034, 0x00007DCE,
152                 0x035, 0x00003800,
153                 0x034, 0x00006CD1,
154                 0x035, 0x00004400,
155                 0x034, 0x00005CCE,
156                 0x035, 0x00003800,
157                 0x034, 0x000048CE,
158                 0x035, 0x00004400,
159                 0x034, 0x000034CE,
160                 0x035, 0x00003800,
161                 0x034, 0x00002451,
162                 0x035, 0x00004400,
163                 0x034, 0x0000144E,
164                 0x035, 0x00003800,
165                 0x034, 0x00000051,
166                 0x035, 0x00004400,
167                 0x0EF, 0x00000000,
168                 0x0EF, 0x00000100,
169                 0x0ED, 0x00000010,
170                 0x044, 0x0000ADD7,
171                 0x044, 0x00009DD4,
172                 0x044, 0x00008DD1,
173                 0x044, 0x00007DCE,
174                 0x044, 0x00006CC1,
175                 0x044, 0x00005CCE,
176                 0x044, 0x000044D1,
177                 0x044, 0x000034CE,
178                 0x044, 0x00002451,
179                 0x044, 0x0000144E,
180                 0x044, 0x00000051,
181                 0x0EF, 0x00000000,
182                 0x0ED, 0x00000000,
183                 0x07F, 0x00020080,
184                 0x0EF, 0x00002000,
185                 0x03B, 0x000380EF,
186                 0x03B, 0x000302FE,
187                 0x03B, 0x00028CE6,
188                 0x03B, 0x000200BC,
189                 0x03B, 0x000188A5,
190                 0x03B, 0x00010FBC,
191                 0x03B, 0x00008F71,
192                 0x03B, 0x00000900,
193                 0x0EF, 0x00000000,
194                 0x0ED, 0x00000001,
195                 0x040, 0x000380EF,
196                 0x040, 0x000302FE,
197                 0x040, 0x00028CE6,
198                 0x040, 0x000200BC,
199                 0x040, 0x000188A5,
200                 0x040, 0x00010FBC,
201                 0x040, 0x00008F71,
202                 0x040, 0x00000900,
203                 0x0ED, 0x00000000,
204                 0x082, 0x00080000,
205                 0x083, 0x00008000,
206                 0x084, 0x00048D80,
207                 0x085, 0x00068000,
208                 0x0A2, 0x00080000,
209                 0x0A3, 0x00008000,
210                 0x0A4, 0x00048D80,
211                 0x0A5, 0x00068000,
212                 0x0ED, 0x00000002,
213                 0x0EF, 0x00000002,
214                 0x056, 0x00000032,
215                 0x076, 0x00000032,
216                 0x001, 0x00000780,
217
218 };
219
220 void ODM_ReadAndConfig_MP_8723B_RadioA(struct dm_odm_t *pDM_Odm)
221 {
222         u32 i = 0;
223         u32 ArrayLen = ARRAY_SIZE(Array_MP_8723B_RadioA);
224         u32 *Array = Array_MP_8723B_RadioA;
225
226         for (i = 0; i < ArrayLen; i += 2) {
227                 u32 v1 = Array[i];
228                 u32 v2 = Array[i+1];
229
230                 /*  This (offset, data) pair doesn't care the condition. */
231                 if (v1 < 0x40000000) {
232                         odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
233                         continue;
234                 } else {
235                         /*  This line is the beginning of branch. */
236                         bool bMatched = true;
237                         u8  cCond  = (u8)((v1 & (BIT29|BIT28)) >> 28);
238
239                         if (cCond == COND_ELSE) { /*  ELSE, ENDIF */
240                                 bMatched = true;
241                                 READ_NEXT_PAIR(v1, v2, i);
242                         } else if (!CheckPositive(pDM_Odm, v1, v2)) {
243                                 bMatched = false;
244                                 READ_NEXT_PAIR(v1, v2, i);
245                                 READ_NEXT_PAIR(v1, v2, i);
246                         } else {
247                                 READ_NEXT_PAIR(v1, v2, i);
248                                 if (!CheckNegative(pDM_Odm, v1, v2))
249                                         bMatched = false;
250                                 else
251                                         bMatched = true;
252                                 READ_NEXT_PAIR(v1, v2, i);
253                         }
254
255                         if (!bMatched) {
256                                 /*  Condition isn't matched.
257                                 *   Discard the following (offset, data) pairs.
258                                 */
259                                 while (v1 < 0x40000000 && i < ArrayLen-2)
260                                         READ_NEXT_PAIR(v1, v2, i);
261
262                                 i -= 2; /*  prevent from for-loop += 2 */
263                         } else {
264                                 /*  Configure matched pairs and skip to end of if-else. */
265                                 while (v1 < 0x40000000 && i < ArrayLen-2) {
266                                         odm_ConfigRF_RadioA_8723B(pDM_Odm, v1, v2);
267                                         READ_NEXT_PAIR(v1, v2, i);
268                                 }
269
270                                 /*  Keeps reading until ENDIF. */
271                                 cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
272                                 while (cCond != COND_ENDIF && i < ArrayLen-2) {
273                                         READ_NEXT_PAIR(v1, v2, i);
274                                         cCond = (u8)((v1 & (BIT29|BIT28)) >> 28);
275                                 }
276                         }
277                 }
278         }
279 }
280
281 /******************************************************************************
282 *                           TxPowerTrack_SDIO.TXT
283 ******************************************************************************/
284
285 static u8 gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B[] = {
286         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6, 6,  6,
287         7,  7,  7, 8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15
288 };
289 static u8 gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B[] = {
290         0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,
291         9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15
292 };
293 static u8 gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B[] = {
294         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  6,  6,
295         7,  7,  7,  8,  8,  9,  9, 10, 10, 11, 12, 13, 14, 15
296 };
297 static u8 gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B[] = {
298         0, 0, 1, 2, 2, 3, 3, 4, 5, 5,  6,  6,  7,  7,  8,  8,
299         9,  9, 10, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15, 15
300 };
301 static u8 gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B[] = {
302         0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,
303         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
304 };
305 static u8 gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B[] = {
306         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,
307         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
308 };
309 static u8 gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B[] = {
310         0, 0, 1, 2, 2, 3, 3, 4, 4, 5,  6,  6,  7,  7,  7,  8,
311         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
312 };
313 static u8 gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B[] = {
314         0, 0, 1, 2, 2, 2, 3, 3, 3, 4,  5,  5,  6,  6,  7,  7,
315         8,  8,  9,  9,  9, 10, 10, 11, 11, 12, 12, 13, 14, 15
316 };
317
318 void ODM_ReadAndConfig_MP_8723B_TxPowerTrack_SDIO(struct dm_odm_t *pDM_Odm)
319 {
320         struct odm_rf_cal_t *pRFCalibrateInfo = &pDM_Odm->RFCalibrateInfo;
321
322
323         memcpy(
324                 pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P,
325                 gDeltaSwingTableIdx_MP_2GA_P_TxPowerTrack_SDIO_8723B,
326                 DELTA_SWINGIDX_SIZE
327         );
328         memcpy(
329                 pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N,
330                 gDeltaSwingTableIdx_MP_2GA_N_TxPowerTrack_SDIO_8723B,
331                 DELTA_SWINGIDX_SIZE
332         );
333         memcpy(
334                 pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P,
335                 gDeltaSwingTableIdx_MP_2GB_P_TxPowerTrack_SDIO_8723B,
336                 DELTA_SWINGIDX_SIZE
337         );
338         memcpy(
339                 pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N,
340                 gDeltaSwingTableIdx_MP_2GB_N_TxPowerTrack_SDIO_8723B,
341                 DELTA_SWINGIDX_SIZE
342         );
343
344         memcpy(
345                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P,
346                 gDeltaSwingTableIdx_MP_2GCCKA_P_TxPowerTrack_SDIO_8723B,
347                 DELTA_SWINGIDX_SIZE
348         );
349         memcpy(
350                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N,
351                 gDeltaSwingTableIdx_MP_2GCCKA_N_TxPowerTrack_SDIO_8723B,
352                 DELTA_SWINGIDX_SIZE
353         );
354         memcpy(
355                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P,
356                 gDeltaSwingTableIdx_MP_2GCCKB_P_TxPowerTrack_SDIO_8723B,
357                 DELTA_SWINGIDX_SIZE
358         );
359         memcpy(
360                 pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N,
361                 gDeltaSwingTableIdx_MP_2GCCKB_N_TxPowerTrack_SDIO_8723B,
362                 DELTA_SWINGIDX_SIZE
363         );
364 }
365
366 /******************************************************************************
367 *                           TXPWR_LMT.TXT
368 ******************************************************************************/
369
370 static u8 *Array_MP_8723B_TXPWR_LMT[] = {
371         "FCC", "20M", "CCK", "1T", "01", "32",
372         "ETSI", "20M", "CCK", "1T", "01", "32",
373         "MKK", "20M", "CCK", "1T", "01", "32",
374         "FCC", "20M", "CCK", "1T", "02", "32",
375         "ETSI", "20M", "CCK", "1T", "02", "32",
376         "MKK", "20M", "CCK", "1T", "02", "32",
377         "FCC", "20M", "CCK", "1T", "03", "32",
378         "ETSI", "20M", "CCK", "1T", "03", "32",
379         "MKK", "20M", "CCK", "1T", "03", "32",
380         "FCC", "20M", "CCK", "1T", "04", "32",
381         "ETSI", "20M", "CCK", "1T", "04", "32",
382         "MKK", "20M", "CCK", "1T", "04", "32",
383         "FCC", "20M", "CCK", "1T", "05", "32",
384         "ETSI", "20M", "CCK", "1T", "05", "32",
385         "MKK", "20M", "CCK", "1T", "05", "32",
386         "FCC", "20M", "CCK", "1T", "06", "32",
387         "ETSI", "20M", "CCK", "1T", "06", "32",
388         "MKK", "20M", "CCK", "1T", "06", "32",
389         "FCC", "20M", "CCK", "1T", "07", "32",
390         "ETSI", "20M", "CCK", "1T", "07", "32",
391         "MKK", "20M", "CCK", "1T", "07", "32",
392         "FCC", "20M", "CCK", "1T", "08", "32",
393         "ETSI", "20M", "CCK", "1T", "08", "32",
394         "MKK", "20M", "CCK", "1T", "08", "32",
395         "FCC", "20M", "CCK", "1T", "09", "32",
396         "ETSI", "20M", "CCK", "1T", "09", "32",
397         "MKK", "20M", "CCK", "1T", "09", "32",
398         "FCC", "20M", "CCK", "1T", "10", "32",
399         "ETSI", "20M", "CCK", "1T", "10", "32",
400         "MKK", "20M", "CCK", "1T", "10", "32",
401         "FCC", "20M", "CCK", "1T", "11", "32",
402         "ETSI", "20M", "CCK", "1T", "11", "32",
403         "MKK", "20M", "CCK", "1T", "11", "32",
404         "FCC", "20M", "CCK", "1T", "12", "63",
405         "ETSI", "20M", "CCK", "1T", "12", "32",
406         "MKK", "20M", "CCK", "1T", "12", "32",
407         "FCC", "20M", "CCK", "1T", "13", "63",
408         "ETSI", "20M", "CCK", "1T", "13", "32",
409         "MKK", "20M", "CCK", "1T", "13", "32",
410         "FCC", "20M", "CCK", "1T", "14", "63",
411         "ETSI", "20M", "CCK", "1T", "14", "63",
412         "MKK", "20M", "CCK", "1T", "14", "32",
413         "FCC", "20M", "OFDM", "1T", "01", "28",
414         "ETSI", "20M", "OFDM", "1T", "01", "32",
415         "MKK", "20M", "OFDM", "1T", "01", "32",
416         "FCC", "20M", "OFDM", "1T", "02", "28",
417         "ETSI", "20M", "OFDM", "1T", "02", "32",
418         "MKK", "20M", "OFDM", "1T", "02", "32",
419         "FCC", "20M", "OFDM", "1T", "03", "32",
420         "ETSI", "20M", "OFDM", "1T", "03", "32",
421         "MKK", "20M", "OFDM", "1T", "03", "32",
422         "FCC", "20M", "OFDM", "1T", "04", "32",
423         "ETSI", "20M", "OFDM", "1T", "04", "32",
424         "MKK", "20M", "OFDM", "1T", "04", "32",
425         "FCC", "20M", "OFDM", "1T", "05", "32",
426         "ETSI", "20M", "OFDM", "1T", "05", "32",
427         "MKK", "20M", "OFDM", "1T", "05", "32",
428         "FCC", "20M", "OFDM", "1T", "06", "32",
429         "ETSI", "20M", "OFDM", "1T", "06", "32",
430         "MKK", "20M", "OFDM", "1T", "06", "32",
431         "FCC", "20M", "OFDM", "1T", "07", "32",
432         "ETSI", "20M", "OFDM", "1T", "07", "32",
433         "MKK", "20M", "OFDM", "1T", "07", "32",
434         "FCC", "20M", "OFDM", "1T", "08", "32",
435         "ETSI", "20M", "OFDM", "1T", "08", "32",
436         "MKK", "20M", "OFDM", "1T", "08", "32",
437         "FCC", "20M", "OFDM", "1T", "09", "32",
438         "ETSI", "20M", "OFDM", "1T", "09", "32",
439         "MKK", "20M", "OFDM", "1T", "09", "32",
440         "FCC", "20M", "OFDM", "1T", "10", "28",
441         "ETSI", "20M", "OFDM", "1T", "10", "32",
442         "MKK", "20M", "OFDM", "1T", "10", "32",
443         "FCC", "20M", "OFDM", "1T", "11", "28",
444         "ETSI", "20M", "OFDM", "1T", "11", "32",
445         "MKK", "20M", "OFDM", "1T", "11", "32",
446         "FCC", "20M", "OFDM", "1T", "12", "63",
447         "ETSI", "20M", "OFDM", "1T", "12", "32",
448         "MKK", "20M", "OFDM", "1T", "12", "32",
449         "FCC", "20M", "OFDM", "1T", "13", "63",
450         "ETSI", "20M", "OFDM", "1T", "13", "32",
451         "MKK", "20M", "OFDM", "1T", "13", "32",
452         "FCC", "20M", "OFDM", "1T", "14", "63",
453         "ETSI", "20M", "OFDM", "1T", "14", "63",
454         "MKK", "20M", "OFDM", "1T", "14", "63",
455         "FCC", "20M", "HT", "1T", "01", "26",
456         "ETSI", "20M", "HT", "1T", "01", "32",
457         "MKK", "20M", "HT", "1T", "01", "32",
458         "FCC", "20M", "HT", "1T", "02", "26",
459         "ETSI", "20M", "HT", "1T", "02", "32",
460         "MKK", "20M", "HT", "1T", "02", "32",
461         "FCC", "20M", "HT", "1T", "03", "32",
462         "ETSI", "20M", "HT", "1T", "03", "32",
463         "MKK", "20M", "HT", "1T", "03", "32",
464         "FCC", "20M", "HT", "1T", "04", "32",
465         "ETSI", "20M", "HT", "1T", "04", "32",
466         "MKK", "20M", "HT", "1T", "04", "32",
467         "FCC", "20M", "HT", "1T", "05", "32",
468         "ETSI", "20M", "HT", "1T", "05", "32",
469         "MKK", "20M", "HT", "1T", "05", "32",
470         "FCC", "20M", "HT", "1T", "06", "32",
471         "ETSI", "20M", "HT", "1T", "06", "32",
472         "MKK", "20M", "HT", "1T", "06", "32",
473         "FCC", "20M", "HT", "1T", "07", "32",
474         "ETSI", "20M", "HT", "1T", "07", "32",
475         "MKK", "20M", "HT", "1T", "07", "32",
476         "FCC", "20M", "HT", "1T", "08", "32",
477         "ETSI", "20M", "HT", "1T", "08", "32",
478         "MKK", "20M", "HT", "1T", "08", "32",
479         "FCC", "20M", "HT", "1T", "09", "32",
480         "ETSI", "20M", "HT", "1T", "09", "32",
481         "MKK", "20M", "HT", "1T", "09", "32",
482         "FCC", "20M", "HT", "1T", "10", "26",
483         "ETSI", "20M", "HT", "1T", "10", "32",
484         "MKK", "20M", "HT", "1T", "10", "32",
485         "FCC", "20M", "HT", "1T", "11", "26",
486         "ETSI", "20M", "HT", "1T", "11", "32",
487         "MKK", "20M", "HT", "1T", "11", "32",
488         "FCC", "20M", "HT", "1T", "12", "63",
489         "ETSI", "20M", "HT", "1T", "12", "32",
490         "MKK", "20M", "HT", "1T", "12", "32",
491         "FCC", "20M", "HT", "1T", "13", "63",
492         "ETSI", "20M", "HT", "1T", "13", "32",
493         "MKK", "20M", "HT", "1T", "13", "32",
494         "FCC", "20M", "HT", "1T", "14", "63",
495         "ETSI", "20M", "HT", "1T", "14", "63",
496         "MKK", "20M", "HT", "1T", "14", "63",
497         "FCC", "40M", "HT", "1T", "01", "63",
498         "ETSI", "40M", "HT", "1T", "01", "63",
499         "MKK", "40M", "HT", "1T", "01", "63",
500         "FCC", "40M", "HT", "1T", "02", "63",
501         "ETSI", "40M", "HT", "1T", "02", "63",
502         "MKK", "40M", "HT", "1T", "02", "63",
503         "FCC", "40M", "HT", "1T", "03", "26",
504         "ETSI", "40M", "HT", "1T", "03", "32",
505         "MKK", "40M", "HT", "1T", "03", "32",
506         "FCC", "40M", "HT", "1T", "04", "26",
507         "ETSI", "40M", "HT", "1T", "04", "32",
508         "MKK", "40M", "HT", "1T", "04", "32",
509         "FCC", "40M", "HT", "1T", "05", "32",
510         "ETSI", "40M", "HT", "1T", "05", "32",
511         "MKK", "40M", "HT", "1T", "05", "32",
512         "FCC", "40M", "HT", "1T", "06", "32",
513         "ETSI", "40M", "HT", "1T", "06", "32",
514         "MKK", "40M", "HT", "1T", "06", "32",
515         "FCC", "40M", "HT", "1T", "07", "32",
516         "ETSI", "40M", "HT", "1T", "07", "32",
517         "MKK", "40M", "HT", "1T", "07", "32",
518         "FCC", "40M", "HT", "1T", "08", "26",
519         "ETSI", "40M", "HT", "1T", "08", "32",
520         "MKK", "40M", "HT", "1T", "08", "32",
521         "FCC", "40M", "HT", "1T", "09", "26",
522         "ETSI", "40M", "HT", "1T", "09", "32",
523         "MKK", "40M", "HT", "1T", "09", "32",
524         "FCC", "40M", "HT", "1T", "10", "26",
525         "ETSI", "40M", "HT", "1T", "10", "32",
526         "MKK", "40M", "HT", "1T", "10", "32",
527         "FCC", "40M", "HT", "1T", "11", "26",
528         "ETSI", "40M", "HT", "1T", "11", "32",
529         "MKK", "40M", "HT", "1T", "11", "32",
530         "FCC", "40M", "HT", "1T", "12", "63",
531         "ETSI", "40M", "HT", "1T", "12", "32",
532         "MKK", "40M", "HT", "1T", "12", "32",
533         "FCC", "40M", "HT", "1T", "13", "63",
534         "ETSI", "40M", "HT", "1T", "13", "32",
535         "MKK", "40M", "HT", "1T", "13", "32",
536         "FCC", "40M", "HT", "1T", "14", "63",
537         "ETSI", "40M", "HT", "1T", "14", "63",
538         "MKK", "40M", "HT", "1T", "14", "63"
539 };
540
541 void ODM_ReadAndConfig_MP_8723B_TXPWR_LMT(struct dm_odm_t *pDM_Odm)
542 {
543         u32 i = 0;
544         u8 **Array = Array_MP_8723B_TXPWR_LMT;
545
546         for (i = 0; i < ARRAY_SIZE(Array_MP_8723B_TXPWR_LMT); i += 6) {
547                 u8 *regulation = Array[i];
548                 u8 *bandwidth = Array[i+1];
549                 u8 *rate = Array[i+2];
550                 u8 *rfPath = Array[i+3];
551                 u8 *chnl = Array[i+4];
552                 u8 *val = Array[i+5];
553
554                 odm_ConfigBB_TXPWR_LMT_8723B(
555                         pDM_Odm,
556                         regulation,
557                         bandwidth,
558                         rate,
559                         rfPath,
560                         chnl,
561                         val
562                 );
563         }
564 }