Merge branch 'develop-3.10-next' of 10.10.10.29:rk/kernel into develop-3.10-next
[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_BB_CFO_TRACKING\r
327                 | ODM_MAC_EDCA_TURBO\r
328                 | ODM_RF_TX_PWR_TRACK\r
329                 | ODM_RF_CALIBRATION\r
330                 ;\r
331 \r
332         if (rtw_odm_adaptivity_needed(Adapter) == _TRUE)\r
333                 pdmpriv->InitODMFlag |= ODM_BB_ADAPTIVITY;\r
334 \r
335 #ifdef CONFIG_ANTENNA_DIVERSITY\r
336         if(pHalData->AntDivCfg)\r
337                 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;\r
338 #endif\r
339 \r
340 #if (MP_DRIVER==1)\r
341         if (Adapter->registrypriv.mp_mode == 1) {\r
342                 pdmpriv->InitODMFlag = 0\r
343                         | ODM_RF_CALIBRATION\r
344                         | ODM_RF_TX_PWR_TRACK\r
345                         ;\r
346         }\r
347 #endif//(MP_DRIVER==1)\r
348 \r
349 #ifdef CONFIG_DISABLE_ODM\r
350         pdmpriv->InitODMFlag = 0;\r
351 #endif//CONFIG_DISABLE_ODM\r
352 \r
353         //\r
354         // Pointer reference\r
355         //\r
356         //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D\r
357         //      ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp));\r
358 \r
359         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\r
360 \r
361         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes));\r
362         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes));\r
363         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode));\r
364         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC));\r
365         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm));\r
366         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW ));\r
367         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel));\r
368         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed));\r
369         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode));\r
370         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pHalData->CurrentBandType));\r
371         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_IGI_LB,&(pHalData->u1ForcedIgiLb));\r
372         //================= only for 8192D   =================\r
373         /*\r
374         //pHalData->CurrentBandType92D\r
375         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp));\r
376         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp));\r
377         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp));\r
378         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp));\r
379         //================= only for 8192D   =================\r
380         // driver havn't those variable now\r
381         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp));\r
382         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp));\r
383         */\r
384         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_FORCED_RATE,&(pHalData->ForcedDataRate));\r
385         \r
386         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));\r
387         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));\r
388 \r
389 \r
390         for(i=0; i< NUM_STA; i++)\r
391         {\r
392                 //pDM_Odm->pODM_StaInfo[i] = NULL;\r
393                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);\r
394         }\r
395 }\r
396 \r
397 void\r
398 rtl8723b_InitHalDm(\r
399         IN      PADAPTER        Adapter\r
400         )\r
401 {\r
402         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
403         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
404         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
405 \r
406         u8      i;\r
407 \r
408 #ifdef CONFIG_USB_HCI\r
409         dm_InitGPIOSetting(Adapter);\r
410 #endif\r
411 \r
412         pdmpriv->DM_Type = DM_Type_ByDriver;\r
413         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;\r
414 \r
415 #ifdef CONFIG_BT_COEXIST\r
416         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;\r
417 #endif\r
418         pdmpriv->InitDMFlag = pdmpriv->DMFlag;\r
419 \r
420         Update_ODM_ComInfo_8723b(Adapter);\r
421         \r
422         if (Adapter->registrypriv.mp_mode == 0)\r
423                 ODM_DMInit(pDM_Odm);\r
424 \r
425 }\r
426 \r
427 static void\r
428 FindMinimumRSSI_8723b(\r
429 IN      PADAPTER        pAdapter\r
430         )\r
431 {\r
432         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
433         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
434         struct mlme_priv        *pmlmepriv = &pAdapter->mlmepriv;\r
435 \r
436         //1 1.Determine the minimum RSSI\r
437 \r
438 \r
439 #ifdef CONFIG_CONCURRENT_MODE\r
440         //      FindMinimumRSSI()       per-adapter\r
441         {\r
442                 PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;\r
443                 PHAL_DATA_TYPE  pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);\r
444                 struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv;\r
445 \r
446                 if((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) &&\r
447                   (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0))\r
448                 {\r
449 \r
450                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB)\r
451                                 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
452              }\r
453                 else\r
454                 {\r
455                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)\r
456                               pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
457 \r
458                 }\r
459                 #if 0\r
460                 if((pdmpriv->UndecoratedSmoothedPWDB != (-1)) &&\r
461                          (pbuddy_dmpriv->UndecoratedSmoothedPWDB != (-1)))\r
462                 {\r
463 \r
464                         if((pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB) &&\r
465                                 (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
466                                     pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
467                 }\r
468                 else\r
469                 {\r
470                         if((pdmpriv->UndecoratedSmoothedPWDB == (-1)) && (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
471                               pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
472                 }\r
473                 #endif\r
474         }\r
475 #endif\r
476 \r
477         if((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) &&\r
478                 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))\r
479         {\r
480                 pdmpriv->MinUndecoratedPWDBForDM = 0;\r
481                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));\r
482         }\r
483         if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port\r
484         {\r
485                 #if 0\r
486                 if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ||\r
487                         (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||\r
488                         (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))\r
489                 {\r
490                         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
491                         //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
492                 }\r
493                 else//for STA mode\r
494                 {\r
495                         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->UndecoratedSmoothedPWDB;\r
496                         //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
497                 }\r
498                 #else\r
499                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
500                 #endif\r
501         }\r
502         else // associated entry pwdb\r
503         {\r
504                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
505                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port or disconnet PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
506         }\r
507 \r
508         //odm_FindMinimumRSSI_Dmsp(pAdapter);\r
509         //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);\r
510         //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));\r
511 }\r
512 \r
513 VOID\r
514 rtl8723b_HalDmWatchDog(\r
515         IN      PADAPTER        Adapter\r
516         )\r
517 {\r
518         BOOLEAN         bFwCurrentInPSMode = _FALSE;\r
519         BOOLEAN         bFwPSAwake = _TRUE;\r
520         u8 hw_init_completed = _FALSE;\r
521         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
522         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
523 #ifdef CONFIG_CONCURRENT_MODE\r
524         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
525 #endif //CONFIG_CONCURRENT_MODE\r
526 \r
527 //#if MP_DRIVER\r
528 if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP power tracking\r
529         return;\r
530 //#endif\r
531 \r
532         hw_init_completed = Adapter->hw_init_completed;\r
533 \r
534         if (hw_init_completed == _FALSE)\r
535                 goto skip_dm;\r
536 \r
537 #ifdef CONFIG_LPS\r
538         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\r
539         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\r
540 #endif\r
541 \r
542 #ifdef CONFIG_P2P\r
543         // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.\r
544         // modifed by thomas. 2011.06.11.\r
545         if(Adapter->wdinfo.p2p_ps_mode)\r
546                 bFwPSAwake = _FALSE;\r
547 #endif //CONFIG_P2P\r
548 \r
549 \r
550         if( (hw_init_completed == _TRUE)\r
551                 && ((!bFwCurrentInPSMode) && bFwPSAwake))\r
552         {\r
553                 //\r
554                 // Calculate Tx/Rx statistics.\r
555                 //\r
556                 dm_CheckStatistics(Adapter);\r
557                 rtw_hal_check_rxfifo_full(Adapter);\r
558                 //\r
559                 // Dynamically switch RTS/CTS protection.\r
560                 //\r
561                 //dm_CheckProtection(Adapter);\r
562 \r
563 #ifdef CONFIG_PCI_HCI\r
564                 // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.\r
565                 // Tx Migration settings.\r
566                 //dm_InterruptMigration(Adapter);\r
567 \r
568                 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\r
569                 //      PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\r
570 #endif\r
571         }\r
572 \r
573         //ODM\r
574         if (hw_init_completed == _TRUE)\r
575         {\r
576                 u8      bLinked=_FALSE;\r
577                 u8      bsta_state=_FALSE;\r
578                 u8      bBtDisabled = _TRUE;\r
579 \r
580                 if(rtw_linked_check(Adapter)){                  \r
581                         bLinked = _TRUE;\r
582                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
583                                 bsta_state = _TRUE;\r
584                 }\r
585                         \r
586 #ifdef CONFIG_CONCURRENT_MODE\r
587                 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\r
588                         bLinked = _TRUE;\r
589                         if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
590                                 bsta_state = _TRUE;\r
591                 }\r
592 #endif //CONFIG_CONCURRENT_MODE\r
593 \r
594                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
595                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
596 \r
597                 //FindMinimumRSSI_8723b(Adapter);\r
598                 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
599 \r
600 #ifdef CONFIG_BT_COEXIST\r
601                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);\r
602 #endif // CONFIG_BT_COEXIST\r
603                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));\r
604 \r
605                 ODM_DMWatchdog(&pHalData->odmpriv);\r
606         }\r
607 \r
608 skip_dm:\r
609 \r
610         // Check GPIO to determine current RF on/off and Pbc status.\r
611         // Check Hardware Radio ON/OFF or not\r
612         //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)\r
613         //{\r
614                 //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));\r
615         //      dm_CheckRfCtrlGPIO(Adapter);\r
616         //}\r
617 #ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
618         dm_CheckPbcGPIO(Adapter);\r
619 #endif\r
620         return;\r
621 }\r
622 \r
623 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)\r
624 {\r
625         u32     PWDB_rssi=0;    \r
626         struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
627         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);\r
628         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
629         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
630         struct sta_priv *pstapriv = &padapter->stapriv;\r
631         struct sta_info *psta = NULL;\r
632 \r
633         DBG_871X("%s, RSSI_Min=%d\n", __func__, pDM_Odm->RSSI_Min);\r
634 \r
635         //update IGI\r
636         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);\r
637 \r
638 \r
639         //set rssi to fw\r
640         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
641         if(psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))\r
642         {\r
643                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
644                 \r
645                 rtl8723b_set_rssi_cmd(padapter, (u8*)&PWDB_rssi);\r
646         }       \r
647 \r
648 }\r
649 \r
650 void rtl8723b_HalDmWatchDog_in_LPS(IN   PADAPTER        Adapter)\r
651 {\r
652         u8      bLinked=_FALSE;\r
653         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
654         struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;\r
655         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
656         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
657         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
658         struct sta_priv *pstapriv = &Adapter->stapriv;\r
659         struct sta_info *psta = NULL;\r
660 #ifdef CONFIG_CONCURRENT_MODE\r
661         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
662 #endif //CONFIG_CONCURRENT_MODE\r
663 \r
664         if (Adapter->hw_init_completed == _FALSE)\r
665                 goto skip_lps_dm;\r
666 \r
667 \r
668         if(rtw_linked_check(Adapter))\r
669                 bLinked = _TRUE;\r
670 \r
671 #ifdef CONFIG_CONCURRENT_MODE\r
672         if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
673                 bLinked = _TRUE;\r
674 #endif //CONFIG_CONCURRENT_MODE\r
675 \r
676         ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
677 \r
678         if(bLinked == _FALSE)\r
679                 goto skip_lps_dm;\r
680 \r
681         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
682                 goto skip_lps_dm;\r
683 \r
684 \r
685         //ODM_DMWatchdog(&pHalData->odmpriv);   \r
686         //Do DIG by RSSI In LPS-32K \r
687         \r
688       //.1 Find MIN-RSSI\r
689         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
690         if(psta == NULL)\r
691                 goto skip_lps_dm;\r
692 \r
693         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
694 \r
695         DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB );\r
696 \r
697         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB <=0)\r
698                 goto skip_lps_dm;\r
699 \r
700         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
701 \r
702         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;\r
703 \r
704         //if(pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min)\r
705         if((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) || \r
706              (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5))\r
707 \r
708         {               \r
709                 rtw_dm_in_lps_wk_cmd(Adapter);          \r
710         }\r
711         \r
712         \r
713 skip_lps_dm:\r
714 \r
715         return;\r
716 \r
717 }\r
718 \r
719 void rtl8723b_init_dm_priv(IN PADAPTER Adapter)\r
720 {\r
721         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
722         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
723         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
724         _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));\r
725         Init_ODM_ComInfo_8723b(Adapter);\r
726 #ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
727         //_init_timer(&(pdmpriv->SwAntennaSwitchTimer),  Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter);\r
728         ODM_InitAllTimers(podmpriv );\r
729 #endif\r
730 \r
731 }\r
732 \r
733 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)\r
734 {\r
735         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
736         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
737         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
738 #ifdef CONFIG_SW_ANTENNA_DIVERSITY\r
739         //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);\r
740         ODM_CancelAllTimers(podmpriv);\r
741 #endif\r
742 }\r
743 \r