1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2012 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
20 //============================================================
\r
23 // This file is for 92CE/92CU dynamic mechanism only
\r
26 //============================================================
\r
27 #define _RTL8723B_DM_C_
\r
29 //============================================================
\r
31 //============================================================
\r
32 #include <rtl8723b_hal.h>
\r
34 //============================================================
\r
36 //============================================================
\r
45 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
\r
46 u1Byte CurRate, RateThreshold;
\r
48 if(pMgntInfo->pHTInfo->bCurBW40MHz)
\r
49 RateThreshold = MGN_MCS1;
\r
51 RateThreshold = MGN_MCS3;
\r
53 if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)
\r
55 pMgntInfo->bDmDisableProtect = TRUE;
\r
56 DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
\r
60 pMgntInfo->bDmDisableProtect = FALSE;
\r
61 DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
\r
72 if(!Adapter->MgntInfo.bMediaConnect)
\r
75 //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly.
\r
76 rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) );
\r
78 // Calculate current Tx Rate(Successful transmited!!)
\r
80 // Calculate current Rx Rate(Successful received!!)
\r
82 //for tx tx retry count
\r
83 rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );
\r
86 #ifdef CONFIG_SUPPORT_HW_WPS_PBC
\r
87 static void dm_CheckPbcGPIO(_adapter *padapter)
\r
90 u8 bPbcPressed = _FALSE;
\r
92 if(!padapter->registrypriv.hw_wps_pbc)
\r
95 #ifdef CONFIG_USB_HCI
\r
96 tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);
\r
97 tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT);
\r
98 rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as output mode
\r
100 tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);
\r
101 rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level
\r
103 tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);
\r
104 tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);
\r
105 rtw_write8(padapter, GPIO_IO_SEL, tmp1byte); //enable GPIO[2] as input mode
\r
107 tmp1byte =rtw_read8(padapter, GPIO_IN);
\r
109 if (tmp1byte == 0xff)
\r
112 if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)
\r
114 bPbcPressed = _TRUE;
\r
117 tmp1byte = rtw_read8(padapter, GPIO_IN);
\r
118 //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte));
\r
120 if (tmp1byte == 0xff || padapter->init_adpt_in_progress)
\r
123 if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0)
\r
125 bPbcPressed = _TRUE;
\r
129 if( _TRUE == bPbcPressed)
\r
131 // Here we only set bPbcPressed to true
\r
132 // After trigger PBC, the variable will be set to false
\r
133 DBG_8192C("CheckPbcGPIO - PBC is pressed\n");
\r
134 rtw_request_wps_pbc_event(padapter);
\r
137 #endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC
\r
140 #ifdef CONFIG_PCI_HCI
\r
143 // Perform interrupt migration dynamically to reduce CPU utilization.
\r
146 // 1. Do not enable migration under WIFI test.
\r
148 // Created by Roger, 2010.03.05.
\r
151 dm_InterruptMigration(
\r
152 IN PADAPTER Adapter
\r
155 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
156 struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);
\r
157 BOOLEAN bCurrentIntMt, bCurrentACIntDisable;
\r
158 BOOLEAN IntMtToSet = _FALSE;
\r
159 BOOLEAN ACIntToSet = _FALSE;
\r
162 // Retrieve current interrupt migration and Tx four ACs IMR settings first.
\r
163 bCurrentIntMt = pHalData->bInterruptMigration;
\r
164 bCurrentACIntDisable = pHalData->bDisableTxInt;
\r
167 // <Roger_Notes> Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics
\r
168 // when interrupt migration is set before. 2010.03.05.
\r
170 if(!Adapter->registrypriv.wifi_spec &&
\r
171 (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&
\r
172 pmlmepriv->LinkDetectInfo.bHigherBusyTraffic)
\r
174 IntMtToSet = _TRUE;
\r
176 // To check whether we should disable Tx interrupt or not.
\r
177 if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic )
\r
178 ACIntToSet = _TRUE;
\r
181 //Update current settings.
\r
182 if( bCurrentIntMt != IntMtToSet ){
\r
183 DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet);
\r
187 // <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.
\r
188 // timer 25ns*0xfa0=100us for 0xf packets.
\r
191 rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx
\r
192 pHalData->bInterruptMigration = IntMtToSet;
\r
196 // Reset all interrupt migration settings.
\r
197 rtw_write32(Adapter, REG_INT_MIG, 0);
\r
198 pHalData->bInterruptMigration = IntMtToSet;
\r
202 /*if( bCurrentACIntDisable != ACIntToSet ){
\r
203 DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet);
\r
204 if(ACIntToSet) // Disable four ACs interrupts.
\r
207 // <Roger_Notes> Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization.
\r
208 // When extremely highly Rx OK occurs, we will disable Tx interrupts.
\r
211 UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );
\r
212 pHalData->bDisableTxInt = ACIntToSet;
\r
214 else// Enable four ACs interrupts.
\r
216 UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );
\r
217 pHalData->bDisableTxInt = ACIntToSet;
\r
226 // Initialize GPIO setting registers
\r
229 dm_InitGPIOSetting(
\r
230 IN PADAPTER Adapter
\r
233 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
237 tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);
\r
238 tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);
\r
240 rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);
\r
242 //============================================================
\r
244 //============================================================
\r
245 static void Init_ODM_ComInfo_8723b(PADAPTER Adapter)
\r
248 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
249 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
250 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
251 u8 cut_ver,fab_ver;
\r
256 _rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));
\r
258 pDM_Odm->Adapter = Adapter;
\r
259 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE);
\r
260 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE
\r
261 ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);
\r
262 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);
\r
264 fab_ver = ODM_TSMC;
\r
265 cut_ver = ODM_CUT_A;
\r
267 DBG_871X("%s(): fab_ver=%d cut_ver=%d\n", __func__, fab_ver, cut_ver);
\r
268 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);
\r
269 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);
\r
270 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID));
\r
272 #ifdef CONFIG_USB_HCI
\r
273 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType);
\r
275 if(pHalData->BoardType == BOARD_USB_High_PA){
\r
276 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA,_TRUE);
\r
277 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA,_TRUE);
\r
280 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pHalData->CustomerID);
\r
281 // ODM_CMNINFO_BINHCT_TEST only for MP Team
\r
282 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec);
\r
285 if(pHalData->rf_type == RF_1T1R){
\r
286 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R);
\r
288 else if(pHalData->rf_type == RF_2T2R){
\r
289 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R);
\r
291 else if(pHalData->rf_type == RF_1T2R){
\r
292 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R);
\r
295 #ifdef CONFIG_DISABLE_ODM
\r
296 pdmpriv->InitODMFlag = 0;
\r
298 pdmpriv->InitODMFlag = ODM_RF_CALIBRATION |
\r
299 ODM_RF_TX_PWR_TRACK //|
\r
301 //if(pHalData->AntDivCfg)
\r
302 // pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;
\r
305 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);
\r
308 static void Update_ODM_ComInfo_8723b(PADAPTER Adapter)
\r
310 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
\r
311 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
\r
312 struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);
\r
313 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
314 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
315 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
318 pdmpriv->InitODMFlag = 0
\r
321 | ODM_BB_DYNAMIC_TXPWR
\r
323 | ODM_BB_RSSI_MONITOR
\r
326 | ODM_MAC_EDCA_TURBO
\r
327 | ODM_RF_TX_PWR_TRACK
\r
328 | ODM_RF_CALIBRATION
\r
329 #ifdef CONFIG_ODM_ADAPTIVITY
\r
330 | ODM_BB_ADAPTIVITY
\r
334 #ifdef CONFIG_ANTENNA_DIVERSITY
\r
335 if(pHalData->AntDivCfg)
\r
336 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;
\r
340 if (Adapter->registrypriv.mp_mode == 1) {
\r
341 pdmpriv->InitODMFlag = 0
\r
342 | ODM_RF_CALIBRATION
\r
343 | ODM_RF_TX_PWR_TRACK
\r
346 #endif//(MP_DRIVER==1)
\r
348 #ifdef CONFIG_DISABLE_ODM
\r
349 pdmpriv->InitODMFlag = 0;
\r
350 #endif//CONFIG_DISABLE_ODM
\r
353 // Pointer reference
\r
355 //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D
\r
356 // ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp));
\r
358 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);
\r
360 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes));
\r
361 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes));
\r
362 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode));
\r
363 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC));
\r
364 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm));
\r
365 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW ));
\r
366 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel));
\r
367 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed));
\r
368 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode));
\r
369 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType));
\r
370 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_IGI_LB,&(pHalData->u1ForcedIgiLb));
\r
371 //================= only for 8192D =================
\r
373 //pHalData->CurrentBandType92D
\r
374 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp));
\r
375 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp));
\r
376 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp));
\r
377 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp));
\r
378 //================= only for 8192D =================
\r
379 // driver havn't those variable now
\r
380 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp));
\r
381 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp));
\r
383 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));
\r
385 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));
\r
386 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));
\r
389 for(i=0; i< NUM_STA; i++)
\r
391 //pDM_Odm->pODM_StaInfo[i] = NULL;
\r
392 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);
\r
397 rtl8723b_InitHalDm(
\r
398 IN PADAPTER Adapter
\r
401 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
402 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
403 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
407 #ifdef CONFIG_USB_HCI
\r
408 dm_InitGPIOSetting(Adapter);
\r
411 pdmpriv->DM_Type = DM_Type_ByDriver;
\r
412 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
\r
414 #ifdef CONFIG_BT_COEXIST
\r
415 pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
\r
417 pdmpriv->InitDMFlag = pdmpriv->DMFlag;
\r
419 Update_ODM_ComInfo_8723b(Adapter);
\r
420 ODM_DMInit(pDM_Odm);
\r
425 FindMinimumRSSI_8723b(
\r
426 IN PADAPTER pAdapter
\r
429 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
430 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
431 struct mlme_priv *pmlmepriv = &pAdapter->mlmepriv;
\r
433 //1 1.Determine the minimum RSSI
\r
436 #ifdef CONFIG_CONCURRENT_MODE
\r
437 // FindMinimumRSSI() per-adapter
\r
439 PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;
\r
440 PHAL_DATA_TYPE pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);
\r
441 struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv;
\r
443 if((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) &&
\r
444 (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0))
\r
447 if(pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB)
\r
448 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
452 if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)
\r
453 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
457 if((pdmpriv->UndecoratedSmoothedPWDB != (-1)) &&
\r
458 (pbuddy_dmpriv->UndecoratedSmoothedPWDB != (-1)))
\r
461 if((pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB) &&
\r
462 (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))
\r
463 pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;
\r
467 if((pdmpriv->UndecoratedSmoothedPWDB == (-1)) && (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))
\r
468 pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;
\r
474 if((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) &&
\r
475 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))
\r
477 pdmpriv->MinUndecoratedPWDBForDM = 0;
\r
478 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));
\r
480 if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE) // Default port
\r
483 if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ||
\r
484 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||
\r
485 (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))
\r
487 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
488 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));
\r
492 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->UndecoratedSmoothedPWDB;
\r
493 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));
\r
496 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
499 else // associated entry pwdb
\r
501 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
502 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port or disconnet PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));
\r
505 //odm_FindMinimumRSSI_Dmsp(pAdapter);
\r
506 //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);
\r
507 //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));
\r
511 rtl8723b_HalDmWatchDog(
\r
512 IN PADAPTER Adapter
\r
515 BOOLEAN bFwCurrentInPSMode = _FALSE;
\r
516 BOOLEAN bFwPSAwake = _TRUE;
\r
517 u8 hw_init_completed = _FALSE;
\r
518 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
519 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
520 #ifdef CONFIG_CONCURRENT_MODE
\r
521 PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
\r
522 #endif //CONFIG_CONCURRENT_MODE
\r
525 if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP power tracking
\r
529 hw_init_completed = Adapter->hw_init_completed;
\r
531 if (hw_init_completed == _FALSE)
\r
535 bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
\r
536 rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
\r
540 // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.
\r
541 // modifed by thomas. 2011.06.11.
\r
542 if(Adapter->wdinfo.p2p_ps_mode)
\r
543 bFwPSAwake = _FALSE;
\r
544 #endif //CONFIG_P2P
\r
547 if( (hw_init_completed == _TRUE)
\r
548 && ((!bFwCurrentInPSMode) && bFwPSAwake))
\r
551 // Calculate Tx/Rx statistics.
\r
553 dm_CheckStatistics(Adapter);
\r
554 rtw_hal_check_rxfifo_full(Adapter);
\r
556 // Dynamically switch RTS/CTS protection.
\r
558 //dm_CheckProtection(Adapter);
\r
560 #ifdef CONFIG_PCI_HCI
\r
561 // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.
\r
562 // Tx Migration settings.
\r
563 //dm_InterruptMigration(Adapter);
\r
565 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))
\r
566 // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));
\r
571 if (hw_init_completed == _TRUE)
\r
574 u8 bsta_state=_FALSE;
\r
576 if(rtw_linked_check(Adapter)){
\r
578 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))
\r
579 bsta_state = _TRUE;
\r
582 #ifdef CONFIG_CONCURRENT_MODE
\r
583 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){
\r
585 if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))
\r
586 bsta_state = _TRUE;
\r
588 #endif //CONFIG_CONCURRENT_MODE
\r
590 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
\r
591 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);
\r
593 //FindMinimumRSSI_8723b(Adapter);
\r
594 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);
\r
596 ODM_DMWatchdog(&pHalData->odmpriv);
\r
601 // Check GPIO to determine current RF on/off and Pbc status.
\r
602 // Check Hardware Radio ON/OFF or not
\r
603 //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)
\r
605 //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));
\r
606 // dm_CheckRfCtrlGPIO(Adapter);
\r
608 #ifdef CONFIG_SUPPORT_HW_WPS_PBC
\r
609 dm_CheckPbcGPIO(Adapter);
\r
614 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)
\r
617 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
\r
618 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(padapter);
\r
619 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
620 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
621 struct sta_priv *pstapriv = &padapter->stapriv;
\r
622 struct sta_info *psta = NULL;
\r
624 DBG_871X("%s, RSSI_Min=%d\n", __func__, pDM_Odm->RSSI_Min);
\r
627 ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);
\r
631 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
\r
632 if(psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))
\r
634 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );
\r
636 rtl8723b_set_rssi_cmd(padapter, (u8*)&PWDB_rssi);
\r
641 void rtl8723b_HalDmWatchDog_in_LPS(IN PADAPTER Adapter)
\r
644 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
645 struct mlme_priv *pmlmepriv = &Adapter->mlmepriv;
\r
646 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
647 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
648 pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
\r
649 struct sta_priv *pstapriv = &Adapter->stapriv;
\r
650 struct sta_info *psta = NULL;
\r
651 #ifdef CONFIG_CONCURRENT_MODE
\r
652 PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;
\r
653 #endif //CONFIG_CONCURRENT_MODE
\r
655 if (Adapter->hw_init_completed == _FALSE)
\r
659 if(rtw_linked_check(Adapter))
\r
662 #ifdef CONFIG_CONCURRENT_MODE
\r
663 if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))
\r
665 #endif //CONFIG_CONCURRENT_MODE
\r
667 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
\r
669 if(bLinked == _FALSE)
\r
672 if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))
\r
676 //ODM_DMWatchdog(&pHalData->odmpriv);
\r
677 //Do DIG by RSSI In LPS-32K
\r
680 psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
\r
684 pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;
\r
686 DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB );
\r
688 if(pdmpriv->EntryMinUndecoratedSmoothedPWDB <=0)
\r
691 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;
\r
693 pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;
\r
695 //if(pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min)
\r
696 if((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) ||
\r
697 (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5))
\r
700 rtw_dm_in_lps_wk_cmd(Adapter);
\r
710 void rtl8723b_init_dm_priv(IN PADAPTER Adapter)
\r
712 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
713 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
714 PDM_ODM_T podmpriv = &pHalData->odmpriv;
\r
715 _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));
\r
716 Init_ODM_ComInfo_8723b(Adapter);
\r
717 #ifdef CONFIG_SW_ANTENNA_DIVERSITY
\r
718 //_init_timer(&(pdmpriv->SwAntennaSwitchTimer), Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter);
\r
719 ODM_InitAllTimers(podmpriv );
\r
724 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)
\r
726 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
727 struct dm_priv *pdmpriv = &pHalData->dmpriv;
\r
728 PDM_ODM_T podmpriv = &pHalData->odmpriv;
\r
729 #ifdef CONFIG_SW_ANTENNA_DIVERSITY
\r
730 //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);
\r
731 ODM_CancelAllTimers(podmpriv);
\r