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