c149fe481db5a8a0b230407a9f0a9e195d98b8ee
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / rtl8723b / rtl8723b_dm.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.\r
4  *\r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 //============================================================\r
21 // Description:\r
22 //\r
23 // This file is for 92CE/92CU dynamic mechanism only\r
24 //\r
25 //\r
26 //============================================================\r
27 #define _RTL8723B_DM_C_\r
28 \r
29 //============================================================\r
30 // include files\r
31 //============================================================\r
32 #include <rtl8723b_hal.h>\r
33 \r
34 //============================================================\r
35 // Global var\r
36 //============================================================\r
37 \r
38 \r
39 static VOID\r
40 dm_CheckProtection(\r
41         IN      PADAPTER        Adapter\r
42         )\r
43 {\r
44 #if 0\r
45         PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);\r
46         u1Byte                  CurRate, RateThreshold;\r
47 \r
48         if(pMgntInfo->pHTInfo->bCurBW40MHz)\r
49                 RateThreshold = MGN_MCS1;\r
50         else\r
51                 RateThreshold = MGN_MCS3;\r
52 \r
53         if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)\r
54         {\r
55                 pMgntInfo->bDmDisableProtect = TRUE;\r
56                 DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);\r
57         }\r
58         else\r
59         {\r
60                 pMgntInfo->bDmDisableProtect = FALSE;\r
61                 DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);\r
62         }\r
63 #endif\r
64 }\r
65 \r
66 static VOID\r
67 dm_CheckStatistics(\r
68         IN      PADAPTER        Adapter\r
69         )\r
70 {\r
71 #if 0\r
72         if(!Adapter->MgntInfo.bMediaConnect)\r
73                 return;\r
74 \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
77 \r
78         // Calculate current Tx Rate(Successful transmited!!)\r
79 \r
80         // Calculate current Rx Rate(Successful received!!)\r
81 \r
82         //for tx tx retry count\r
83         rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );\r
84 #endif\r
85 }\r
86 #ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
87 static void dm_CheckPbcGPIO(_adapter *padapter)\r
88 {\r
89         u8      tmp1byte;\r
90         u8      bPbcPressed = _FALSE;\r
91 \r
92         if(!padapter->registrypriv.hw_wps_pbc)\r
93                 return;\r
94 \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
99 \r
100         tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);\r
101         rtw_write8(padapter,  GPIO_IN, tmp1byte);               //reset the floating voltage level\r
102 \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
106 \r
107         tmp1byte =rtw_read8(padapter, GPIO_IN);\r
108 \r
109         if (tmp1byte == 0xff)\r
110                 return ;\r
111 \r
112         if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)\r
113         {\r
114                 bPbcPressed = _TRUE;\r
115         }\r
116 #else\r
117         tmp1byte = rtw_read8(padapter, GPIO_IN);\r
118         //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte));\r
119 \r
120         if (tmp1byte == 0xff || padapter->init_adpt_in_progress)\r
121                 return ;\r
122 \r
123         if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0)\r
124         {\r
125                 bPbcPressed = _TRUE;\r
126         }\r
127 #endif\r
128 \r
129         if( _TRUE == bPbcPressed)\r
130         {\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
135         }\r
136 }\r
137 #endif //#ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
138 \r
139 \r
140 #ifdef CONFIG_PCI_HCI\r
141 //\r
142 //      Description:\r
143 //              Perform interrupt migration dynamically to reduce CPU utilization.\r
144 //\r
145 //      Assumption:\r
146 //              1. Do not enable migration under WIFI test.\r
147 //\r
148 //      Created by Roger, 2010.03.05.\r
149 //\r
150 VOID\r
151 dm_InterruptMigration(\r
152         IN      PADAPTER        Adapter\r
153         )\r
154 {\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
160 \r
161 \r
162         // Retrieve current interrupt migration and Tx four ACs IMR settings first.\r
163         bCurrentIntMt = pHalData->bInterruptMigration;\r
164         bCurrentACIntDisable = pHalData->bDisableTxInt;\r
165 \r
166         //\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
169         //\r
170         if(!Adapter->registrypriv.wifi_spec &&\r
171                 (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&\r
172                 pmlmepriv->LinkDetectInfo.bHigherBusyTraffic)\r
173         {\r
174                 IntMtToSet = _TRUE;\r
175 \r
176                 // To check whether we should disable Tx interrupt or not.\r
177                 if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic )\r
178                         ACIntToSet = _TRUE;\r
179         }\r
180 \r
181         //Update current settings.\r
182         if( bCurrentIntMt != IntMtToSet ){\r
183                 DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet);\r
184                 if(IntMtToSet)\r
185                 {\r
186                         //\r
187                         // <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.\r
188                         // timer 25ns*0xfa0=100us for 0xf packets.\r
189                         // 2010.03.05.\r
190                         //\r
191                         rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx\r
192                         pHalData->bInterruptMigration = IntMtToSet;\r
193                 }\r
194                 else\r
195                 {\r
196                         // Reset all interrupt migration settings.\r
197                         rtw_write32(Adapter, REG_INT_MIG, 0);\r
198                         pHalData->bInterruptMigration = IntMtToSet;\r
199                 }\r
200         }\r
201 \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
205                 {\r
206                         //\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
209                         // 2010.03.05.\r
210                         //\r
211                         UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );\r
212                         pHalData->bDisableTxInt = ACIntToSet;\r
213                 }\r
214                 else// Enable four ACs interrupts.\r
215                 {\r
216                         UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );\r
217                         pHalData->bDisableTxInt = ACIntToSet;\r
218                 }\r
219         }*/\r
220 \r
221 }\r
222 \r
223 #endif\r
224 \r
225 //\r
226 // Initialize GPIO setting registers\r
227 //\r
228 static void\r
229 dm_InitGPIOSetting(\r
230         IN      PADAPTER        Adapter\r
231         )\r
232 {\r
233         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);\r
234 \r
235         u8      tmp1byte;\r
236 \r
237         tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);\r
238         tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);\r
239 \r
240         rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);\r
241 }\r
242 //============================================================\r
243 // functions\r
244 //============================================================\r
245 static void Init_ODM_ComInfo_8723b(PADAPTER     Adapter)\r
246 {\r
247         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
248         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
249         u32 SupportAbility = 0;\r
250         u8      cut_ver,fab_ver;\r
251 \r
252         Init_ODM_ComInfo(Adapter);\r
253 \r
254         ODM_CmnInfoInit(pDM_Odm, ODM_CMNINFO_PACKAGE_TYPE, pHalData->PackageType);\r
255         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE, ODM_RTL8723B);\r
256 \r
257         fab_ver = ODM_TSMC;\r
258         cut_ver = ODM_CUT_A;\r
259 \r
260         DBG_871X("%s(): fab_ver=%d cut_ver=%d\n", __func__, fab_ver, cut_ver);\r
261         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);\r
262         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);\r
263 \r
264         #ifdef CONFIG_DISABLE_ODM\r
265         SupportAbility = 0;\r
266         #else\r
267         SupportAbility =        ODM_RF_CALIBRATION |\r
268                                         ODM_RF_TX_PWR_TRACK     \r
269                                         ;       \r
270         /*if(pHalData->AntDivCfg)\r
271                 SupportAbility |= ODM_BB_ANT_DIV;*/\r
272         #endif  \r
273 \r
274         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility);\r
275 }\r
276 \r
277 static void Update_ODM_ComInfo_8723b(PADAPTER   Adapter)\r
278 {\r
279         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
280         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
281         u32 SupportAbility = 0;\r
282 \r
283         SupportAbility = 0\r
284                 | ODM_BB_DIG\r
285                 | ODM_BB_RA_MASK\r
286                 | ODM_BB_DYNAMIC_TXPWR\r
287                 | ODM_BB_FA_CNT\r
288                 | ODM_BB_RSSI_MONITOR\r
289                 | ODM_BB_CCK_PD\r
290                 //| ODM_BB_PWR_SAVE\r
291                 | ODM_BB_CFO_TRACKING\r
292                 | ODM_MAC_EDCA_TURBO\r
293                 | ODM_RF_TX_PWR_TRACK\r
294                 | ODM_RF_CALIBRATION\r
295                 | ODM_BB_NHM_CNT\r
296 //              | ODM_BB_PWR_TRAIN\r
297                 ;\r
298 \r
299         if (rtw_odm_adaptivity_needed(Adapter) == _TRUE)\r
300                 SupportAbility |= ODM_BB_ADAPTIVITY;\r
301 \r
302 #ifdef CONFIG_ANTENNA_DIVERSITY\r
303         if(pHalData->AntDivCfg)\r
304                 SupportAbility |= ODM_BB_ANT_DIV;\r
305 #endif\r
306 \r
307 #if (MP_DRIVER==1)\r
308         if (Adapter->registrypriv.mp_mode == 1) {\r
309                 SupportAbility = 0\r
310                         | ODM_RF_CALIBRATION\r
311                         | ODM_RF_TX_PWR_TRACK\r
312                         ;\r
313         }\r
314 #endif//(MP_DRIVER==1)\r
315 \r
316 #ifdef CONFIG_DISABLE_ODM\r
317         SupportAbility = 0;\r
318 #endif//CONFIG_DISABLE_ODM\r
319 \r
320         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,SupportAbility);\r
321 }\r
322 \r
323 void\r
324 rtl8723b_InitHalDm(\r
325         IN      PADAPTER        Adapter\r
326         )\r
327 {\r
328         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
329         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
330 \r
331         u8      i;\r
332 \r
333 #ifdef CONFIG_USB_HCI\r
334         dm_InitGPIOSetting(Adapter);\r
335 #endif\r
336 \r
337         pHalData->DM_Type = DM_Type_ByDriver;\r
338 \r
339         Update_ODM_ComInfo_8723b(Adapter);\r
340         \r
341         if (Adapter->registrypriv.mp_mode == 0)\r
342                 ODM_DMInit(pDM_Odm);\r
343 \r
344 }\r
345 \r
346 VOID\r
347 rtl8723b_HalDmWatchDog(\r
348         IN      PADAPTER        Adapter\r
349         )\r
350 {\r
351         BOOLEAN         bFwCurrentInPSMode = _FALSE;\r
352         BOOLEAN         bFwPSAwake = _TRUE;\r
353         u8 hw_init_completed = _FALSE;\r
354         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
355 #ifdef CONFIG_CONCURRENT_MODE\r
356         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
357 #endif //CONFIG_CONCURRENT_MODE\r
358 \r
359 //#if MP_DRIVER\r
360 if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP power tracking\r
361         return;\r
362 //#endif\r
363 \r
364         hw_init_completed = Adapter->hw_init_completed;\r
365 \r
366         if (hw_init_completed == _FALSE)\r
367                 goto skip_dm;\r
368 \r
369 #ifdef CONFIG_LPS\r
370         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\r
371         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\r
372 #endif\r
373 \r
374 #ifdef CONFIG_P2P\r
375         // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.\r
376         // modifed by thomas. 2011.06.11.\r
377         if(Adapter->wdinfo.p2p_ps_mode)\r
378                 bFwPSAwake = _FALSE;\r
379 #endif //CONFIG_P2P\r
380 \r
381 \r
382         if( (hw_init_completed == _TRUE)\r
383                 && ((!bFwCurrentInPSMode) && bFwPSAwake))\r
384         {\r
385                 //\r
386                 // Calculate Tx/Rx statistics.\r
387                 //\r
388                 dm_CheckStatistics(Adapter);\r
389                 rtw_hal_check_rxfifo_full(Adapter);\r
390                 //\r
391                 // Dynamically switch RTS/CTS protection.\r
392                 //\r
393                 //dm_CheckProtection(Adapter);\r
394 \r
395 #ifdef CONFIG_PCI_HCI\r
396                 // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.\r
397                 // Tx Migration settings.\r
398                 //dm_InterruptMigration(Adapter);\r
399 \r
400                 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\r
401                 //      PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\r
402 #endif\r
403         }\r
404 \r
405         //ODM\r
406         if (hw_init_completed == _TRUE)\r
407         {\r
408                 u8      bLinked=_FALSE;\r
409                 u8      bsta_state=_FALSE;\r
410                 u8      bBtDisabled = _TRUE;\r
411 \r
412                 if(rtw_linked_check(Adapter)){                  \r
413                         bLinked = _TRUE;\r
414                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
415                                 bsta_state = _TRUE;\r
416                 }\r
417                         \r
418 #ifdef CONFIG_CONCURRENT_MODE\r
419                 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\r
420                         bLinked = _TRUE;\r
421                         if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
422                                 bsta_state = _TRUE;\r
423                 }\r
424 #endif //CONFIG_CONCURRENT_MODE\r
425 \r
426                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
427                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
428 \r
429                 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
430 \r
431 #ifdef CONFIG_BT_COEXIST\r
432                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);\r
433 #endif // CONFIG_BT_COEXIST\r
434                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));\r
435 \r
436                 ODM_DMWatchdog(&pHalData->odmpriv);\r
437         }\r
438 \r
439 skip_dm:\r
440 \r
441         // Check GPIO to determine current RF on/off and Pbc status.\r
442         // Check Hardware Radio ON/OFF or not\r
443         //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)\r
444         //{\r
445                 //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));\r
446         //      dm_CheckRfCtrlGPIO(Adapter);\r
447         //}\r
448 #ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
449         dm_CheckPbcGPIO(Adapter);\r
450 #endif\r
451         return;\r
452 }\r
453 \r
454 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)\r
455 {\r
456         u32     PWDB_rssi=0;    \r
457         struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
458         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);\r
459         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
460         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
461         struct sta_priv *pstapriv = &padapter->stapriv;\r
462         struct sta_info *psta = NULL;\r
463 \r
464         DBG_871X("%s, RSSI_Min=%d\n", __func__, pDM_Odm->RSSI_Min);\r
465 \r
466         //update IGI\r
467         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);\r
468 \r
469 \r
470         //set rssi to fw\r
471         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
472         if(psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))\r
473         {\r
474                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
475                 \r
476                 rtl8723b_set_rssi_cmd(padapter, (u8*)&PWDB_rssi);\r
477         }       \r
478 \r
479 }\r
480 \r
481 void rtl8723b_HalDmWatchDog_in_LPS(IN   PADAPTER        Adapter)\r
482 {\r
483         u8      bLinked=_FALSE;\r
484         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
485         struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;\r
486         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
487         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
488         struct sta_priv *pstapriv = &Adapter->stapriv;\r
489         struct sta_info *psta = NULL;\r
490 #ifdef CONFIG_CONCURRENT_MODE\r
491         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
492 #endif //CONFIG_CONCURRENT_MODE\r
493 \r
494         if (Adapter->hw_init_completed == _FALSE)\r
495                 goto skip_lps_dm;\r
496 \r
497 \r
498         if(rtw_linked_check(Adapter))\r
499                 bLinked = _TRUE;\r
500 \r
501 #ifdef CONFIG_CONCURRENT_MODE\r
502         if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
503                 bLinked = _TRUE;\r
504 #endif //CONFIG_CONCURRENT_MODE\r
505 \r
506         ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
507 \r
508         if(bLinked == _FALSE)\r
509                 goto skip_lps_dm;\r
510 \r
511         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
512                 goto skip_lps_dm;\r
513 \r
514 \r
515         //ODM_DMWatchdog(&pHalData->odmpriv);   \r
516         //Do DIG by RSSI In LPS-32K \r
517         \r
518       //.1 Find MIN-RSSI\r
519         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
520         if(psta == NULL)\r
521                 goto skip_lps_dm;\r
522 \r
523         pHalData->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
524 \r
525         DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pHalData->EntryMinUndecoratedSmoothedPWDB );\r
526 \r
527         if(pHalData->EntryMinUndecoratedSmoothedPWDB <=0)\r
528                 goto skip_lps_dm;\r
529 \r
530         pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
531 \r
532         pDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM;\r
533 \r
534         //if(pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min)\r
535         if((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) || \r
536              (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5))\r
537 \r
538         {               \r
539                 rtw_dm_in_lps_wk_cmd(Adapter);          \r
540         }\r
541         \r
542         \r
543 skip_lps_dm:\r
544 \r
545         return;\r
546 \r
547 }\r
548 \r
549 void rtl8723b_init_dm_priv(IN PADAPTER Adapter)\r
550 {\r
551         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
552         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
553         Init_ODM_ComInfo_8723b(Adapter);\r
554         ODM_InitAllTimers(podmpriv );\r
555 }\r
556 \r
557 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)\r
558 {\r
559         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
560         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
561         ODM_CancelAllTimers(podmpriv);\r
562 \r
563 }\r
564 \r