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 	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 	struct dm_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(struct dm_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(struct dm_odm_t *pDM_Odm)
424 {
425 	struct odm_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(struct dm_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 }
791