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"
25 #include "phydm_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 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
371 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
375 if(pMgntInfo->bMediaConnect) // Default port
377 if(ACTING_AS_AP(Adapter) || ACTING_AS_IBSS(Adapter))
379 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
380 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
384 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
385 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
388 else // associated entry pwdb
390 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
391 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
394 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
396 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
397 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
399 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
400 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
402 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
403 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
405 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
407 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
408 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
412 if( pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl )
414 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192C() Channel = %d \n" , pHalData->CurrentChannel));
415 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
416 if( (pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) &&
417 (pHalData->LastDTPLvl == TxHighPwrLevel_Level1 || pHalData->LastDTPLvl == TxHighPwrLevel_Level2)) //TxHighPwrLevel_Normal
418 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
419 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
420 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
421 else if(pHalData->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
422 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
424 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
427 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
429 #if (RTL8192C_SUPPORT==1)
430 PADAPTER Adapter = pDM_Odm->Adapter;
431 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
432 struct dm_priv *pdmpriv = &pHalData->dmpriv;
433 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
434 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
435 int UndecoratedSmoothedPWDB;
437 if(!pdmpriv->bDynamicTxPowerEnable)
440 #ifdef CONFIG_INTEL_PROXIM
441 if(Adapter->proximity.proxim_on== _TRUE){
442 struct proximity_priv *prox_priv=Adapter->proximity.proximity_priv;
443 // Intel set fixed tx power
444 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);
446 if(prox_priv->proxim_modeinfo->power_output> 0)
448 switch(prox_priv->proxim_modeinfo->power_output)
451 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
452 printk("TxHighPwrLevel_100\n");
455 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_70;
456 printk("TxHighPwrLevel_70\n");
459 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_50;
460 printk("TxHighPwrLevel_50\n");
463 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_35;
464 printk("TxHighPwrLevel_35\n");
467 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_15;
468 printk("TxHighPwrLevel_15\n");
471 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_100;
472 printk("TxHighPwrLevel_100\n");
481 // STA not connected and AP not connected
482 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
483 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
485 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
486 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
488 //the LastDTPlvl should reset when disconnect,
489 //otherwise the tx power level wouldn't change when disconnect and connect again.
491 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
495 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
499 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
500 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
502 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
503 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
507 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
508 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
511 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
514 else // associated entry pwdb
516 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
517 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
520 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
522 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
523 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
525 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
526 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
528 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
529 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
531 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
533 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
534 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
537 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
539 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
540 if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Normal) // HP1 -> Normal or HP2 -> Normal
541 odm_DynamicTxPowerRestorePowerIndex(pDM_Odm);
542 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
543 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x14);
544 else if(pdmpriv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
545 odm_DynamicTxPowerWritePowerIndex(pDM_Odm, 0x10);
547 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
549 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
555 odm_DynamicTxPower_92D(
559 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
560 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
\r
561 PADAPTER Adapter = pDM_Odm->Adapter;
562 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
563 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
564 s4Byte UndecoratedSmoothedPWDB;
566 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
567 BOOLEAN bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(Adapter);
568 u1Byte HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
570 // 2012/01/12 MH According to Luke's suggestion, only high power will support the feature.
571 if (pDM_Odm->ExtPA == FALSE)
574 // If dynamic high power is disabled.
575 if( (pMgntInfo->bDynamicTxPowerEnable != TRUE) ||
576 pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_HIGH_POWER)
578 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
582 // STA not connected and AP not connected
583 if((!pMgntInfo->bMediaConnect) &&
584 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))
586 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("Not connected to any \n"));
587 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
589 //the LastDTPlvl should reset when disconnect,
590 //otherwise the tx power level wouldn't change when disconnect and connect again.
592 pHalData->LastDTPLvl=TxHighPwrLevel_Normal;
596 if(pMgntInfo->bMediaConnect) // Default port
598 if(ACTING_AS_AP(Adapter) || pMgntInfo->mIbss)
600 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
601 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
605 UndecoratedSmoothedPWDB = pHalData->UndecoratedSmoothedPWDB;
606 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
609 else // associated entry pwdb
611 UndecoratedSmoothedPWDB = pHalData->EntryMinUndecoratedSmoothedPWDB;
612 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
615 if(IS_HARDWARE_TYPE_8192D(Adapter) && GET_HAL_DATA(Adapter)->CurrentBandType == 1){
616 if(UndecoratedSmoothedPWDB >= 0x33)
618 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
619 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
621 else if((UndecoratedSmoothedPWDB <0x33) &&
622 (UndecoratedSmoothedPWDB >= 0x2b) )
624 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
625 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
627 else if(UndecoratedSmoothedPWDB < 0x2b)
629 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
630 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
637 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
639 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
640 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
642 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
643 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
645 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
646 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
648 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
650 pHalData->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
651 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
656 //sherry delete flag 20110517
657 if(bGetValueFromBuddyAdapter)
659 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
660 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
662 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
663 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
664 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
665 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
666 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
667 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = FALSE;
671 if( (pHalData->DynamicTxHighPowerLvl != pHalData->LastDTPLvl) )
673 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
674 if(Adapter->DualMacSmartConcurrent == TRUE)
676 if(BuddyAdapter == NULL)
678 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
679 if(!Adapter->bSlaveOfDMSP)
681 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
686 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
688 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
689 if(Adapter->bSlaveOfDMSP)
691 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
692 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = TRUE;
693 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
697 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
698 if(!bGetValueFromBuddyAdapter)
700 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
701 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
707 ODM_RT_TRACE(pDM_Odm,ODM_COMP_DYNAMIC_TXPWR,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
708 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
714 PHY_SetTxPowerLevel8192C(Adapter, pHalData->CurrentChannel);
718 pHalData->LastDTPLvl = pHalData->DynamicTxHighPowerLvl;
719 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)
720 #if (RTL8192D_SUPPORT==1)
721 PADAPTER Adapter = pDM_Odm->Adapter;
722 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
723 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
725 struct dm_priv *pdmpriv = &pHalData->dmpriv;
726 DM_ODM_T *podmpriv = &pHalData->odmpriv;
727 int UndecoratedSmoothedPWDB;
728 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
729 PADAPTER BuddyAdapter = Adapter->BuddyAdapter;
730 BOOLEAN bGetValueFromBuddyAdapter = DualMacGetParameterFromBuddyAdapter(Adapter);
731 u8 HighPowerLvlBackForMac0 = TxHighPwrLevel_Level1;
734 // If dynamic high power is disabled.
735 if( (pdmpriv->bDynamicTxPowerEnable != _TRUE) ||
736 (!(podmpriv->SupportAbility& ODM_BB_DYNAMIC_TXPWR)) )
738 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
742 // STA not connected and AP not connected
743 if((check_fwstate(pmlmepriv, _FW_LINKED) != _TRUE) &&
744 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
746 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("Not connected to any \n"));
747 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
748 //the LastDTPlvl should reset when disconnect,
749 //otherwise the tx power level wouldn't change when disconnect and connect again.
751 pdmpriv->LastDTPLvl=TxHighPwrLevel_Normal;
755 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
759 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
760 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
762 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
763 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Client PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
767 UndecoratedSmoothedPWDB = pdmpriv->UndecoratedSmoothedPWDB;
768 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
771 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
774 else // associated entry pwdb
776 UndecoratedSmoothedPWDB = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
777 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("AP Ext Port PWDB = 0x%x \n", UndecoratedSmoothedPWDB));
779 #if TX_POWER_FOR_5G_BAND == 1
780 if(pHalData->CurrentBandType92D == BAND_ON_5G){
781 if(UndecoratedSmoothedPWDB >= 0x33)
783 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
784 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level2 (TxPwr=0x0)\n"));
786 else if((UndecoratedSmoothedPWDB <0x33) &&
787 (UndecoratedSmoothedPWDB >= 0x2b) )
789 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
790 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
792 else if(UndecoratedSmoothedPWDB < 0x2b)
794 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
795 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("5G:TxHighPwrLevel_Normal\n"));
801 if(UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL2)
803 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level2;
804 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x0)\n"));
806 else if((UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL2-3)) &&
807 (UndecoratedSmoothedPWDB >= TX_POWER_NEAR_FIELD_THRESH_LVL1) )
809 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Level1;
810 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Level1 (TxPwr=0x10)\n"));
812 else if(UndecoratedSmoothedPWDB < (TX_POWER_NEAR_FIELD_THRESH_LVL1-5))
814 pdmpriv->DynamicTxHighPowerLvl = TxHighPwrLevel_Normal;
815 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("TxHighPwrLevel_Normal\n"));
818 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
819 if(bGetValueFromBuddyAdapter)
821 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 1 \n"));
822 if(Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP)
824 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() change value \n"));
825 HighPowerLvlBackForMac0 = pHalData->DynamicTxHighPowerLvl;
826 pHalData->DynamicTxHighPowerLvl = Adapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP;
827 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
828 pHalData->DynamicTxHighPowerLvl = HighPowerLvlBackForMac0;
829 Adapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _FALSE;
834 if( (pdmpriv->DynamicTxHighPowerLvl != pdmpriv->LastDTPLvl) )
836 //ODM_RT_TRACE(pDM_Odm,COMP_HIPWR, DBG_LOUD, ("PHY_SetTxPowerLevel8192S() Channel = %d \n" , pHalData->CurrentChannel));
837 #if (RTL8192D_EASY_SMART_CONCURRENT == 1)
838 if(BuddyAdapter == NULL)
840 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter == NULL case \n"));
841 if(!Adapter->bSlaveOfDMSP)
843 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
848 if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)
850 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMSP \n"));
851 if(Adapter->bSlaveOfDMSP)
853 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() bslave case \n"));
854 BuddyAdapter->DualMacDMSPControl.bChangeTxHighPowerLvlForAnotherMacOfDMSP = _TRUE;
855 BuddyAdapter->DualMacDMSPControl.CurTxHighLvlForAnotherMacOfDMSP = pHalData->DynamicTxHighPowerLvl;
859 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() master case \n"));
860 if(!bGetValueFromBuddyAdapter)
862 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() mac 0 for mac 0 \n"));
863 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
869 //ODM_RT_TRACE(pDM_Odm,COMP_MLME,DBG_LOUD,("dm_DynamicTxPower() BuddyAdapter DMDP\n"));
870 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
874 PHY_SetTxPowerLevel8192D(Adapter, pHalData->CurrentChannel);
877 pdmpriv->LastDTPLvl = pdmpriv->DynamicTxHighPowerLvl;
879 #endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)