1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 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
21 //============================================================
\r
23 //============================================================
\r
24 #include "mp_precomp.h"
\r
25 #include "phydm_precomp.h"
\r
31 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
33 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
\r
34 PADAPTER Adapter = NULL;
\r
35 HAL_DATA_TYPE *pHalData = NULL;
\r
37 if(pDM_Odm->Adapter==NULL) {
\r
38 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
\r
42 Adapter=pDM_Odm->Adapter;
\r
43 pHalData=GET_HAL_DATA(Adapter);
\r
45 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
\r
46 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
\r
47 pHalData->bIsAnyNonBEPkts = FALSE;
\r
49 #elif(DM_ODM_SUPPORT_TYPE==ODM_CE)
\r
50 PADAPTER Adapter = pDM_Odm->Adapter;
\r
51 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
\r
52 pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
\r
53 Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;
\r
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)));
\r
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)));
\r
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)));
\r
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)));
\r
62 } // ODM_InitEdcaTurbo
\r
70 // For AP/ADSL use prtl8192cd_priv
\r
71 // For CE/NIC use PADAPTER
\r
75 // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate
\r
76 // at the same time. In the stage2/3, we need to prive universal interface and merge all
\r
77 // HW dynamic mechanism.
\r
79 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
80 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));
\r
82 if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
\r
85 switch (pDM_Odm->SupportPlatform)
\r
89 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
\r
90 odm_EdcaTurboCheckMP(pDM_Odm);
\r
95 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
\r
96 odm_EdcaTurboCheckCE(pDM_Odm);
\r
100 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
\r
102 } // odm_CheckEdcaTurbo
\r
104 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
\r
108 odm_EdcaTurboCheckCE(
\r
112 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
113 PADAPTER Adapter = pDM_Odm->Adapter;
\r
114 u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
\r
115 u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
\r
116 u32 ICType=pDM_Odm->SupportICType;
\r
118 u8 WirelessMode=0xFF; //invalid value
\r
121 u64 cur_tx_bytes = 0;
\r
122 u64 cur_rx_bytes = 0;
\r
123 u8 bbtchange = _FALSE;
\r
124 u8 bBiasOnRx = _FALSE;
\r
125 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
126 struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);
\r
127 struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);
\r
128 struct recv_priv *precvpriv = &(Adapter->recvpriv);
\r
129 struct registry_priv *pregpriv = &Adapter->registrypriv;
\r
130 struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);
\r
131 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
\r
133 if(pDM_Odm->bLinked != _TRUE)
\r
135 precvpriv->bIsAnyNonBEPkts = _FALSE;
\r
139 if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
\r
141 precvpriv->bIsAnyNonBEPkts = _FALSE;
\r
145 if(pDM_Odm->pWirelessMode!=NULL)
\r
146 WirelessMode=*(pDM_Odm->pWirelessMode);
\r
148 IOTPeer = pmlmeinfo->assoc_AP_vendor;
\r
150 if (IOTPeer >= HT_IOT_PEER_MAX)
\r
152 precvpriv->bIsAnyNonBEPkts = _FALSE;
\r
156 if (pDM_Odm->SupportICType & ODM_RTL8188E) {
\r
157 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
\r
161 // Check if the status needs to be changed.
\r
162 if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
\r
164 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
\r
165 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
\r
167 //traffic, TX or RX
\r
170 if (cur_tx_bytes > (cur_rx_bytes << 2))
\r
171 { // Uplink TP is present.
\r
172 trafficIndex = UP_LINK;
\r
175 { // Balance TP is present.
\r
176 trafficIndex = DOWN_LINK;
\r
181 if (cur_rx_bytes > (cur_tx_bytes << 2))
\r
182 { // Downlink TP is present.
\r
183 trafficIndex = DOWN_LINK;
\r
186 { // Balance TP is present.
\r
187 trafficIndex = UP_LINK;
\r
191 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
\r
193 if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) {
\r
194 EDCA_BE_UL = 0x6ea42b;
\r
195 EDCA_BE_DL = 0x6ea42b;
\r
198 //92D txop can't be set to 0x3e for cisco1250
\r
199 if ((IOTPeer == HT_IOT_PEER_CISCO) && (WirelessMode == ODM_WM_N24G))
\r
201 EDCA_BE_DL = edca_setting_DL[IOTPeer];
\r
202 EDCA_BE_UL = edca_setting_UL[IOTPeer];
\r
204 //merge from 92s_92c_merge temp brunch v2445 20120215
\r
205 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)))
\r
207 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
\r
209 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
\r
211 EDCA_BE_DL = 0xa630;
\r
213 else if(IOTPeer == HT_IOT_PEER_MARVELL)
\r
215 EDCA_BE_DL = edca_setting_DL[IOTPeer];
\r
216 EDCA_BE_UL = edca_setting_UL[IOTPeer];
\r
218 else if(IOTPeer == HT_IOT_PEER_ATHEROS)
\r
220 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
\r
221 EDCA_BE_DL = edca_setting_DL[IOTPeer];
\r
224 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
\r
226 EDCA_BE_UL = 0x5ea42b;
\r
227 EDCA_BE_DL = 0x5ea42b;
\r
229 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));
\r
232 if (trafficIndex == DOWN_LINK)
\r
233 edca_param = EDCA_BE_DL;
\r
235 edca_param = EDCA_BE_UL;
\r
237 rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
\r
239 pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
\r
242 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
\r
247 // Turn Off EDCA turbo here.
\r
248 // Restore original EDCA according to the declaration of AP.
\r
250 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
\r
252 rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
\r
253 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
\r
260 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
\r
262 odm_EdcaTurboCheckMP(
\r
267 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
268 PADAPTER Adapter = pDM_Odm->Adapter;
\r
269 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
271 PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);
\r
272 PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;
\r
273 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
274 PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;
\r
275 //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn
\r
276 u8Byte Ext_curTxOkCnt = 0;
\r
277 u8Byte Ext_curRxOkCnt = 0;
\r
278 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
\r
279 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
\r
281 // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.
\r
282 u8Byte curTxOkCnt = 0;
\r
283 u8Byte curRxOkCnt = 0;
\r
284 u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];
\r
285 u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];
\r
286 u4Byte EDCA_BE = 0x5ea42b;
\r
288 BOOLEAN *pbIsCurRDLState=NULL;
\r
289 BOOLEAN bLastIsCurRDLState=FALSE;
\r
290 BOOLEAN bBiasOnRx=FALSE;
\r
291 BOOLEAN bEdcaTurboOn=FALSE;
\r
292 u1Byte TxRate = 0xFF;
\r
295 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));
\r
296 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)));
\r
298 ////===============================
\r
299 ////list paramter for different platform
\r
300 ////===============================
\r
301 bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
\r
302 pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);
\r
304 //2012/09/14 MH Add
\r
305 if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !(Adapter->MgntInfo.bWiFiConfg & RT_WIFI_LOGO))
\r
306 pHalData->bIsAnyNonBEPkts = TRUE;
\r
308 pMgntInfo->NumNonBePkt = 0;
\r
310 // Caculate TX/RX TP:
\r
311 curTxOkCnt = pDM_Odm->curTxOkCnt;
\r
312 curRxOkCnt = pDM_Odm->curRxOkCnt;
\r
315 if(pExtAdapter == NULL)
\r
316 pExtAdapter = pDefaultAdapter;
\r
318 Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;
\r
319 Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;
\r
320 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
\r
321 //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.
\r
322 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
\r
324 curTxOkCnt = Ext_curTxOkCnt ;
\r
325 curRxOkCnt = Ext_curRxOkCnt ;
\r
328 IOTPeer=pMgntInfo->IOTPeer;
\r
329 bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;
\r
330 bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;
\r
331 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx \n",pHalData->bIsAnyNonBEPkts));
\r
334 ////===============================
\r
335 ////check if edca turbo is disabled
\r
336 ////===============================
\r
337 if(odm_IsEdcaTurboDisable(pDM_Odm))
\r
339 pHalData->bIsAnyNonBEPkts = FALSE;
\r
340 pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
\r
341 pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
\r
342 pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;
\r
343 pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;
\r
347 ////===============================
\r
348 ////remove iot case out
\r
349 ////===============================
\r
350 ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
\r
353 ////===============================
\r
354 ////Check if the status needs to be changed.
\r
355 ////===============================
\r
358 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));
\r
359 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));
\r
360 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));
\r
362 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);
\r
364 odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);
\r
366 //modify by Guo.Mingzhi 2011-12-29
\r
367 if( Adapter->AP_EDCA_PARAM[0] != EDCA_BE )
\r
368 EDCA_BE = Adapter->AP_EDCA_PARAM[0];
\r
370 EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;
\r
371 if(IS_HARDWARE_TYPE_8821U(Adapter))
\r
373 if(pMgntInfo->RegTxDutyEnable)
\r
375 //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
\r
376 if(!pMgntInfo->ForcedDataRate) //auto rate
\r
378 if(pDM_Odm->TxRate != 0xFF)
\r
379 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
\r
383 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
\r
386 value64 = (curRxOkCnt<<2);
\r
387 if(curTxOkCnt < value64) //Downlink
\r
388 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
391 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/
\r
392 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/
\r
393 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
\r
394 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
399 case MGN_VHT1SS_MCS6:
\r
400 case MGN_VHT1SS_MCS5:
\r
405 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
\r
407 case MGN_VHT1SS_MCS4:
\r
410 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
\r
412 case MGN_VHT1SS_MCS3:
\r
415 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
\r
417 case MGN_VHT1SS_MCS2:
\r
420 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
\r
422 case MGN_VHT1SS_MCS1:
\r
426 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
\r
428 case MGN_VHT1SS_MCS0:
\r
431 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
\r
434 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
442 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
446 else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
\r
447 if(pMgntInfo->RegTxDutyEnable)
\r
449 //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)
\r
450 // it;s the same issue as 8811AU
\r
451 if(!pMgntInfo->ForcedDataRate) //auto rate
\r
453 if(pDM_Odm->TxRate != 0xFF)
\r
454 TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate);
\r
458 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
\r
461 value64 = (curRxOkCnt<<2);
\r
462 if(curTxOkCnt < value64) //Downlink
\r
463 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
466 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/
\r
467 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/
\r
468 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))
\r
469 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
474 case MGN_VHT2SS_MCS9:
\r
475 case MGN_VHT1SS_MCS9:
\r
476 case MGN_VHT1SS_MCS8:
\r
479 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);
\r
480 case MGN_VHT2SS_MCS8:
\r
481 case MGN_VHT1SS_MCS7:
\r
485 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);
\r
486 case MGN_VHT2SS_MCS7:
\r
487 case MGN_VHT2SS_MCS6:
\r
488 case MGN_VHT1SS_MCS6:
\r
489 case MGN_VHT1SS_MCS5:
\r
493 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
\r
495 case MGN_VHT2SS_MCS5:
\r
496 case MGN_VHT2SS_MCS4:
\r
497 case MGN_VHT1SS_MCS4:
\r
498 case MGN_VHT1SS_MCS3:
\r
504 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
\r
506 case MGN_VHT2SS_MCS3:
\r
507 case MGN_VHT2SS_MCS2:
\r
508 case MGN_VHT2SS_MCS1:
\r
509 case MGN_VHT1SS_MCS2:
\r
510 case MGN_VHT1SS_MCS1:
\r
518 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
\r
520 case MGN_VHT2SS_MCS0:
\r
521 case MGN_VHT1SS_MCS0:
\r
526 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
\r
529 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
537 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
541 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
\r
543 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
\r
545 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
\r
547 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));
\r
552 // Turn Off EDCA turbo here.
\r
553 // Restore original EDCA according to the declaration of AP.
\r
554 if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
\r
556 Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
\r
558 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;
\r
559 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));
\r
567 //check if edca turbo is disabled
\r
569 odm_IsEdcaTurboDisable(
\r
573 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
574 PADAPTER Adapter = pDM_Odm->Adapter;
\r
575 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
576 u4Byte IOTPeer=pMgntInfo->IOTPeer;
\r
578 if(pDM_Odm->bBtDisableEdcaTurbo)
\r
580 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
\r
584 if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
\r
585 (pDM_Odm->WIFITest & RT_WIFI_LOGO)||
\r
586 (IOTPeer>= HT_IOT_PEER_MAX))
\r
588 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
\r
593 // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue
\r
594 // 2. User may disable EDCA Turbo mode with OID settings.
\r
595 if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){
\r
596 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));
\r
605 //add iot case here: for MP/CE
\r
607 ODM_EdcaParaSelByIot(
\r
609 OUT u4Byte *EDCA_BE_UL,
\r
610 OUT u4Byte *EDCA_BE_DL
\r
613 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
614 PADAPTER Adapter = pDM_Odm->Adapter;
\r
616 u4Byte ICType=pDM_Odm->SupportICType;
\r
617 u1Byte WirelessMode=0xFF; //invalid value
\r
618 u4Byte IOTPeerSubType = 0;
\r
620 PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
\r
621 u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
\r
623 if(pDM_Odm->pWirelessMode!=NULL)
\r
624 WirelessMode=*(pDM_Odm->pWirelessMode);
\r
626 ///////////////////////////////////////////////////////////
\r
627 ////list paramter for different platform
\r
629 IOTPeer=pMgntInfo->IOTPeer;
\r
630 IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
\r
631 GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
\r
633 ////============================
\r
634 /// IOT case for MP
\r
635 ////============================
\r
636 if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) {
\r
637 (*EDCA_BE_UL) = 0x6ea42b;
\r
638 (*EDCA_BE_DL) = 0x6ea42b;
\r
641 if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
\r
643 (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];
\r
644 (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];
\r
647 #if (INTEL_PROXIMITY_SUPPORT == 1)
\r
648 if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
\r
650 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
\r
655 if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))
\r
656 {// To check whether we shall force turn on TXOP configuration.
\r
657 if(!((*EDCA_BE_UL) & 0xffff0000))
\r
658 (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.
\r
659 if(!((*EDCA_BE_DL) & 0xffff0000))
\r
660 (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.
\r
663 //92D txop can't be set to 0x3e for cisco1250
\r
664 if ((IOTPeer == HT_IOT_PEER_CISCO) && (WirelessMode == ODM_WM_N24G))
\r
666 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
\r
667 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
\r
669 //merge from 92s_92c_merge temp brunch v2445 20120215
\r
670 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)))
\r
672 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
\r
674 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
\r
676 (*EDCA_BE_DL) = 0xa630;
\r
679 else if(IOTPeer == HT_IOT_PEER_MARVELL)
\r
681 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
\r
682 (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
\r
684 else if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)
\r
686 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue.
\r
687 if(WirelessMode==ODM_WM_G)
\r
688 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
\r
690 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
\r
692 if(ICType == ODM_RTL8821)
\r
693 (*EDCA_BE_DL) = 0x5ea630;
\r
698 if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE
\r
700 (*EDCA_BE_UL) = 0x5ea42b;
\r
701 (*EDCA_BE_DL) = 0x5ea42b;
\r
703 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)));
\r
706 if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK)) /*8814AU and 8814AR*/
\r
708 (*EDCA_BE_UL) = 0x5ea42b;
\r
709 (*EDCA_BE_DL) = 0xa42b;
\r
711 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)));
\r
714 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));
\r
720 odm_EdcaChooseTrafficIdx(
\r
722 IN u8Byte cur_tx_bytes,
\r
723 IN u8Byte cur_rx_bytes,
\r
724 IN BOOLEAN bBiasOnRx,
\r
725 OUT BOOLEAN *pbIsCurRDLState
\r
728 PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
\r
733 if(cur_tx_bytes>(cur_rx_bytes*4))
\r
735 *pbIsCurRDLState=FALSE;
\r
736 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
\r
741 *pbIsCurRDLState=TRUE;
\r
742 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
\r
748 if(cur_rx_bytes>(cur_tx_bytes*4))
\r
750 *pbIsCurRDLState=TRUE;
\r
751 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));
\r
756 *pbIsCurRDLState=FALSE;
\r
757 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
\r