1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
\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
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
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
19 ******************************************************************************/
\r
20 //============================================================
\r
23 // This file is for 92CE/92CU dynamic mechanism only
\r
26 //============================================================
\r
27 #define _RTL8723A_DM_C_
\r
29 //============================================================
\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
37 #include <rtl8723a_hal.h>
\r
39 //============================================================
\r
41 //============================================================
\r
50 PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);
\r
51 u1Byte CurRate, RateThreshold;
\r
53 if(pMgntInfo->pHTInfo->bCurBW40MHz)
\r
54 RateThreshold = MGN_MCS1;
\r
56 RateThreshold = MGN_MCS3;
\r
58 if(Adapter->TxStats.CurrentInitTxRate <= RateThreshold)
\r
60 pMgntInfo->bDmDisableProtect = TRUE;
\r
61 DbgPrint("Forced disable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
\r
65 pMgntInfo->bDmDisableProtect = FALSE;
\r
66 DbgPrint("Enable protect: %x\n", Adapter->TxStats.CurrentInitTxRate);
\r
77 if(!Adapter->MgntInfo.bMediaConnect)
\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
83 // Calculate current Tx Rate(Successful transmited!!)
\r
85 // Calculate current Rx Rate(Successful received!!)
\r
87 //for tx tx retry count
\r
88 rtw_hal_get_hwreg( Adapter, HW_VAR_RETRY_COUNT, (pu1Byte)(&Adapter->TxStats.NumTxRetryCount) );
\r
92 static void dm_CheckPbcGPIO(_adapter *padapter)
\r
95 u8 bPbcPressed = _FALSE;
\r
97 if(!padapter->registrypriv.hw_wps_pbc)
\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
105 tmp1byte &= ~(HAL_8192C_HW_GPIO_WPS_BIT);
\r
106 rtw_write8(padapter, GPIO_IN, tmp1byte); //reset the floating voltage level
\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
112 tmp1byte =rtw_read8(padapter, GPIO_IN);
\r
114 if (tmp1byte == 0xff)
\r
117 if (tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)
\r
119 bPbcPressed = _TRUE;
\r
122 tmp1byte = rtw_read8(padapter, GPIO_IN);
\r
123 //RT_TRACE(COMP_IO, DBG_TRACE, ("dm_CheckPbcGPIO - %x\n", tmp1byte));
\r
125 if (tmp1byte == 0xff || padapter->init_adpt_in_progress)
\r
128 if((tmp1byte&HAL_8192C_HW_GPIO_WPS_BIT)==0)
\r
130 bPbcPressed = _TRUE;
\r
134 if( _TRUE == bPbcPressed)
\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
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
144 kobject_hotplug(&padapter->pnetdev->class_dev.kobj, KOBJ_NET_PBC);
\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
153 #ifdef PLATFORM_LINUX
\r
154 rtw_signal_process(padapter->pid[0], SIGUSR1);
\r
160 #ifdef CONFIG_PCI_HCI
\r
163 // Perform interrupt migration dynamically to reduce CPU utilization.
\r
166 // 1. Do not enable migration under WIFI test.
\r
168 // Created by Roger, 2010.03.05.
\r
171 dm_InterruptMigration(
\r
172 IN PADAPTER Adapter
\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
182 // Retrieve current interrupt migration and Tx four ACs IMR settings first.
\r
183 bCurrentIntMt = pHalData->bInterruptMigration;
\r
184 bCurrentACIntDisable = pHalData->bDisableTxInt;
\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
190 if(!Adapter->registrypriv.wifi_spec &&
\r
191 (check_fwstate(pmlmepriv, _FW_LINKED)== _TRUE) &&
\r
192 pmlmepriv->LinkDetectInfo.bHigherBusyTraffic)
\r
194 IntMtToSet = _TRUE;
\r
196 // To check whether we should disable Tx interrupt or not.
\r
197 if(pmlmepriv->LinkDetectInfo.bHigherBusyRxTraffic )
\r
198 ACIntToSet = _TRUE;
\r
201 //Update current settings.
\r
202 if( bCurrentIntMt != IntMtToSet ){
\r
203 DBG_8192C("%s(): Update interrrupt migration(%d)\n",__FUNCTION__,IntMtToSet);
\r
207 // <Roger_Notes> Set interrrupt migration timer and corresponging Tx/Rx counter.
\r
208 // timer 25ns*0xfa0=100us for 0xf packets.
\r
211 rtw_write32(Adapter, REG_INT_MIG, 0xff000fa0);// 0x306:Rx, 0x307:Tx
\r
212 pHalData->bInterruptMigration = IntMtToSet;
\r
216 // Reset all interrupt migration settings.
\r
217 rtw_write32(Adapter, REG_INT_MIG, 0);
\r
218 pHalData->bInterruptMigration = IntMtToSet;
\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
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
231 UpdateInterruptMask8192CE( Adapter, 0, RT_AC_INT_MASKS );
\r
232 pHalData->bDisableTxInt = ACIntToSet;
\r
234 else// Enable four ACs interrupts.
\r
236 UpdateInterruptMask8192CE( Adapter, RT_AC_INT_MASKS, 0 );
\r
237 pHalData->bDisableTxInt = ACIntToSet;
\r
246 // Initialize GPIO setting registers
\r
249 dm_InitGPIOSetting(
\r
250 IN PADAPTER Adapter
\r
253 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
257 tmp1byte = rtw_read8(Adapter, REG_GPIO_MUXCFG);
\r
258 tmp1byte &= (GPIOSEL_GPIO | ~GPIOSEL_ENBT);
\r
260 rtw_write8(Adapter, REG_GPIO_MUXCFG, tmp1byte);
\r
262 //============================================================
\r
264 //============================================================
\r
265 static void Init_ODM_ComInfo_8723a(PADAPTER Adapter)
\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
275 _rtw_memset(pDM_Odm,0,sizeof(pDM_Odm));
\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
282 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_INTERFACE,Adapter->interface_type);//RTL871X_HCI_TYPE
\r
284 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_IC_TYPE,ODM_RTL8723A);
\r
287 if(IS_8723A_A_CUT(pHalData->VersionID))
\r
290 cut_ver = ODM_CUT_A;
\r
292 else if(IS_8723A_B_CUT(pHalData->VersionID))
\r
295 cut_ver = ODM_CUT_B;
\r
299 fab_ver = ODM_TSMC;
\r
300 cut_ver = ODM_CUT_A;
\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
306 #ifdef CONFIG_USB_HCI
\r
307 ODM_CmnInfoInit(pDM_Odm,ODM_CMNINFO_BOARD_TYPE,pHalData->BoardType);
\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
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
319 if(pHalData->rf_type == RF_1T1R){
\r
320 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T1R);
\r
322 else if(pHalData->rf_type == RF_2T2R){
\r
323 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_2T2R);
\r
325 else if(pHalData->rf_type == RF_1T2R){
\r
326 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_RF_TYPE,ODM_1T2R);
\r
329 static void Update_ODM_ComInfo_8723a(PADAPTER Adapter)
\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
339 pdmpriv->InitODMFlag = 0
\r
341 #ifdef CONFIG_ODM_REFRESH_RAMASK
\r
344 | ODM_BB_DYNAMIC_TXPWR
\r
346 | ODM_BB_RSSI_MONITOR
\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
357 #ifdef CONFIG_ANTENNA_DIVERSITY
\r
358 if(pHalData->AntDivCfg)
\r
359 pdmpriv->InitODMFlag |= ODM_BB_ANT_DIV;
\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
369 #endif//(MP_DRIVER==1)
\r
371 #ifdef CONFIG_DISABLE_ODM
\r
372 pdmpriv->InitODMFlag = 0;
\r
373 #endif//CONFIG_DISABLE_ODM
\r
376 // Pointer reference
\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
381 ODM_CmnInfoUpdate(pDM_Odm,ODM_CMNINFO_ABILITY,pdmpriv->InitODMFlag);
\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
393 //================= only for 8192D =================
\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
406 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_SCAN,&(pmlmepriv->bScanInProcess));
\r
407 ODM_CmnInfoHook(pDM_Odm,ODM_CMNINFO_POWER_SAVING,&(pwrctrlpriv->bpower_saving));
\r
410 for(i=0; i< NUM_STA; i++)
\r
412 //pDM_Odm->pODM_StaInfo[i] = NULL;
\r
413 ODM_CmnInfoPtrArrayHook(pDM_Odm, ODM_CMNINFO_STA_STATUS,i,NULL);
\r
418 rtl8723a_InitHalDm(
\r
419 IN PADAPTER Adapter
\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
428 pdmpriv->DM_Type = DM_Type_ByDriver;
\r
429 pdmpriv->DMFlag = DYNAMIC_FUNC_DISABLE;
\r
431 #ifdef CONFIG_BT_COEXIST
\r
432 pdmpriv->DMFlag |= DYNAMIC_FUNC_BT;
\r
433 // btdm_InitBtCoexistDM(Adapter); // Move to BT_CoexistMechanism()
\r
435 pdmpriv->InitDMFlag = pdmpriv->DMFlag;
\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
442 pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL+i) & 0x3f;
\r
448 rtl8723a_HalDmWatchDog(
\r
449 IN PADAPTER Adapter
\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
461 hw_init_completed = Adapter->hw_init_completed;
\r
463 if (hw_init_completed == _FALSE)
\r
467 bFwCurrentInPSMode = adapter_to_pwrctl(Adapter)->bFwCurrentInPSMode;
\r
468 rtw_hal_get_hwreg(Adapter, HW_VAR_FWLPS_RF_ON, (u8 *)(&bFwPSAwake));
\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
478 if( (hw_init_completed == _TRUE)
\r
479 && ((!bFwCurrentInPSMode) && bFwPSAwake))
\r
482 // Calculate Tx/Rx statistics.
\r
484 dm_CheckStatistics(Adapter);
\r
487 #ifdef CONFIG_CONCURRENT_MODE
\r
488 if(Adapter->adapter_type > PRIMARY_ADAPTER)
\r
489 goto _record_initrate;
\r
493 // Dynamically switch RTS/CTS protection.
\r
495 //dm_CheckProtection(Adapter);
\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
502 //if(Adapter->HalFunc.TxCheckStuckHandler(Adapter))
\r
503 // PlatformScheduleWorkItem(&(GET_HAL_DATA(Adapter)->HalResetWorkItem));
\r
507 // Read REG_INIDATA_RATE_SEL value for TXDESC.
\r
508 if(check_fwstate(&Adapter->mlmepriv, WIFI_STATION_STATE) == _TRUE)
\r
510 pdmpriv->INIDATA_RATE[0] = rtw_read8(Adapter, REG_INIDATA_RATE_SEL) & 0x3f;
\r
515 for(i=1 ; i < (Adapter->stapriv.asoc_sta_count + 1); i++)
\r
517 pdmpriv->INIDATA_RATE[i] = rtw_read8(Adapter, (REG_INIDATA_RATE_SEL+i)) & 0x3f;
\r
524 if (hw_init_completed == _TRUE)
\r
527 u8 bsta_state=_FALSE;
\r
529 #ifdef CONFIG_DISABLE_ODM
\r
530 pHalData->odmpriv.SupportAbility = 0;
\r
533 if(rtw_linked_check(Adapter))
\r
536 #ifdef CONFIG_CONCURRENT_MODE
\r
537 if(pbuddy_adapter && rtw_linked_check(pbuddy_adapter))
\r
539 #endif //CONFIG_CONCURRENT_MODE
\r
541 ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_LINK, bLinked);
\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
552 ODM_DMWatchdog(&pHalData->odmpriv);
\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
564 dm_CheckPbcGPIO(Adapter); // Add by hpfan 2008-03-11
\r
569 void rtl8723a_init_dm_priv(IN PADAPTER Adapter)
\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
582 void rtl8723a_deinit_dm_priv(IN PADAPTER Adapter)
\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