1 // SPDX-License-Identifier: GPL-2.0
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
5  *
6  ******************************************************************************/
7 #define _HAL_COM_PHYCFG_C_
8 
9 #include <drv_types.h>
10 #include <rtw_debug.h>
11 #include <hal_data.h>
12 #include <linux/kernel.h>
13 
PHY_GetTxPowerByRateBase(struct adapter * Adapter,u8 Band,u8 RfPath,u8 TxNum,enum RATE_SECTION RateSection)14 u8 PHY_GetTxPowerByRateBase(struct adapter *Adapter, u8 Band, u8 RfPath,
15 			    u8 TxNum, enum RATE_SECTION RateSection)
16 {
17 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
18 	u8	value = 0;
19 
20 	if (RfPath > ODM_RF_PATH_D) {
21 		DBG_871X("Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n", RfPath);
22 		return 0;
23 	}
24 
25 	if (Band == BAND_ON_2_4G) {
26 		switch (RateSection) {
27 		case CCK:
28 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][0];
29 			break;
30 		case OFDM:
31 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][1];
32 			break;
33 		case HT_MCS0_MCS7:
34 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][2];
35 			break;
36 		case HT_MCS8_MCS15:
37 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][3];
38 			break;
39 		case HT_MCS16_MCS23:
40 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][4];
41 			break;
42 		case HT_MCS24_MCS31:
43 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][5];
44 			break;
45 		case VHT_1SSMCS0_1SSMCS9:
46 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][6];
47 			break;
48 		case VHT_2SSMCS0_2SSMCS9:
49 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][7];
50 			break;
51 		case VHT_3SSMCS0_3SSMCS9:
52 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][8];
53 			break;
54 		case VHT_4SSMCS0_4SSMCS9:
55 			value = pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][9];
56 			break;
57 		default:
58 			DBG_871X("Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
59 					 RateSection, RfPath, TxNum);
60 			break;
61 		}
62 	} else if (Band == BAND_ON_5G) {
63 		switch (RateSection) {
64 		case OFDM:
65 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][0];
66 			break;
67 		case HT_MCS0_MCS7:
68 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][1];
69 			break;
70 		case HT_MCS8_MCS15:
71 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][2];
72 			break;
73 		case HT_MCS16_MCS23:
74 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][3];
75 			break;
76 		case HT_MCS24_MCS31:
77 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][4];
78 			break;
79 		case VHT_1SSMCS0_1SSMCS9:
80 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][5];
81 			break;
82 		case VHT_2SSMCS0_2SSMCS9:
83 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][6];
84 			break;
85 		case VHT_3SSMCS0_3SSMCS9:
86 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][7];
87 			break;
88 		case VHT_4SSMCS0_4SSMCS9:
89 			value = pHalData->TxPwrByRateBase5G[RfPath][TxNum][8];
90 			break;
91 		default:
92 			DBG_871X("Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n",
93 					 RateSection, RfPath, TxNum);
94 			break;
95 		}
96 	} else
97 		DBG_871X("Invalid Band %d in PHY_GetTxPowerByRateBase()\n", Band);
98 
99 	return value;
100 }
101 
102 static void
phy_SetTxPowerByRateBase(struct adapter * Adapter,u8 Band,u8 RfPath,enum RATE_SECTION RateSection,u8 TxNum,u8 Value)103 phy_SetTxPowerByRateBase(
104 	struct adapter *Adapter,
105 	u8 Band,
106 	u8 RfPath,
107 	enum RATE_SECTION	RateSection,
108 	u8 TxNum,
109 	u8 Value
110 )
111 {
112 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
113 
114 	if (RfPath > ODM_RF_PATH_D) {
115 		DBG_871X("Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", RfPath);
116 		return;
117 	}
118 
119 	if (Band == BAND_ON_2_4G) {
120 		switch (RateSection) {
121 		case CCK:
122 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][0] = Value;
123 			break;
124 		case OFDM:
125 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][1] = Value;
126 			break;
127 		case HT_MCS0_MCS7:
128 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][2] = Value;
129 			break;
130 		case HT_MCS8_MCS15:
131 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][3] = Value;
132 			break;
133 		case HT_MCS16_MCS23:
134 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][4] = Value;
135 			break;
136 		case HT_MCS24_MCS31:
137 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][5] = Value;
138 			break;
139 		case VHT_1SSMCS0_1SSMCS9:
140 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][6] = Value;
141 			break;
142 		case VHT_2SSMCS0_2SSMCS9:
143 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][7] = Value;
144 			break;
145 		case VHT_3SSMCS0_3SSMCS9:
146 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][8] = Value;
147 			break;
148 		case VHT_4SSMCS0_4SSMCS9:
149 			pHalData->TxPwrByRateBase2_4G[RfPath][TxNum][9] = Value;
150 			break;
151 		default:
152 			DBG_871X("Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in phy_SetTxPowerByRateBase()\n",
153 					 RateSection, RfPath, TxNum);
154 			break;
155 		}
156 	} else if (Band == BAND_ON_5G) {
157 		switch (RateSection) {
158 		case OFDM:
159 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][0] = Value;
160 			break;
161 		case HT_MCS0_MCS7:
162 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][1] = Value;
163 			break;
164 		case HT_MCS8_MCS15:
165 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][2] = Value;
166 			break;
167 		case HT_MCS16_MCS23:
168 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][3] = Value;
169 			break;
170 		case HT_MCS24_MCS31:
171 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][4] = Value;
172 			break;
173 		case VHT_1SSMCS0_1SSMCS9:
174 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][5] = Value;
175 			break;
176 		case VHT_2SSMCS0_2SSMCS9:
177 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][6] = Value;
178 			break;
179 		case VHT_3SSMCS0_3SSMCS9:
180 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][7] = Value;
181 			break;
182 		case VHT_4SSMCS0_4SSMCS9:
183 			pHalData->TxPwrByRateBase5G[RfPath][TxNum][8] = Value;
184 			break;
185 		default:
186 			DBG_871X("Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in phy_SetTxPowerByRateBase()\n",
187 					 RateSection, RfPath, TxNum);
188 			break;
189 		}
190 	} else
191 		DBG_871X("Invalid Band %d in phy_SetTxPowerByRateBase()\n", Band);
192 }
193 
194 static void
phy_StoreTxPowerByRateBase(struct adapter * padapter)195 phy_StoreTxPowerByRateBase(
196 struct adapter *padapter
197 	)
198 {
199 	u8 path, base;
200 
201 	/* DBG_871X("===>%s\n", __func__); */
202 
203 	for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_B; ++path) {
204 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_1TX, MGN_11M);
205 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, CCK, RF_1TX, base);
206 		/* DBG_871X("Power index base of 2.4G path %d 1Tx CCK = > 0x%x\n", path, base); */
207 
208 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_1TX, MGN_54M);
209 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, OFDM, RF_1TX, base);
210 		/* DBG_871X("Power index base of 2.4G path %d 1Tx OFDM = > 0x%x\n", path, base); */
211 
212 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_1TX, MGN_MCS7);
213 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base);
214 		/* DBG_871X("Power index base of 2.4G path %d 1Tx MCS0-7 = > 0x%x\n", path, base); */
215 
216 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_2TX, MGN_MCS15);
217 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base);
218 		/* DBG_871X("Power index base of 2.4G path %d 2Tx MCS8-15 = > 0x%x\n", path, base); */
219 
220 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_3TX, MGN_MCS23);
221 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, HT_MCS16_MCS23, RF_3TX, base);
222 		/* DBG_871X("Power index base of 2.4G path %d 3Tx MCS16-23 = > 0x%x\n", path, base); */
223 
224 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_1TX, MGN_VHT1SS_MCS7);
225 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
226 		/* DBG_871X("Power index base of 2.4G path %d 1Tx VHT1SS = > 0x%x\n", path, base); */
227 
228 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_2TX, MGN_VHT2SS_MCS7);
229 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
230 		/* DBG_871X("Power index base of 2.4G path %d 2Tx VHT2SS = > 0x%x\n", path, base); */
231 
232 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_2_4G, path, RF_3TX, MGN_VHT3SS_MCS7);
233 		phy_SetTxPowerByRateBase(padapter, BAND_ON_2_4G, path, VHT_3SSMCS0_3SSMCS9, RF_3TX, base);
234 		/* DBG_871X("Power index base of 2.4G path %d 3Tx VHT3SS = > 0x%x\n", path, base); */
235 
236 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_1TX, MGN_54M);
237 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, OFDM, RF_1TX, base);
238 		/* DBG_871X("Power index base of 5G path %d 1Tx OFDM = > 0x%x\n", path, base); */
239 
240 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_1TX, MGN_MCS7);
241 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base);
242 		/* DBG_871X("Power index base of 5G path %d 1Tx MCS0~7 = > 0x%x\n", path, base); */
243 
244 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_2TX, MGN_MCS15);
245 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base);
246 		/* DBG_871X("Power index base of 5G path %d 2Tx MCS8~15 = > 0x%x\n", path, base); */
247 
248 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_3TX, MGN_MCS23);
249 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, HT_MCS16_MCS23, RF_3TX, base);
250 		/* DBG_871X("Power index base of 5G path %d 3Tx MCS16~23 = > 0x%x\n", path, base); */
251 
252 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_1TX, MGN_VHT1SS_MCS7);
253 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base);
254 		/* DBG_871X("Power index base of 5G path %d 1Tx VHT1SS = > 0x%x\n", path, base); */
255 
256 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_2TX, MGN_VHT2SS_MCS7);
257 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base);
258 		/* DBG_871X("Power index base of 5G path %d 2Tx VHT2SS = > 0x%x\n", path, base); */
259 
260 		base = PHY_GetTxPowerByRate(padapter, BAND_ON_5G, path, RF_3TX, MGN_VHT2SS_MCS7);
261 		phy_SetTxPowerByRateBase(padapter, BAND_ON_5G, path, VHT_3SSMCS0_3SSMCS9, RF_3TX, base);
262 		/* DBG_871X("Power index base of 5G path %d 3Tx VHT3SS = > 0x%x\n", path, base); */
263 	}
264 
265 	/* DBG_871X("<===%s\n", __func__); */
266 }
267 
PHY_GetRateSectionIndexOfTxPowerByRate(struct adapter * padapter,u32 RegAddr,u32 BitMask)268 u8 PHY_GetRateSectionIndexOfTxPowerByRate(
269 	struct adapter *padapter, u32 RegAddr, u32 BitMask
270 )
271 {
272 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
273 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
274 	u8	index = 0;
275 
276 	if (pDM_Odm->PhyRegPgVersion == 0) {
277 		switch (RegAddr) {
278 		case rTxAGC_A_Rate18_06:
279 			index = 0;
280 			break;
281 		case rTxAGC_A_Rate54_24:
282 			index = 1;
283 			break;
284 		case rTxAGC_A_CCK1_Mcs32:
285 			index = 6;
286 			break;
287 		case rTxAGC_B_CCK11_A_CCK2_11:
288 			if (BitMask == bMaskH3Bytes)
289 				index = 7;
290 			else if (BitMask == 0x000000ff)
291 				index = 15;
292 			break;
293 
294 		case rTxAGC_A_Mcs03_Mcs00:
295 			index = 2;
296 			break;
297 		case rTxAGC_A_Mcs07_Mcs04:
298 			index = 3;
299 			break;
300 		case rTxAGC_A_Mcs11_Mcs08:
301 			index = 4;
302 			break;
303 		case rTxAGC_A_Mcs15_Mcs12:
304 			index = 5;
305 			break;
306 		case rTxAGC_B_Rate18_06:
307 			index = 8;
308 			break;
309 		case rTxAGC_B_Rate54_24:
310 			index = 9;
311 			break;
312 		case rTxAGC_B_CCK1_55_Mcs32:
313 			index = 14;
314 			break;
315 		case rTxAGC_B_Mcs03_Mcs00:
316 			index = 10;
317 			break;
318 		case rTxAGC_B_Mcs07_Mcs04:
319 			index = 11;
320 			break;
321 		case rTxAGC_B_Mcs11_Mcs08:
322 			index = 12;
323 			break;
324 		case rTxAGC_B_Mcs15_Mcs12:
325 			index = 13;
326 			break;
327 		default:
328 			DBG_871X("Invalid RegAddr 0x3%x in PHY_GetRateSectionIndexOfTxPowerByRate()", RegAddr);
329 			break;
330 		}
331 	}
332 
333 	return index;
334 }
335 
336 void
PHY_GetRateValuesOfTxPowerByRate(struct adapter * padapter,u32 RegAddr,u32 BitMask,u32 Value,u8 * RateIndex,s8 * PwrByRateVal,u8 * RateNum)337 PHY_GetRateValuesOfTxPowerByRate(
338 	struct adapter *padapter,
339 	u32	RegAddr,
340 	u32	BitMask,
341 	u32	Value,
342 	u8 *RateIndex,
343 	s8 *PwrByRateVal,
344 	u8 *RateNum
345 )
346 {
347 	u8 i = 0;
348 
349 	switch (RegAddr) {
350 	case rTxAGC_A_Rate18_06:
351 	case rTxAGC_B_Rate18_06:
352 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_6M);
353 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_9M);
354 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_12M);
355 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_18M);
356 		for (i = 0; i < 4; ++i) {
357 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
358 											((Value >> (i * 8)) & 0xF));
359 		}
360 		*RateNum = 4;
361 		break;
362 
363 	case rTxAGC_A_Rate54_24:
364 	case rTxAGC_B_Rate54_24:
365 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_24M);
366 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_36M);
367 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_48M);
368 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_54M);
369 		for (i = 0; i < 4; ++i) {
370 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
371 											((Value >> (i * 8)) & 0xF));
372 		}
373 		*RateNum = 4;
374 		break;
375 
376 	case rTxAGC_A_CCK1_Mcs32:
377 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_1M);
378 		PwrByRateVal[0] = (s8) ((((Value >> (8 + 4)) & 0xF)) * 10 +
379 										((Value >> 8) & 0xF));
380 		*RateNum = 1;
381 		break;
382 
383 	case rTxAGC_B_CCK11_A_CCK2_11:
384 		if (BitMask == 0xffffff00) {
385 			RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_2M);
386 			RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_5_5M);
387 			RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_11M);
388 			for (i = 1; i < 4; ++i) {
389 				PwrByRateVal[i - 1] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
390 												((Value >> (i * 8)) & 0xF));
391 			}
392 			*RateNum = 3;
393 		} else if (BitMask == 0x000000ff) {
394 			RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_11M);
395 			PwrByRateVal[0] = (s8) ((((Value >> 4) & 0xF)) * 10 + (Value & 0xF));
396 			*RateNum = 1;
397 		}
398 		break;
399 
400 	case rTxAGC_A_Mcs03_Mcs00:
401 	case rTxAGC_B_Mcs03_Mcs00:
402 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS0);
403 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS1);
404 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS2);
405 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS3);
406 		for (i = 0; i < 4; ++i) {
407 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
408 											((Value >> (i * 8)) & 0xF));
409 		}
410 		*RateNum = 4;
411 		break;
412 
413 	case rTxAGC_A_Mcs07_Mcs04:
414 	case rTxAGC_B_Mcs07_Mcs04:
415 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS4);
416 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS5);
417 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS6);
418 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS7);
419 		for (i = 0; i < 4; ++i) {
420 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
421 											((Value >> (i * 8)) & 0xF));
422 		}
423 		*RateNum = 4;
424 		break;
425 
426 	case rTxAGC_A_Mcs11_Mcs08:
427 	case rTxAGC_B_Mcs11_Mcs08:
428 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS8);
429 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS9);
430 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS10);
431 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS11);
432 		for (i = 0; i < 4; ++i) {
433 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
434 											((Value >> (i * 8)) & 0xF));
435 		}
436 		*RateNum = 4;
437 		break;
438 
439 	case rTxAGC_A_Mcs15_Mcs12:
440 	case rTxAGC_B_Mcs15_Mcs12:
441 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS12);
442 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS13);
443 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS14);
444 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS15);
445 		for (i = 0; i < 4; ++i) {
446 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
447 											((Value >> (i * 8)) & 0xF));
448 		}
449 		*RateNum = 4;
450 
451 		break;
452 
453 	case rTxAGC_B_CCK1_55_Mcs32:
454 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_1M);
455 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_2M);
456 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_5_5M);
457 		for (i = 1; i < 4; ++i) {
458 			PwrByRateVal[i - 1] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
459 											((Value >> (i * 8)) & 0xF));
460 		}
461 		*RateNum = 3;
462 		break;
463 
464 	case 0xC20:
465 	case 0xE20:
466 	case 0x1820:
467 	case 0x1a20:
468 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_1M);
469 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_2M);
470 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_5_5M);
471 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_11M);
472 		for (i = 0; i < 4; ++i) {
473 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
474 											((Value >> (i * 8)) & 0xF));
475 		}
476 		*RateNum = 4;
477 		break;
478 
479 	case 0xC24:
480 	case 0xE24:
481 	case 0x1824:
482 	case 0x1a24:
483 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_6M);
484 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_9M);
485 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_12M);
486 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_18M);
487 		for (i = 0; i < 4; ++i) {
488 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
489 											((Value >> (i * 8)) & 0xF));
490 		}
491 		*RateNum = 4;
492 		break;
493 
494 	case 0xC28:
495 	case 0xE28:
496 	case 0x1828:
497 	case 0x1a28:
498 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_24M);
499 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_36M);
500 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_48M);
501 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_54M);
502 		for (i = 0; i < 4; ++i) {
503 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
504 											((Value >> (i * 8)) & 0xF));
505 		}
506 		*RateNum = 4;
507 		break;
508 
509 	case 0xC2C:
510 	case 0xE2C:
511 	case 0x182C:
512 	case 0x1a2C:
513 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS0);
514 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS1);
515 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS2);
516 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS3);
517 		for (i = 0; i < 4; ++i) {
518 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
519 											((Value >> (i * 8)) & 0xF));
520 		}
521 		*RateNum = 4;
522 		break;
523 
524 	case 0xC30:
525 	case 0xE30:
526 	case 0x1830:
527 	case 0x1a30:
528 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS4);
529 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS5);
530 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS6);
531 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS7);
532 		for (i = 0; i < 4; ++i) {
533 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
534 											((Value >> (i * 8)) & 0xF));
535 		}
536 		*RateNum = 4;
537 		break;
538 
539 	case 0xC34:
540 	case 0xE34:
541 	case 0x1834:
542 	case 0x1a34:
543 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS8);
544 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS9);
545 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS10);
546 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS11);
547 		for (i = 0; i < 4; ++i) {
548 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
549 											((Value >> (i * 8)) & 0xF));
550 		}
551 		*RateNum = 4;
552 		break;
553 
554 	case 0xC38:
555 	case 0xE38:
556 	case 0x1838:
557 	case 0x1a38:
558 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS12);
559 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS13);
560 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS14);
561 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS15);
562 		for (i = 0; i < 4; ++i) {
563 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
564 											((Value >> (i * 8)) & 0xF));
565 		}
566 		*RateNum = 4;
567 		break;
568 
569 	case 0xC3C:
570 	case 0xE3C:
571 	case 0x183C:
572 	case 0x1a3C:
573 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS0);
574 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS1);
575 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS2);
576 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS3);
577 		for (i = 0; i < 4; ++i) {
578 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
579 											((Value >> (i * 8)) & 0xF));
580 		}
581 		*RateNum = 4;
582 		break;
583 
584 	case 0xC40:
585 	case 0xE40:
586 	case 0x1840:
587 	case 0x1a40:
588 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS4);
589 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS5);
590 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS6);
591 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS7);
592 		for (i = 0; i < 4; ++i) {
593 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
594 											((Value >> (i * 8)) & 0xF));
595 		}
596 		*RateNum = 4;
597 		break;
598 
599 	case 0xC44:
600 	case 0xE44:
601 	case 0x1844:
602 	case 0x1a44:
603 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS8);
604 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT1SS_MCS9);
605 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS0);
606 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS1);
607 		for (i = 0; i < 4; ++i) {
608 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
609 											((Value >> (i * 8)) & 0xF));
610 		}
611 		*RateNum = 4;
612 		break;
613 
614 	case 0xC48:
615 	case 0xE48:
616 	case 0x1848:
617 	case 0x1a48:
618 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS2);
619 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS3);
620 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS4);
621 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS5);
622 		for (i = 0; i < 4; ++i) {
623 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
624 											((Value >> (i * 8)) & 0xF));
625 		}
626 		*RateNum = 4;
627 		break;
628 
629 	case 0xC4C:
630 	case 0xE4C:
631 	case 0x184C:
632 	case 0x1a4C:
633 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS6);
634 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS7);
635 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS8);
636 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS9);
637 		for (i = 0; i < 4; ++i) {
638 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
639 											((Value >> (i * 8)) & 0xF));
640 		}
641 		*RateNum = 4;
642 		break;
643 
644 	case 0xCD8:
645 	case 0xED8:
646 	case 0x18D8:
647 	case 0x1aD8:
648 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS16);
649 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS17);
650 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS18);
651 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS19);
652 		for (i = 0; i < 4; ++i) {
653 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
654 											((Value >> (i * 8)) & 0xF));
655 		}
656 		*RateNum = 4;
657 		break;
658 
659 	case 0xCDC:
660 	case 0xEDC:
661 	case 0x18DC:
662 	case 0x1aDC:
663 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS20);
664 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS21);
665 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS22);
666 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_MCS23);
667 		for (i = 0; i < 4; ++i) {
668 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
669 											((Value >> (i * 8)) & 0xF));
670 		}
671 		*RateNum = 4;
672 		break;
673 
674 	case 0xCE0:
675 	case 0xEE0:
676 	case 0x18E0:
677 	case 0x1aE0:
678 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS0);
679 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS1);
680 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS2);
681 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS3);
682 		for (i = 0; i < 4; ++i) {
683 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
684 											((Value >> (i * 8)) & 0xF));
685 		}
686 		*RateNum = 4;
687 		break;
688 
689 	case 0xCE4:
690 	case 0xEE4:
691 	case 0x18E4:
692 	case 0x1aE4:
693 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS4);
694 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS5);
695 		RateIndex[2] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS6);
696 		RateIndex[3] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS7);
697 		for (i = 0; i < 4; ++i) {
698 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
699 											((Value >> (i * 8)) & 0xF));
700 		}
701 		*RateNum = 4;
702 		break;
703 
704 	case 0xCE8:
705 	case 0xEE8:
706 	case 0x18E8:
707 	case 0x1aE8:
708 		RateIndex[0] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS8);
709 		RateIndex[1] = PHY_GetRateIndexOfTxPowerByRate(MGN_VHT3SS_MCS9);
710 		for (i = 0; i < 2; ++i) {
711 			PwrByRateVal[i] = (s8) ((((Value >> (i * 8 + 4)) & 0xF)) * 10 +
712 											((Value >> (i * 8)) & 0xF));
713 		}
714 		*RateNum = 4;
715 		break;
716 
717 	default:
718 		DBG_871X("Invalid RegAddr 0x%x in %s()\n", RegAddr, __func__);
719 		break;
720 	}
721 }
722 
PHY_StoreTxPowerByRateNew(struct adapter * padapter,u32 Band,u32 RfPath,u32 TxNum,u32 RegAddr,u32 BitMask,u32 Data)723 static void PHY_StoreTxPowerByRateNew(
724 	struct adapter *padapter,
725 	u32	Band,
726 	u32	RfPath,
727 	u32	TxNum,
728 	u32	RegAddr,
729 	u32	BitMask,
730 	u32	Data
731 )
732 {
733 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
734 	u8 i = 0, rateIndex[4] = {0}, rateNum = 0;
735 	s8	PwrByRateVal[4] = {0};
736 
737 	PHY_GetRateValuesOfTxPowerByRate(padapter, RegAddr, BitMask, Data, rateIndex, PwrByRateVal, &rateNum);
738 
739 	if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
740 		DBG_871X("Invalid Band %d\n", Band);
741 		return;
742 	}
743 
744 	if (RfPath > ODM_RF_PATH_D) {
745 		DBG_871X("Invalid RfPath %d\n", RfPath);
746 		return;
747 	}
748 
749 	if (TxNum > ODM_RF_PATH_D) {
750 		DBG_871X("Invalid TxNum %d\n", TxNum);
751 		return;
752 	}
753 
754 	for (i = 0; i < rateNum; ++i) {
755 		if (rateIndex[i] == PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS0) ||
756 			 rateIndex[i] == PHY_GetRateIndexOfTxPowerByRate(MGN_VHT2SS_MCS1))
757 			TxNum = RF_2TX;
758 
759 		pHalData->TxPwrByRateOffset[Band][RfPath][TxNum][rateIndex[i]] = PwrByRateVal[i];
760 	}
761 }
762 
PHY_StoreTxPowerByRateOld(struct adapter * padapter,u32 RegAddr,u32 BitMask,u32 Data)763 static void PHY_StoreTxPowerByRateOld(
764 	struct adapter *padapter, u32	RegAddr, u32 BitMask, u32 Data
765 )
766 {
767 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
768 	u8	index = PHY_GetRateSectionIndexOfTxPowerByRate(padapter, RegAddr, BitMask);
769 
770 	pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][index] = Data;
771 	/* DBG_871X("MCSTxPowerLevelOriginalOffset[%d][0] = 0x%x\n", pHalData->pwrGroupCnt, */
772 	/*	pHalData->MCSTxPowerLevelOriginalOffset[pHalData->pwrGroupCnt][0]); */
773 }
774 
PHY_InitTxPowerByRate(struct adapter * padapter)775 void PHY_InitTxPowerByRate(struct adapter *padapter)
776 {
777 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
778 	u8 band, rfPath, TxNum, rate;
779 
780 	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band)
781 			for (rfPath = 0; rfPath < TX_PWR_BY_RATE_NUM_RF; ++rfPath)
782 				for (TxNum = 0; TxNum < TX_PWR_BY_RATE_NUM_RF; ++TxNum)
783 					for (rate = 0; rate < TX_PWR_BY_RATE_NUM_RATE; ++rate)
784 						pHalData->TxPwrByRateOffset[band][rfPath][TxNum][rate] = 0;
785 }
786 
PHY_StoreTxPowerByRate(struct adapter * padapter,u32 Band,u32 RfPath,u32 TxNum,u32 RegAddr,u32 BitMask,u32 Data)787 void PHY_StoreTxPowerByRate(
788 	struct adapter *padapter,
789 	u32	Band,
790 	u32	RfPath,
791 	u32	TxNum,
792 	u32	RegAddr,
793 	u32	BitMask,
794 	u32	Data
795 )
796 {
797 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
798 	PDM_ODM_T		pDM_Odm = &pHalData->odmpriv;
799 
800 	if (pDM_Odm->PhyRegPgVersion > 0)
801 		PHY_StoreTxPowerByRateNew(padapter, Band, RfPath, TxNum, RegAddr, BitMask, Data);
802 	else if (pDM_Odm->PhyRegPgVersion == 0) {
803 		PHY_StoreTxPowerByRateOld(padapter, RegAddr, BitMask, Data);
804 
805 		if (RegAddr == rTxAGC_A_Mcs15_Mcs12 && pHalData->rf_type == RF_1T1R)
806 			pHalData->pwrGroupCnt++;
807 		else if (RegAddr == rTxAGC_B_Mcs15_Mcs12 && pHalData->rf_type != RF_1T1R)
808 			pHalData->pwrGroupCnt++;
809 	} else
810 		DBG_871X("Invalid PHY_REG_PG.txt version %d\n",  pDM_Odm->PhyRegPgVersion);
811 
812 }
813 
814 static void
phy_ConvertTxPowerByRateInDbmToRelativeValues(struct adapter * padapter)815 phy_ConvertTxPowerByRateInDbmToRelativeValues(
816 struct adapter *padapter
817 	)
818 {
819 	u8	base = 0, i = 0, value = 0, band = 0, path = 0, txNum = 0;
820 	u8	cckRates[4] = {
821 		MGN_1M, MGN_2M, MGN_5_5M, MGN_11M
822 	};
823 	u8	ofdmRates[8] = {
824 		MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M
825 	};
826 	u8 mcs0_7Rates[8] = {
827 		MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7
828 	};
829 	u8 mcs8_15Rates[8] = {
830 		MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15
831 	};
832 	u8 mcs16_23Rates[8] = {
833 		MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23
834 	};
835 	u8 vht1ssRates[10] = {
836 		MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4,
837 		MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9
838 	};
839 	u8 vht2ssRates[10] = {
840 		MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4,
841 		MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9
842 	};
843 	u8 vht3ssRates[10] = {
844 		MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4,
845 		MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9
846 	};
847 
848 	/* DBG_871X("===>PHY_ConvertTxPowerByRateInDbmToRelativeValues()\n"); */
849 
850 	for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band) {
851 		for (path = ODM_RF_PATH_A; path <= ODM_RF_PATH_D; ++path) {
852 			for (txNum = RF_1TX; txNum < RF_MAX_TX_NUM; ++txNum) {
853 				/*  CCK */
854 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_11M);
855 				for (i = 0; i < ARRAY_SIZE(cckRates); ++i) {
856 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, cckRates[i]);
857 					PHY_SetTxPowerByRate(padapter, band, path, txNum, cckRates[i], value - base);
858 				}
859 
860 				/*  OFDM */
861 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_54M);
862 				for (i = 0; i < sizeof(ofdmRates); ++i) {
863 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, ofdmRates[i]);
864 					PHY_SetTxPowerByRate(padapter, band, path, txNum, ofdmRates[i], value - base);
865 				}
866 
867 				/*  HT MCS0~7 */
868 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_MCS7);
869 				for (i = 0; i < sizeof(mcs0_7Rates); ++i) {
870 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, mcs0_7Rates[i]);
871 					PHY_SetTxPowerByRate(padapter, band, path, txNum, mcs0_7Rates[i], value - base);
872 				}
873 
874 				/*  HT MCS8~15 */
875 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_MCS15);
876 				for (i = 0; i < sizeof(mcs8_15Rates); ++i) {
877 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, mcs8_15Rates[i]);
878 					PHY_SetTxPowerByRate(padapter, band, path, txNum, mcs8_15Rates[i], value - base);
879 				}
880 
881 				/*  HT MCS16~23 */
882 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_MCS23);
883 				for (i = 0; i < sizeof(mcs16_23Rates); ++i) {
884 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, mcs16_23Rates[i]);
885 					PHY_SetTxPowerByRate(padapter, band, path, txNum, mcs16_23Rates[i], value - base);
886 				}
887 
888 				/*  VHT 1SS */
889 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_VHT1SS_MCS7);
890 				for (i = 0; i < sizeof(vht1ssRates); ++i) {
891 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, vht1ssRates[i]);
892 					PHY_SetTxPowerByRate(padapter, band, path, txNum, vht1ssRates[i], value - base);
893 				}
894 
895 				/*  VHT 2SS */
896 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_VHT2SS_MCS7);
897 				for (i = 0; i < sizeof(vht2ssRates); ++i) {
898 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, vht2ssRates[i]);
899 					PHY_SetTxPowerByRate(padapter, band, path, txNum, vht2ssRates[i], value - base);
900 				}
901 
902 				/*  VHT 3SS */
903 				base = PHY_GetTxPowerByRate(padapter, band, path, txNum, MGN_VHT3SS_MCS7);
904 				for (i = 0; i < sizeof(vht3ssRates); ++i) {
905 					value = PHY_GetTxPowerByRate(padapter, band, path, txNum, vht3ssRates[i]);
906 					PHY_SetTxPowerByRate(padapter, band, path, txNum, vht3ssRates[i], value - base);
907 				}
908 			}
909 		}
910 	}
911 
912 	/* DBG_871X("<===PHY_ConvertTxPowerByRateInDbmToRelativeValues()\n"); */
913 }
914 
915 /*
916   * This function must be called if the value in the PHY_REG_PG.txt(or header)
917   * is exact dBm values
918   */
PHY_TxPowerByRateConfiguration(struct adapter * padapter)919 void PHY_TxPowerByRateConfiguration(struct adapter *padapter)
920 {
921 	phy_StoreTxPowerByRateBase(padapter);
922 	phy_ConvertTxPowerByRateInDbmToRelativeValues(padapter);
923 }
924 
PHY_SetTxPowerIndexByRateSection(struct adapter * padapter,u8 RFPath,u8 Channel,u8 RateSection)925 void PHY_SetTxPowerIndexByRateSection(
926 	struct adapter *padapter, u8 RFPath, u8 Channel, u8 RateSection
927 )
928 {
929 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
930 
931 	if (RateSection == CCK) {
932 		u8 cckRates[]   = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M};
933 		if (pHalData->CurrentBandType == BAND_ON_2_4G)
934 			PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
935 						     pHalData->CurrentChannelBW,
936 						     Channel, cckRates,
937 						     ARRAY_SIZE(cckRates));
938 
939 	} else if (RateSection == OFDM) {
940 		u8 ofdmRates[]  = {MGN_6M, MGN_9M, MGN_12M, MGN_18M, MGN_24M, MGN_36M, MGN_48M, MGN_54M};
941 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
942 					       pHalData->CurrentChannelBW,
943 					       Channel, ofdmRates,
944 					       ARRAY_SIZE(ofdmRates));
945 
946 	} else if (RateSection == HT_MCS0_MCS7) {
947 		u8 htRates1T[]  = {MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3, MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7};
948 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
949 					       pHalData->CurrentChannelBW,
950 					       Channel, htRates1T,
951 					       ARRAY_SIZE(htRates1T));
952 
953 	} else if (RateSection == HT_MCS8_MCS15) {
954 		u8 htRates2T[]  = {MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11, MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15};
955 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
956 					       pHalData->CurrentChannelBW,
957 					       Channel, htRates2T,
958 					       ARRAY_SIZE(htRates2T));
959 
960 	} else if (RateSection == HT_MCS16_MCS23) {
961 		u8 htRates3T[]  = {MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19, MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23};
962 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
963 					       pHalData->CurrentChannelBW,
964 					       Channel, htRates3T,
965 					       ARRAY_SIZE(htRates3T));
966 
967 	} else if (RateSection == HT_MCS24_MCS31) {
968 		u8 htRates4T[]  = {MGN_MCS24, MGN_MCS25, MGN_MCS26, MGN_MCS27, MGN_MCS28, MGN_MCS29, MGN_MCS30, MGN_MCS31};
969 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
970 					       pHalData->CurrentChannelBW,
971 					       Channel, htRates4T,
972 					       ARRAY_SIZE(htRates4T));
973 
974 	} else if (RateSection == VHT_1SSMCS0_1SSMCS9) {
975 		u8 vhtRates1T[] = {MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3, MGN_VHT1SS_MCS4,
976 				MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7, MGN_VHT1SS_MCS8, MGN_VHT1SS_MCS9};
977 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
978 					       pHalData->CurrentChannelBW,
979 					       Channel, vhtRates1T,
980 					       ARRAY_SIZE(vhtRates1T));
981 
982 	} else if (RateSection == VHT_2SSMCS0_2SSMCS9) {
983 		u8 vhtRates2T[] = {MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1, MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4,
984 				MGN_VHT2SS_MCS5, MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9};
985 
986 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
987 					       pHalData->CurrentChannelBW,
988 					       Channel, vhtRates2T,
989 					       ARRAY_SIZE(vhtRates2T));
990 	} else if (RateSection == VHT_3SSMCS0_3SSMCS9) {
991 		u8 vhtRates3T[] = {MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3, MGN_VHT3SS_MCS4,
992 				MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7, MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9};
993 
994 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
995 					       pHalData->CurrentChannelBW,
996 					       Channel, vhtRates3T,
997 					       ARRAY_SIZE(vhtRates3T));
998 	} else if (RateSection == VHT_4SSMCS0_4SSMCS9) {
999 		u8 vhtRates4T[] = {MGN_VHT4SS_MCS0, MGN_VHT4SS_MCS1, MGN_VHT4SS_MCS2, MGN_VHT4SS_MCS3, MGN_VHT4SS_MCS4,
1000 				MGN_VHT4SS_MCS5, MGN_VHT4SS_MCS6, MGN_VHT4SS_MCS7, MGN_VHT4SS_MCS8, MGN_VHT4SS_MCS9};
1001 
1002 		PHY_SetTxPowerIndexByRateArray(padapter, RFPath,
1003 					       pHalData->CurrentChannelBW,
1004 					       Channel, vhtRates4T,
1005 					       ARRAY_SIZE(vhtRates4T));
1006 	} else
1007 		DBG_871X("Invalid RateSection %d in %s", RateSection, __func__);
1008 }
1009 
phy_GetChnlIndex(u8 Channel,u8 * ChannelIdx)1010 static bool phy_GetChnlIndex(u8 Channel, u8 *ChannelIdx)
1011 {
1012 	u8 channel5G[CHANNEL_MAX_NUMBER_5G] = {
1013 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, 102,
1014 		104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130,
1015 		132, 134, 136, 138, 140, 142, 144, 149, 151, 153, 155, 157, 159, 161,
1016 		163, 165, 167, 168, 169, 171, 173, 175, 177
1017 	};
1018 	u8  i = 0;
1019 	bool bIn24G = true;
1020 
1021 	if (Channel <= 14) {
1022 		bIn24G = true;
1023 		*ChannelIdx = Channel-1;
1024 	} else {
1025 		bIn24G = false;
1026 
1027 		for (i = 0; i < ARRAY_SIZE(channel5G); ++i) {
1028 			if (channel5G[i] == Channel) {
1029 				*ChannelIdx = i;
1030 				return bIn24G;
1031 			}
1032 		}
1033 	}
1034 
1035 	return bIn24G;
1036 }
1037 
PHY_GetTxPowerIndexBase(struct adapter * padapter,u8 RFPath,u8 Rate,enum CHANNEL_WIDTH BandWidth,u8 Channel,bool * bIn24G)1038 u8 PHY_GetTxPowerIndexBase(
1039 	struct adapter *padapter,
1040 	u8 RFPath,
1041 	u8 Rate,
1042 	enum CHANNEL_WIDTH	BandWidth,
1043 	u8 Channel,
1044 	bool *bIn24G
1045 )
1046 {
1047 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1048 	u8 i = 0;	/* default set to 1S */
1049 	u8 txPower = 0;
1050 	u8 chnlIdx = (Channel-1);
1051 
1052 	if (HAL_IsLegalChannel(padapter, Channel) == false) {
1053 		chnlIdx = 0;
1054 		DBG_871X("Illegal channel!!\n");
1055 	}
1056 
1057 	*bIn24G = phy_GetChnlIndex(Channel, &chnlIdx);
1058 
1059 	/* DBG_871X("[%s] Channel Index: %d\n", (*bIn24G?"2.4G":"5G"), chnlIdx); */
1060 
1061 	if (*bIn24G) { /* 3 ============================== 2.4 G ============================== */
1062 		if (IS_CCK_RATE(Rate))
1063 			txPower = pHalData->Index24G_CCK_Base[RFPath][chnlIdx];
1064 		else if (MGN_6M <= Rate)
1065 			txPower = pHalData->Index24G_BW40_Base[RFPath][chnlIdx];
1066 		else
1067 			DBG_871X("PHY_GetTxPowerIndexBase: INVALID Rate.\n");
1068 
1069 		/* DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", */
1070 		/*		((RFPath == 0)?'A':'B'), Rate, chnlIdx, txPower); */
1071 
1072 		/*  OFDM-1T */
1073 		if ((MGN_6M <= Rate && Rate <= MGN_54M) && !IS_CCK_RATE(Rate)) {
1074 			txPower += pHalData->OFDM_24G_Diff[RFPath][TX_1S];
1075 			/* DBG_871X("+PowerDiff 2.4G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath == 0)?'A':'B'), pHalData->OFDM_24G_Diff[RFPath][TX_1S]); */
1076 		}
1077 		if (BandWidth == CHANNEL_WIDTH_20) { /*  BW20-1S, BW20-2S */
1078 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1079 				txPower += pHalData->BW20_24G_Diff[RFPath][TX_1S];
1080 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1081 				txPower += pHalData->BW20_24G_Diff[RFPath][TX_2S];
1082 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1083 				txPower += pHalData->BW20_24G_Diff[RFPath][TX_3S];
1084 			if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1085 				txPower += pHalData->BW20_24G_Diff[RFPath][TX_4S];
1086 
1087 			/* DBG_871X("+PowerDiff 2.4G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1088 			/*	pHalData->BW20_24G_Diff[RFPath][TX_1S], pHalData->BW20_24G_Diff[RFPath][TX_2S], */
1089 			/*	pHalData->BW20_24G_Diff[RFPath][TX_3S], pHalData->BW20_24G_Diff[RFPath][TX_4S]); */
1090 		} else if (BandWidth == CHANNEL_WIDTH_40) { /*  BW40-1S, BW40-2S */
1091 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1092 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];
1093 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1094 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];
1095 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1096 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];
1097 			if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1098 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];
1099 
1100 			/* DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4S) = (%d, %d, %d, %d)\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1101 			/*	pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S], */
1102 			/*	pHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]); */
1103 		}
1104 		/*  Willis suggest adopt BW 40M power index while in BW 80 mode */
1105 		else if (BandWidth == CHANNEL_WIDTH_80) {
1106 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1107 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_1S];
1108 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1109 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_2S];
1110 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1111 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_3S];
1112 			if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1113 				txPower += pHalData->BW40_24G_Diff[RFPath][TX_4S];
1114 
1115 			/* DBG_871X("+PowerDiff 2.4G (RF-%c): (BW40-1S, BW40-2S, BW40-3S, BW40-4T) = (%d, %d, %d, %d) P.S. Current is in BW 80MHz\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1116 			/*	pHalData->BW40_24G_Diff[RFPath][TX_1S], pHalData->BW40_24G_Diff[RFPath][TX_2S], */
1117 			/*	pHalData->BW40_24G_Diff[RFPath][TX_3S], pHalData->BW40_24G_Diff[RFPath][TX_4S]); */
1118 		}
1119 	} else {/* 3 ============================== 5 G ============================== */
1120 		if (MGN_6M <= Rate)
1121 			txPower = pHalData->Index5G_BW40_Base[RFPath][chnlIdx];
1122 		else
1123 			DBG_871X("===> mpt_ProQueryCalTxPower_Jaguar: INVALID Rate.\n");
1124 
1125 		/* DBG_871X("Base Tx power(RF-%c, Rate #%d, Channel Index %d) = 0x%X\n", */
1126 		/*	((RFPath == 0)?'A':'B'), Rate, chnlIdx, txPower); */
1127 
1128 		/*  OFDM-1T */
1129 		if ((MGN_6M <= Rate && Rate <= MGN_54M) && !IS_CCK_RATE(Rate)) {
1130 			txPower += pHalData->OFDM_5G_Diff[RFPath][TX_1S];
1131 			/* DBG_871X("+PowerDiff 5G (RF-%c): (OFDM-1T) = (%d)\n", ((RFPath == 0)?'A':'B'), pHalData->OFDM_5G_Diff[RFPath][TX_1S]); */
1132 		}
1133 
1134 		/*  BW20-1S, BW20-2S */
1135 		if (BandWidth == CHANNEL_WIDTH_20) {
1136 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1137 				txPower += pHalData->BW20_5G_Diff[RFPath][TX_1S];
1138 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1139 				txPower += pHalData->BW20_5G_Diff[RFPath][TX_2S];
1140 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1141 				txPower += pHalData->BW20_5G_Diff[RFPath][TX_3S];
1142 			if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1143 				txPower += pHalData->BW20_5G_Diff[RFPath][TX_4S];
1144 
1145 			/* DBG_871X("+PowerDiff 5G (RF-%c): (BW20-1S, BW20-2S, BW20-3S, BW20-4S) = (%d, %d, %d, %d)\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1146 			/*	pHalData->BW20_5G_Diff[RFPath][TX_1S], pHalData->BW20_5G_Diff[RFPath][TX_2S], */
1147 			/*	pHalData->BW20_5G_Diff[RFPath][TX_3S], pHalData->BW20_5G_Diff[RFPath][TX_4S]); */
1148 		} else if (BandWidth == CHANNEL_WIDTH_40) { /*  BW40-1S, BW40-2S */
1149 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1150 				txPower += pHalData->BW40_5G_Diff[RFPath][TX_1S];
1151 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1152 				txPower += pHalData->BW40_5G_Diff[RFPath][TX_2S];
1153 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1154 				txPower += pHalData->BW40_5G_Diff[RFPath][TX_3S];
1155 			if ((MGN_MCS24 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1156 				txPower += pHalData->BW40_5G_Diff[RFPath][TX_4S];
1157 
1158 			/* DBG_871X("+PowerDiff 5G(RF-%c): (BW40-1S, BW40-2S) = (%d, %d, %d, %d)\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1159 			/*	pHalData->BW40_5G_Diff[RFPath][TX_1S], pHalData->BW40_5G_Diff[RFPath][TX_2S], */
1160 			/*	pHalData->BW40_5G_Diff[RFPath][TX_3S], pHalData->BW40_5G_Diff[RFPath][TX_4S]); */
1161 		} else if (BandWidth == CHANNEL_WIDTH_80) { /*  BW80-1S, BW80-2S */
1162 			/*  <20121220, Kordan> Get the index of array "Index5G_BW80_Base". */
1163 			u8 channel5G_80M[CHANNEL_MAX_NUMBER_5G_80M] = {42, 58, 106, 122, 138, 155, 171};
1164 			for (i = 0; i < ARRAY_SIZE(channel5G_80M); ++i)
1165 				if (channel5G_80M[i] == Channel)
1166 					chnlIdx = i;
1167 
1168 			txPower = pHalData->Index5G_BW80_Base[RFPath][chnlIdx];
1169 
1170 			if ((MGN_MCS0 <= Rate && Rate <= MGN_MCS31)  || (MGN_VHT1SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1171 				txPower += + pHalData->BW80_5G_Diff[RFPath][TX_1S];
1172 			if ((MGN_MCS8 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT2SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1173 				txPower += pHalData->BW80_5G_Diff[RFPath][TX_2S];
1174 			if ((MGN_MCS16 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT3SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1175 				txPower += pHalData->BW80_5G_Diff[RFPath][TX_3S];
1176 			if ((MGN_MCS23 <= Rate && Rate <= MGN_MCS31) || (MGN_VHT4SS_MCS0 <= Rate && Rate <= MGN_VHT4SS_MCS9))
1177 				txPower += pHalData->BW80_5G_Diff[RFPath][TX_4S];
1178 
1179 			/* DBG_871X("+PowerDiff 5G(RF-%c): (BW80-1S, BW80-2S, BW80-3S, BW80-4S) = (%d, %d, %d, %d)\n", ((RFPath == 0)?'A':(RFPath == 1)?'B':(RFPath ==2)?'C':'D'), */
1180 			/*	pHalData->BW80_5G_Diff[RFPath][TX_1S], pHalData->BW80_5G_Diff[RFPath][TX_2S], */
1181 			/*	pHalData->BW80_5G_Diff[RFPath][TX_3S], pHalData->BW80_5G_Diff[RFPath][TX_4S]); */
1182 		}
1183 	}
1184 
1185 	return txPower;
1186 }
1187 
PHY_GetTxPowerTrackingOffset(struct adapter * padapter,u8 RFPath,u8 Rate)1188 s8 PHY_GetTxPowerTrackingOffset(struct adapter *padapter, u8 RFPath, u8 Rate)
1189 {
1190 	struct hal_com_data *pHalData = GET_HAL_DATA(padapter);
1191 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
1192 	s8 offset = 0;
1193 
1194 	if (pDM_Odm->RFCalibrateInfo.TxPowerTrackControl  == false)
1195 		return offset;
1196 
1197 	if ((Rate == MGN_1M) || (Rate == MGN_2M) || (Rate == MGN_5_5M) || (Rate == MGN_11M)) {
1198 		offset = pDM_Odm->Remnant_CCKSwingIdx;
1199 		/* DBG_871X("+Remnant_CCKSwingIdx = 0x%x\n", RFPath, Rate, pDM_Odm->Remnant_CCKSwingIdx); */
1200 	} else {
1201 		offset = pDM_Odm->Remnant_OFDMSwingIdx[RFPath];
1202 		/* DBG_871X("+Remanant_OFDMSwingIdx[RFPath %u][Rate 0x%x] = 0x%x\n", RFPath, Rate, pDM_Odm->Remnant_OFDMSwingIdx[RFPath]); */
1203 
1204 	}
1205 
1206 	return offset;
1207 }
1208 
PHY_GetRateIndexOfTxPowerByRate(u8 Rate)1209 u8 PHY_GetRateIndexOfTxPowerByRate(u8 Rate)
1210 {
1211 	u8 index = 0;
1212 	switch (Rate) {
1213 	case MGN_1M:
1214 		index = 0;
1215 		break;
1216 	case MGN_2M:
1217 		index = 1;
1218 		break;
1219 	case MGN_5_5M:
1220 		index = 2;
1221 		break;
1222 	case MGN_11M:
1223 		index = 3;
1224 		break;
1225 	case MGN_6M:
1226 		index = 4;
1227 		break;
1228 	case MGN_9M:
1229 		index = 5;
1230 		break;
1231 	case MGN_12M:
1232 		index = 6;
1233 		break;
1234 	case MGN_18M:
1235 		index = 7;
1236 		break;
1237 	case MGN_24M:
1238 		index = 8;
1239 		break;
1240 	case MGN_36M:
1241 		index = 9;
1242 		break;
1243 	case MGN_48M:
1244 		index = 10;
1245 		break;
1246 	case MGN_54M:
1247 		index = 11;
1248 		break;
1249 	case MGN_MCS0:
1250 		index = 12;
1251 		break;
1252 	case MGN_MCS1:
1253 		index = 13;
1254 		break;
1255 	case MGN_MCS2:
1256 		index = 14;
1257 		break;
1258 	case MGN_MCS3:
1259 		index = 15;
1260 		break;
1261 	case MGN_MCS4:
1262 		index = 16;
1263 		break;
1264 	case MGN_MCS5:
1265 		index = 17;
1266 		break;
1267 	case MGN_MCS6:
1268 		index = 18;
1269 		break;
1270 	case MGN_MCS7:
1271 		index = 19;
1272 		break;
1273 	case MGN_MCS8:
1274 		index = 20;
1275 		break;
1276 	case MGN_MCS9:
1277 		index = 21;
1278 		break;
1279 	case MGN_MCS10:
1280 		index = 22;
1281 		break;
1282 	case MGN_MCS11:
1283 		index = 23;
1284 		break;
1285 	case MGN_MCS12:
1286 		index = 24;
1287 		break;
1288 	case MGN_MCS13:
1289 		index = 25;
1290 		break;
1291 	case MGN_MCS14:
1292 		index = 26;
1293 		break;
1294 	case MGN_MCS15:
1295 		index = 27;
1296 		break;
1297 	case MGN_MCS16:
1298 		index = 28;
1299 		break;
1300 	case MGN_MCS17:
1301 		index = 29;
1302 		break;
1303 	case MGN_MCS18:
1304 		index = 30;
1305 		break;
1306 	case MGN_MCS19:
1307 		index = 31;
1308 		break;
1309 	case MGN_MCS20:
1310 		index = 32;
1311 		break;
1312 	case MGN_MCS21:
1313 		index = 33;
1314 		break;
1315 	case MGN_MCS22:
1316 		index = 34;
1317 		break;
1318 	case MGN_MCS23:
1319 		index = 35;
1320 		break;
1321 	case MGN_MCS24:
1322 		index = 36;
1323 		break;
1324 	case MGN_MCS25:
1325 		index = 37;
1326 		break;
1327 	case MGN_MCS26:
1328 		index = 38;
1329 		break;
1330 	case MGN_MCS27:
1331 		index = 39;
1332 		break;
1333 	case MGN_MCS28:
1334 		index = 40;
1335 		break;
1336 	case MGN_MCS29:
1337 		index = 41;
1338 		break;
1339 	case MGN_MCS30:
1340 		index = 42;
1341 		break;
1342 	case MGN_MCS31:
1343 		index = 43;
1344 		break;
1345 	case MGN_VHT1SS_MCS0:
1346 		index = 44;
1347 		break;
1348 	case MGN_VHT1SS_MCS1:
1349 		index = 45;
1350 		break;
1351 	case MGN_VHT1SS_MCS2:
1352 		index = 46;
1353 		break;
1354 	case MGN_VHT1SS_MCS3:
1355 		index = 47;
1356 		break;
1357 	case MGN_VHT1SS_MCS4:
1358 		index = 48;
1359 		break;
1360 	case MGN_VHT1SS_MCS5:
1361 		index = 49;
1362 		break;
1363 	case MGN_VHT1SS_MCS6:
1364 		index = 50;
1365 		break;
1366 	case MGN_VHT1SS_MCS7:
1367 		index = 51;
1368 		break;
1369 	case MGN_VHT1SS_MCS8:
1370 		index = 52;
1371 		break;
1372 	case MGN_VHT1SS_MCS9:
1373 		index = 53;
1374 		break;
1375 	case MGN_VHT2SS_MCS0:
1376 		index = 54;
1377 		break;
1378 	case MGN_VHT2SS_MCS1:
1379 		index = 55;
1380 		break;
1381 	case MGN_VHT2SS_MCS2:
1382 		index = 56;
1383 		break;
1384 	case MGN_VHT2SS_MCS3:
1385 		index = 57;
1386 		break;
1387 	case MGN_VHT2SS_MCS4:
1388 		index = 58;
1389 		break;
1390 	case MGN_VHT2SS_MCS5:
1391 		index = 59;
1392 		break;
1393 	case MGN_VHT2SS_MCS6:
1394 		index = 60;
1395 		break;
1396 	case MGN_VHT2SS_MCS7:
1397 		index = 61;
1398 		break;
1399 	case MGN_VHT2SS_MCS8:
1400 		index = 62;
1401 		break;
1402 	case MGN_VHT2SS_MCS9:
1403 		index = 63;
1404 		break;
1405 	case MGN_VHT3SS_MCS0:
1406 		index = 64;
1407 		break;
1408 	case MGN_VHT3SS_MCS1:
1409 		index = 65;
1410 		break;
1411 	case MGN_VHT3SS_MCS2:
1412 		index = 66;
1413 		break;
1414 	case MGN_VHT3SS_MCS3:
1415 		index = 67;
1416 		break;
1417 	case MGN_VHT3SS_MCS4:
1418 		index = 68;
1419 		break;
1420 	case MGN_VHT3SS_MCS5:
1421 		index = 69;
1422 		break;
1423 	case MGN_VHT3SS_MCS6:
1424 		index = 70;
1425 		break;
1426 	case MGN_VHT3SS_MCS7:
1427 		index = 71;
1428 		break;
1429 	case MGN_VHT3SS_MCS8:
1430 		index = 72;
1431 		break;
1432 	case MGN_VHT3SS_MCS9:
1433 		index = 73;
1434 		break;
1435 	case MGN_VHT4SS_MCS0:
1436 		index = 74;
1437 		break;
1438 	case MGN_VHT4SS_MCS1:
1439 		index = 75;
1440 		break;
1441 	case MGN_VHT4SS_MCS2:
1442 		index = 76;
1443 		break;
1444 	case MGN_VHT4SS_MCS3:
1445 		index = 77;
1446 		break;
1447 	case MGN_VHT4SS_MCS4:
1448 		index = 78;
1449 		break;
1450 	case MGN_VHT4SS_MCS5:
1451 		index = 79;
1452 		break;
1453 	case MGN_VHT4SS_MCS6:
1454 		index = 80;
1455 		break;
1456 	case MGN_VHT4SS_MCS7:
1457 		index = 81;
1458 		break;
1459 	case MGN_VHT4SS_MCS8:
1460 		index = 82;
1461 		break;
1462 	case MGN_VHT4SS_MCS9:
1463 		index = 83;
1464 		break;
1465 	default:
1466 		DBG_871X("Invalid rate 0x%x in %s\n", Rate, __func__);
1467 		break;
1468 	}
1469 	return index;
1470 }
1471 
PHY_GetTxPowerByRate(struct adapter * padapter,u8 Band,u8 RFPath,u8 TxNum,u8 Rate)1472 s8 PHY_GetTxPowerByRate(
1473 	struct adapter *padapter, u8 Band, u8 RFPath, u8 TxNum, u8 Rate
1474 )
1475 {
1476 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1477 	s8 value = 0;
1478 	u8 rateIndex = PHY_GetRateIndexOfTxPowerByRate(Rate);
1479 
1480 	if ((padapter->registrypriv.RegEnableTxPowerByRate == 2 && pHalData->EEPROMRegulatory == 2) ||
1481 		   padapter->registrypriv.RegEnableTxPowerByRate == 0)
1482 		return 0;
1483 
1484 	if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
1485 		DBG_871X("Invalid band %d in %s\n", Band, __func__);
1486 		return value;
1487 	}
1488 	if (RFPath > ODM_RF_PATH_D) {
1489 		DBG_871X("Invalid RfPath %d in %s\n", RFPath, __func__);
1490 		return value;
1491 	}
1492 	if (TxNum >= RF_MAX_TX_NUM) {
1493 		DBG_871X("Invalid TxNum %d in %s\n", TxNum, __func__);
1494 		return value;
1495 	}
1496 	if (rateIndex >= TX_PWR_BY_RATE_NUM_RATE) {
1497 		DBG_871X("Invalid RateIndex %d in %s\n", rateIndex, __func__);
1498 		return value;
1499 	}
1500 
1501 	value = pHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex];
1502 
1503 	return value;
1504 
1505 }
1506 
PHY_SetTxPowerByRate(struct adapter * padapter,u8 Band,u8 RFPath,u8 TxNum,u8 Rate,s8 Value)1507 void PHY_SetTxPowerByRate(
1508 	struct adapter *padapter,
1509 	u8 Band,
1510 	u8 RFPath,
1511 	u8 TxNum,
1512 	u8 Rate,
1513 	s8 Value
1514 )
1515 {
1516 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1517 	u8 rateIndex = PHY_GetRateIndexOfTxPowerByRate(Rate);
1518 
1519 	if (Band != BAND_ON_2_4G && Band != BAND_ON_5G) {
1520 		DBG_871X("Invalid band %d in %s\n", Band, __func__);
1521 		return;
1522 	}
1523 	if (RFPath > ODM_RF_PATH_D) {
1524 		DBG_871X("Invalid RfPath %d in %s\n", RFPath, __func__);
1525 		return;
1526 	}
1527 	if (TxNum >= RF_MAX_TX_NUM) {
1528 		DBG_871X("Invalid TxNum %d in %s\n", TxNum, __func__);
1529 		return;
1530 	}
1531 	if (rateIndex >= TX_PWR_BY_RATE_NUM_RATE) {
1532 		DBG_871X("Invalid RateIndex %d in %s\n", rateIndex, __func__);
1533 		return;
1534 	}
1535 
1536 	pHalData->TxPwrByRateOffset[Band][RFPath][TxNum][rateIndex] = Value;
1537 }
1538 
PHY_SetTxPowerLevelByPath(struct adapter * Adapter,u8 channel,u8 path)1539 void PHY_SetTxPowerLevelByPath(struct adapter *Adapter, u8 channel, u8 path)
1540 {
1541 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
1542 	bool bIsIn24G = (pHalData->CurrentBandType == BAND_ON_2_4G);
1543 
1544 	/* if (pMgntInfo->RegNByteAccess == 0) */
1545 	{
1546 		if (bIsIn24G)
1547 			PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, CCK);
1548 
1549 		PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, OFDM);
1550 		PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, HT_MCS0_MCS7);
1551 
1552 		if (pHalData->NumTotalRFPath >= 2)
1553 			PHY_SetTxPowerIndexByRateSection(Adapter, path, channel, HT_MCS8_MCS15);
1554 
1555 	}
1556 }
1557 
PHY_SetTxPowerIndexByRateArray(struct adapter * padapter,u8 RFPath,enum CHANNEL_WIDTH BandWidth,u8 Channel,u8 * Rates,u8 RateArraySize)1558 void PHY_SetTxPowerIndexByRateArray(
1559 	struct adapter *padapter,
1560 	u8 RFPath,
1561 	enum CHANNEL_WIDTH BandWidth,
1562 	u8 Channel,
1563 	u8 *Rates,
1564 	u8 RateArraySize
1565 )
1566 {
1567 	u32 powerIndex = 0;
1568 	int	i = 0;
1569 
1570 	for (i = 0; i < RateArraySize; ++i) {
1571 		powerIndex = PHY_GetTxPowerIndex(padapter, RFPath, Rates[i], BandWidth, Channel);
1572 		PHY_SetTxPowerIndex(padapter, powerIndex, RFPath, Rates[i]);
1573 	}
1574 }
1575 
phy_GetWorldWideLimit(s8 * LimitTable)1576 static s8 phy_GetWorldWideLimit(s8 *LimitTable)
1577 {
1578 	s8	min = LimitTable[0];
1579 	u8 i = 0;
1580 
1581 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1582 		if (LimitTable[i] < min)
1583 			min = LimitTable[i];
1584 	}
1585 
1586 	return min;
1587 }
1588 
phy_GetChannelIndexOfTxPowerLimit(u8 Band,u8 Channel)1589 static s8 phy_GetChannelIndexOfTxPowerLimit(u8 Band, u8 Channel)
1590 {
1591 	s8	channelIndex = -1;
1592 	u8 channel5G[CHANNEL_MAX_NUMBER_5G] = {
1593 		36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 100, 102,
1594 		104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130,
1595 		132, 134, 136, 138, 140, 142, 144, 149, 151, 153, 155, 157, 159, 161,
1596 		163, 165, 167, 168, 169, 171, 173, 175, 177
1597 	};
1598 	u8 i = 0;
1599 	if (Band == BAND_ON_2_4G)
1600 		channelIndex = Channel - 1;
1601 	else if (Band == BAND_ON_5G) {
1602 		for (i = 0; i < ARRAY_SIZE(channel5G); ++i) {
1603 			if (channel5G[i] == Channel)
1604 				channelIndex = i;
1605 		}
1606 	} else
1607 		DBG_871X("Invalid Band %d in %s", Band, __func__);
1608 
1609 	if (channelIndex == -1)
1610 		DBG_871X("Invalid Channel %d of Band %d in %s", Channel, Band, __func__);
1611 
1612 	return channelIndex;
1613 }
1614 
get_bandwidth_idx(const enum CHANNEL_WIDTH bandwidth)1615 static s16 get_bandwidth_idx(const enum CHANNEL_WIDTH bandwidth)
1616 {
1617 	switch (bandwidth) {
1618 	case CHANNEL_WIDTH_20:
1619 		return 0;
1620 	case CHANNEL_WIDTH_40:
1621 		return 1;
1622 	case CHANNEL_WIDTH_80:
1623 		return 2;
1624 	case CHANNEL_WIDTH_160:
1625 		return 3;
1626 	default:
1627 		return -1;
1628 	}
1629 }
1630 
get_rate_sctn_idx(const u8 rate)1631 static s16 get_rate_sctn_idx(const u8 rate)
1632 {
1633 	switch (rate) {
1634 	case MGN_1M: case MGN_2M: case MGN_5_5M: case MGN_11M:
1635 		return 0;
1636 	case MGN_6M: case MGN_9M: case MGN_12M: case MGN_18M:
1637 	case MGN_24M: case MGN_36M: case MGN_48M: case MGN_54M:
1638 		return 1;
1639 	case MGN_MCS0: case MGN_MCS1: case MGN_MCS2: case MGN_MCS3:
1640 	case MGN_MCS4: case MGN_MCS5: case MGN_MCS6: case MGN_MCS7:
1641 		return 2;
1642 	case MGN_MCS8: case MGN_MCS9: case MGN_MCS10: case MGN_MCS11:
1643 	case MGN_MCS12: case MGN_MCS13: case MGN_MCS14: case MGN_MCS15:
1644 		return 3;
1645 	case MGN_MCS16: case MGN_MCS17: case MGN_MCS18: case MGN_MCS19:
1646 	case MGN_MCS20: case MGN_MCS21: case MGN_MCS22: case MGN_MCS23:
1647 		return 4;
1648 	case MGN_MCS24: case MGN_MCS25: case MGN_MCS26: case MGN_MCS27:
1649 	case MGN_MCS28: case MGN_MCS29: case MGN_MCS30: case MGN_MCS31:
1650 		return 5;
1651 	case MGN_VHT1SS_MCS0: case MGN_VHT1SS_MCS1: case MGN_VHT1SS_MCS2:
1652 	case MGN_VHT1SS_MCS3: case MGN_VHT1SS_MCS4: case MGN_VHT1SS_MCS5:
1653 	case MGN_VHT1SS_MCS6: case MGN_VHT1SS_MCS7: case MGN_VHT1SS_MCS8:
1654 	case MGN_VHT1SS_MCS9:
1655 		return 6;
1656 	case MGN_VHT2SS_MCS0: case MGN_VHT2SS_MCS1: case MGN_VHT2SS_MCS2:
1657 	case MGN_VHT2SS_MCS3: case MGN_VHT2SS_MCS4: case MGN_VHT2SS_MCS5:
1658 	case MGN_VHT2SS_MCS6: case MGN_VHT2SS_MCS7: case MGN_VHT2SS_MCS8:
1659 	case MGN_VHT2SS_MCS9:
1660 		return 7;
1661 	case MGN_VHT3SS_MCS0: case MGN_VHT3SS_MCS1: case MGN_VHT3SS_MCS2:
1662 	case MGN_VHT3SS_MCS3: case MGN_VHT3SS_MCS4: case MGN_VHT3SS_MCS5:
1663 	case MGN_VHT3SS_MCS6: case MGN_VHT3SS_MCS7: case MGN_VHT3SS_MCS8:
1664 	case MGN_VHT3SS_MCS9:
1665 		return 8;
1666 	case MGN_VHT4SS_MCS0: case MGN_VHT4SS_MCS1: case MGN_VHT4SS_MCS2:
1667 	case MGN_VHT4SS_MCS3: case MGN_VHT4SS_MCS4: case MGN_VHT4SS_MCS5:
1668 	case MGN_VHT4SS_MCS6: case MGN_VHT4SS_MCS7: case MGN_VHT4SS_MCS8:
1669 	case MGN_VHT4SS_MCS9:
1670 		return 9;
1671 	default:
1672 		DBG_871X("Wrong rate 0x%x\n", rate);
1673 		return -1;
1674 	}
1675 }
1676 
phy_get_tx_pwr_lmt(struct adapter * adapter,u32 reg_pwr_tbl_sel,enum BAND_TYPE band_type,enum CHANNEL_WIDTH bandwidth,u8 rf_path,u8 data_rate,u8 channel)1677 s8 phy_get_tx_pwr_lmt(struct adapter *adapter, u32 reg_pwr_tbl_sel,
1678 		      enum BAND_TYPE band_type, enum CHANNEL_WIDTH bandwidth,
1679 		      u8 rf_path, u8 data_rate, u8 channel)
1680 {
1681 	s16 idx_band       = -1;
1682 	s16 idx_regulation = -1;
1683 	s16 idx_bandwidth  = -1;
1684 	s16 idx_rate_sctn  = -1;
1685 	s16 idx_channel    = -1;
1686 	s8 pwr_lmt = MAX_POWER_INDEX;
1687 	struct hal_com_data *hal_data = GET_HAL_DATA(adapter);
1688 
1689 	if (((adapter->registrypriv.RegEnableTxPowerLimit == 2) &&
1690 	     (hal_data->EEPROMRegulatory != 1)) ||
1691 	    (adapter->registrypriv.RegEnableTxPowerLimit == 0))
1692 		return MAX_POWER_INDEX;
1693 
1694 	switch (adapter->registrypriv.RegPwrTblSel) {
1695 	case 1:
1696 		idx_regulation = TXPWR_LMT_ETSI;
1697 		break;
1698 	case 2:
1699 		idx_regulation = TXPWR_LMT_MKK;
1700 		break;
1701 	case 3:
1702 		idx_regulation = TXPWR_LMT_FCC;
1703 		break;
1704 	case 4:
1705 		idx_regulation = TXPWR_LMT_WW;
1706 		break;
1707 	default:
1708 		idx_regulation = (band_type == BAND_ON_2_4G) ?
1709 			hal_data->Regulation2_4G :
1710 			hal_data->Regulation5G;
1711 		break;
1712 	}
1713 
1714 	/* DBG_871X("pMgntInfo->RegPwrTblSel %d, final regulation %d\n", */
1715 	/*         adapter->registrypriv.RegPwrTblSel, idx_regulation); */
1716 
1717 	if (band_type == BAND_ON_2_4G)
1718 		idx_band = 0;
1719 	else if (band_type == BAND_ON_5G)
1720 		idx_band = 1;
1721 
1722 	idx_bandwidth = get_bandwidth_idx(bandwidth);
1723 	idx_rate_sctn = get_rate_sctn_idx(data_rate);
1724 
1725 	if (band_type == BAND_ON_5G && idx_rate_sctn == 0)
1726                 DBG_871X("Wrong rate 0x%x: No CCK in 5G Band\n", DataRate);
1727 
1728 	/*  workaround for wrong index combination to obtain tx power limit, */
1729 	/*  OFDM only exists in BW 20M */
1730 	/*  CCK table will only be given in BW 20M */
1731 	/*  HT on 80M will reference to HT on 40M */
1732 	if (idx_rate_sctn == 0 || idx_rate_sctn == 1)
1733 		idx_bandwidth = 0;
1734 	else if ((idx_rate_sctn == 2 || idx_rate_sctn == 3) &&
1735 		 (band_type == BAND_ON_5G) && (idx_bandwidth == 2))
1736 		idx_bandwidth = 1;
1737 
1738 	if (band_type == BAND_ON_2_4G || band_type == BAND_ON_5G)
1739 		channel = phy_GetChannelIndexOfTxPowerLimit(band_type, channel);
1740 
1741 	if (idx_band == -1 || idx_regulation == -1 || idx_bandwidth == -1 ||
1742 	    idx_rate_sctn == -1 || idx_channel == -1) {
1743 		/* DBG_871X("Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnlGroup %d]\n", */
1744 		/*         idx_band, idx_regulation, idx_bandwidth, rf_path, */
1745 		/*         idx_rate_sctn, channel); */
1746 
1747 		return MAX_POWER_INDEX;
1748 	}
1749 
1750 	if (band_type == BAND_ON_2_4G) {
1751 		s8 limits[10] = {0}; u8 i = 0;
1752 		for (i = 0; i < MAX_REGULATION_NUM; i++)
1753 			limits[i] = hal_data->TxPwrLimit_2_4G[i]
1754 							     [idx_bandwidth]
1755 							     [idx_rate_sctn]
1756 							     [idx_channel]
1757 							     [rf_path];
1758 
1759 		pwr_lmt = (idx_regulation == TXPWR_LMT_WW) ?
1760 			phy_GetWorldWideLimit(limits) :
1761 			hal_data->TxPwrLimit_2_4G[idx_regulation]
1762 						 [idx_bandwidth]
1763 						 [idx_rate_sctn]
1764 						 [idx_channel]
1765 						 [rf_path];
1766 
1767 	} else if (band_type == BAND_ON_5G) {
1768 		s8 limits[10] = {0}; u8 i = 0;
1769 		for (i = 0; i < MAX_REGULATION_NUM; ++i)
1770 			limits[i] = hal_data->TxPwrLimit_5G[i]
1771 							   [idx_bandwidth]
1772 							   [idx_rate_sctn]
1773 							   [idx_channel]
1774 							   [rf_path];
1775 
1776 		pwr_lmt = (idx_regulation == TXPWR_LMT_WW) ?
1777 			phy_GetWorldWideLimit(limits) :
1778 			hal_data->TxPwrLimit_5G[idx_regulation]
1779 					       [idx_bandwidth]
1780 					       [idx_rate_sctn]
1781 					       [idx_channel]
1782 					       [rf_path];
1783 	} else {
1784 		DBG_871X("No power limit table of the specified band\n");
1785 	}
1786 
1787 	/*  combine 5G VHT & HT rate */
1788 	/*  5G 20M and 40M HT and VHT can cross reference */
1789 	/*
1790 	if (band_type == BAND_ON_5G && pwr_lmt == MAX_POWER_INDEX) {
1791 		if (idx_bandwidth == 0 || idx_bandwidth == 1) {
1792 			RT_TRACE(COMP_INIT, DBG_LOUD, ("No power limit table of the specified band %d, bandwidth %d, ratesection %d, rf path %d\n",
1793 				 idx_band, idx_bandwidth,
1794 				 idx_rate_sctn, rf_path));
1795 			if (idx_rate_sctn == 2)
1796 				pwr_lmt = hal_data->TxPwrLimit_5G[idx_regulation][idx_bandwidth][4][idx_channel][rf_path];
1797 			else if (idx_rate_sctn == 4)
1798 				pwr_lmt = hal_data->TxPwrLimit_5G[idx_regulation][idx_bandwidth][2][idx_channel][rf_path];
1799 			else if (idx_rate_sctn == 3)
1800 				pwr_lmt = hal_data->TxPwrLimit_5G[idx_regulation][idx_bandwidth][5][idx_channel][rf_path];
1801 			else if (idx_rate_sctn == 5)
1802 				pwr_lmt = hal_data->TxPwrLimit_5G[idx_regulation][idx_bandwidth][3][idx_channel][rf_path];
1803 		}
1804 	}
1805 	*/
1806 
1807 	/* DBG_871X("TxPwrLmt[Regulation %d][Band %d][BW %d][RFPath %d][Rate 0x%x][Chnl %d] = %d\n", */
1808 	/*		idx_regulation, hal_data->CurrentBandType, bandwidth, rf_path, data_rate, channel, pwr_lmt); */
1809 	return pwr_lmt;
1810 }
1811 
phy_CrossReferenceHTAndVHTTxPowerLimit(struct adapter * padapter)1812 static void phy_CrossReferenceHTAndVHTTxPowerLimit(struct adapter *padapter)
1813 {
1814 	struct hal_com_data	*pHalData = GET_HAL_DATA(padapter);
1815 	u8 regulation, bw, channel, rateSection;
1816 	s8 tempPwrLmt = 0;
1817 
1818 	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1819 		for (bw = 0; bw < MAX_5G_BANDWITH_NUM; ++bw) {
1820 			for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) {
1821 				for (rateSection = 0; rateSection < MAX_RATE_SECTION_NUM; ++rateSection) {
1822 					tempPwrLmt = pHalData->TxPwrLimit_5G[regulation][bw][rateSection][channel][ODM_RF_PATH_A];
1823 					if (tempPwrLmt == MAX_POWER_INDEX) {
1824 						u8 baseSection = 2, refSection = 6;
1825 						if (bw == 0 || bw == 1) { /*  5G 20M 40M VHT and HT can cross reference */
1826 							/* DBG_871X("No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n", */
1827 							/*			1, bw, rateSection, channel, ODM_RF_PATH_A); */
1828 							if (rateSection >= 2 && rateSection <= 9) {
1829 								if (rateSection == 2) {
1830 									baseSection = 2;
1831 									refSection = 6;
1832 								} else if (rateSection == 3) {
1833 									baseSection = 3;
1834 									refSection = 7;
1835 								} else if (rateSection == 4) {
1836 									baseSection = 4;
1837 									refSection = 8;
1838 								} else if (rateSection == 5) {
1839 									baseSection = 5;
1840 									refSection = 9;
1841 								} else if (rateSection == 6) {
1842 									baseSection = 6;
1843 									refSection = 2;
1844 								} else if (rateSection == 7) {
1845 									baseSection = 7;
1846 									refSection = 3;
1847 								} else if (rateSection == 8) {
1848 									baseSection = 8;
1849 									refSection = 4;
1850 								} else if (rateSection == 9) {
1851 									baseSection = 9;
1852 									refSection = 5;
1853 								}
1854 								pHalData->TxPwrLimit_5G[regulation][bw][baseSection][channel][ODM_RF_PATH_A] =
1855 									pHalData->TxPwrLimit_5G[regulation][bw][refSection][channel][ODM_RF_PATH_A];
1856 							}
1857 
1858 							/* DBG_871X("use other value %d", tempPwrLmt); */
1859 						}
1860 					}
1861 				}
1862 			}
1863 		}
1864 	}
1865 }
1866 
PHY_ConvertTxPowerLimitToPowerIndex(struct adapter * Adapter)1867 void PHY_ConvertTxPowerLimitToPowerIndex(struct adapter *Adapter)
1868 {
1869 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
1870 	u8 BW40PwrBasedBm2_4G = 0x2E;
1871 	u8 regulation, bw, channel, rateSection;
1872 	s8 tempValue = 0, tempPwrLmt = 0;
1873 	u8 rfPath = 0;
1874 
1875 	/* DBG_871X("=====> PHY_ConvertTxPowerLimitToPowerIndex()\n"); */
1876 
1877 	phy_CrossReferenceHTAndVHTTxPowerLimit(Adapter);
1878 
1879 	for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) {
1880 		for (bw = 0; bw < MAX_2_4G_BANDWITH_NUM; ++bw) {
1881 			for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) {
1882 				for (rateSection = 0; rateSection < MAX_RATE_SECTION_NUM; ++rateSection) {
1883 					tempPwrLmt = pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][ODM_RF_PATH_A];
1884 
1885 					for (rfPath = ODM_RF_PATH_A; rfPath < MAX_RF_PATH_NUM; ++rfPath) {
1886 						if (pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE) {
1887 							if (rateSection == 5) /*  HT 4T */
1888 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_4TX, HT_MCS24_MCS31);
1889 							else if (rateSection == 4) /*  HT 3T */
1890 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_3TX, HT_MCS16_MCS23);
1891 							else if (rateSection == 3) /*  HT 2T */
1892 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_2TX, HT_MCS8_MCS15);
1893 							else if (rateSection == 2) /*  HT 1T */
1894 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_1TX, HT_MCS0_MCS7);
1895 							else if (rateSection == 1) /*  OFDM */
1896 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_1TX, OFDM);
1897 							else if (rateSection == 0) /*  CCK */
1898 								BW40PwrBasedBm2_4G = PHY_GetTxPowerByRateBase(Adapter, BAND_ON_2_4G, rfPath, RF_1TX, CCK);
1899 						} else
1900 							BW40PwrBasedBm2_4G = Adapter->registrypriv.RegPowerBase * 2;
1901 
1902 						if (tempPwrLmt != MAX_POWER_INDEX) {
1903 							tempValue = tempPwrLmt - BW40PwrBasedBm2_4G;
1904 							pHalData->TxPwrLimit_2_4G[regulation][bw][rateSection][channel][rfPath] = tempValue;
1905 						}
1906 					}
1907 				}
1908 			}
1909 		}
1910 	}
1911 
1912 	/* DBG_871X("<===== PHY_ConvertTxPowerLimitToPowerIndex()\n"); */
1913 }
1914 
PHY_InitTxPowerLimit(struct adapter * Adapter)1915 void PHY_InitTxPowerLimit(struct adapter *Adapter)
1916 {
1917 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
1918 	u8 i, j, k, l, m;
1919 
1920 	/* DBG_871X("=====> PHY_InitTxPowerLimit()!\n"); */
1921 
1922 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1923 		for (j = 0; j < MAX_2_4G_BANDWITH_NUM; ++j)
1924 			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1925 				for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m)
1926 					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1927 						pHalData->TxPwrLimit_2_4G[i][j][k][m][l] = MAX_POWER_INDEX;
1928 	}
1929 
1930 	for (i = 0; i < MAX_REGULATION_NUM; ++i) {
1931 		for (j = 0; j < MAX_5G_BANDWITH_NUM; ++j)
1932 			for (k = 0; k < MAX_RATE_SECTION_NUM; ++k)
1933 				for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m)
1934 					for (l = 0; l < MAX_RF_PATH_NUM; ++l)
1935 						pHalData->TxPwrLimit_5G[i][j][k][m][l] = MAX_POWER_INDEX;
1936 	}
1937 
1938 	/* DBG_871X("<===== PHY_InitTxPowerLimit()!\n"); */
1939 }
1940 
PHY_SetTxPowerLimit(struct adapter * Adapter,u8 * Regulation,u8 * Band,u8 * Bandwidth,u8 * RateSection,u8 * RfPath,u8 * Channel,u8 * PowerLimit)1941 void PHY_SetTxPowerLimit(
1942 	struct adapter *Adapter,
1943 	u8 *Regulation,
1944 	u8 *Band,
1945 	u8 *Bandwidth,
1946 	u8 *RateSection,
1947 	u8 *RfPath,
1948 	u8 *Channel,
1949 	u8 *PowerLimit
1950 )
1951 {
1952 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
1953 	u8 regulation = 0, bandwidth = 0, rateSection = 0, channel;
1954 	s8 powerLimit = 0, prevPowerLimit, channelIndex;
1955 
1956 	/* DBG_871X("Index of power limit table [band %s][regulation %s][bw %s][rate section %s][rf path %s][chnl %s][val %s]\n", */
1957 	/*	  Band, Regulation, Bandwidth, RateSection, RfPath, Channel, PowerLimit); */
1958 
1959 	if (!GetU1ByteIntegerFromStringInDecimal((s8 *)Channel, &channel) ||
1960 		 !GetU1ByteIntegerFromStringInDecimal((s8 *)PowerLimit, &powerLimit))
1961 		DBG_871X("Illegal index of power limit table [chnl %s][val %s]\n", Channel, PowerLimit);
1962 
1963 	powerLimit = powerLimit > MAX_POWER_INDEX ? MAX_POWER_INDEX : powerLimit;
1964 
1965 	if (eqNByte(Regulation, (u8 *)("FCC"), 3))
1966 		regulation = 0;
1967 	else if (eqNByte(Regulation, (u8 *)("MKK"), 3))
1968 		regulation = 1;
1969 	else if (eqNByte(Regulation, (u8 *)("ETSI"), 4))
1970 		regulation = 2;
1971 	else if (eqNByte(Regulation, (u8 *)("WW13"), 4))
1972 		regulation = 3;
1973 
1974 	if (eqNByte(RateSection, (u8 *)("CCK"), 3) && eqNByte(RfPath, (u8 *)("1T"), 2))
1975 		rateSection = 0;
1976 	else if (eqNByte(RateSection, (u8 *)("OFDM"), 4) && eqNByte(RfPath, (u8 *)("1T"), 2))
1977 		rateSection = 1;
1978 	else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("1T"), 2))
1979 		rateSection = 2;
1980 	else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("2T"), 2))
1981 		rateSection = 3;
1982 	else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("3T"), 2))
1983 		rateSection = 4;
1984 	else if (eqNByte(RateSection, (u8 *)("HT"), 2) && eqNByte(RfPath, (u8 *)("4T"), 2))
1985 		rateSection = 5;
1986 	else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("1T"), 2))
1987 		rateSection = 6;
1988 	else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("2T"), 2))
1989 		rateSection = 7;
1990 	else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("3T"), 2))
1991 		rateSection = 8;
1992 	else if (eqNByte(RateSection, (u8 *)("VHT"), 3) && eqNByte(RfPath, (u8 *)("4T"), 2))
1993 		rateSection = 9;
1994 	else {
1995 		DBG_871X("Wrong rate section!\n");
1996 		return;
1997 	}
1998 
1999 
2000 	if (eqNByte(Bandwidth, (u8 *)("20M"), 3))
2001 		bandwidth = 0;
2002 	else if (eqNByte(Bandwidth, (u8 *)("40M"), 3))
2003 		bandwidth = 1;
2004 	else if (eqNByte(Bandwidth, (u8 *)("80M"), 3))
2005 		bandwidth = 2;
2006 	else if (eqNByte(Bandwidth, (u8 *)("160M"), 4))
2007 		bandwidth = 3;
2008 
2009 	if (eqNByte(Band, (u8 *)("2.4G"), 4)) {
2010 		channelIndex = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_2_4G, channel);
2011 
2012 		if (channelIndex == -1)
2013 			return;
2014 
2015 		prevPowerLimit = pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A];
2016 
2017 		if (powerLimit < prevPowerLimit)
2018 			pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] = powerLimit;
2019 
2020 		/* DBG_871X("2.4G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", */
2021 		/*	  regulation, bandwidth, rateSection, channelIndex, pHalData->TxPwrLimit_2_4G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A]); */
2022 	} else if (eqNByte(Band, (u8 *)("5G"), 2)) {
2023 		channelIndex = phy_GetChannelIndexOfTxPowerLimit(BAND_ON_5G, channel);
2024 
2025 		if (channelIndex == -1)
2026 			return;
2027 
2028 		prevPowerLimit = pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A];
2029 
2030 		if (powerLimit < prevPowerLimit)
2031 			pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A] = powerLimit;
2032 
2033 		/* DBG_871X("5G Band value : [regulation %d][bw %d][rate_section %d][chnl %d][val %d]\n", */
2034 		/*	  regulation, bandwidth, rateSection, channel, pHalData->TxPwrLimit_5G[regulation][bandwidth][rateSection][channelIndex][ODM_RF_PATH_A]); */
2035 	} else {
2036 		DBG_871X("Cannot recognize the band info in %s\n", Band);
2037 		return;
2038 	}
2039 }
2040 
PHY_GetTxPowerIndex(struct adapter * padapter,u8 RFPath,u8 Rate,enum CHANNEL_WIDTH BandWidth,u8 Channel)2041 u8 PHY_GetTxPowerIndex(
2042 	struct adapter *padapter,
2043 	u8 RFPath,
2044 	u8 Rate,
2045 	enum CHANNEL_WIDTH BandWidth,
2046 	u8 Channel
2047 )
2048 {
2049 	return PHY_GetTxPowerIndex_8723B(padapter, RFPath, Rate, BandWidth, Channel);
2050 }
2051 
PHY_SetTxPowerIndex(struct adapter * padapter,u32 PowerIndex,u8 RFPath,u8 Rate)2052 void PHY_SetTxPowerIndex(
2053 	struct adapter *padapter, u32 PowerIndex, u8 RFPath, u8 Rate
2054 )
2055 {
2056 	PHY_SetTxPowerIndex_8723B(padapter, PowerIndex, RFPath, Rate);
2057 }
2058 
Hal_ChannelPlanToRegulation(struct adapter * Adapter,u16 ChannelPlan)2059 void Hal_ChannelPlanToRegulation(struct adapter *Adapter, u16 ChannelPlan)
2060 {
2061 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
2062 	pHalData->Regulation2_4G = TXPWR_LMT_WW;
2063 	pHalData->Regulation5G = TXPWR_LMT_WW;
2064 
2065 	switch (ChannelPlan) {
2066 	case RT_CHANNEL_DOMAIN_WORLD_NULL:
2067 		pHalData->Regulation2_4G = TXPWR_LMT_WW;
2068 		break;
2069 	case RT_CHANNEL_DOMAIN_ETSI1_NULL:
2070 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2071 		break;
2072 	case RT_CHANNEL_DOMAIN_FCC1_NULL:
2073 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2074 		break;
2075 	case RT_CHANNEL_DOMAIN_MKK1_NULL:
2076 		pHalData->Regulation2_4G = TXPWR_LMT_MKK;
2077 		break;
2078 	case RT_CHANNEL_DOMAIN_ETSI2_NULL:
2079 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2080 		break;
2081 	case RT_CHANNEL_DOMAIN_FCC1_FCC1:
2082 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2083 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2084 		break;
2085 	case RT_CHANNEL_DOMAIN_WORLD_ETSI1:
2086 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2087 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2088 		break;
2089 	case RT_CHANNEL_DOMAIN_MKK1_MKK1:
2090 		pHalData->Regulation2_4G = TXPWR_LMT_MKK;
2091 		pHalData->Regulation5G = TXPWR_LMT_MKK;
2092 		break;
2093 	case RT_CHANNEL_DOMAIN_WORLD_KCC1:
2094 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2095 		pHalData->Regulation5G = TXPWR_LMT_MKK;
2096 		break;
2097 	case RT_CHANNEL_DOMAIN_WORLD_FCC2:
2098 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2099 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2100 		break;
2101 	case RT_CHANNEL_DOMAIN_WORLD_FCC3:
2102 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2103 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2104 		break;
2105 	case RT_CHANNEL_DOMAIN_WORLD_FCC4:
2106 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2107 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2108 		break;
2109 	case RT_CHANNEL_DOMAIN_WORLD_FCC5:
2110 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2111 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2112 		break;
2113 	case RT_CHANNEL_DOMAIN_WORLD_FCC6:
2114 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2115 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2116 		break;
2117 	case RT_CHANNEL_DOMAIN_FCC1_FCC7:
2118 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2119 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2120 		break;
2121 	case RT_CHANNEL_DOMAIN_WORLD_ETSI2:
2122 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2123 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2124 		break;
2125 	case RT_CHANNEL_DOMAIN_WORLD_ETSI3:
2126 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2127 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2128 		break;
2129 	case RT_CHANNEL_DOMAIN_MKK1_MKK2:
2130 		pHalData->Regulation2_4G = TXPWR_LMT_MKK;
2131 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2132 		break;
2133 	case RT_CHANNEL_DOMAIN_MKK1_MKK3:
2134 		pHalData->Regulation2_4G = TXPWR_LMT_MKK;
2135 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2136 		break;
2137 	case RT_CHANNEL_DOMAIN_FCC1_NCC1:
2138 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2139 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2140 		break;
2141 	case RT_CHANNEL_DOMAIN_FCC1_NCC2:
2142 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2143 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2144 		break;
2145 	case RT_CHANNEL_DOMAIN_GLOBAL_NULL:
2146 		pHalData->Regulation2_4G = TXPWR_LMT_WW;
2147 		pHalData->Regulation5G = TXPWR_LMT_WW;
2148 		break;
2149 	case RT_CHANNEL_DOMAIN_ETSI1_ETSI4:
2150 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2151 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2152 		break;
2153 	case RT_CHANNEL_DOMAIN_FCC1_FCC2:
2154 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2155 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2156 		break;
2157 	case RT_CHANNEL_DOMAIN_FCC1_NCC3:
2158 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2159 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2160 		break;
2161 	case RT_CHANNEL_DOMAIN_WORLD_ETSI5:
2162 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2163 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2164 		break;
2165 	case RT_CHANNEL_DOMAIN_FCC1_FCC8:
2166 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2167 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2168 		break;
2169 	case RT_CHANNEL_DOMAIN_WORLD_ETSI6:
2170 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2171 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2172 		break;
2173 	case RT_CHANNEL_DOMAIN_WORLD_ETSI7:
2174 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2175 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2176 		break;
2177 	case RT_CHANNEL_DOMAIN_WORLD_ETSI8:
2178 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2179 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2180 		break;
2181 	case RT_CHANNEL_DOMAIN_WORLD_ETSI9:
2182 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2183 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2184 		break;
2185 	case RT_CHANNEL_DOMAIN_WORLD_ETSI10:
2186 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2187 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2188 		break;
2189 	case RT_CHANNEL_DOMAIN_WORLD_ETSI11:
2190 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2191 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2192 		break;
2193 	case RT_CHANNEL_DOMAIN_FCC1_NCC4:
2194 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2195 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2196 		break;
2197 	case RT_CHANNEL_DOMAIN_WORLD_ETSI12:
2198 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2199 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2200 		break;
2201 	case RT_CHANNEL_DOMAIN_FCC1_FCC9:
2202 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2203 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2204 		break;
2205 	case RT_CHANNEL_DOMAIN_WORLD_ETSI13:
2206 		pHalData->Regulation2_4G = TXPWR_LMT_ETSI;
2207 		pHalData->Regulation5G = TXPWR_LMT_ETSI;
2208 		break;
2209 	case RT_CHANNEL_DOMAIN_FCC1_FCC10:
2210 		pHalData->Regulation2_4G = TXPWR_LMT_FCC;
2211 		pHalData->Regulation5G = TXPWR_LMT_FCC;
2212 		break;
2213 	case RT_CHANNEL_DOMAIN_REALTEK_DEFINE: /* Realtek Reserve */
2214 		pHalData->Regulation2_4G = TXPWR_LMT_WW;
2215 		pHalData->Regulation5G = TXPWR_LMT_WW;
2216 		break;
2217 	default:
2218 		break;
2219 	}
2220 }
2221 
2222 
2223 static char file_path_bs[PATH_MAX];
2224 
2225 #define GetLineFromBuffer(buffer)	 strsep(&buffer, "\n")
2226 
phy_ConfigMACWithParaFile(struct adapter * Adapter,char * pFileName)2227 int phy_ConfigMACWithParaFile(struct adapter *Adapter, char *pFileName)
2228 {
2229 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
2230 	int	rlen = 0, rtStatus = _FAIL;
2231 	char *szLine, *ptmp;
2232 	u32 u4bRegOffset, u4bRegValue, u4bMove;
2233 
2234 	if (!(Adapter->registrypriv.load_phy_file & LOAD_MAC_PARA_FILE))
2235 		return rtStatus;
2236 
2237 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
2238 
2239 	if ((pHalData->mac_reg_len == 0) && (pHalData->mac_reg == NULL)) {
2240 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
2241 
2242 		if (rtw_is_file_readable(file_path_bs) == true) {
2243 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
2244 			if (rlen > 0) {
2245 				rtStatus = _SUCCESS;
2246 				pHalData->mac_reg = vzalloc(rlen);
2247 				if (pHalData->mac_reg) {
2248 					memcpy(pHalData->mac_reg, pHalData->para_file_buf, rlen);
2249 					pHalData->mac_reg_len = rlen;
2250 				} else
2251 					DBG_871X("%s mac_reg alloc fail !\n", __func__);
2252 			}
2253 		}
2254 	} else {
2255 		if ((pHalData->mac_reg_len != 0) && (pHalData->mac_reg != NULL)) {
2256 			memcpy(pHalData->para_file_buf, pHalData->mac_reg, pHalData->mac_reg_len);
2257 			rtStatus = _SUCCESS;
2258 		} else
2259 			DBG_871X("%s(): Critical Error !!!\n", __func__);
2260 	}
2261 
2262 	if (rtStatus == _SUCCESS) {
2263 		ptmp = pHalData->para_file_buf;
2264 		for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
2265 			if (!IsCommentString(szLine)) {
2266 				/*  Get 1st hex value as register offset */
2267 				if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
2268 					if (u4bRegOffset == 0xffff) /*  Ending. */
2269 						break;
2270 
2271 					/*  Get 2nd hex value as register value. */
2272 					szLine += u4bMove;
2273 					if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove))
2274 						rtw_write8(Adapter, u4bRegOffset, (u8)u4bRegValue);
2275 				}
2276 			}
2277 		}
2278 	} else
2279 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
2280 
2281 	return rtStatus;
2282 }
2283 
phy_ConfigBBWithParaFile(struct adapter * Adapter,char * pFileName,u32 ConfigType)2284 int phy_ConfigBBWithParaFile(
2285 	struct adapter *Adapter, char *pFileName, u32 ConfigType
2286 )
2287 {
2288 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
2289 	int	rlen = 0, rtStatus = _FAIL;
2290 	char *szLine, *ptmp;
2291 	u32 u4bRegOffset, u4bRegValue, u4bMove;
2292 	char *pBuf = NULL;
2293 	u32 *pBufLen = NULL;
2294 
2295 	if (!(Adapter->registrypriv.load_phy_file & LOAD_BB_PARA_FILE))
2296 		return rtStatus;
2297 
2298 	switch (ConfigType) {
2299 	case CONFIG_BB_PHY_REG:
2300 		pBuf = pHalData->bb_phy_reg;
2301 		pBufLen = &pHalData->bb_phy_reg_len;
2302 		break;
2303 	case CONFIG_BB_AGC_TAB:
2304 		pBuf = pHalData->bb_agc_tab;
2305 		pBufLen = &pHalData->bb_agc_tab_len;
2306 		break;
2307 	default:
2308 		DBG_871X("Unknown ConfigType!! %d\r\n", ConfigType);
2309 		break;
2310 	}
2311 
2312 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
2313 
2314 	if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
2315 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
2316 
2317 		if (rtw_is_file_readable(file_path_bs) == true) {
2318 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
2319 			if (rlen > 0) {
2320 				rtStatus = _SUCCESS;
2321 				pBuf = vzalloc(rlen);
2322 				if (pBuf) {
2323 					memcpy(pBuf, pHalData->para_file_buf, rlen);
2324 					*pBufLen = rlen;
2325 
2326 					switch (ConfigType) {
2327 					case CONFIG_BB_PHY_REG:
2328 						pHalData->bb_phy_reg = pBuf;
2329 						break;
2330 					case CONFIG_BB_AGC_TAB:
2331 						pHalData->bb_agc_tab = pBuf;
2332 						break;
2333 					}
2334 				} else
2335 					DBG_871X("%s(): ConfigType %d  alloc fail !\n", __func__, ConfigType);
2336 			}
2337 		}
2338 	} else {
2339 		if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
2340 			memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
2341 			rtStatus = _SUCCESS;
2342 		} else
2343 			DBG_871X("%s(): Critical Error !!!\n", __func__);
2344 	}
2345 
2346 	if (rtStatus == _SUCCESS) {
2347 		ptmp = pHalData->para_file_buf;
2348 		for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
2349 			if (!IsCommentString(szLine)) {
2350 				/*  Get 1st hex value as register offset. */
2351 				if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
2352 					if (u4bRegOffset == 0xffff) /*  Ending. */
2353 						break;
2354 					else if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe)
2355 						msleep(50);
2356 					else if (u4bRegOffset == 0xfd)
2357 						mdelay(5);
2358 					else if (u4bRegOffset == 0xfc)
2359 						mdelay(1);
2360 					else if (u4bRegOffset == 0xfb)
2361 						udelay(50);
2362 					else if (u4bRegOffset == 0xfa)
2363 						udelay(5);
2364 					else if (u4bRegOffset == 0xf9)
2365 						udelay(1);
2366 
2367 					/*  Get 2nd hex value as register value. */
2368 					szLine += u4bMove;
2369 					if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
2370 						/* DBG_871X("[BB-ADDR]%03lX =%08lX\n", u4bRegOffset, u4bRegValue); */
2371 						PHY_SetBBReg(Adapter, u4bRegOffset, bMaskDWord, u4bRegValue);
2372 
2373 						if (u4bRegOffset == 0xa24)
2374 							pHalData->odmpriv.RFCalibrateInfo.RegA24 = u4bRegValue;
2375 
2376 						/*  Add 1us delay between BB/RF register setting. */
2377 						udelay(1);
2378 					}
2379 				}
2380 			}
2381 		}
2382 	} else
2383 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
2384 
2385 	return rtStatus;
2386 }
2387 
phy_DecryptBBPgParaFile(struct adapter * Adapter,char * buffer)2388 static void phy_DecryptBBPgParaFile(struct adapter *Adapter, char *buffer)
2389 {
2390 	u32 i = 0, j = 0;
2391 	u8 map[95] = {0};
2392 	u8 currentChar;
2393 	char *BufOfLines, *ptmp;
2394 
2395 	/* DBG_871X("=====>phy_DecryptBBPgParaFile()\n"); */
2396 	/*  32 the ascii code of the first visable char, 126 the last one */
2397 	for (i = 0; i < 95; ++i)
2398 		map[i] = (u8) (94 - i);
2399 
2400 	ptmp = buffer;
2401 	i = 0;
2402 	for (BufOfLines = GetLineFromBuffer(ptmp); BufOfLines != NULL; BufOfLines = GetLineFromBuffer(ptmp)) {
2403 		/* DBG_871X("Encrypted Line: %s\n", BufOfLines); */
2404 
2405 		for (j = 0; j < strlen(BufOfLines); ++j) {
2406 			currentChar = BufOfLines[j];
2407 
2408 			if (currentChar == '\0')
2409 				break;
2410 
2411 			currentChar -=  (u8) ((((i + j) * 3) % 128));
2412 
2413 			BufOfLines[j] = map[currentChar - 32] + 32;
2414 		}
2415 		/* DBG_871X("Decrypted Line: %s\n", BufOfLines); */
2416 		if (strlen(BufOfLines) != 0)
2417 			i++;
2418 		BufOfLines[strlen(BufOfLines)] = '\n';
2419 	}
2420 }
2421 
phy_ParseBBPgParaFile(struct adapter * Adapter,char * buffer)2422 static int phy_ParseBBPgParaFile(struct adapter *Adapter, char *buffer)
2423 {
2424 	int	rtStatus = _SUCCESS;
2425 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
2426 	char *szLine, *ptmp;
2427 	u32 u4bRegOffset, u4bRegMask, u4bRegValue;
2428 	u32 u4bMove;
2429 	bool firstLine = true;
2430 	u8 tx_num = 0;
2431 	u8 band = 0, rf_path = 0;
2432 
2433 	/* DBG_871X("=====>phy_ParseBBPgParaFile()\n"); */
2434 
2435 	if (Adapter->registrypriv.RegDecryptCustomFile == 1)
2436 		phy_DecryptBBPgParaFile(Adapter, buffer);
2437 
2438 	ptmp = buffer;
2439 	for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
2440 		if (!IsCommentString(szLine)) {
2441 			if (isAllSpaceOrTab(szLine, sizeof(*szLine)))
2442 				continue;
2443 
2444 			/*  Get header info (relative value or exact value) */
2445 			if (firstLine) {
2446 				if (eqNByte(szLine, (u8 *)("#[v1]"), 5)) {
2447 
2448 					pHalData->odmpriv.PhyRegPgVersion = szLine[3] - '0';
2449 					/* DBG_871X("This is a new format PHY_REG_PG.txt\n"); */
2450 				} else if (eqNByte(szLine, (u8 *)("#[v0]"), 5)) {
2451 					pHalData->odmpriv.PhyRegPgVersion = szLine[3] - '0';
2452 					/* DBG_871X("This is a old format PHY_REG_PG.txt ok\n"); */
2453 				} else {
2454 					DBG_871X("The format in PHY_REG_PG are invalid %s\n", szLine);
2455 					return _FAIL;
2456 				}
2457 
2458 				if (eqNByte(szLine + 5, (u8 *)("[Exact]#"), 8)) {
2459 					pHalData->odmpriv.PhyRegPgValueType = PHY_REG_PG_EXACT_VALUE;
2460 					/* DBG_871X("The values in PHY_REG_PG are exact values ok\n"); */
2461 					firstLine = false;
2462 					continue;
2463 				} else if (eqNByte(szLine + 5, (u8 *)("[Relative]#"), 11)) {
2464 					pHalData->odmpriv.PhyRegPgValueType = PHY_REG_PG_RELATIVE_VALUE;
2465 					/* DBG_871X("The values in PHY_REG_PG are relative values ok\n"); */
2466 					firstLine = false;
2467 					continue;
2468 				} else {
2469 					DBG_871X("The values in PHY_REG_PG are invalid %s\n", szLine);
2470 					return _FAIL;
2471 				}
2472 			}
2473 
2474 			if (pHalData->odmpriv.PhyRegPgVersion == 0) {
2475 				/*  Get 1st hex value as register offset. */
2476 				if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
2477 					szLine += u4bMove;
2478 					if (u4bRegOffset == 0xffff) /*  Ending. */
2479 						break;
2480 
2481 					/*  Get 2nd hex value as register mask. */
2482 					if (GetHexValueFromString(szLine, &u4bRegMask, &u4bMove))
2483 						szLine += u4bMove;
2484 					else
2485 						return _FAIL;
2486 
2487 					if (pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_RELATIVE_VALUE) {
2488 						/*  Get 3rd hex value as register value. */
2489 						if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
2490 							PHY_StoreTxPowerByRate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, u4bRegValue);
2491 							/* DBG_871X("[ADDR] %03X =%08X Mask =%08x\n", u4bRegOffset, u4bRegValue, u4bRegMask); */
2492 						} else
2493 							return _FAIL;
2494 					} else if (pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE) {
2495 						u32 combineValue = 0;
2496 						u8 integer = 0, fraction = 0;
2497 
2498 						if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2499 							szLine += u4bMove;
2500 						else
2501 							return _FAIL;
2502 
2503 						integer *= 2;
2504 						if (fraction == 5)
2505 							integer += 1;
2506 						combineValue |= (((integer / 10) << 4) + (integer % 10));
2507 						/* DBG_871X(" %d", integer); */
2508 
2509 						if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2510 							szLine += u4bMove;
2511 						else
2512 							return _FAIL;
2513 
2514 						integer *= 2;
2515 						if (fraction == 5)
2516 							integer += 1;
2517 						combineValue <<= 8;
2518 						combineValue |= (((integer / 10) << 4) + (integer % 10));
2519 						/* DBG_871X(" %d", integer); */
2520 
2521 						if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2522 							szLine += u4bMove;
2523 						else
2524 							return _FAIL;
2525 
2526 						integer *= 2;
2527 						if (fraction == 5)
2528 							integer += 1;
2529 						combineValue <<= 8;
2530 						combineValue |= (((integer / 10) << 4) + (integer % 10));
2531 						/* DBG_871X(" %d", integer); */
2532 
2533 						if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2534 							szLine += u4bMove;
2535 						else
2536 							return _FAIL;
2537 
2538 						integer *= 2;
2539 						if (fraction == 5)
2540 							integer += 1;
2541 						combineValue <<= 8;
2542 						combineValue |= (((integer / 10) << 4) + (integer % 10));
2543 						/* DBG_871X(" %d", integer); */
2544 						PHY_StoreTxPowerByRate(Adapter, 0, 0, 1, u4bRegOffset, u4bRegMask, combineValue);
2545 
2546 						/* DBG_871X("[ADDR] 0x%3x = 0x%4x\n", u4bRegOffset, combineValue); */
2547 					}
2548 				}
2549 			} else if (pHalData->odmpriv.PhyRegPgVersion > 0) {
2550 				u32 index = 0;
2551 
2552 				if (eqNByte(szLine, "0xffff", 6))
2553 					break;
2554 
2555 				if (!eqNByte("#[END]#", szLine, 7)) {
2556 					/*  load the table label info */
2557 					if (szLine[0] == '#') {
2558 						index = 0;
2559 						if (eqNByte(szLine, "#[2.4G]", 7)) {
2560 							band = BAND_ON_2_4G;
2561 							index += 8;
2562 						} else if (eqNByte(szLine, "#[5G]", 5)) {
2563 							band = BAND_ON_5G;
2564 							index += 6;
2565 						} else {
2566 							DBG_871X("Invalid band %s in PHY_REG_PG.txt\n", szLine);
2567 							return _FAIL;
2568 						}
2569 
2570 						rf_path = szLine[index] - 'A';
2571 						/* DBG_871X(" Table label Band %d, RfPath %d\n", band, rf_path); */
2572 					} else { /*  load rows of tables */
2573 						if (szLine[1] == '1')
2574 							tx_num = RF_1TX;
2575 						else if (szLine[1] == '2')
2576 							tx_num = RF_2TX;
2577 						else if (szLine[1] == '3')
2578 							tx_num = RF_3TX;
2579 						else if (szLine[1] == '4')
2580 							tx_num = RF_4TX;
2581 						else {
2582 							DBG_871X("Invalid row in PHY_REG_PG.txt %c\n", szLine[1]);
2583 							return _FAIL;
2584 						}
2585 
2586 						while (szLine[index] != ']')
2587 							++index;
2588 						++index;/*  skip ] */
2589 
2590 						/*  Get 2nd hex value as register offset. */
2591 						szLine += index;
2592 						if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove))
2593 							szLine += u4bMove;
2594 						else
2595 							return _FAIL;
2596 
2597 						/*  Get 2nd hex value as register mask. */
2598 						if (GetHexValueFromString(szLine, &u4bRegMask, &u4bMove))
2599 							szLine += u4bMove;
2600 						else
2601 							return _FAIL;
2602 
2603 						if (pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_RELATIVE_VALUE) {
2604 							/*  Get 3rd hex value as register value. */
2605 							if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
2606 								PHY_StoreTxPowerByRate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, u4bRegValue);
2607 								/* DBG_871X("[ADDR] %03X (tx_num %d) =%08X Mask =%08x\n", u4bRegOffset, tx_num, u4bRegValue, u4bRegMask); */
2608 							} else
2609 								return _FAIL;
2610 						} else if (pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE) {
2611 							u32 combineValue = 0;
2612 							u8 integer = 0, fraction = 0;
2613 
2614 							if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2615 								szLine += u4bMove;
2616 							else
2617 								return _FAIL;
2618 
2619 							integer *= 2;
2620 							if (fraction == 5)
2621 								integer += 1;
2622 							combineValue |= (((integer / 10) << 4) + (integer % 10));
2623 							/* DBG_871X(" %d", integer); */
2624 
2625 							if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2626 								szLine += u4bMove;
2627 							else
2628 								return _FAIL;
2629 
2630 							integer *= 2;
2631 							if (fraction == 5)
2632 								integer += 1;
2633 							combineValue <<= 8;
2634 							combineValue |= (((integer / 10) << 4) + (integer % 10));
2635 							/* DBG_871X(" %d", integer); */
2636 
2637 							if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2638 								szLine += u4bMove;
2639 							else
2640 								return _FAIL;
2641 
2642 							integer *= 2;
2643 							if (fraction == 5)
2644 								integer += 1;
2645 							combineValue <<= 8;
2646 							combineValue |= (((integer / 10) << 4) + (integer % 10));
2647 							/* DBG_871X(" %d", integer); */
2648 
2649 							if (GetFractionValueFromString(szLine, &integer, &fraction, &u4bMove))
2650 								szLine += u4bMove;
2651 							else
2652 								return _FAIL;
2653 
2654 							integer *= 2;
2655 							if (fraction == 5)
2656 								integer += 1;
2657 							combineValue <<= 8;
2658 							combineValue |= (((integer / 10) << 4) + (integer % 10));
2659 							/* DBG_871X(" %d", integer); */
2660 							PHY_StoreTxPowerByRate(Adapter, band, rf_path, tx_num, u4bRegOffset, u4bRegMask, combineValue);
2661 
2662 							/* DBG_871X("[ADDR] 0x%3x (tx_num %d) = 0x%4x\n", u4bRegOffset, tx_num, combineValue); */
2663 						}
2664 					}
2665 				}
2666 			}
2667 		}
2668 	}
2669 	/* DBG_871X("<=====phy_ParseBBPgParaFile()\n"); */
2670 	return rtStatus;
2671 }
2672 
phy_ConfigBBWithPgParaFile(struct adapter * Adapter,char * pFileName)2673 int phy_ConfigBBWithPgParaFile(struct adapter *Adapter, char *pFileName)
2674 {
2675 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
2676 	int	rlen = 0, rtStatus = _FAIL;
2677 
2678 	if (!(Adapter->registrypriv.load_phy_file & LOAD_BB_PG_PARA_FILE))
2679 		return rtStatus;
2680 
2681 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
2682 
2683 	if ((pHalData->bb_phy_reg_pg_len == 0) && (pHalData->bb_phy_reg_pg == NULL)) {
2684 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
2685 
2686 		if (rtw_is_file_readable(file_path_bs) == true) {
2687 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
2688 			if (rlen > 0) {
2689 				rtStatus = _SUCCESS;
2690 				pHalData->bb_phy_reg_pg = vzalloc(rlen);
2691 				if (pHalData->bb_phy_reg_pg) {
2692 					memcpy(pHalData->bb_phy_reg_pg, pHalData->para_file_buf, rlen);
2693 					pHalData->bb_phy_reg_pg_len = rlen;
2694 				} else
2695 					DBG_871X("%s bb_phy_reg_pg alloc fail !\n", __func__);
2696 			}
2697 		}
2698 	} else {
2699 		if ((pHalData->bb_phy_reg_pg_len != 0) && (pHalData->bb_phy_reg_pg != NULL)) {
2700 			memcpy(pHalData->para_file_buf, pHalData->bb_phy_reg_pg, pHalData->bb_phy_reg_pg_len);
2701 			rtStatus = _SUCCESS;
2702 		} else
2703 			DBG_871X("%s(): Critical Error !!!\n", __func__);
2704 	}
2705 
2706 	if (rtStatus == _SUCCESS) {
2707 		/* DBG_871X("phy_ConfigBBWithPgParaFile(): read %s ok\n", pFileName); */
2708 		phy_ParseBBPgParaFile(Adapter, pHalData->para_file_buf);
2709 	} else
2710 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
2711 
2712 	return rtStatus;
2713 }
2714 
PHY_ConfigRFWithParaFile(struct adapter * Adapter,char * pFileName,u8 eRFPath)2715 int PHY_ConfigRFWithParaFile(
2716 	struct adapter *Adapter, char *pFileName, u8 eRFPath
2717 )
2718 {
2719 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
2720 	int	rlen = 0, rtStatus = _FAIL;
2721 	char *szLine, *ptmp;
2722 	u32 u4bRegOffset, u4bRegValue, u4bMove;
2723 	u16 i;
2724 	char *pBuf = NULL;
2725 	u32 *pBufLen = NULL;
2726 
2727 	if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_PARA_FILE))
2728 		return rtStatus;
2729 
2730 	switch (eRFPath) {
2731 	case ODM_RF_PATH_A:
2732 		pBuf = pHalData->rf_radio_a;
2733 		pBufLen = &pHalData->rf_radio_a_len;
2734 		break;
2735 	case ODM_RF_PATH_B:
2736 		pBuf = pHalData->rf_radio_b;
2737 		pBufLen = &pHalData->rf_radio_b_len;
2738 		break;
2739 	default:
2740 		DBG_871X("Unknown RF path!! %d\r\n", eRFPath);
2741 		break;
2742 	}
2743 
2744 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
2745 
2746 	if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
2747 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
2748 
2749 		if (rtw_is_file_readable(file_path_bs) == true) {
2750 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
2751 			if (rlen > 0) {
2752 				rtStatus = _SUCCESS;
2753 				pBuf = vzalloc(rlen);
2754 				if (pBuf) {
2755 					memcpy(pBuf, pHalData->para_file_buf, rlen);
2756 					*pBufLen = rlen;
2757 
2758 					switch (eRFPath) {
2759 					case ODM_RF_PATH_A:
2760 						pHalData->rf_radio_a = pBuf;
2761 						break;
2762 					case ODM_RF_PATH_B:
2763 						pHalData->rf_radio_b = pBuf;
2764 						break;
2765 					}
2766 				} else
2767 					DBG_871X("%s(): eRFPath =%d  alloc fail !\n", __func__, eRFPath);
2768 			}
2769 		}
2770 	} else {
2771 		if ((pBufLen != NULL) && (*pBufLen == 0) && (pBuf == NULL)) {
2772 			memcpy(pHalData->para_file_buf, pBuf, *pBufLen);
2773 			rtStatus = _SUCCESS;
2774 		} else
2775 			DBG_871X("%s(): Critical Error !!!\n", __func__);
2776 	}
2777 
2778 	if (rtStatus == _SUCCESS) {
2779 		/* DBG_871X("%s(): read %s successfully\n", __func__, pFileName); */
2780 
2781 		ptmp = pHalData->para_file_buf;
2782 		for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
2783 			if (!IsCommentString(szLine)) {
2784 				/*  Get 1st hex value as register offset. */
2785 				if (GetHexValueFromString(szLine, &u4bRegOffset, &u4bMove)) {
2786 					if (u4bRegOffset == 0xfe || u4bRegOffset == 0xffe) /*  Deay specific ms. Only RF configuration require delay. */
2787 						msleep(50);
2788 					else if (u4bRegOffset == 0xfd) {
2789 						/* mdelay(5); */
2790 						for (i = 0; i < 100; i++)
2791 							udelay(MAX_STALL_TIME);
2792 					} else if (u4bRegOffset == 0xfc) {
2793 						/* mdelay(1); */
2794 						for (i = 0; i < 20; i++)
2795 							udelay(MAX_STALL_TIME);
2796 					} else if (u4bRegOffset == 0xfb)
2797 						udelay(50);
2798 					else if (u4bRegOffset == 0xfa)
2799 						udelay(5);
2800 					else if (u4bRegOffset == 0xf9)
2801 						udelay(1);
2802 					else if (u4bRegOffset == 0xffff)
2803 						break;
2804 
2805 					/*  Get 2nd hex value as register value. */
2806 					szLine += u4bMove;
2807 					if (GetHexValueFromString(szLine, &u4bRegValue, &u4bMove)) {
2808 						PHY_SetRFReg(Adapter, eRFPath, u4bRegOffset, bRFRegOffsetMask, u4bRegValue);
2809 
2810 						/*  Temp add, for frequency lock, if no delay, that may cause */
2811 						/*  frequency shift, ex: 2412MHz => 2417MHz */
2812 						/*  If frequency shift, the following action may works. */
2813 						/*  Fractional-N table in radio_a.txt */
2814 						/* 0x2a 0x00001		channel 1 */
2815 						/* 0x2b 0x00808		frequency divider. */
2816 						/* 0x2b 0x53333 */
2817 						/* 0x2c 0x0000c */
2818 						udelay(1);
2819 					}
2820 				}
2821 			}
2822 		}
2823 	} else
2824 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
2825 
2826 	return rtStatus;
2827 }
2828 
initDeltaSwingIndexTables(struct adapter * Adapter,char * Band,char * Path,char * Sign,char * Channel,char * Rate,char * Data)2829 static void initDeltaSwingIndexTables(
2830 	struct adapter *Adapter,
2831 	char *Band,
2832 	char *Path,
2833 	char *Sign,
2834 	char *Channel,
2835 	char *Rate,
2836 	char *Data
2837 )
2838 {
2839 	#define STR_EQUAL_5G(_band, _path, _sign, _rate, _chnl) \
2840 		((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\
2841 		(strcmp(Rate, _rate) == 0) && (strcmp(Channel, _chnl) == 0)\
2842 	)
2843 	#define STR_EQUAL_2G(_band, _path, _sign, _rate) \
2844 		((strcmp(Band, _band) == 0) && (strcmp(Path, _path) == 0) && (strcmp(Sign, _sign) == 0) &&\
2845 		(strcmp(Rate, _rate) == 0)\
2846 	)
2847 
2848 	#define STORE_SWING_TABLE(_array, _iteratedIdx) \
2849 		for (token = strsep(&Data, delim); token != NULL; token = strsep(&Data, delim)) {\
2850 			sscanf(token, "%d", &idx);\
2851 			_array[_iteratedIdx++] = (u8)idx;\
2852 		} \
2853 
2854 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
2855 	PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
2856 	PODM_RF_CAL_T pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);
2857 	u32 j = 0;
2858 	char *token;
2859 	char delim[] = ",";
2860 	u32 idx = 0;
2861 
2862 	/* DBG_871X("===>initDeltaSwingIndexTables(): Band: %s;\nPath: %s;\nSign: %s;\nChannel: %s;\nRate: %s;\n, Data: %s;\n", */
2863 	/*	Band, Path, Sign, Channel, Rate, Data); */
2864 
2865 	if (STR_EQUAL_2G("2G", "A", "+", "CCK")) {
2866 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_P, j);
2867 	} else if (STR_EQUAL_2G("2G", "A", "-", "CCK")) {
2868 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKA_N, j);
2869 	} else if (STR_EQUAL_2G("2G", "B", "+", "CCK")) {
2870 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_P, j);
2871 	} else if (STR_EQUAL_2G("2G", "B", "-", "CCK")) {
2872 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GCCKB_N, j);
2873 	} else if (STR_EQUAL_2G("2G", "A", "+", "ALL")) {
2874 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GA_P, j);
2875 	} else if (STR_EQUAL_2G("2G", "A", "-", "ALL")) {
2876 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GA_N, j);
2877 	} else if (STR_EQUAL_2G("2G", "B", "+", "ALL")) {
2878 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GB_P, j);
2879 	} else if (STR_EQUAL_2G("2G", "B", "-", "ALL")) {
2880 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_2GB_N, j);
2881 	} else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "0")) {
2882 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[0], j);
2883 	} else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "0")) {
2884 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[0], j);
2885 	} else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "0")) {
2886 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[0], j);
2887 	} else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "0")) {
2888 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[0], j);
2889 	} else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "1")) {
2890 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[1], j);
2891 	} else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "1")) {
2892 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[1], j);
2893 	} else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "1")) {
2894 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[1], j);
2895 	} else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "1")) {
2896 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[1], j);
2897 	} else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "2")) {
2898 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[2], j);
2899 	} else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "2")) {
2900 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[2], j);
2901 	} else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "2")) {
2902 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[2], j);
2903 	} else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "2")) {
2904 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[2], j);
2905 	} else if (STR_EQUAL_5G("5G", "A", "+", "ALL", "3")) {
2906 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_P[3], j);
2907 	} else if (STR_EQUAL_5G("5G", "A", "-", "ALL", "3")) {
2908 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GA_N[3], j);
2909 	} else if (STR_EQUAL_5G("5G", "B", "+", "ALL", "3")) {
2910 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_P[3], j);
2911 	} else if (STR_EQUAL_5G("5G", "B", "-", "ALL", "3")) {
2912 		STORE_SWING_TABLE(pRFCalibrateInfo->DeltaSwingTableIdx_5GB_N[3], j);
2913 	} else
2914 		DBG_871X("===>initDeltaSwingIndexTables(): The input is invalid!!\n");
2915 }
2916 
PHY_ConfigRFWithTxPwrTrackParaFile(struct adapter * Adapter,char * pFileName)2917 int PHY_ConfigRFWithTxPwrTrackParaFile(struct adapter *Adapter, char *pFileName)
2918 {
2919 	struct hal_com_data *pHalData = GET_HAL_DATA(Adapter);
2920 	int	rlen = 0, rtStatus = _FAIL;
2921 	char *szLine, *ptmp;
2922 	u32 i = 0;
2923 
2924 	if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_TRACK_PARA_FILE))
2925 		return rtStatus;
2926 
2927 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
2928 
2929 	if ((pHalData->rf_tx_pwr_track_len == 0) && (pHalData->rf_tx_pwr_track == NULL)) {
2930 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
2931 
2932 		if (rtw_is_file_readable(file_path_bs) == true) {
2933 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
2934 			if (rlen > 0) {
2935 				rtStatus = _SUCCESS;
2936 				pHalData->rf_tx_pwr_track = vzalloc(rlen);
2937 				if (pHalData->rf_tx_pwr_track) {
2938 					memcpy(pHalData->rf_tx_pwr_track, pHalData->para_file_buf, rlen);
2939 					pHalData->rf_tx_pwr_track_len = rlen;
2940 				} else
2941 					DBG_871X("%s rf_tx_pwr_track alloc fail !\n", __func__);
2942 			}
2943 		}
2944 	} else {
2945 		if ((pHalData->rf_tx_pwr_track_len != 0) && (pHalData->rf_tx_pwr_track != NULL)) {
2946 			memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_track, pHalData->rf_tx_pwr_track_len);
2947 			rtStatus = _SUCCESS;
2948 		} else
2949 			DBG_871X("%s(): Critical Error !!!\n", __func__);
2950 	}
2951 
2952 	if (rtStatus == _SUCCESS) {
2953 		/* DBG_871X("%s(): read %s successfully\n", __func__, pFileName); */
2954 
2955 		ptmp = pHalData->para_file_buf;
2956 		for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
2957 			if (!IsCommentString(szLine)) {
2958 				char band[5] = "", path[5] = "", sign[5] = "";
2959 				char chnl[5] = "", rate[10] = "";
2960 				char data[300] = ""; /*  100 is too small */
2961 
2962 				if (strlen(szLine) < 10 || szLine[0] != '[')
2963 					continue;
2964 
2965 				strncpy(band, szLine+1, 2);
2966 				strncpy(path, szLine+5, 1);
2967 				strncpy(sign, szLine+8, 1);
2968 
2969 				i = 10; /*  szLine+10 */
2970 				if (!ParseQualifiedString(szLine, &i, rate, '[', ']')) {
2971 					/* DBG_871X("Fail to parse rate!\n"); */
2972 				}
2973 				if (!ParseQualifiedString(szLine, &i, chnl, '[', ']')) {
2974 					/* DBG_871X("Fail to parse channel group!\n"); */
2975 				}
2976 				while (szLine[i] != '{' && i < strlen(szLine))
2977 					i++;
2978 				if (!ParseQualifiedString(szLine, &i, data, '{', '}')) {
2979 					/* DBG_871X("Fail to parse data!\n"); */
2980 				}
2981 
2982 				initDeltaSwingIndexTables(Adapter, band, path, sign, chnl, rate, data);
2983 			}
2984 		}
2985 	} else
2986 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
2987 
2988 	return rtStatus;
2989 }
2990 
phy_ParsePowerLimitTableFile(struct adapter * Adapter,char * buffer)2991 static int phy_ParsePowerLimitTableFile(struct adapter *Adapter, char *buffer)
2992 {
2993 	u32 i = 0, forCnt = 0;
2994 	u8 loadingStage = 0, limitValue = 0, fraction = 0;
2995 	char *szLine, *ptmp;
2996 	int	rtStatus = _SUCCESS;
2997 	char band[10], bandwidth[10], rateSection[10],
2998 		regulation[TXPWR_LMT_MAX_REGULATION_NUM][10], rfPath[10], colNumBuf[10];
2999 	u8 colNum = 0;
3000 
3001 	DBG_871X("===>phy_ParsePowerLimitTableFile()\n");
3002 
3003 	if (Adapter->registrypriv.RegDecryptCustomFile == 1)
3004 		phy_DecryptBBPgParaFile(Adapter, buffer);
3005 
3006 	ptmp = buffer;
3007 	for (szLine = GetLineFromBuffer(ptmp); szLine != NULL; szLine = GetLineFromBuffer(ptmp)) {
3008 		/*  skip comment */
3009 		if (IsCommentString(szLine)) {
3010 			continue;
3011 		}
3012 
3013 		if (loadingStage == 0) {
3014 			for (forCnt = 0; forCnt < TXPWR_LMT_MAX_REGULATION_NUM; ++forCnt)
3015 				memset((void *) regulation[forCnt], 0, 10);
3016 
3017 			memset((void *) band, 0, 10);
3018 			memset((void *) bandwidth, 0, 10);
3019 			memset((void *) rateSection, 0, 10);
3020 			memset((void *) rfPath, 0, 10);
3021 			memset((void *) colNumBuf, 0, 10);
3022 
3023 			if (szLine[0] != '#' || szLine[1] != '#')
3024 				continue;
3025 
3026 			/*  skip the space */
3027 			i = 2;
3028 			while (szLine[i] == ' ' || szLine[i] == '\t')
3029 				++i;
3030 
3031 			szLine[--i] = ' '; /*  return the space in front of the regulation info */
3032 
3033 			/*  Parse the label of the table */
3034 			if (!ParseQualifiedString(szLine, &i, band, ' ', ',')) {
3035 				DBG_871X("Fail to parse band!\n");
3036 				return _FAIL;
3037 			}
3038 			if (!ParseQualifiedString(szLine, &i, bandwidth, ' ', ',')) {
3039 				DBG_871X("Fail to parse bandwidth!\n");
3040 				return _FAIL;
3041 			}
3042 			if (!ParseQualifiedString(szLine, &i, rfPath, ' ', ',')) {
3043 				DBG_871X("Fail to parse rf path!\n");
3044 				return _FAIL;
3045 			}
3046 			if (!ParseQualifiedString(szLine, &i, rateSection, ' ', ',')) {
3047 				DBG_871X("Fail to parse rate!\n");
3048 				return _FAIL;
3049 			}
3050 
3051 			loadingStage = 1;
3052 		} else if (loadingStage == 1) {
3053 			if (szLine[0] != '#' || szLine[1] != '#')
3054 				continue;
3055 
3056 			/*  skip the space */
3057 			i = 2;
3058 			while (szLine[i] == ' ' || szLine[i] == '\t')
3059 				++i;
3060 
3061 			if (!eqNByte((u8 *)(szLine + i), (u8 *)("START"), 5)) {
3062 				DBG_871X("Lost \"##   START\" label\n");
3063 				return _FAIL;
3064 			}
3065 
3066 			loadingStage = 2;
3067 		} else if (loadingStage == 2) {
3068 			if (szLine[0] != '#' || szLine[1] != '#')
3069 				continue;
3070 
3071 			/*  skip the space */
3072 			i = 2;
3073 			while (szLine[i] == ' ' || szLine[i] == '\t')
3074 				++i;
3075 
3076 			if (!ParseQualifiedString(szLine, &i, colNumBuf, '#', '#')) {
3077 				DBG_871X("Fail to parse column number!\n");
3078 				return _FAIL;
3079 			}
3080 
3081 			if (!GetU1ByteIntegerFromStringInDecimal(colNumBuf, &colNum))
3082 				return _FAIL;
3083 
3084 			if (colNum > TXPWR_LMT_MAX_REGULATION_NUM) {
3085 				DBG_871X(
3086 					"unvalid col number %d (greater than max %d)\n",
3087 					colNum, TXPWR_LMT_MAX_REGULATION_NUM
3088 				);
3089 				return _FAIL;
3090 			}
3091 
3092 			for (forCnt = 0; forCnt < colNum; ++forCnt) {
3093 				u8 regulation_name_cnt = 0;
3094 
3095 				/*  skip the space */
3096 				while (szLine[i] == ' ' || szLine[i] == '\t')
3097 					++i;
3098 
3099 				while (szLine[i] != ' ' && szLine[i] != '\t' && szLine[i] != '\0')
3100 					regulation[forCnt][regulation_name_cnt++] = szLine[i++];
3101 				/* DBG_871X("regulation %s!\n", regulation[forCnt]); */
3102 
3103 				if (regulation_name_cnt == 0) {
3104 					DBG_871X("unvalid number of regulation!\n");
3105 					return _FAIL;
3106 				}
3107 			}
3108 
3109 			loadingStage = 3;
3110 		} else if (loadingStage == 3) {
3111 			char channel[10] = {0}, powerLimit[10] = {0};
3112 			u8 cnt = 0;
3113 
3114 			/*  the table ends */
3115 			if (szLine[0] == '#' && szLine[1] == '#') {
3116 				i = 2;
3117 				while (szLine[i] == ' ' || szLine[i] == '\t')
3118 					++i;
3119 
3120 				if (eqNByte((u8 *)(szLine + i), (u8 *)("END"), 3)) {
3121 					loadingStage = 0;
3122 					continue;
3123 				} else {
3124 					DBG_871X("Wrong format\n");
3125 					DBG_871X("<===== phy_ParsePowerLimitTableFile()\n");
3126 					return _FAIL;
3127 				}
3128 			}
3129 
3130 			if ((szLine[0] != 'c' && szLine[0] != 'C') ||
3131 				 (szLine[1] != 'h' && szLine[1] != 'H')) {
3132 				DBG_871X("Meet wrong channel => power limt pair\n");
3133 				continue;
3134 			}
3135 			i = 2;/*  move to the  location behind 'h' */
3136 
3137 			/*  load the channel number */
3138 			cnt = 0;
3139 			while (szLine[i] >= '0' && szLine[i] <= '9') {
3140 				channel[cnt] = szLine[i];
3141 				++cnt;
3142 				++i;
3143 			}
3144 			/* DBG_871X("chnl %s!\n", channel); */
3145 
3146 			for (forCnt = 0; forCnt < colNum; ++forCnt) {
3147 				/*  skip the space between channel number and the power limit value */
3148 				while (szLine[i] == ' ' || szLine[i] == '\t')
3149 					++i;
3150 
3151 				/*  load the power limit value */
3152 				cnt = 0;
3153 				fraction = 0;
3154 				memset((void *) powerLimit, 0, 10);
3155 				while ((szLine[i] >= '0' && szLine[i] <= '9') || szLine[i] == '.') {
3156 					if (szLine[i] == '.') {
3157 						if ((szLine[i+1] >= '0' && szLine[i+1] <= '9')) {
3158 							fraction = szLine[i+1];
3159 							i += 2;
3160 						} else {
3161 							DBG_871X("Wrong fraction in TXPWR_LMT.txt\n");
3162 							return _FAIL;
3163 						}
3164 
3165 						break;
3166 					}
3167 
3168 					powerLimit[cnt] = szLine[i];
3169 					++cnt;
3170 					++i;
3171 				}
3172 
3173 				if (powerLimit[0] == '\0') {
3174 					powerLimit[0] = '6';
3175 					powerLimit[1] = '3';
3176 					i += 2;
3177 				} else {
3178 					if (!GetU1ByteIntegerFromStringInDecimal(powerLimit, &limitValue))
3179 						return _FAIL;
3180 
3181 					limitValue *= 2;
3182 					cnt = 0;
3183 					if (fraction == '5')
3184 						++limitValue;
3185 
3186 					/*  the value is greater or equal to 100 */
3187 					if (limitValue >= 100) {
3188 						powerLimit[cnt++] = limitValue/100 + '0';
3189 						limitValue %= 100;
3190 
3191 						if (limitValue >= 10) {
3192 							powerLimit[cnt++] = limitValue/10 + '0';
3193 							limitValue %= 10;
3194 						} else
3195 							powerLimit[cnt++] = '0';
3196 
3197 						powerLimit[cnt++] = limitValue + '0';
3198 					} else if (limitValue >= 10) { /*  the value is greater or equal to 10 */
3199 						powerLimit[cnt++] = limitValue/10 + '0';
3200 						limitValue %= 10;
3201 						powerLimit[cnt++] = limitValue + '0';
3202 					}
3203 					/*  the value is less than 10 */
3204 					else
3205 						powerLimit[cnt++] = limitValue + '0';
3206 
3207 					powerLimit[cnt] = '\0';
3208 				}
3209 
3210 				/* DBG_871X("ch%s => %s\n", channel, powerLimit); */
3211 
3212 				/*  store the power limit value */
3213 				PHY_SetTxPowerLimit(Adapter, (u8 *)regulation[forCnt], (u8 *)band,
3214 					(u8 *)bandwidth, (u8 *)rateSection, (u8 *)rfPath, (u8 *)channel, (u8 *)powerLimit);
3215 
3216 			}
3217 		} else {
3218 			DBG_871X("Abnormal loading stage in phy_ParsePowerLimitTableFile()!\n");
3219 			rtStatus = _FAIL;
3220 			break;
3221 		}
3222 	}
3223 
3224 	DBG_871X("<===phy_ParsePowerLimitTableFile()\n");
3225 	return rtStatus;
3226 }
3227 
PHY_ConfigRFWithPowerLimitTableParaFile(struct adapter * Adapter,char * pFileName)3228 int PHY_ConfigRFWithPowerLimitTableParaFile(
3229 	struct adapter *Adapter, char *pFileName
3230 )
3231 {
3232 	struct hal_com_data	*pHalData = GET_HAL_DATA(Adapter);
3233 	int	rlen = 0, rtStatus = _FAIL;
3234 
3235 	if (!(Adapter->registrypriv.load_phy_file & LOAD_RF_TXPWR_LMT_PARA_FILE))
3236 		return rtStatus;
3237 
3238 	memset(pHalData->para_file_buf, 0, MAX_PARA_FILE_BUF_LEN);
3239 
3240 	if ((pHalData->rf_tx_pwr_lmt_len == 0) && (pHalData->rf_tx_pwr_lmt == NULL)) {
3241 		rtw_merge_string(file_path_bs, PATH_MAX, rtw_phy_file_path, pFileName);
3242 
3243 		if (rtw_is_file_readable(file_path_bs) == true) {
3244 			rlen = rtw_retrive_from_file(file_path_bs, pHalData->para_file_buf, MAX_PARA_FILE_BUF_LEN);
3245 			if (rlen > 0) {
3246 				rtStatus = _SUCCESS;
3247 				pHalData->rf_tx_pwr_lmt = vzalloc(rlen);
3248 				if (pHalData->rf_tx_pwr_lmt) {
3249 					memcpy(pHalData->rf_tx_pwr_lmt, pHalData->para_file_buf, rlen);
3250 					pHalData->rf_tx_pwr_lmt_len = rlen;
3251 				} else
3252 					DBG_871X("%s rf_tx_pwr_lmt alloc fail !\n", __func__);
3253 			}
3254 		}
3255 	} else {
3256 		if ((pHalData->rf_tx_pwr_lmt_len != 0) && (pHalData->rf_tx_pwr_lmt != NULL)) {
3257 			memcpy(pHalData->para_file_buf, pHalData->rf_tx_pwr_lmt, pHalData->rf_tx_pwr_lmt_len);
3258 			rtStatus = _SUCCESS;
3259 		} else
3260 			DBG_871X("%s(): Critical Error !!!\n", __func__);
3261 	}
3262 
3263 	if (rtStatus == _SUCCESS) {
3264 		/* DBG_871X("%s(): read %s ok\n", __func__, pFileName); */
3265 		rtStatus = phy_ParsePowerLimitTableFile(Adapter, pHalData->para_file_buf);
3266 	} else
3267 		DBG_871X("%s(): No File %s, Load from HWImg Array!\n", __func__, pFileName);
3268 
3269 	return rtStatus;
3270 }
3271 
phy_free_filebuf(struct adapter * padapter)3272 void phy_free_filebuf(struct adapter *padapter)
3273 {
3274 	struct hal_com_data		*pHalData = GET_HAL_DATA(padapter);
3275 
3276 	if (pHalData->mac_reg)
3277 		vfree(pHalData->mac_reg);
3278 	if (pHalData->bb_phy_reg)
3279 		vfree(pHalData->bb_phy_reg);
3280 	if (pHalData->bb_agc_tab)
3281 		vfree(pHalData->bb_agc_tab);
3282 	if (pHalData->bb_phy_reg_pg)
3283 		vfree(pHalData->bb_phy_reg_pg);
3284 	if (pHalData->bb_phy_reg_mp)
3285 		vfree(pHalData->bb_phy_reg_mp);
3286 	if (pHalData->rf_radio_a)
3287 		vfree(pHalData->rf_radio_a);
3288 	if (pHalData->rf_radio_b)
3289 		vfree(pHalData->rf_radio_b);
3290 	if (pHalData->rf_tx_pwr_track)
3291 		vfree(pHalData->rf_tx_pwr_track);
3292 	if (pHalData->rf_tx_pwr_lmt)
3293 		vfree(pHalData->rf_tx_pwr_lmt);
3294 
3295 }
3296