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
25 #include "odm_precomp.h"
\r
28 odm_DynamicTxPowerInit(
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;
35 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
36 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
38 #if DEV_BUS_TYPE==RT_USB_INTERFACE
39 if(RT_GetInterfaceSelection(Adapter) == INTF_SEL1_USB_High_Power)
41 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
42 pMgntInfo->bDynamicTxPowerEnable = TRUE;
46 //so 92c pci do not need dynamic tx power? vivi check it later
47 if(IS_HARDWARE_TYPE_8192D(Adapter))
48 pMgntInfo->bDynamicTxPowerEnable = TRUE;
50 pMgntInfo->bDynamicTxPowerEnable = FALSE;
54 pHalData->LastDTPLvl = TxHighPwrLevel_Normal;
55 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
56 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
57 PADAPTER Adapter = pDM_Odm->Adapter;
58 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
59 struct dm_priv *pdmpriv = &pHalData->dmpriv;
60 pdmpriv->bDynamicTxPowerEnable = _FALSE;
62 #if (RTL8192C_SUPPORT==1)
65 #ifdef CONFIG_INTEL_PROXIM
66 if((pHalData->BoardType == BOARD_USB_High_PA)||(Adapter->proximity.proxim_support==_TRUE))
68 if(pHalData->BoardType == BOARD_USB_High_PA)
72 //odm_SavePowerIndex(Adapter);
73 odm_DynamicTxPowerSavePowerIndex(pDM_Odm);
74 pdmpriv->bDynamicTxPowerEnable = _TRUE;
78 pdmpriv->bDynamicTxPowerEnable = _FALSE;
82 pdmpriv->LastDTPLvl = TxHighPwrLevel_Normal;
83 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
90 odm_DynamicTxPowerSavePowerIndex(
94 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
95 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
97 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
\r
99 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
100 PADAPTER Adapter = pDM_Odm->Adapter;
101 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
102 for(index = 0; index< 6; index++)
103 pHalData->PowerIndex_backup[index] = PlatformEFIORead1Byte(Adapter, Power_Index_REG[index]);
104 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
105 PADAPTER Adapter = pDM_Odm->Adapter;
106 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
107 struct dm_priv *pdmpriv = &pHalData->dmpriv;
108 for(index = 0; index< 6; index++)
109 pdmpriv->PowerIndex_backup[index] = rtw_read8(Adapter, Power_Index_REG[index]);
115 odm_DynamicTxPowerRestorePowerIndex(
119 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
120 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
122 PADAPTER Adapter = pDM_Odm->Adapter;
\r
123 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
124 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
125 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
126 for(index = 0; index< 6; index++)
127 PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], pHalData->PowerIndex_backup[index]);
128 #elif(DM_ODM_SUPPORT_TYPE == ODM_CE)
129 struct dm_priv *pdmpriv = &pHalData->dmpriv;
130 for(index = 0; index< 6; index++)
131 rtw_write8(Adapter, Power_Index_REG[index], pdmpriv->PowerIndex_backup[index]);
137 odm_DynamicTxPowerWritePowerIndex(
138 IN PVOID pDM_VOID,
\r
141 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
143 u4Byte Power_Index_REG[6] = {0xc90, 0xc91, 0xc92, 0xc98, 0xc99, 0xc9a};
145 for(index = 0; index< 6; index++)
146 //PlatformEFIOWrite1Byte(Adapter, Power_Index_REG[index], Value);
147 ODM_Write1Byte(pDM_Odm, Power_Index_REG[index], Value);
158 // For AP/ADSL use prtl8192cd_priv
159 // For CE/NIC use PADAPTER
161 //PADAPTER pAdapter = pDM_Odm->Adapter;
162 // prtl8192cd_priv priv = pDM_Odm->priv;
163 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
164 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
167 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
168 // at the same time. In the stage2/3, we need to prive universal interface and merge all
169 // HW dynamic mechanism.
171 switch (pDM_Odm->SupportPlatform)
175 odm_DynamicTxPowerNIC(pDM_Odm);
178 odm_DynamicTxPowerAP(pDM_Odm);
182 //odm_DIGAP(pDM_Odm);
191 odm_DynamicTxPowerNIC(
195 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
197 if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR))
\r
200 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
202 if(pDM_Odm->SupportICType == ODM_RTL8192C)
204 odm_DynamicTxPower_92C(pDM_Odm);
206 else if(pDM_Odm->SupportICType == ODM_RTL8192D)
208 odm_DynamicTxPower_92D(pDM_Odm);
210 else if (pDM_Odm->SupportICType == ODM_RTL8821)
212 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
213 PADAPTER Adapter = pDM_Odm->Adapter;
214 PMGNT_INFO pMgntInfo = GetDefaultMgntInfo(Adapter);
216 if (pMgntInfo->RegRspPwr == 1)
218 if(pDM_Odm->RSSI_Min > 60)
220 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 1); // Resp TXAGC offset = -3dB
223 else if(pDM_Odm->RSSI_Min < 55)
225 ODM_SetMACReg(pDM_Odm, ODM_REG_RESP_TX_11AC, BIT20|BIT19|BIT18, 0); // Resp TXAGC offset = 0dB
234 odm_DynamicTxPowerAP(
239 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
240 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
242 //#if ((RTL8192C_SUPPORT==1) || (RTL8192D_SUPPORT==1) || (RTL8188E_SUPPORT==1) || (RTL8812E_SUPPORT==1))
245 prtl8192cd_priv priv = pDM_Odm->priv;
247 s2Byte pwr_thd = TX_POWER_NEAR_FIELD_THRESH_AP;
249 if(!priv->pshare->rf_ft_var.tx_pwr_ctrl)
252 #if ((RTL8812E_SUPPORT==1) || (RTL8881A_SUPPORT==1))
253 if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8881A))
254 pwr_thd = TX_POWER_NEAR_FIELD_THRESH_8812;
257 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)
258 if(CHIP_VER_92X_SERIES(priv))
260 #ifdef HIGH_POWER_EXT_PA
262 tx_power_control(priv);
267 * Check if station is near by to use lower tx power
270 if ((priv->up_time % 3) == 0 ) {
271 int disable_pwr_ctrl = ((pDM_Odm->FalseAlmCnt.Cnt_all > 1000 ) || ((pDM_Odm->FalseAlmCnt.Cnt_all > 300 ) && ((RTL_R8(0xc50) & 0x7f) >= 0x32))) ? 1 : 0;
273 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){
274 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];
275 if(IS_STA_VALID(pstat) ) {
278 else if ((pstat->hp_level == 0) && (pstat->rssi > pwr_thd))
280 else if ((pstat->hp_level == 1) && (pstat->rssi < (pwr_thd-8)))
285 #if defined(CONFIG_WLAN_HAL_8192EE)
286 if (GET_CHIP_VER(priv) == VERSION_8192E) {
287 if( !disable_pwr_ctrl && (pDM_Odm->RSSI_Min != 0xff) ) {
288 if(pDM_Odm->RSSI_Min > pwr_thd)
289 RRSR_power_control_11n(priv, 1 );
290 else if(pDM_Odm->RSSI_Min < (pwr_thd-8))
291 RRSR_power_control_11n(priv, 0 );
293 RRSR_power_control_11n(priv, 0 );
305 odm_DynamicTxPower_92C(
309 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
310 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
311 PADAPTER Adapter = pDM_Odm->Adapter;
312 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
313 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
314 s4Byte UndecoratedSmoothedPWDB;
316 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
317 if (pDM_Odm->ExtPA == FALSE)
320 // STA not connected and AP not connected
321 if((!pMgntInfo->bMediaConnect) &&
322 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
324 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
325 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
327 //the LastDTPlvl should reset when disconnect,
328 //otherwise the tx power level wouldn't change when disconnect and connect again.
330 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
334 #if (INTEL_PROXIMITY_SUPPORT == 1)
335 // Intel set fixed tx power
336 if(pMgntInfo->IntelProximityModeInfo.PowerOutput > 0)
338 switch(pMgntInfo->IntelProximityModeInfo.PowerOutput){
340 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
341 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
344 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
345 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_70\n"));
348 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
349 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_50\n"));
352 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
353 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_35\n"));
356 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
357 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_15\n"));
360 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
361 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_100\n"));
368 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
369 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
370 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
372 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
376 if(pMgntInfo->bMediaConnect) // Default port
378 if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
380 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
381 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
385 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
386 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
389 else // associated entry pwdb
391 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
392 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
395 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
397 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
398 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
400 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
401 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
403 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
404 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
406 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
408 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
409 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
413 if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
415 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
416 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
417 if( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
418 (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
419 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
420 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
421 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
422 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
423 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
425 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
428 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
430 #if (RTL8192C_SUPPORT==1)
431 PADAPTER Adapter = pDM_Odm->Adapter;
432 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
433 struct dm_priv *pdmpriv = &pHalData->dmpriv;
434 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
435 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
436 int UndecoratedSmoothedPWDB;
438 if(!pdmpriv->bDynamicTxPowerEnable)
441 #ifdef CONFIG_INTEL_PROXIM
442 if(Adapter->proximity.proxim_on== _TRUE){
443 struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
444 // Intel set fixed tx power
445 printk("\n %s Adapter->proximity.proxim_on=%d prox_priv->proxim_modeinfo->power_output=%d \n",__FUNCTION__,Adapter->proximity.proxim_on,prox_priv->proxim_modeinfo->power_output);
447 if(prox_priv->proxim_modeinfo->power_output> 0)
449 switch(prox_priv->proxim_modeinfo->power_output)
452 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
453 printk("TxHighPwrLevel_100\n");
456 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
457 printk("TxHighPwrLevel_70\n");
460 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
461 printk("TxHighPwrLevel_50\n");
464 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
465 printk("TxHighPwrLevel_35\n");
468 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
469 printk("TxHighPwrLevel_15\n");
472 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
473 printk("TxHighPwrLevel_100\n");
482 // STA not connected and AP not connected
483 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
484 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
486 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
487 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
489 //the LastDTPlvl should reset when disconnect,
490 //otherwise the tx power level wouldn't change when disconnect and connect again.
492 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
496 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
500 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
501 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
503 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
504 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
508 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
509 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
512 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
515 else // associated entry pwdb
517 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
518 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
521 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
523 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
524 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
526 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
527 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
529 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
530 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
532 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
534 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
535 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
538 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
540 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
541 if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
542 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
543 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
544 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
545 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
546 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
548 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
550 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
556 odm_DynamicTxPower_92D(
560 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
561 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
562 PADAPTER Adapter = pDM_Odm->Adapter;
563 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
564 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
565 s4Byte UndecoratedSmoothedPWDB;
567 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
568 BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
569 u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
571 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
572 if (pDM_Odm->ExtPA == FALSE)
575 // If dynamic high power is disabled.
576 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
577 (pHalData->DMFlag & HAL_DM_HIPWR_DISABLE) ||
578 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
580 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
584 // STA not connected and AP not connected
585 if((!pMgntInfo->bMediaConnect) &&
586 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
588 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
589 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
591 //the LastDTPlvl should reset when disconnect,
592 //otherwise the tx power level wouldn't change when disconnect and connect again.
594 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
598 if(pMgntInfo->bMediaConnect) // Default port
600 if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
602 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
603 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
607 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
608 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
611 else // associated entry pwdb
613 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
614 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
617 if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
618 if(UndecoratedSmoothedPWDB >= 0x33)
620 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
621 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
623 else if((UndecoratedSmoothedPWDB <0x33) &&
624 (UndecoratedSmoothedPWDB >= 0x2b) )
626 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
627 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
629 else if(UndecoratedSmoothedPWDB < 0x2b)
631 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
632 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
639 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
641 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
642 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
644 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
645 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
647 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
648 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
650 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
652 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
653 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
658 //sherry delete flag 20110517
659 if(bGetValueFromBuddyAdapter)
661 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
662 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
664 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
665 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
666 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
667 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
668 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
669 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
673 if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
675 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
676 if(Adapter->DualMacSmartConcurrent == TRUE)
678 if(BuddyAdapter == NULL)
680 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
681 if(!Adapter->bSlaveOfDMSP)
683 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
688 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
690 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
691 if(Adapter->bSlaveOfDMSP)
693 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
694 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
695 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
699 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
700 if(!bGetValueFromBuddyAdapter)
702 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
703 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
709 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
710 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
716 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
720 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
721 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
722 #if (RTL8192D_SUPPORT==1)
723 PADAPTER Adapter = pDM_Odm->Adapter;
724 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
725 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
727 struct dm_priv *pdmpriv = &pHalData->dmpriv;
728 DM_ODM_T *podmpriv = &pHalData->odmpriv;
729 int UndecoratedSmoothedPWDB;
730 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
731 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
732 BOOLEAN bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
733 u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
736 // If dynamic high power is disabled.
737 if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
738 (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
740 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
744 // STA not connected and AP not connected
745 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
746 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
748 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
749 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
750 //the LastDTPlvl should reset when disconnect,
751 //otherwise the tx power level wouldn't change when disconnect and connect again.
753 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
757 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
761 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
762 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
764 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
765 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
769 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
770 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
773 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
776 else // associated entry pwdb
778 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
779 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
781 #if TX_POWER_FOR_5G_BAND == 1
782 if(pHalData->CurrentBandType92D == BAND_ON_5G){
783 if(UndecoratedSmoothedPWDB >= 0x33)
785 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
786 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
788 else if((UndecoratedSmoothedPWDB <0x33) &&
789 (UndecoratedSmoothedPWDB >= 0x2b) )
791 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
792 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
794 else if(UndecoratedSmoothedPWDB < 0x2b)
796 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
797 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
803 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
805 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
806 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
808 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
809 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
811 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
812 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
814 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
816 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
817 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
820 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
821 if(bGetValueFromBuddyAdapter)
823 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
824 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
826 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
827 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
828 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
829 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
830 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
831 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
836 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
838 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
839 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
840 if(BuddyAdapter == NULL)
842 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
843 if(!Adapter->bSlaveOfDMSP)
845 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
850 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
852 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
853 if(Adapter->bSlaveOfDMSP)
855 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
856 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
857 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
861 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
862 if(!bGetValueFromBuddyAdapter)
864 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
865 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
871 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
872 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
876 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
879 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
881 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)