add rk3288 pinctrl dts code
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rtl8723au / hal / rtl8723a / rtl8723a_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 _RTL8723A_DM_C_\r
28 \r
29 //============================================================\r
30 // include files\r
31 //============================================================\r
32 #include <drv_conf.h>\r
33 #include <osdep_service.h>\r
34 #include <drv_types.h>\r
35 #include <rtw_byteorder.h>\r
36 \r
37 #include <rtl8723a_hal.h>\r
38 \r
39 //============================================================\r
40 // Global var\r
41 //============================================================\r
42 \r
43 \r
44 static VOID\r
45 dm_CheckProtection(\r
46         IN      PADAPTER        Adapter\r
47         )\r
48 {\r
49 #if 0\r
50         PMGNT_INFO              pMgntInfo = &(Adapter->MgntInfo);\r
51         u1Byte                  CurRate, RateThreshold;\r
52 \r
53         if(pMgntInfo->pHTInfo->bCurBW40MHz)\r
54                 RateThreshold = MGN_MCS1;\r
55         else\r
56                 RateThreshold = MGN_MCS3;\r
57 \r
58         if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)\r
59         {\r
60                 pMgntInfo->bDmDisableProtect = TRUE;\r
61                 DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);\r
62         }\r
63         else\r
64         {\r
65                 pMgntInfo->bDmDisableProtect = FALSE;\r
66                 DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);\r
67         }\r
68 #endif\r
69 }\r
70 \r
71 static VOID\r
72 dm_CheckStatistics(\r
73         IN      PADAPTER        Adapter\r
74         )\r
75 {\r
76 #if 0\r
77         if(!Adapter->MgntInfo.bMediaConnect)\r
78                 return;\r
79 \r
80         //2008.12.10 tynli Add for getting Current_Tx_Rate_Reg flexibly.\r
81         rtw_hal_get_hwreg( Adapter, HW_VAR_INIT_TX_RATE, (pu1Byte)(&Adapter->TxStats.CurrentInitTxRate) );\r
82 \r
83         // Calculate current Tx Rate(Successful transmited!!)\r
84 \r
85         // Calculate current Rx Rate(Successful received!!)\r
86 \r
87         //for tx tx retry count\r
88         rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );\r
89 #endif\r
90 }\r
91 \r
92 static void dm_CheckPbcGPIO(_adapter *padapter)\r
93 {\r
94         u8      tmp1byte;\r
95         u8      bPbcPressed = _FALSE;\r
96 \r
97         if(!padapter->registrypriv.hw_wps_pbc)\r
98                 return;\r
99 \r
100 #ifdef CONFIG_USB_HCI\r
101         tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);\r
102         tmp1byte |= (HAL_8192C_HW_GPIO_WPS_BIT);\r
103         rtw_write8(padapter, GPIO_IO_SEL, tmp1byte);    //enable GPIO[2] as output mode\r
104 \r
105         tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);\r
106         rtw_write8(padapter,  GPIO_IN, tmp1byte);               //reset the floating voltage level\r
107 \r
108         tmp1byte = rtw_read8(padapter, GPIO_IO_SEL);\r
109         tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);\r
110         rtw_write8(padapter, GPIO_IO_SEL, tmp1byte);    //enable GPIO[2] as input mode\r
111 \r
112         tmp1byte =rtw_read8(padapter, GPIO_IN);\r
113 \r
114         if (tmp1byte == 0xff)\r
115                 return ;\r
116 \r
117         if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)\r
118         {\r
119                 bPbcPressed = _TRUE;\r
120         }\r
121 #else\r
122         tmp1byte = rtw_read8(padapter, GPIO_IN);\r
123         //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte));\r
124 \r
125         if (tmp1byte == 0xff || padapter->init_adpt_in_progress)\r
126                 return ;\r
127 \r
128         if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0)\r
129         {\r
130                 bPbcPressed = _TRUE;\r
131         }\r
132 #endif\r
133 \r
134         if( _TRUE == bPbcPressed)\r
135         {\r
136                 // Here we only set bPbcPressed to true\r
137                 // After trigger PBC, the variable will be set to false\r
138                 DBG_8192C("CheckPbcGPIO - PBC is pressed\n");\r
139 \r
140 #ifdef RTK_DMP_PLATFORM\r
141 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,12))\r
142                 kobject_uevent(&padapter->pnetdev->dev.kobj, KOBJ_NET_PBC);\r
143 #else\r
144                 kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC);\r
145 #endif\r
146 #else\r
147 \r
148                 if ( padapter->pid[0] == 0 )\r
149                 {       //      0 is the default value and it means the application monitors the HW PBC doesn't privde its pid to driver.\r
150                         return;\r
151                 }\r
152 \r
153 #ifdef PLATFORM_LINUX\r
154                 rtw_signal_process(padapter->pid[0], SIGUSR1);\r
155 #endif\r
156 #endif\r
157         }\r
158 }\r
159 \r
160 #ifdef CONFIG_PCI_HCI\r
161 //\r
162 //      Description:\r
163 //              Perform interrupt migration dynamically to reduce CPU utilization.\r
164 //\r
165 //      Assumption:\r
166 //              1. Do not enable migration under WIFI test.\r
167 //\r
168 //      Created by Roger, 2010.03.05.\r
169 //\r
170 VOID\r
171 dm_InterruptMigration(\r
172         IN      PADAPTER        Adapter\r
173         )\r
174 {\r
175         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
176         struct mlme_priv        *pmlmepriv = &(Adapter->mlmepriv);\r
177         BOOLEAN                 bCurrentIntMt, bCurrentACIntDisable;\r
178         BOOLEAN                 IntMtToSet = _FALSE;\r
179         BOOLEAN                 ACIntToSet = _FALSE;\r
180 \r
181 \r
182         // Retrieve current interrupt migration and Tx four ACs IMR settings first.\r
183         bCurrentIntMt = pHalData->bInterruptMigration;\r
184         bCurrentACIntDisable = pHalData->bDisableTxInt;\r
185 \r
186         //\r
187         // <Roger_Notes> Currently we use busy traffic for reference instead of RxIntOK counts to prevent non-linear Rx statistics\r
188         // when interrupt migration is set before. 2010.03.05.\r
189         //\r
190         if(!Adapter->registrypriv.wifi_spec &&\r
191                 (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&\r
192                 pmlmepriv->LinkDetectInfo.bHigherBusyTraffic)\r
193         {\r
194                 IntMtToSet = _TRUE;\r
195 \r
196                 // To check whether we should disable Tx interrupt or not.\r
197                 if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic )\r
198                         ACIntToSet = _TRUE;\r
199         }\r
200 \r
201         //Update current settings.\r
202         if( bCurrentIntMt != IntMtToSet ){\r
203                 DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet);\r
204                 if(IntMtToSet)\r
205                 {\r
206                         //\r
207                         // <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.\r
208                         // timer 25ns*0xfa0=100us for 0xf packets.\r
209                         // 2010.03.05.\r
210                         //\r
211                         rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx\r
212                         pHalData->bInterruptMigration = IntMtToSet;\r
213                 }\r
214                 else\r
215                 {\r
216                         // Reset all interrupt migration settings.\r
217                         rtw_write32(Adapter, REG_INT_MIG, 0);\r
218                         pHalData->bInterruptMigration = IntMtToSet;\r
219                 }\r
220         }\r
221 \r
222         /*if( bCurrentACIntDisable != ACIntToSet ){\r
223                 DBG_8192C("%s(): Update AC interrrupt(%d)\n",__FUNCTION__,ACIntToSet);\r
224                 if(ACIntToSet) // Disable four ACs interrupts.\r
225                 {\r
226                         //\r
227                         // <Roger_Notes> Disable VO, VI, BE and BK four AC interrupts to gain more efficient CPU utilization.\r
228                         // When extremely highly Rx OK occurs, we will disable Tx interrupts.\r
229                         // 2010.03.05.\r
230                         //\r
231                         UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );\r
232                         pHalData->bDisableTxInt = ACIntToSet;\r
233                 }\r
234                 else// Enable four ACs interrupts.\r
235                 {\r
236                         UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );\r
237                         pHalData->bDisableTxInt = ACIntToSet;\r
238                 }\r
239         }*/\r
240 \r
241 }\r
242 \r
243 #endif\r
244 \r
245 //\r
246 // Initialize GPIO setting registers\r
247 //\r
248 static void\r
249 dm_InitGPIOSetting(\r
250         IN      PADAPTER        Adapter\r
251         )\r
252 {\r
253         PHAL_DATA_TYPE          pHalData = GET_HAL_DATA(Adapter);\r
254 \r
255         u8      tmp1byte;\r
256 \r
257         tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);\r
258         tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);\r
259 \r
260         rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);\r
261 }\r
262 //============================================================\r
263 // functions\r
264 //============================================================\r
265 static void Init_ODM_ComInfo_8723a(PADAPTER     Adapter)\r
266 {\r
267 \r
268         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
269         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
270         u8      cut_ver,fab_ver;\r
271         \r
272         //\r
273         // Init Value\r
274         //\r
275         _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm));\r
276         \r
277         pDM_Odm->Adapter = Adapter;\r
278         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PLATFORM,ODM_CE);\r
279         if(Adapter->interface_type == RTW_GSPI )\r
280                 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,ODM_ITRF_SDIO);\r
281         else\r
282                 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE\r
283                 \r
284         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE,ODM_RTL8723A);\r
285         \r
286 \r
287         if(IS_8723A_A_CUT(pHalData->VersionID))\r
288         {\r
289                 fab_ver = ODM_UMC;\r
290                 cut_ver = ODM_CUT_A;            \r
291         }\r
292         else if(IS_8723A_B_CUT(pHalData->VersionID))\r
293         {\r
294                 fab_ver = ODM_UMC;\r
295                 cut_ver = ODM_CUT_B;            \r
296         }\r
297         else\r
298         {\r
299                 fab_ver = ODM_TSMC;\r
300                 cut_ver = ODM_CUT_A;    \r
301         }\r
302         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_FAB_VER,fab_ver);           \r
303         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_CUT_VER,cut_ver);\r
304         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_MP_TEST_CHIP,IS_NORMAL_CHIP(pHalData->VersionID));\r
305         \r
306 #ifdef CONFIG_USB_HCI   \r
307         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType);\r
308 \r
309         if(pHalData->BoardType == BOARD_USB_High_PA){\r
310                 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_LNA,_TRUE);\r
311                 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_EXT_PA,_TRUE);\r
312         }\r
313 #endif  \r
314         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_PATCH_ID,pHalData->CustomerID);\r
315         //      ODM_CMNINFO_BINHCT_TEST only for MP Team\r
316         ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BWIFI_TEST,Adapter->registrypriv.wifi_spec);\r
317                 \r
318         \r
319         if(pHalData->rf_type == RF_1T1R){\r
320                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R);                \r
321         }\r
322         else if(pHalData->rf_type == RF_2T2R){\r
323                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R);                \r
324         }\r
325         else if(pHalData->rf_type == RF_1T2R){          \r
326                 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R);                \r
327         }       \r
328 }\r
329 static void Update_ODM_ComInfo_8723a(PADAPTER   Adapter)\r
330 {\r
331         struct mlme_ext_priv    *pmlmeext = &Adapter->mlmeextpriv;\r
332         struct mlme_priv                *pmlmepriv = &Adapter->mlmepriv;\r
333         struct pwrctrl_priv *pwrctrlpriv = adapter_to_pwrctl(Adapter);\r
334         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
335         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
336         struct dm_priv  *pdmpriv = &pHalData->dmpriv;   \r
337         int i;\r
338 \r
339         pdmpriv->InitODMFlag = 0\r
340                 | ODM_BB_DIG\r
341 #ifdef CONFIG_ODM_REFRESH_RAMASK\r
342                 | ODM_BB_RA_MASK\r
343 #endif\r
344                 | ODM_BB_DYNAMIC_TXPWR\r
345                 | ODM_BB_FA_CNT\r
346                 | ODM_BB_RSSI_MONITOR\r
347                 | ODM_BB_CCK_PD\r
348                 | ODM_BB_PWR_SAVE\r
349                 | ODM_MAC_EDCA_TURBO\r
350                 | ODM_RF_TX_PWR_TRACK\r
351                 | ODM_RF_CALIBRATION\r
352 #ifdef CONFIG_ODM_ADAPTIVITY\r
353                 | ODM_BB_ADAPTIVITY\r
354 #endif\r
355                 ;\r
356 \r
357 #ifdef CONFIG_ANTENNA_DIVERSITY\r
358         if(pHalData->AntDivCfg)\r
359                 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;\r
360 #endif\r
361 \r
362 #if (MP_DRIVER==1)\r
363         if (Adapter->registrypriv.mp_mode == 1) {\r
364                 pdmpriv->InitODMFlag = 0\r
365                         | ODM_RF_CALIBRATION\r
366                         | ODM_RF_TX_PWR_TRACK\r
367                         ;\r
368         }\r
369 #endif//(MP_DRIVER==1)\r
370 \r
371 #ifdef CONFIG_DISABLE_ODM\r
372         pdmpriv->InitODMFlag = 0;\r
373 #endif//CONFIG_DISABLE_ODM\r
374 \r
375         //\r
376         // Pointer reference\r
377         //\r
378         //ODM_CMNINFO_MAC_PHY_MODE pHalData->MacPhyMode92D\r
379         //      ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MAC_PHY_MODE,&(pDM_Odm->u1Byte_temp));\r
380 \r
381         ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);\r
382 \r
383         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_TX_UNI,&(Adapter->xmitpriv.tx_bytes));\r
384         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_RX_UNI,&(Adapter->recvpriv.rx_bytes));\r
385         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_WM_MODE,&(pmlmeext->cur_wireless_mode));\r
386         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_CHNL_OFFSET,&(pHalData->nCur40MhzPrimeSC));\r
387         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SEC_MODE,&(Adapter->securitypriv.dot11PrivacyAlgrthm));\r
388         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BW,&(pHalData->CurrentChannelBW ));\r
389         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_CHNL,&( pHalData->CurrentChannel));\r
390         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_NET_CLOSED,&( Adapter->net_closed));\r
391         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_MP_MODE,&(Adapter->registrypriv.mp_mode));\r
392 \r
393         //================= only for 8192D   =================\r
394         /*\r
395         //pHalData->CurrentBandType92D\r
396         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BAND,&(pDM_Odm->u1Byte_temp));\r
397         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_GET_VALUE,&(pDM_Odm->u1Byte_temp));\r
398         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BUDDY_ADAPTOR,&(pDM_Odm->PADAPTER_temp));\r
399         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_DMSP_IS_MASTER,&(pDM_Odm->u1Byte_temp));\r
400         //================= only for 8192D   =================\r
401         // driver havn't those variable now\r
402         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_OPERATION,&(pDM_Odm->u1Byte_temp));\r
403         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_BT_DISABLE_EDCA,&(pDM_Odm->u1Byte_temp));\r
404         */\r
405         \r
406         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));\r
407         ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));\r
408 \r
409 \r
410         for(i=0; i< NUM_STA; i++)\r
411         {\r
412                 //pDM_Odm->pODM_StaInfo[i] = NULL;\r
413                 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);\r
414         }       \r
415 }\r
416 \r
417 void\r
418 rtl8723a_InitHalDm(\r
419         IN      PADAPTER        Adapter\r
420         )\r
421 {\r
422         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
423         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
424         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
425         \r
426         u8      i;\r
427 \r
428         pdmpriv->DM_Type = DM_Type_ByDriver;\r
429         pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;\r
430 \r
431 #ifdef CONFIG_BT_COEXIST\r
432         pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;\r
433 //      btdm_InitBtCoexistDM(Adapter); // Move to BT_CoexistMechanism()\r
434 #endif\r
435         pdmpriv->InitDMFlag = pdmpriv->DMFlag;\r
436         \r
437         Update_ODM_ComInfo_8723a(Adapter);\r
438         ODM_DMInit(pDM_Odm);\r
439         // Save REG_INIDATA_RATE_SEL value for TXDESC.\r
440         for(i = 0 ; i<32 ; i++)\r
441         {\r
442                 pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f;\r
443         }\r
444 \r
445 }\r
446 \r
447 VOID\r
448 rtl8723a_HalDmWatchDog(\r
449         IN      PADAPTER        Adapter\r
450         )\r
451 {\r
452         BOOLEAN         bFwCurrentInPSMode = _FALSE;\r
453         BOOLEAN         bFwPSAwake = _TRUE;\r
454         u8 hw_init_completed = _FALSE;\r
455         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
456         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
457 #ifdef CONFIG_CONCURRENT_MODE\r
458         PADAPTER pbuddy_adapter = Adapter->pbuddy_adapter;\r
459 #endif //CONFIG_CONCURRENT_MODE\r
460 \r
461         hw_init_completed = Adapter->hw_init_completed;\r
462 \r
463         if (hw_init_completed == _FALSE)\r
464                 goto skip_dm;\r
465 \r
466 #ifdef CONFIG_LPS\r
467         bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;\r
468         rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));\r
469 #endif\r
470 \r
471 #ifdef CONFIG_P2P_PS\r
472         // Fw is under p2p powersaving mode, driver should stop dynamic mechanism.\r
473         // modifed by thomas. 2011.06.11.\r
474         if(Adapter->wdinfo.p2p_ps_mode)\r
475                 bFwPSAwake = _FALSE;\r
476 #endif //CONFIG_P2P_PS\r
477 \r
478         if( (hw_init_completed == _TRUE)\r
479                 && ((!bFwCurrentInPSMode) && bFwPSAwake))\r
480         {\r
481                 //\r
482                 // Calculate Tx/Rx statistics.\r
483                 //\r
484                 dm_CheckStatistics(Adapter);\r
485                 \r
486 \r
487 #ifdef CONFIG_CONCURRENT_MODE\r
488                 if(Adapter->adapter_type > PRIMARY_ADAPTER)\r
489                         goto _record_initrate;\r
490 #endif\r
491 \r
492                 //\r
493                 // Dynamically switch RTS/CTS protection.\r
494                 //\r
495                 //dm_CheckProtection(Adapter);\r
496 \r
497 #ifdef CONFIG_PCI_HCI\r
498                 // 20100630 Joseph: Disable Interrupt Migration mechanism temporarily because it degrades Rx throughput.\r
499                 // Tx Migration settings.\r
500                 //dm_InterruptMigration(Adapter);\r
501 \r
502                 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))\r
503                 //      PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));\r
504 #endif\r
505 _record_initrate:\r
506 \r
507                 // Read REG_INIDATA_RATE_SEL value for TXDESC.\r
508                 if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)\r
509                 {\r
510                         pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f;\r
511                 }\r
512                 else\r
513                 {\r
514                         u8      i;\r
515                         for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++)\r
516                         {\r
517                                 pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f;\r
518                         }\r
519                 }\r
520         }\r
521         \r
522 \r
523         //ODM\r
524         if (hw_init_completed == _TRUE)\r
525         {\r
526                 u8      bLinked=_FALSE;\r
527                 u8      bsta_state=_FALSE;\r
528 \r
529                 #ifdef CONFIG_DISABLE_ODM\r
530                 pHalData->odmpriv.SupportAbility = 0;\r
531                 #endif\r
532 \r
533                 if(rtw_linked_check(Adapter))\r
534                         bLinked = _TRUE;\r
535                 \r
536 #ifdef CONFIG_CONCURRENT_MODE\r
537                 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter))\r
538                         bLinked = _TRUE;\r
539 #endif //CONFIG_CONCURRENT_MODE\r
540 \r
541                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);\r
542 \r
543                 if (check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE))\r
544                         bsta_state = _TRUE;\r
545 #ifdef CONFIG_CONCURRENT_MODE\r
546                 if(pbuddy_adapter && check_fwstate(&pbuddy_adapter->mlmepriv, WIFI_STATION_STATE))\r
547                         bsta_state = _TRUE;\r
548 #endif //CONFIG_CONCURRENT_MODE \r
549                 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_STATION_STATE, bsta_state);\r
550 \r
551 \r
552                 ODM_DMWatchdog(&pHalData->odmpriv);\r
553 \r
554         }\r
555 \r
556 skip_dm:\r
557 \r
558         // Check GPIO to determine current RF on/off and Pbc status.\r
559         // Check Hardware Radio ON/OFF or not\r
560 #ifdef CONFIG_PCI_HCI\r
561         if(pHalData->bGpioHwWpsPbc)\r
562 #endif\r
563         {\r
564                 dm_CheckPbcGPIO(Adapter);                               // Add by hpfan 2008-03-11\r
565         }\r
566 \r
567 }\r
568 \r
569 void rtl8723a_init_dm_priv(IN PADAPTER Adapter)\r
570 {\r
571         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
572         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
573         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
574         _rtw_memset(pdmpriv, 0, sizeof(struct dm_priv));\r
575         Init_ODM_ComInfo_8723a(Adapter);\r
576 #ifdef CONFIG_SW_ANTENNA_DIVERSITY      \r
577         //_init_timer(&(pdmpriv->SwAntennaSwitchTimer),  Adapter->pnetdev , odm_SW_AntennaSwitchCallback, Adapter);     \r
578         ODM_InitAllTimers(podmpriv );   \r
579 #endif\r
580 }\r
581 \r
582 void rtl8723a_deinit_dm_priv(IN PADAPTER Adapter)\r
583 {\r
584         PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(Adapter);\r
585         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
586         PDM_ODM_T               podmpriv = &pHalData->odmpriv;\r
587 #ifdef CONFIG_SW_ANTENNA_DIVERSITY      \r
588         //_cancel_timer_ex(&pdmpriv->SwAntennaSwitchTimer);     \r
589         ODM_CancelAllTimers(podmpriv);  \r
590 #endif\r
591 }\r
592 \r