Merge tag 'lsk-v3.10-15.09-android'
[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         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\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         pdmpriv->InitODMFlag = 0;\r
266         #else\r
267         pdmpriv->InitODMFlag =  ODM_RF_CALIBRATION              |\r
268                                                         ODM_RF_TX_PWR_TRACK     //|\r
269                                                         ;       \r
270         //if(pHalData->AntDivCfg)\r
271         //      pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;\r
272         #endif  \r
273 \r
274         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\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         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
282 \r
283         pdmpriv->InitODMFlag = 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                 pdmpriv->InitODMFlag |= ODM_BB_ADAPTIVITY;\r
301 \r
302 #ifdef CONFIG_ANTENNA_DIVERSITY\r
303         if(pHalData->AntDivCfg)\r
304                 pdmpriv->InitODMFlag |= 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                 pdmpriv->InitODMFlag = 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         pdmpriv->InitODMFlag = 0;\r
318 #endif//CONFIG_DISABLE_ODM\r
319 \r
320         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\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         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
330         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
331 \r
332         u8      i;\r
333 \r
334 #ifdef CONFIG_USB_HCI\r
335         dm_InitGPIOSetting(Adapter);\r
336 #endif\r
337 \r
338         pdmpriv->DM_Type = DM_Type_ByDriver;\r
339         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;\r
340 \r
341 #ifdef CONFIG_BT_COEXIST\r
342         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;\r
343 #endif\r
344         pdmpriv->InitDMFlag = pdmpriv->DMFlag;\r
345 \r
346         Update_ODM_ComInfo_8723b(Adapter);\r
347         \r
348         if (Adapter->registrypriv.mp_mode == 0)\r
349                 ODM_DMInit(pDM_Odm);\r
350 \r
351 }\r
352 \r
353 static void\r
354 FindMinimumRSSI_8723b(\r
355 IN      PADAPTER        pAdapter\r
356         )\r
357 {\r
358         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
359         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
360         struct mlme_priv        *pmlmepriv = &pAdapter->mlmepriv;\r
361 \r
362         //1 1.Determine the minimum RSSI\r
363 \r
364 \r
365 #ifdef CONFIG_CONCURRENT_MODE\r
366         //      FindMinimumRSSI()       per-adapter\r
367         {\r
368                 PADAPTER pbuddy_adapter = pAdapter->pbuddy_adapter;\r
369                 PHAL_DATA_TYPE  pbuddy_HalData = GET_HAL_DATA(pbuddy_adapter);\r
370                 struct dm_priv *pbuddy_dmpriv = &pbuddy_HalData->dmpriv;\r
371 \r
372                 if((pdmpriv->EntryMinUndecoratedSmoothedPWDB != 0) &&\r
373                   (pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB != 0))\r
374                 {\r
375 \r
376                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB > pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB)\r
377                                 pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
378              }\r
379                 else\r
380                 {\r
381                         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0)\r
382                               pdmpriv->EntryMinUndecoratedSmoothedPWDB = pbuddy_dmpriv->EntryMinUndecoratedSmoothedPWDB;\r
383 \r
384                 }\r
385                 #if 0\r
386                 if((pdmpriv->UndecoratedSmoothedPWDB != (-1)) &&\r
387                          (pbuddy_dmpriv->UndecoratedSmoothedPWDB != (-1)))\r
388                 {\r
389 \r
390                         if((pdmpriv->UndecoratedSmoothedPWDB > pbuddy_dmpriv->UndecoratedSmoothedPWDB) &&\r
391                                 (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
392                                     pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
393                 }\r
394                 else\r
395                 {\r
396                         if((pdmpriv->UndecoratedSmoothedPWDB == (-1)) && (pbuddy_dmpriv->UndecoratedSmoothedPWDB!=0))\r
397                               pdmpriv->UndecoratedSmoothedPWDB = pbuddy_dmpriv->UndecoratedSmoothedPWDB;\r
398                 }\r
399                 #endif\r
400         }\r
401 #endif\r
402 \r
403         if((check_fwstate(pmlmepriv, _FW_LINKED) == _FALSE) &&\r
404                 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))\r
405         {\r
406                 pdmpriv->MinUndecoratedPWDBForDM = 0;\r
407                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));\r
408         }\r
409         if(check_fwstate(pmlmepriv, _FW_LINKED) == _TRUE)       // Default port\r
410         {\r
411                 #if 0\r
412                 if((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ||\r
413                         (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE) ||\r
414                         (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE))\r
415                 {\r
416                         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
417                         //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Client PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
418                 }\r
419                 else//for STA mode\r
420                 {\r
421                         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->UndecoratedSmoothedPWDB;\r
422                         //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("STA Default Port PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
423                 }\r
424                 #else\r
425                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
426                 #endif\r
427         }\r
428         else // associated entry pwdb\r
429         {\r
430                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
431                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("AP Ext Port or disconnet PWDB = 0x%x \n", pHalData->MinUndecoratedPWDBForDM));\r
432         }\r
433 \r
434         //odm_FindMinimumRSSI_Dmsp(pAdapter);\r
435         //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);\r
436         //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));\r
437 }\r
438 \r
439 VOID\r
440 rtl8723b_HalDmWatchDog(\r
441         IN      PADAPTER        Adapter\r
442         )\r
443 {\r
444         BOOLEAN         bFwCurrentInPSMode = _FALSE;\r
445         BOOLEAN         bFwPSAwake = _TRUE;\r
446         u8 hw_init_completed = _FALSE;\r
447         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
448         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
449 #ifdef CONFIG_CONCURRENT_MODE\r
450         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
451 #endif //CONFIG_CONCURRENT_MODE\r
452 \r
453 //#if MP_DRIVER\r
454 if (Adapter->registrypriv.mp_mode == 1 && Adapter->mppriv.mp_dm ==0) // for MP power tracking\r
455         return;\r
456 //#endif\r
457 \r
458         hw_init_completed = Adapter->hw_init_completed;\r
459 \r
460         if (hw_init_completed == _FALSE)\r
461                 goto skip_dm;\r
462 \r
463 #ifdef CONFIG_LPS\r
464         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\r
465         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\r
466 #endif\r
467 \r
468 #ifdef CONFIG_P2P\r
469         // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.\r
470         // modifed by thomas. 2011.06.11.\r
471         if(Adapter->wdinfo.p2p_ps_mode)\r
472                 bFwPSAwake = _FALSE;\r
473 #endif //CONFIG_P2P\r
474 \r
475 \r
476         if( (hw_init_completed == _TRUE)\r
477                 && ((!bFwCurrentInPSMode) && bFwPSAwake))\r
478         {\r
479                 //\r
480                 // Calculate Tx/Rx statistics.\r
481                 //\r
482                 dm_CheckStatistics(Adapter);\r
483                 rtw_hal_check_rxfifo_full(Adapter);\r
484                 //\r
485                 // Dynamically switch RTS/CTS protection.\r
486                 //\r
487                 //dm_CheckProtection(Adapter);\r
488 \r
489 #ifdef CONFIG_PCI_HCI\r
490                 // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.\r
491                 // Tx Migration settings.\r
492                 //dm_InterruptMigration(Adapter);\r
493 \r
494                 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\r
495                 //      PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\r
496 #endif\r
497         }\r
498 \r
499         //ODM\r
500         if (hw_init_completed == _TRUE)\r
501         {\r
502                 u8      bLinked=_FALSE;\r
503                 u8      bsta_state=_FALSE;\r
504                 u8      bBtDisabled = _TRUE;\r
505 \r
506                 if(rtw_linked_check(Adapter)){                  \r
507                         bLinked = _TRUE;\r
508                         if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
509                                 bsta_state = _TRUE;\r
510                 }\r
511                         \r
512 #ifdef CONFIG_CONCURRENT_MODE\r
513                 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter)){\r
514                         bLinked = _TRUE;\r
515                         if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
516                                 bsta_state = _TRUE;\r
517                 }\r
518 #endif //CONFIG_CONCURRENT_MODE\r
519 \r
520                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
521                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
522 \r
523                 //FindMinimumRSSI_8723b(Adapter);\r
524                 //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
525 \r
526 #ifdef CONFIG_BT_COEXIST\r
527                 bBtDisabled = rtw_btcoex_IsBtDisabled(Adapter);\r
528 #endif // CONFIG_BT_COEXIST\r
529                 ODM_CmnInfoUpdate(&pHalData->odmpriv, ODM_CMNINFO_BT_ENABLED, ((bBtDisabled == _TRUE)?_FALSE:_TRUE));\r
530 \r
531                 ODM_DMWatchdog(&pHalData->odmpriv);\r
532         }\r
533 \r
534 skip_dm:\r
535 \r
536         // Check GPIO to determine current RF on/off and Pbc status.\r
537         // Check Hardware Radio ON/OFF or not\r
538         //if(Adapter->MgntInfo.PowerSaveControl.bGpioRfSw)\r
539         //{\r
540                 //RTPRINT(FPWR, PWRHW, ("dm_CheckRfCtrlGPIO \n"));\r
541         //      dm_CheckRfCtrlGPIO(Adapter);\r
542         //}\r
543 #ifdef CONFIG_SUPPORT_HW_WPS_PBC\r
544         dm_CheckPbcGPIO(Adapter);\r
545 #endif\r
546         return;\r
547 }\r
548 \r
549 void rtl8723b_hal_dm_in_lps(PADAPTER padapter)\r
550 {\r
551         u32     PWDB_rssi=0;    \r
552         struct mlme_priv        *pmlmepriv = &padapter->mlmepriv;\r
553         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(padapter);\r
554         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
555         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
556         struct sta_priv *pstapriv = &padapter->stapriv;\r
557         struct sta_info *psta = NULL;\r
558 \r
559         DBG_871X("%s, RSSI_Min=%d\n", __func__, pDM_Odm->RSSI_Min);\r
560 \r
561         //update IGI\r
562         ODM_Write_DIG(pDM_Odm, pDM_Odm->RSSI_Min);\r
563 \r
564 \r
565         //set rssi to fw\r
566         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
567         if(psta && (psta->rssi_stat.UndecoratedSmoothedPWDB > 0))\r
568         {\r
569                 PWDB_rssi = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
570                 \r
571                 rtl8723b_set_rssi_cmd(padapter, (u8*)&PWDB_rssi);\r
572         }       \r
573 \r
574 }\r
575 \r
576 void rtl8723b_HalDmWatchDog_in_LPS(IN   PADAPTER        Adapter)\r
577 {\r
578         u8      bLinked=_FALSE;\r
579         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
580         struct mlme_priv        *pmlmepriv = &Adapter->mlmepriv;\r
581         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
582         PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
583         pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
584         struct sta_priv *pstapriv = &Adapter->stapriv;\r
585         struct sta_info *psta = NULL;\r
586 #ifdef CONFIG_CONCURRENT_MODE\r
587         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
588 #endif //CONFIG_CONCURRENT_MODE\r
589 \r
590         if (Adapter->hw_init_completed == _FALSE)\r
591                 goto skip_lps_dm;\r
592 \r
593 \r
594         if(rtw_linked_check(Adapter))\r
595                 bLinked = _TRUE;\r
596 \r
597 #ifdef CONFIG_CONCURRENT_MODE\r
598         if (pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
599                 bLinked = _TRUE;\r
600 #endif //CONFIG_CONCURRENT_MODE\r
601 \r
602         ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
603 \r
604         if(bLinked == _FALSE)\r
605                 goto skip_lps_dm;\r
606 \r
607         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
608                 goto skip_lps_dm;\r
609 \r
610 \r
611         //ODM_DMWatchdog(&pHalData->odmpriv);   \r
612         //Do DIG by RSSI In LPS-32K \r
613         \r
614       //.1 Find MIN-RSSI\r
615         psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));\r
616         if(psta == NULL)\r
617                 goto skip_lps_dm;\r
618 \r
619         pdmpriv->EntryMinUndecoratedSmoothedPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
620 \r
621         DBG_871X("CurIGValue=%d, EntryMinUndecoratedSmoothedPWDB = %d\n", pDM_DigTable->CurIGValue, pdmpriv->EntryMinUndecoratedSmoothedPWDB );\r
622 \r
623         if(pdmpriv->EntryMinUndecoratedSmoothedPWDB <=0)\r
624                 goto skip_lps_dm;\r
625 \r
626         pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
627 \r
628         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;\r
629 \r
630         //if(pDM_DigTable->CurIGValue != pDM_Odm->RSSI_Min)\r
631         if((pDM_DigTable->CurIGValue > pDM_Odm->RSSI_Min + 5) || \r
632              (pDM_DigTable->CurIGValue < pDM_Odm->RSSI_Min - 5))\r
633 \r
634         {               \r
635                 rtw_dm_in_lps_wk_cmd(Adapter);          \r
636         }\r
637         \r
638         \r
639 skip_lps_dm:\r
640 \r
641         return;\r
642 \r
643 }\r
644 \r
645 void rtl8723b_init_dm_priv(IN PADAPTER Adapter)\r
646 {\r
647         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
648         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
649         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
650         _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));\r
651         Init_ODM_ComInfo_8723b(Adapter);\r
652         ODM_InitAllTimers(podmpriv );\r
653 }\r
654 \r
655 void rtl8723b_deinit_dm_priv(IN PADAPTER Adapter)\r
656 {\r
657         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
658         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
659         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
660         ODM_CancelAllTimers(podmpriv);\r
661 \r
662 }\r
663 \r