Merge tag 'lsk-v3.10-android-14.11'
[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 \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
252 \r
253         //\r
254         // Init Value\r
255         //\r
256         _rtw_memset(pDM_Odm,0,sizeof(*pDM_Odm));\r
257 \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
263 \r
264         fab_ver = ODM_TSMC;\r
265         cut_ver = ODM_CUT_A;\r
266 \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
271 \r
272 #ifdef CONFIG_USB_HCI\r
273         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType);\r
274 \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
278         }\r
279 #endif\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
283 \r
284 \r
285         if(pHalData->rf_type == RF_1T1R){\r
286                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R);\r
287         }\r
288         else if(pHalData->rf_type == RF_2T2R){\r
289                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R);\r
290         }\r
291         else if(pHalData->rf_type == RF_1T2R){\r
292                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R);\r
293         }\r
294 \r
295         #ifdef CONFIG_DISABLE_ODM\r
296         pdmpriv->InitODMFlag = 0;\r
297         #else\r
298         pdmpriv->InitODMFlag =  ODM_RF_CALIBRATION              |\r
299                                                         ODM_RF_TX_PWR_TRACK     //|\r
300                                                         ;       \r
301         //if(pHalData->AntDivCfg)\r
302         //      pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;\r
303         #endif  \r
304 \r
305         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\r
306 }\r
307 \r
308 static void Update_ODM_ComInfo_8723b(PADAPTER   Adapter)\r
309 {\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
316         int i;\r
317 \r
318         pdmpriv->InitODMFlag = 0\r
319                 | ODM_BB_DIG\r
320                 | ODM_BB_RA_MASK\r
321                 | ODM_BB_DYNAMIC_TXPWR\r
322                 | ODM_BB_FA_CNT\r
323                 | ODM_BB_RSSI_MONITOR\r
324                 | ODM_BB_CCK_PD\r
325                 | ODM_BB_PWR_SAVE\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
331 #endif\r
332                 ;\r
333 \r
334 #ifdef CONFIG_ANTENNA_DIVERSITY\r
335         if(pHalData->AntDivCfg)\r
336                 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;\r
337 #endif\r
338 \r
339 #if (MP_DRIVER==1)\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
344                         ;\r
345         }\r
346 #endif//(MP_DRIVER==1)\r
347 \r
348 #ifdef CONFIG_DISABLE_ODM\r
349         pdmpriv->InitODMFlag = 0;\r
350 #endif//CONFIG_DISABLE_ODM\r
351 \r
352         //\r
353         // Pointer reference\r
354         //\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
357 \r
358         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\r
359 \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
372         /*\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
382         */\r
383         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));\r
384         \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
387 \r
388 \r
389         for(i=0; i< NUM_STA; i++)\r
390         {\r
391                 //pDM_Odm->pODM_StaInfo[i] = NULL;\r
392                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);\r
393         }\r
394 }\r
395 \r
396 void\r
397 rtl8723b_InitHalDm(\r
398         IN      PADAPTER        Adapter\r
399         )\r
400 {\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
404 \r
405         u8      i;\r
406 \r
407 #ifdef CONFIG_USB_HCI\r
408         dm_InitGPIOSetting(Adapter);\r
409 #endif\r
410 \r
411         pdmpriv->DM_Type = DM_Type_ByDriver;\r
412         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;\r
413 \r
414 #ifdef CONFIG_BT_COEXIST\r
415         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;\r
416 #endif\r
417         pdmpriv->InitDMFlag = pdmpriv->DMFlag;\r
418 \r
419         Update_ODM_ComInfo_8723b(Adapter);\r
420         ODM_DMInit(pDM_Odm);\r
421 \r
422 }\r
423 \r
424 static void\r
425 FindMinimumRSSI_8723b(\r
426 IN      PADAPTER        pAdapter\r
427         )\r
428 {\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
432 \r
433         //1 1.Determine the minimum RSSI\r
434 \r
435 \r
436 #ifdef CONFIG_CONCURRENT_MODE\r
437         //      FindMinimumRSSI()       per-adapter\r
438         {\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
442 \r
443                 if((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) &&\r
444                   (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0))\r
445                 {\r
446 \r
447                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB)\r
448                                 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
449              }\r
450                 else\r
451                 {\r
452                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)\r
453                               pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
454 \r
455                 }\r
456                 #if 0\r
457                 if((pdmpriv->UndecoratedSmoothedPWDB != (-1)) &&\r
458                          (pbuddy_dmpriv->UndecoratedSmoothedPWDB != (-1)))\r
459                 {\r
460 \r
461                         if((pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB) &&\r
462                                 (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
463                                     pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
464                 }\r
465                 else\r
466                 {\r
467                         if((pdmpriv->UndecoratedSmoothedPWDB == (-1)) && (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
468                               pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
469                 }\r
470                 #endif\r
471         }\r
472 #endif\r
473 \r
474         if((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) &&\r
475                 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))\r
476         {\r
477                 pdmpriv->MinUndecoratedPWDBForDM = 0;\r
478                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));\r
479         }\r
480         if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port\r
481         {\r
482                 #if 0\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
486                 {\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
489                 }\r
490                 else//for STA mode\r
491                 {\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
494                 }\r
495                 #else\r
496                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
497                 #endif\r
498         }\r
499         else // associated entry pwdb\r
500         {\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
503         }\r
504 \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
508 }\r
509 \r
510 VOID\r
511 rtl8723b_HalDmWatchDog(\r
512         IN      PADAPTER        Adapter\r
513         )\r
514 {\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
523 \r
524 //#if MP_DRIVER\r
525 if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP power tracking\r
526         return;\r
527 //#endif\r
528 \r
529         hw_init_completed = Adapter->hw_init_completed;\r
530 \r
531         if (hw_init_completed == _FALSE)\r
532                 goto skip_dm;\r
533 \r
534 #ifdef CONFIG_LPS\r
535         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\r
536         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\r
537 #endif\r
538 \r
539 #ifdef CONFIG_P2P\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
545 \r
546 \r
547         if( (hw_init_completed == _TRUE)\r
548                 && ((!bFwCurrentInPSMode) && bFwPSAwake))\r
549         {\r
550                 //\r
551                 // Calculate Tx/Rx statistics.\r
552                 //\r
553                 dm_CheckStatistics(Adapter);\r
554                 rtw_hal_check_rxfifo_full(Adapter);\r
555                 //\r
556                 // Dynamically switch RTS/CTS protection.\r
557                 //\r
558                 //dm_CheckProtection(Adapter);\r
559 \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
564 \r
565                 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\r
566                 //      PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\r
567 #endif\r
568         }\r
569 \r
570         //ODM\r
571         if (hw_init_completed == _TRUE)\r
572         {\r
573                 u8      bLinked=_FALSE;\r
574                 u8      bsta_state=_FALSE;\r
575 \r
576                 if(rtw_linked_check(Adapter)){                  \r
577                         bLinked = _TRUE;\r
578                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
579                                 bsta_state = _TRUE;\r
580                 }\r
581                         \r
582 #ifdef CONFIG_CONCURRENT_MODE\r
583                 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\r
584                         bLinked = _TRUE;\r
585                         if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
586                                 bsta_state = _TRUE;\r
587                 }\r
588 #endif //CONFIG_CONCURRENT_MODE\r
589 \r
590                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
591                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
592 \r
593                 //FindMinimumRSSI_8723b(Adapter);\r
594                 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
595 \r
596                 ODM_DMWatchdog(&pHalData->odmpriv);\r
597         }\r
598 \r
599 skip_dm:\r
600 \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
604         //{\r
605                 //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));\r
606         //      dm_CheckRfCtrlGPIO(Adapter);\r
607         //}\r
608 #ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
609         dm_CheckPbcGPIO(Adapter);\r
610 #endif\r
611         return;\r
612 }\r
613 \r
614 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)\r
615 {\r
616         u32     PWDB_rssi=0;    \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
623 \r
624         DBG_871X("%s, RSSI_Min=%d\n", __func__, pDM_Odm->RSSI_Min);\r
625 \r
626         //update IGI\r
627         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);\r
628 \r
629 \r
630         //set rssi to fw\r
631         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
632         if(psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))\r
633         {\r
634                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
635                 \r
636                 rtl8723b_set_rssi_cmd(padapter, (u8*)&PWDB_rssi);\r
637         }       \r
638 \r
639 }\r
640 \r
641 void rtl8723b_HalDmWatchDog_in_LPS(IN   PADAPTER        Adapter)\r
642 {\r
643         u8      bLinked=_FALSE;\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
654 \r
655         if (Adapter->hw_init_completed == _FALSE)\r
656                 goto skip_lps_dm;\r
657 \r
658 \r
659         if(rtw_linked_check(Adapter))\r
660                 bLinked = _TRUE;\r
661 \r
662 #ifdef CONFIG_CONCURRENT_MODE\r
663         if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
664                 bLinked = _TRUE;\r
665 #endif //CONFIG_CONCURRENT_MODE\r
666 \r
667         ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
668 \r
669         if(bLinked == _FALSE)\r
670                 goto skip_lps_dm;\r
671 \r
672         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
673                 goto skip_lps_dm;\r
674 \r
675 \r
676         //ODM_DMWatchdog(&pHalData->odmpriv);   \r
677         //Do DIG by RSSI In LPS-32K \r
678         \r
679       //.1 Find MIN-RSSI\r
680         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
681         if(psta == NULL)\r
682                 goto skip_lps_dm;\r
683 \r
684         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
685 \r
686         DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB );\r
687 \r
688         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB <=0)\r
689                 goto skip_lps_dm;\r
690 \r
691         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
692 \r
693         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;\r
694 \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
698 \r
699         {               \r
700                 rtw_dm_in_lps_wk_cmd(Adapter);          \r
701         }\r
702         \r
703         \r
704 skip_lps_dm:\r
705 \r
706         return;\r
707 \r
708 }\r
709 \r
710 void rtl8723b_init_dm_priv(IN PADAPTER Adapter)\r
711 {\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
720 #endif\r
721 \r
722 }\r
723 \r
724 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)\r
725 {\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
732 #endif\r
733 }\r
734 \r