OSDN Git Service

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