1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
21 //============================================================
23 //============================================================
24 #include "mp_precomp.h"
25 #include "phydm_precomp.h"
31 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
33 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
34 PADAPTER Adapter = NULL;
35 HAL_DATA_TYPE *pHalData = NULL;
37 if(pDM_Odm->Adapter==NULL) {
38 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
42 Adapter=pDM_Odm->Adapter;
43 pHalData=GET_HAL_DATA(Adapter);
45 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
46 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
47 pHalData->bIsAnyNonBEPkts = FALSE;
49 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
50 PADAPTER Adapter = pDM_Odm->Adapter;
51 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
52 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
53 Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
56 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VO PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VO_PARAM)));
57 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial VI PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_VI_PARAM)));
58 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
59 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BK PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BK_PARAM)));
62 } // ODM_InitEdcaTurbo
70 // For AP/ADSL use prtl8192cd_priv
71 // For CE/NIC use PADAPTER
75 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
76 // at the same time. In the stage2/3, we need to prive universal interface and merge all
77 // HW dynamic mechanism.
79 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
80 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
82 if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
85 switch (pDM_Odm->SupportPlatform)
89 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
90 odm_EdcaTurboCheckMP(pDM_Odm);
95 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
96 odm_EdcaTurboCheckCE(pDM_Odm);
100 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
102 } // odm_CheckEdcaTurbo
104 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
108 odm_EdcaTurboCheckCE(
112 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
113 PADAPTER Adapter = pDM_Odm->Adapter;
114 u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
115 u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
116 u32 ICType=pDM_Odm->SupportICType;
118 u8 WirelessMode=0xFF; //invalid value
121 u64 cur_tx_bytes = 0;
122 u64 cur_rx_bytes = 0;
123 u8 bbtchange = _FALSE;
124 u8 bBiasOnRx = _FALSE;
125 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
126 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
127 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
128 struct recv_priv *precvpriv = &(Adapter->recvpriv);
129 struct registry_priv *pregpriv = &Adapter->registrypriv;
130 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
131 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
133 if(pDM_Odm->bLinked != _TRUE)
135 precvpriv->bIsAnyNonBEPkts = _FALSE;
139 if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
141 precvpriv->bIsAnyNonBEPkts = _FALSE;
145 if(pDM_Odm->pWirelessMode!=NULL)
146 WirelessMode=*(pDM_Odm->pWirelessMode);
148 IOTPeer = pmlmeinfo->assoc_AP_vendor;
150 if (IOTPeer >= HT_IOT_PEER_MAX)
152 precvpriv->bIsAnyNonBEPkts = _FALSE;
156 if( (pDM_Odm->SupportICType == ODM_RTL8192C) ||
157 (pDM_Odm->SupportICType == ODM_RTL8723A) ||
158 (pDM_Odm->SupportICType == ODM_RTL8188E))
160 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
164 // Check if the status needs to be changed.
165 if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
167 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
168 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
173 if (cur_tx_bytes > (cur_rx_bytes << 2))
174 { // Uplink TP is present.
175 trafficIndex = UP_LINK;
178 { // Balance TP is present.
179 trafficIndex = DOWN_LINK;
184 if (cur_rx_bytes > (cur_tx_bytes << 2))
185 { // Downlink TP is present.
186 trafficIndex = DOWN_LINK;
189 { // Balance TP is present.
190 trafficIndex = UP_LINK;
194 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
196 if (ICType == ODM_RTL8192D) {
198 if (pDM_Odm->RFType == ODM_2T2R) {
199 EDCA_BE_UL = 0x60a42b; //0x5ea42b;
200 EDCA_BE_DL = 0x60a42b; //0x5ea42b;
202 EDCA_BE_UL = 0x6ea42b;
203 EDCA_BE_DL = 0x6ea42b;
208 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {
209 if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
210 EDCA_BE_UL = 0x60a42b;
211 EDCA_BE_DL = 0x60a42b;
213 EDCA_BE_UL = 0x6ea42b;
214 EDCA_BE_DL = 0x6ea42b;
219 //92D txop can't be set to 0x3e for cisco1250
220 if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
222 EDCA_BE_DL = edca_setting_DL[IOTPeer];
223 EDCA_BE_UL = edca_setting_UL[IOTPeer];
225 //merge from 92s_92c_merge temp brunch v2445 20120215
226 else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
228 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
230 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
234 else if(IOTPeer == HT_IOT_PEER_MARVELL)
236 EDCA_BE_DL = edca_setting_DL[IOTPeer];
237 EDCA_BE_UL = edca_setting_UL[IOTPeer];
239 else if(IOTPeer == HT_IOT_PEER_ATHEROS)
241 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
242 EDCA_BE_DL = edca_setting_DL[IOTPeer];
245 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
247 EDCA_BE_UL = 0x5ea42b;
248 EDCA_BE_DL = 0x5ea42b;
250 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));
253 if (trafficIndex == DOWN_LINK)
254 edca_param = EDCA_BE_DL;
256 edca_param = EDCA_BE_UL;
258 rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
260 pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
263 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
268 // Turn Off EDCA turbo here.
269 // Restore original EDCA according to the declaration of AP.
271 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
273 rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
274 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
281 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
283 odm_EdcaTurboCheckMP(
288 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
289 PADAPTER Adapter = pDM_Odm->Adapter;
290 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
292 PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
293 PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
294 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
295 PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
296 //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
297 u8Byte Ext_curTxOkCnt = 0;
298 u8Byte Ext_curRxOkCnt = 0;
299 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
300 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
302 // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
303 u8Byte curTxOkCnt = 0;
304 u8Byte curRxOkCnt = 0;
305 u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
306 u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
307 u4Byte EDCA_BE = 0x5ea42b;
309 BOOLEAN *pbIsCurRDLState=NULL;
310 BOOLEAN bLastIsCurRDLState=FALSE;
311 BOOLEAN bBiasOnRx=FALSE;
312 BOOLEAN bEdcaTurboOn=FALSE;
313 u1Byte TxRate = 0xFF;
316 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
317 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Orginial BE PARAM: 0x%x\n",ODM_Read4Byte(pDM_Odm,ODM_EDCA_BE_PARAM)));
319 ////===============================
320 ////list paramter for different platform
321 ////===============================
322 bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
323 pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
326 if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
327 pHalData->bIsAnyNonBEPkts = TRUE;
329 pMgntInfo->NumNonBePkt = 0;
331 // Caculate TX/RX TP:
332 //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;
333 //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;
334 curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;
335 curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;
336 pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
337 pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
339 if(pExtAdapter == NULL)
340 pExtAdapter = pDefaultAdapter;
342 Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
343 Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
344 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
345 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
346 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
348 curTxOkCnt = Ext_curTxOkCnt ;
349 curRxOkCnt = Ext_curRxOkCnt ;
352 IOTPeer=pMgntInfo->IOTPeer;
353 bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
354 bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;
355 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx \n",pHalData->bIsAnyNonBEPkts));
358 ////===============================
359 ////check if edca turbo is disabled
360 ////===============================
361 if(odm_IsEdcaTurboDisable(pDM_Odm))
363 pHalData->bIsAnyNonBEPkts = FALSE;
364 pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
365 pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
366 pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
367 pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
371 ////===============================
372 ////remove iot case out
373 ////===============================
374 ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
377 ////===============================
378 ////Check if the status needs to be changed.
379 ////===============================
382 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
383 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
384 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
386 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);
388 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);
390 //modify by Guo.Mingzhi 2011-12-29
391 EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
392 if(IS_HARDWARE_TYPE_8821U(Adapter))
394 if(pMgntInfo->RegTxDutyEnable)
396 //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
397 if(!pMgntInfo->ForcedDataRate) //auto rate
399 if(pDM_Odm->TxRate != 0xFF)
400 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
404 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
407 value64 = (curRxOkCnt<<2);
408 if(curTxOkCnt < value64) //Downlink
409 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
412 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/
413 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/
414 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
415 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
420 case MGN_VHT1SS_MCS6:
421 case MGN_VHT1SS_MCS5:
426 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
428 case MGN_VHT1SS_MCS4:
431 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
433 case MGN_VHT1SS_MCS3:
436 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
438 case MGN_VHT1SS_MCS2:
441 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
443 case MGN_VHT1SS_MCS1:
447 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
449 case MGN_VHT1SS_MCS0:
452 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
455 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
463 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
467 else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
468 if(pMgntInfo->RegTxDutyEnable)
470 //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
471 // it;s the same issue as 8811AU
472 if(!pMgntInfo->ForcedDataRate) //auto rate
474 if(pDM_Odm->TxRate != 0xFF)
475 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
479 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
482 value64 = (curRxOkCnt<<2);
483 if(curTxOkCnt < value64) //Downlink
484 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
487 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/
488 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/
489 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
490 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
495 case MGN_VHT2SS_MCS9:
496 case MGN_VHT1SS_MCS9:
497 case MGN_VHT1SS_MCS8:
500 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);
501 case MGN_VHT2SS_MCS8:
502 case MGN_VHT1SS_MCS7:
506 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
507 case MGN_VHT2SS_MCS7:
508 case MGN_VHT2SS_MCS6:
509 case MGN_VHT1SS_MCS6:
510 case MGN_VHT1SS_MCS5:
514 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
516 case MGN_VHT2SS_MCS5:
517 case MGN_VHT2SS_MCS4:
518 case MGN_VHT1SS_MCS4:
519 case MGN_VHT1SS_MCS3:
525 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
527 case MGN_VHT2SS_MCS3:
528 case MGN_VHT2SS_MCS2:
529 case MGN_VHT2SS_MCS1:
530 case MGN_VHT1SS_MCS2:
531 case MGN_VHT1SS_MCS1:
539 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
541 case MGN_VHT2SS_MCS0:
542 case MGN_VHT1SS_MCS0:
547 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
550 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
558 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
562 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
564 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
566 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
568 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA_BE_DL : 0x%lx EDCA_BE_UL : 0x%lx EDCA_BE : 0x%lx \n",EDCA_BE_DL,EDCA_BE_UL,EDCA_BE));
573 // Turn Off EDCA turbo here.
574 // Restore original EDCA according to the declaration of AP.
575 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
577 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
579 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
580 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
588 //check if edca turbo is disabled
590 odm_IsEdcaTurboDisable(
594 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
595 PADAPTER Adapter = pDM_Odm->Adapter;
596 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
597 u4Byte IOTPeer=pMgntInfo->IOTPeer;
599 if(pDM_Odm->bBtDisableEdcaTurbo)
601 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
605 if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
606 (pDM_Odm->bWIFITest)||
607 (IOTPeer>= HT_IOT_PEER_MAX))
609 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
614 // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
615 // 2. User may disable EDCA Turbo mode with OID settings.
616 if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
617 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
626 //add iot case here: for MP/CE
628 ODM_EdcaParaSelByIot(
630 OUT u4Byte *EDCA_BE_UL,
631 OUT u4Byte *EDCA_BE_DL
634 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
635 PADAPTER Adapter = pDM_Odm->Adapter;
636 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
638 u4Byte ICType=pDM_Odm->SupportICType;
639 u1Byte WirelessMode=0xFF; //invalid value
640 u4Byte RFType=pDM_Odm->RFType;
641 u4Byte IOTPeerSubType = 0;
643 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
644 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
646 if(pDM_Odm->pWirelessMode!=NULL)
647 WirelessMode=*(pDM_Odm->pWirelessMode);
649 ///////////////////////////////////////////////////////////
650 ////list paramter for different platform
652 IOTPeer=pMgntInfo->IOTPeer;
653 IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
654 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
657 if(ICType==ODM_RTL8192D)
660 if(pDM_Odm->RFType==ODM_2T2R)
662 (*EDCA_BE_UL) = 0x60a42b; //0x5ea42b;
663 (*EDCA_BE_DL) = 0x60a42b; //0x5ea42b;
668 (*EDCA_BE_UL) = 0x6ea42b;
669 (*EDCA_BE_DL) = 0x6ea42b;
673 ////============================
675 ////============================
680 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){
681 if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {
682 (*EDCA_BE_UL) = 0x60a42b;
683 (*EDCA_BE_DL) = 0x60a42b;
687 (*EDCA_BE_UL) = 0x6ea42b;
688 (*EDCA_BE_DL) = 0x6ea42b;
693 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
695 (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
696 (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
699 #if (INTEL_PROXIMITY_SUPPORT == 1)
700 if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
702 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
707 if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
708 {// To check whether we shall force turn on TXOP configuration.
709 if(!((*EDCA_BE_UL) & 0xffff0000))
710 (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
711 if(!((*EDCA_BE_DL) & 0xffff0000))
712 (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
715 //92D txop can't be set to 0x3e for cisco1250
716 if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))
718 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
719 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
721 //merge from 92s_92c_merge temp brunch v2445 20120215
722 else if((IOTPeer == HT_IOT_PEER_CISCO) &&((WirelessMode==ODM_WM_G)||(WirelessMode==(ODM_WM_B|ODM_WM_G))||(WirelessMode==ODM_WM_A)||(WirelessMode==ODM_WM_B)))
724 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
726 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
728 (*EDCA_BE_DL) = 0xa630;
731 else if(IOTPeer == HT_IOT_PEER_MARVELL)
733 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
734 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
736 else if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)
738 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
739 if(WirelessMode==ODM_WM_G)
740 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
742 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
744 if(ICType == ODM_RTL8821)
745 (*EDCA_BE_DL) = 0x5ea630;
750 if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
752 (*EDCA_BE_DL) = 0x432b;
753 (*EDCA_BE_UL) = 0x432b;
758 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
760 (*EDCA_BE_UL) = 0x5ea42b;
761 (*EDCA_BE_DL) = 0x5ea42b;
763 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8812A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\n",(*EDCA_BE_UL),(*EDCA_BE_DL)));
766 if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK)) /*8814AU and 8814AR*/
768 (*EDCA_BE_UL) = 0x5ea42b;
769 (*EDCA_BE_DL) = 0xa42b;
771 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8814A: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx\n",(*EDCA_BE_UL),(*EDCA_BE_DL)));
776 // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.
777 if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) &&
778 (pMgntInfo->dot11CurrentChannelNumber == 6))
780 (*EDCA_BE_DL) = 0xa92b;
783 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Special: EDCA_BE_UL=0x%lx EDCA_BE_DL =0x%lx, IOTPeer = %d\n",(*EDCA_BE_UL),(*EDCA_BE_DL), IOTPeer));
789 odm_EdcaChooseTrafficIdx(
791 IN u8Byte cur_tx_bytes,
792 IN u8Byte cur_rx_bytes,
793 IN BOOLEAN bBiasOnRx,
794 OUT BOOLEAN *pbIsCurRDLState
797 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
802 if(cur_tx_bytes>(cur_rx_bytes*4))
804 *pbIsCurRDLState=FALSE;
805 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
810 *pbIsCurRDLState=TRUE;
811 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
817 if(cur_rx_bytes>(cur_tx_bytes*4))
819 *pbIsCurRDLState=TRUE;
820 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
825 *pbIsCurRDLState=FALSE;
826 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));