net: wireless: rockchip_wlan: add rtl8723bs support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bs / hal / phydm / phydm_dynamictxpower.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *                                        \r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 //============================================================\r
22 // include files\r
23 //============================================================\r
24 #include "mp_precomp.h"\r
25 #include "phydm_precomp.h"\r
26 \r
27 VOID \r
28 odm_DynamicTxPowerInit(\r
29         IN              PVOID                                   pDM_VOID        \r
30         )\r
31 {\r
32         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
33 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
34         PADAPTER        Adapter = pDM_Odm->Adapter;\r
35         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
36         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
37 \r
38         #if DEV_BUS_TYPE==RT_USB_INTERFACE                                      \r
39         if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)\r
40         {\r
41                 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);\r
42                 pMgntInfo->bDynamicTxPowerEnable = TRUE;\r
43         }               \r
44         else    \r
45         #else\r
46         //so 92c pci do not need dynamic tx power? vivi check it later\r
47         if(IS_HARDWARE_TYPE_8192D(Adapter))\r
48                 pMgntInfo->bDynamicTxPowerEnable = TRUE;\r
49         else\r
50                 pMgntInfo->bDynamicTxPowerEnable = FALSE;\r
51         #endif\r
52         \r
53 \r
54         pHalData->LastDTPLvl = TxHighPwrLevel_Normal;\r
55         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
56 \r
57 \r
58 #endif\r
59         \r
60 }\r
61 \r
62 VOID\r
63 odm_DynamicTxPowerSavePowerIndex(\r
64         IN              PVOID                                   pDM_VOID        \r
65         )\r
66 {       \r
67         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
68 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
69         u1Byte          index;\r
70         u4Byte          Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\r
71         \r
72 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)    \r
73         PADAPTER        Adapter = pDM_Odm->Adapter;\r
74         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      \r
75         for(index = 0; index< 6; index++)\r
76                 pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);\r
77         \r
78         \r
79 #endif\r
80 #endif\r
81 }\r
82 \r
83 VOID\r
84 odm_DynamicTxPowerRestorePowerIndex(\r
85         IN              PVOID                                   pDM_VOID\r
86         )\r
87 {\r
88         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
89 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
90         u1Byte                  index;\r
91         PADAPTER                Adapter = pDM_Odm->Adapter;\r
92         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
93         u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\r
94 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
95         for(index = 0; index< 6; index++)\r
96                 PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);\r
97 \r
98 \r
99 #endif\r
100 #endif\r
101 }\r
102 \r
103 VOID\r
104 odm_DynamicTxPowerWritePowerIndex(\r
105         IN              PVOID                                   pDM_VOID, \r
106         IN      u1Byte          Value)\r
107 {\r
108         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
109         u1Byte                  index;\r
110         u4Byte                  Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};\r
111         \r
112         for(index = 0; index< 6; index++)\r
113                 //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);\r
114                 ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);\r
115 \r
116 }\r
117 \r
118 \r
119 VOID \r
120 odm_DynamicTxPower(\r
121         IN              PVOID                                   pDM_VOID\r
122         )\r
123 {\r
124         // \r
125         // For AP/ADSL use prtl8192cd_priv\r
126         // For CE/NIC use PADAPTER\r
127         //\r
128         //PADAPTER              pAdapter = pDM_Odm->Adapter;\r
129 //      prtl8192cd_priv priv            = pDM_Odm->priv;\r
130         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
131         if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\r
132                 return;\r
133         //\r
134         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
135         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
136         // HW dynamic mechanism.\r
137         //\r
138         switch  (pDM_Odm->SupportPlatform)\r
139         {\r
140                 case    ODM_WIN:\r
141                 case    ODM_CE:\r
142                         odm_DynamicTxPowerNIC(pDM_Odm);\r
143                         break;  \r
144                 case    ODM_AP:\r
145                         odm_DynamicTxPowerAP(pDM_Odm);\r
146                         break;          \r
147 \r
148                 case    ODM_ADSL:\r
149                         //odm_DIGAP(pDM_Odm);\r
150                         break;  \r
151         }\r
152 \r
153         \r
154 }\r
155 \r
156 \r
157 VOID \r
158 odm_DynamicTxPowerNIC(\r
159         IN              PVOID                                   pDM_VOID\r
160         )\r
161 {       \r
162         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
163         \r
164         if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))\r
165                 return;\r
166         \r
167 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
168 \r
169         if(pDM_Odm->SupportICType == ODM_RTL8192C)      \r
170         {\r
171                 odm_DynamicTxPower_92C(pDM_Odm);\r
172         }\r
173         else if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
174         {\r
175                 odm_DynamicTxPower_92D(pDM_Odm);\r
176         }\r
177         else if (pDM_Odm->SupportICType == ODM_RTL8821)\r
178         {\r
179 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
180                 PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
181                 PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);\r
182 \r
183                 if (pMgntInfo->RegRspPwr == 1)\r
184                 {\r
185                         if(pDM_Odm->RSSI_Min > 60)\r
186                         {\r
187                                 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB\r
188 \r
189                         }\r
190                         else if(pDM_Odm->RSSI_Min < 55)\r
191                         {\r
192                                 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB\r
193                         }\r
194                 }\r
195 #endif\r
196         }\r
197 #endif  \r
198 }\r
199 \r
200 VOID \r
201 odm_DynamicTxPowerAP(\r
202         IN              PVOID                                   pDM_VOID\r
203 \r
204         )\r
205 {       \r
206         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
207 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
208 \r
209 //#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))\r
210 \r
211 \r
212         prtl8192cd_priv priv            = pDM_Odm->priv;\r
213         s4Byte i;\r
214         s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;\r
215 \r
216         if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)\r
217                 return;\r
218         \r
219 #if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1) || (RTL8814A_SUPPORT==1))\r
220         if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A | ODM_RTL8814A))\r
221                 pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;\r
222 #endif\r
223 \r
224 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\r
225         if(CHIP_VER_92X_SERIES(priv))\r
226         {\r
227 #ifdef HIGH_POWER_EXT_PA\r
228         if(pDM_Odm->ExtPA)\r
229                 tx_power_control(priv);\r
230 #endif          \r
231         }\r
232 #endif  \r
233         /*\r
234          *      Check if station is near by to use lower tx power\r
235          */\r
236 \r
237         if ((priv->up_time % 3) == 0 )  {\r
238                 int disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;\r
239                         \r
240                 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){\r
241                         PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\r
242                         if(IS_STA_VALID(pstat) ) {\r
243                                         if(disable_pwr_ctrl)\r
244                                                 pstat->hp_level = 0;\r
245                                          else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))\r
246                                         pstat->hp_level = 1;\r
247                                                 else if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))\r
248                                         pstat->hp_level = 0;\r
249                         }\r
250                 }\r
251 \r
252 #if defined(CONFIG_WLAN_HAL_8192EE)\r
253                 if (GET_CHIP_VER(priv) == VERSION_8192E) {\r
254                         if( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {\r
255                                 if(pDM_Odm->RSSI_Min > pwr_thd)\r
256                                         RRSR_power_control_11n(priv,  1 );\r
257                                 else if(pDM_Odm->RSSI_Min < (pwr_thd-8))\r
258                                         RRSR_power_control_11n(priv,  0 );\r
259                         } else {\r
260                                         RRSR_power_control_11n(priv,  0 );\r
261                         }\r
262                 }\r
263 #endif                  \r
264 \r
265 #ifdef CONFIG_WLAN_HAL_8814AE\r
266                 if (GET_CHIP_VER(priv) == VERSION_8814A) {\r
267                         if (!disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff)) {\r
268                                 if (pDM_Odm->RSSI_Min > pwr_thd)\r
269                                         RRSR_power_control_14(priv,  1);\r
270                                 else if (pDM_Odm->RSSI_Min < (pwr_thd-8))\r
271                                         RRSR_power_control_14(priv,  0);\r
272                         } else {\r
273                                         RRSR_power_control_14(priv,  0);\r
274                         }\r
275                 }\r
276 #endif          \r
277 \r
278         }\r
279 //#endif        \r
280 \r
281 #endif  \r
282 }\r
283 \r
284 \r
285 VOID \r
286 odm_DynamicTxPower_92C(\r
287         IN              PVOID                                   pDM_VOID\r
288         )\r
289 {\r
290         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
291 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
292         PADAPTER Adapter = pDM_Odm->Adapter;\r
293         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
294         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
295         s4Byte                          UndecoratedSmoothedPWDB;\r
296 \r
297         // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.\r
298         if (pDM_Odm->ExtPA == FALSE)\r
299                 return;\r
300 \r
301         // STA not connected and AP not connected\r
302         if((!pMgntInfo->bMediaConnect) &&       \r
303                 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))\r
304         {\r
305                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));\r
306                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
307 \r
308                 //the LastDTPlvl should reset when disconnect, \r
309                 //otherwise the tx power level wouldn't change when disconnect and connect again.\r
310                 // Maddest 20091220.\r
311                  pHalData->LastDTPLvl=TxHighPwrLevel_Normal;\r
312                 return;\r
313         }\r
314 \r
315 #if (INTEL_PROXIMITY_SUPPORT == 1)\r
316         // Intel set fixed tx power \r
317         if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)\r
318         {\r
319                 switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){\r
320                         case 1:\r
321                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;\r
322                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));\r
323                                 break;\r
324                         case 2:\r
325                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;\r
326                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));\r
327                                 break;\r
328                         case 3:\r
329                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;\r
330                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));\r
331                                 break;\r
332                         case 4:\r
333                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;\r
334                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));\r
335                                 break;\r
336                         case 5:\r
337                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;\r
338                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));\r
339                                 break;\r
340                         default:\r
341                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;\r
342                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));\r
343                                 break;\r
344                 }               \r
345         }\r
346         else\r
347 #endif          \r
348         { \r
349                 if(     (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||\r
350                         pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)\r
351                 {\r
352                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
353                 }\r
354                 else\r
355                 {\r
356                         if(pMgntInfo->bMediaConnect)    // Default port\r
357                         {\r
358                                 if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))\r
359                                 {\r
360                                         UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
361                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
362                                 }\r
363                                 else\r
364                                 {\r
365                                         UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;\r
366                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
367                                 }\r
368                         }\r
369                         else // associated entry pwdb\r
370                         {       \r
371                                 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
372                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
373                         }\r
374                                 \r
375                         if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)\r
376                         {\r
377                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;\r
378                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));\r
379                         }\r
380                         else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&\r
381                                 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )\r
382                         {\r
383                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\r
384                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));\r
385                         }\r
386                         else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))\r
387                         {\r
388                                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
389                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));\r
390                         }\r
391                 }\r
392         }\r
393         if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )\r
394         {\r
395                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));\r
396                 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
397                 if(     (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&\r
398                         (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal\r
399                         odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);\r
400                 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)\r
401                         odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);\r
402                 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)\r
403                         odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);\r
404         }\r
405         pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;\r
406 \r
407         \r
408 \r
409 \r
410 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
411 \r
412 }\r
413 \r
414 \r
415 VOID \r
416 odm_DynamicTxPower_92D(\r
417         IN              PVOID                                   pDM_VOID\r
418         )\r
419 {\r
420 #if (RTL8192D_SUPPORT==1)\r
421         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
422 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
423         PADAPTER Adapter = pDM_Odm->Adapter;\r
424         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
425         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
426         s4Byte                          UndecoratedSmoothedPWDB;\r
427 \r
428         PADAPTER        BuddyAdapter = Adapter->BuddyAdapter;\r
429         BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);\r
430         u1Byte          HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;\r
431 \r
432         // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.\r
433         if (pDM_Odm->ExtPA == FALSE)\r
434                 return;\r
435 \r
436         // If dynamic high power is disabled.\r
437         if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||\r
438                 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)\r
439         {\r
440                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
441                 return;\r
442         }\r
443 \r
444         // STA not connected and AP not connected\r
445         if((!pMgntInfo->bMediaConnect) &&       \r
446                 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))\r
447         {\r
448                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));\r
449                 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
450 \r
451                 //the LastDTPlvl should reset when disconnect, \r
452                 //otherwise the tx power level wouldn't change when disconnect and connect again.\r
453                 // Maddest 20091220.\r
454                  pHalData->LastDTPLvl=TxHighPwrLevel_Normal;\r
455                 return;\r
456         }\r
457         \r
458         if(pMgntInfo->bMediaConnect)    // Default port\r
459         {\r
460                 if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)\r
461                 {\r
462                         UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
463                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
464                 }\r
465                 else\r
466                 {\r
467                         UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;\r
468                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
469                 }\r
470         }\r
471         else // associated entry pwdb\r
472         {       \r
473                 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
474                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));\r
475         }\r
476         \r
477         if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){\r
478                 if(UndecoratedSmoothedPWDB >= 0x33)\r
479                 {\r
480                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;\r
481                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));\r
482                 }\r
483                 else if((UndecoratedSmoothedPWDB <0x33) &&\r
484                         (UndecoratedSmoothedPWDB >= 0x2b) )\r
485                 {\r
486                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\r
487                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));\r
488                 }\r
489                 else if(UndecoratedSmoothedPWDB < 0x2b)\r
490                 {\r
491                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
492                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));\r
493                 }\r
494 \r
495         }\r
496         else\r
497         \r
498         {\r
499                 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)\r
500                 {\r
501                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\r
502                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));\r
503                 }\r
504                 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&\r
505                         (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )\r
506                 {\r
507                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;\r
508                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));\r
509                 }\r
510                 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))\r
511                 {\r
512                         pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;\r
513                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));\r
514                 }\r
515 \r
516         }\r
517 \r
518 //sherry  delete flag 20110517\r
519         if(bGetValueFromBuddyAdapter)\r
520         {\r
521                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));\r
522                 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)\r
523                 {\r
524                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));\r
525                         HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;\r
526                         pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;\r
527                         PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
528                         pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;\r
529                         Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;\r
530                 }                                               \r
531         }\r
532 \r
533         if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )\r
534         {\r
535                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));\r
536                         if(Adapter->DualMacSmartConcurrent == TRUE)\r
537                         {\r
538                                 if(BuddyAdapter == NULL)\r
539                                 {\r
540                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));\r
541                                         if(!Adapter->bSlaveOfDMSP)\r
542                                         {\r
543                                                 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
544                                         }\r
545                                 }\r
546                                 else\r
547                                 {\r
548                                         if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)\r
549                                         {\r
550                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));\r
551                                                 if(Adapter->bSlaveOfDMSP)\r
552                                                 {\r
553                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case  \n"));\r
554                                                         BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;\r
555                                                         BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;\r
556                                                 }\r
557                                                 else\r
558                                                 {\r
559                                                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case  \n"));                                  \r
560                                                         if(!bGetValueFromBuddyAdapter)\r
561                                                         {\r
562                                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));\r
563                                                                 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
564                                                         }\r
565                                                 }\r
566                                         }\r
567                                         else\r
568                                         {\r
569                                                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));\r
570                                                 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
571                                         }\r
572                                 }\r
573                         }\r
574                         else\r
575                         {\r
576                                 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);\r
577                         }\r
578 \r
579                 }\r
580         pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;\r
581 \r
582 \r
583 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
584 #endif\r
585 }\r
586 \r
587 VOID \r
588 odm_DynamicTxPower_8821(\r
589         IN              PVOID                   pDM_VOID,       \r
590         IN              pu1Byte                 pDesc,\r
591         IN              u1Byte                  macId   \r
592         )\r
593 {\r
594 #if (RTL8821A_SUPPORT == 1)\r
595 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
596         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
597         PSTA_INFO_T             pEntry;\r
598         u1Byte                  reg0xc56_byte;\r
599         u1Byte                  reg0xe56_byte;\r
600         u1Byte                  txpwr_offset = 0;\r
601         \r
602         pEntry = pDM_Odm->pODM_StaInfo[macId];  \r
603 \r
604         reg0xc56_byte = ODM_Read1Byte(pDM_Odm, 0xc56);\r
605 \r
606         ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("reg0xc56_byte=%d\n", reg0xc56_byte));\r
607 \r
608         if (pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB > 85) {\r
609 \r
610                 /* Avoid TXAGC error after TX power offset is applied.\r
611                 For example: Reg0xc56=0x6, if txpwr_offset=3( reduce 11dB )\r
612                 Total power = 6-11= -5( overflow!! ), PA may be burned !\r
613                 so txpwr_offset should be adjusted by Reg0xc56*/\r
614                 \r
615                 if (reg0xc56_byte < 7)\r
616                         txpwr_offset = 1;\r
617                 else if (reg0xc56_byte < 11)\r
618                         txpwr_offset = 2;\r
619                 else\r
620                         txpwr_offset = 3;\r
621                 \r
622                 SET_TX_DESC_TX_POWER_OFFSET_8812(pDesc, txpwr_offset);\r
623                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("odm_DynamicTxPower_8821: RSSI=%d, txpwr_offset=%d\n", pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB, txpwr_offset));\r
624 \r
625         } else{\r
626                 SET_TX_DESC_TX_POWER_OFFSET_8812(pDesc, txpwr_offset);\r
627                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("odm_DynamicTxPower_8821: RSSI=%d, txpwr_offset=%d\n", pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB, txpwr_offset));\r
628 \r
629         }\r
630 #endif  /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\r
631 #endif  /*#if (RTL8821A_SUPPORT==1)*/\r
632 }\r
633 \r