1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\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
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
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
19 ******************************************************************************/
\r
21 //============================================================
\r
23 //============================================================
\r
24 #include "mp_precomp.h"
\r
25 #include "phydm_precomp.h"
\r
28 odm_DynamicTxPowerInit(
\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
38 #if DEV_BUS_TYPE==RT_USB_INTERFACE
\r
39 if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
\r
41 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
\r
42 pMgntInfo->bDynamicTxPowerEnable = TRUE;
\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
50 pMgntInfo->bDynamicTxPowerEnable = FALSE;
\r
54 pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
\r
55 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
63 odm_DynamicTxPowerSavePowerIndex(
\r
67 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
68 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
\r
70 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
\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
84 odm_DynamicTxPowerRestorePowerIndex(
\r
88 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
89 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
\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
104 odm_DynamicTxPowerWritePowerIndex(
\r
105 IN PVOID pDM_VOID,
\r
108 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
110 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
\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
120 odm_DynamicTxPower(
\r
125 // For AP/ADSL use prtl8192cd_priv
\r
126 // For CE/NIC use PADAPTER
\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
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
138 switch (pDM_Odm->SupportPlatform)
\r
142 odm_DynamicTxPowerNIC(pDM_Odm);
\r
145 odm_DynamicTxPowerAP(pDM_Odm);
\r
149 //odm_DIGAP(pDM_Odm);
\r
158 odm_DynamicTxPowerNIC(
\r
162 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
164 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
\r
167 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
\r
169 if(pDM_Odm->SupportICType == ODM_RTL8192C)
\r
171 odm_DynamicTxPower_92C(pDM_Odm);
\r
173 else if(pDM_Odm->SupportICType == ODM_RTL8192D)
\r
175 odm_DynamicTxPower_92D(pDM_Odm);
\r
177 else if (pDM_Odm->SupportICType == ODM_RTL8821)
\r
179 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
\r
180 PADAPTER Adapter = pDM_Odm->Adapter;
\r
181 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
\r
183 if (pMgntInfo->RegRspPwr == 1)
\r
185 if(pDM_Odm->RSSI_Min > 60)
\r
187 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
\r
190 else if(pDM_Odm->RSSI_Min < 55)
\r
192 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
\r
201 odm_DynamicTxPowerAP(
\r
206 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
207 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
\r
209 //#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))
\r
212 prtl8192cd_priv priv = pDM_Odm->priv;
\r
214 s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;
\r
216 if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
\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
224 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
\r
225 if(CHIP_VER_92X_SERIES(priv))
\r
227 #ifdef HIGH_POWER_EXT_PA
\r
229 tx_power_control(priv);
\r
234 * Check if station is near by to use lower tx power
\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
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
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
260 RRSR_power_control_11n(priv, 0 );
\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
273 RRSR_power_control_14(priv, 0);
\r
286 odm_DynamicTxPower_92C(
\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
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
301 // STA not connected and AP not connected
\r
302 if((!pMgntInfo->bMediaConnect) &&
\r
303 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
\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
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
315 #if (INTEL_PROXIMITY_SUPPORT == 1)
\r
316 // Intel set fixed tx power
\r
317 if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
\r
319 switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
\r
321 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
\r
322 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
\r
325 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
\r
326 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
\r
329 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
\r
330 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
\r
333 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
\r
334 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
\r
337 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
\r
338 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
\r
341 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
\r
342 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
\r
349 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
\r
350 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
\r
352 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
356 if(pMgntInfo->bMediaConnect) // Default port
\r
358 if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
\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
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
369 else // associated entry pwdb
\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
375 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
\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
380 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
\r
381 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
\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
386 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
\r
388 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
389 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
\r
393 if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
\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
405 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
\r
410 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
416 odm_DynamicTxPower_92D(
\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
428 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
\r
429 BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
\r
430 u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
\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
436 // If dynamic high power is disabled.
\r
437 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
\r
438 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
\r
440 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
444 // STA not connected and AP not connected
\r
445 if((!pMgntInfo->bMediaConnect) &&
\r
446 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
\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
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
458 if(pMgntInfo->bMediaConnect) // Default port
\r
460 if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
\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
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
471 else // associated entry pwdb
\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
477 if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
\r
478 if(UndecoratedSmoothedPWDB >= 0x33)
\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
483 else if((UndecoratedSmoothedPWDB <0x33) &&
\r
484 (UndecoratedSmoothedPWDB >= 0x2b) )
\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
489 else if(UndecoratedSmoothedPWDB < 0x2b)
\r
491 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
492 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
\r
499 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
\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
504 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
\r
505 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
\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
510 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
\r
512 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
\r
513 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
\r
518 //sherry delete flag 20110517
\r
519 if(bGetValueFromBuddyAdapter)
\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
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
533 if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
\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
538 if(BuddyAdapter == NULL)
\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
543 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
\r
548 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
\r
550 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
\r
551 if(Adapter->bSlaveOfDMSP)
\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
559 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
\r
560 if(!bGetValueFromBuddyAdapter)
\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
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
576 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
\r
580 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
\r
583 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
588 odm_DynamicTxPower_8821(
\r
589 IN PVOID pDM_VOID,
\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
602 pEntry = pDM_Odm->pODM_StaInfo[macId];
\r
604 reg0xc56_byte = ODM_Read1Byte(pDM_Odm, 0xc56);
\r
606 ODM_RT_TRACE(pDM_Odm, ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("reg0xc56_byte=%d\n", reg0xc56_byte));
\r
608 if (pEntry[macId].rssi_stat.UndecoratedSmoothedPWDB > 85) {
\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
615 if (reg0xc56_byte < 7)
\r
617 else if (reg0xc56_byte < 11)
\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
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
630 #endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/
\r
631 #endif /*#if (RTL8821A_SUPPORT==1)*/
\r