net: wireless: rockchip_wlan: add rtl8188eu support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8188eu / hal / phydm / phydm_edcaturbocheck.c
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2011 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 //============================================================
22 // include files
23 //============================================================
24 #include "mp_precomp.h"
25 #include "phydm_precomp.h"
26
27 VOID
28 ODM_EdcaTurboInit(
29         IN      PVOID           pDM_VOID)
30 {
31         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
32
33 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)
34         PADAPTER        Adapter = NULL;
35         HAL_DATA_TYPE   *pHalData = NULL;
36
37         if(pDM_Odm->Adapter==NULL)      {
38                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));
39                 return;
40         }
41
42         Adapter=pDM_Odm->Adapter;
43         pHalData=GET_HAL_DATA(Adapter);
44
45         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       
46         pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;
47         pHalData->bIsAnyNonBEPkts = FALSE;
48         
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;
54
55 #endif  
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)));
60
61         
62 }       // ODM_InitEdcaTurbo
63
64 VOID
65 odm_EdcaTurboCheck(
66         IN      PVOID           pDM_VOID
67         )
68 {
69         // 
70         // For AP/ADSL use prtl8192cd_priv
71         // For CE/NIC use PADAPTER
72         //
73
74         //
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.
78         //
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"));
81
82         if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))
83                 return;
84
85         switch  (pDM_Odm->SupportPlatform)
86         {
87                 case    ODM_WIN:
88
89 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)
90                         odm_EdcaTurboCheckMP(pDM_Odm);
91 #endif
92                         break;
93
94                 case    ODM_CE:
95 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
96                         odm_EdcaTurboCheckCE(pDM_Odm);
97 #endif
98                         break;
99         }
100         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));
101
102 }       // odm_CheckEdcaTurbo
103
104 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)
105
106
107 VOID
108 odm_EdcaTurboCheckCE(
109         IN      PVOID           pDM_VOID
110         )
111 {
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;
117         u32     IOTPeer=0;
118         u8      WirelessMode=0xFF;                   //invalid value
119         u32     trafficIndex;
120         u32     edca_param;
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);
132
133         if(pDM_Odm->bLinked != _TRUE)
134         {
135                 precvpriv->bIsAnyNonBEPkts = _FALSE;
136                 return;
137         }
138
139         if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))
140         {
141                 precvpriv->bIsAnyNonBEPkts = _FALSE;
142                 return;
143         }
144
145         if(pDM_Odm->pWirelessMode!=NULL)
146                 WirelessMode=*(pDM_Odm->pWirelessMode);
147
148         IOTPeer = pmlmeinfo->assoc_AP_vendor;
149
150         if (IOTPeer >=  HT_IOT_PEER_MAX)
151         {
152                 precvpriv->bIsAnyNonBEPkts = _FALSE;
153                 return;
154         }
155
156         if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||
157                 (pDM_Odm->SupportICType == ODM_RTL8723A) ||
158                 (pDM_Odm->SupportICType == ODM_RTL8188E))
159         {
160                 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))
161                         bBiasOnRx = _TRUE;
162         }
163
164         // Check if the status needs to be changed.
165         if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )
166         {
167                 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;
168                 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;
169
170                 //traffic, TX or RX
171                 if(bBiasOnRx)
172                 {
173                         if (cur_tx_bytes > (cur_rx_bytes << 2))
174                         { // Uplink TP is present.
175                                 trafficIndex = UP_LINK; 
176                         }
177                         else
178                         { // Balance TP is present.
179                                 trafficIndex = DOWN_LINK;
180                         }
181                 }
182                 else
183                 {
184                         if (cur_rx_bytes > (cur_tx_bytes << 2))
185                         { // Downlink TP is present.
186                                 trafficIndex = DOWN_LINK;
187                         }
188                         else
189                         { // Balance TP is present.
190                                 trafficIndex = UP_LINK;
191                         }
192                 }
193
194                 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))
195                 {
196                         if (ICType == ODM_RTL8192D) {
197                                 // Single PHY
198                                 if (pDM_Odm->RFType == ODM_2T2R) {
199                                         EDCA_BE_UL = 0x60a42b;    //0x5ea42b;
200                                         EDCA_BE_DL = 0x60a42b;    //0x5ea42b;
201                         } else {
202                                         EDCA_BE_UL = 0x6ea42b;
203                                         EDCA_BE_DL = 0x6ea42b;
204                         }
205                         }
206                         else
207                         {
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;
212                                         } else {
213                                                 EDCA_BE_UL = 0x6ea42b;
214                                                 EDCA_BE_DL = 0x6ea42b;
215                                         }
216                                 }
217                         }
218                 
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))
221                         {
222                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];
223                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];
224                         }
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)))
227                         {
228                                 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];
229                         }
230                         else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
231                         {
232                                 EDCA_BE_DL = 0xa630;
233                         }
234                         else if(IOTPeer == HT_IOT_PEER_MARVELL)
235                         {
236                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];
237                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];
238                         }
239                         else if(IOTPeer == HT_IOT_PEER_ATHEROS)
240                         {
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];
243                         }
244
245                         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
246                         {
247                                 EDCA_BE_UL = 0x5ea42b;
248                                 EDCA_BE_DL = 0x5ea42b;
249
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));
251                         }
252
253                         if (trafficIndex == DOWN_LINK)
254                                 edca_param = EDCA_BE_DL;
255                         else
256                                 edca_param = EDCA_BE_UL;
257
258                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);
259
260                         pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;
261                 }
262                 
263                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;
264         }
265         else
266         {
267                 //
268                 // Turn Off EDCA turbo here.
269                 // Restore original EDCA according to the declaration of AP.
270                 //
271                  if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
272                 {
273                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);
274                         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;
275                 }
276         }
277
278 }
279
280
281 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)
282 VOID
283 odm_EdcaTurboCheckMP(
284         IN      PVOID           pDM_VOID
285         )
286 {
287
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);
291
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;
301
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;
308         u1Byte                         IOTPeer=0;
309         BOOLEAN                      *pbIsCurRDLState=NULL;
310         BOOLEAN                      bLastIsCurRDLState=FALSE;
311         BOOLEAN                          bBiasOnRx=FALSE;
312         BOOLEAN                         bEdcaTurboOn=FALSE;
313         u1Byte                          TxRate = 0xFF;
314         u8Byte                          value64;        
315
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)));
318
319 ////===============================
320 ////list paramter for different platform
321 ////===============================
322         bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;
323         pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       
324
325         //2012/09/14 MH Add 
326         if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)
327                 pHalData->bIsAnyNonBEPkts = TRUE;
328
329         pMgntInfo->NumNonBePkt = 0;
330
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;
338
339         if(pExtAdapter == NULL) 
340                 pExtAdapter = pDefaultAdapter;
341
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)
347         {
348                 curTxOkCnt = Ext_curTxOkCnt ;
349                 curRxOkCnt = Ext_curRxOkCnt ;
350         }
351         //
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));
356
357
358 ////===============================
359 ////check if edca turbo is disabled
360 ////===============================
361         if(odm_IsEdcaTurboDisable(pDM_Odm))
362         {
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;
368
369         }
370
371 ////===============================
372 ////remove iot case out
373 ////===============================
374         ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);
375
376
377 ////===============================
378 ////Check if the status needs to be changed.
379 ////===============================
380         if(bEdcaTurboOn)
381         {
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));
385                 if(bBiasOnRx)
386                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);
387                 else
388                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);
389
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))
393                         {
394                                 if(pMgntInfo->RegTxDutyEnable)
395                                 {
396                                         //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)
397                                         if(!pMgntInfo->ForcedDataRate) //auto rate
398                                         {
399                                                 if(pDM_Odm->TxRate != 0xFF)
400                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
401                                         }
402                                         else //force rate
403                                         {
404                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
405                                         }
406
407                                         value64 = (curRxOkCnt<<2);
408                                         if(curTxOkCnt < value64) //Downlink
409                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
410                                         else //Uplink
411                                         {
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);
416                                                 else
417                                                 {
418                                                         switch (TxRate)
419                                                         {
420                                                                 case MGN_VHT1SS_MCS6:
421                                                                 case MGN_VHT1SS_MCS5:
422                                                                 case MGN_MCS6:
423                                                                 case MGN_MCS5:
424                                                                 case MGN_48M:
425                                                                 case MGN_54M:
426                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);
427                                                                 break;
428                                                                 case MGN_VHT1SS_MCS4:
429                                                                 case MGN_MCS4:
430                                                                 case MGN_36M:
431                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);
432                                                                 break;
433                                                                 case MGN_VHT1SS_MCS3:
434                                                                 case MGN_MCS3:
435                                                                 case MGN_24M:
436                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);
437                                                                 break;
438                                                                 case MGN_VHT1SS_MCS2:
439                                                                 case MGN_MCS2:
440                                                                 case MGN_18M:
441                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);
442                                                                 break;
443                                                                 case MGN_VHT1SS_MCS1:
444                                                                 case MGN_MCS1:
445                                                                 case MGN_9M:
446                                                                 case MGN_12M:
447                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);
448                                                                 break;
449                                                                 case MGN_VHT1SS_MCS0:
450                                                                 case MGN_MCS0:
451                                                                 case MGN_6M:
452                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
453                                                                 break;
454                                                                 default:
455                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
456                                                                 break;
457                                                         }
458                                                 }
459                                         }                               
460                                 }
461                                 else
462                                 {
463                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
464                                 }
465
466                         }
467                         else if (IS_HARDWARE_TYPE_8812AU(Adapter)){
468                                 if(pMgntInfo->RegTxDutyEnable)
469                                 {
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
473                                         {
474                                                 if(pDM_Odm->TxRate != 0xFF)
475                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); 
476                                         }
477                                         else //force rate
478                                         {
479                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;
480                                         }
481
482                                         value64 = (curRxOkCnt<<2);
483                                         if(curTxOkCnt < value64) //Downlink
484                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
485                                         else //Uplink
486                                         {
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);
491                                                 else
492                                                 {
493                                                         switch (TxRate)
494                                                         {
495                                                                 case MGN_VHT2SS_MCS9:
496                                                                 case MGN_VHT1SS_MCS9:                                                                   
497                                                                 case MGN_VHT1SS_MCS8:
498                                                                 case MGN_MCS15:
499                                                                 case MGN_MCS7:                                                                  
500                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     
501                                                                 case MGN_VHT2SS_MCS8:
502                                                                 case MGN_VHT1SS_MCS7:
503                                                                 case MGN_MCS14:
504                                                                 case MGN_MCS6:
505                                                                 case MGN_54M:                                                                   
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:
511                                                                 case MGN_MCS13:
512                                                                 case MGN_MCS5:
513                                                                 case MGN_48M:
514                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);
515                                                                 break;
516                                                                 case MGN_VHT2SS_MCS5:
517                                                                 case MGN_VHT2SS_MCS4:
518                                                                 case MGN_VHT1SS_MCS4:
519                                                                 case MGN_VHT1SS_MCS3:   
520                                                                 case MGN_MCS12:
521                                                                 case MGN_MCS4:  
522                                                                 case MGN_MCS3:  
523                                                                 case MGN_36M:
524                                                                 case MGN_24M:   
525                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);
526                                                                 break;
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:   
532                                                                 case MGN_MCS11: 
533                                                                 case MGN_MCS10: 
534                                                                 case MGN_MCS9:          
535                                                                 case MGN_MCS2:  
536                                                                 case MGN_MCS1:
537                                                                 case MGN_18M:   
538                                                                 case MGN_12M:
539                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);
540                                                                 break;
541                                                                 case MGN_VHT2SS_MCS0:
542                                                                 case MGN_VHT1SS_MCS0:
543                                                                 case MGN_MCS0:  
544                                                                 case MGN_MCS8:
545                                                                 case MGN_9M:    
546                                                                 case MGN_6M:
547                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);
548                                                                 break;
549                                                                 default:
550                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
551                                                                 break;
552                                                         }
553                                                 }
554                                         }                               
555                                 }
556                                 else
557                                 {
558                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
559                                 }
560                         }
561                         else
562                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);
563
564                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));
565
566                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;
567                 
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));
569
570         }
571         else
572         {
573                 // Turn Off EDCA turbo here.
574                 // Restore original EDCA according to the declaration of AP.
575                  if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)
576                 {
577                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );
578
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));
581
582                 }
583         }
584
585 }
586
587
588 //check if edca turbo is disabled
589 BOOLEAN
590 odm_IsEdcaTurboDisable(
591         IN      PVOID           pDM_VOID
592 )
593 {
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;
598
599         if(pDM_Odm->bBtDisableEdcaTurbo)
600         {
601                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));
602                 return TRUE;
603         }
604
605         if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||
606                 (pDM_Odm->bWIFITest)||
607                 (IOTPeer>= HT_IOT_PEER_MAX))
608         {
609                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));
610                 return TRUE;
611         }
612
613
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"));
618                 return  TRUE;
619                 }
620                 
621         return  FALSE;
622         
623
624 }
625
626 //add iot case here: for MP/CE
627 VOID 
628 ODM_EdcaParaSelByIot(
629         IN      PVOID           pDM_VOID,
630         OUT     u4Byte          *EDCA_BE_UL,
631         OUT u4Byte              *EDCA_BE_DL
632         )
633 {
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);
637         u4Byte                         IOTPeer=0;
638         u4Byte                         ICType=pDM_Odm->SupportICType;
639         u1Byte                         WirelessMode=0xFF;                   //invalid value
640         u4Byte                          RFType=pDM_Odm->RFType;
641         u4Byte                         IOTPeerSubType = 0;
642
643         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;
644         u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;
645
646         if(pDM_Odm->pWirelessMode!=NULL)
647                 WirelessMode=*(pDM_Odm->pWirelessMode);
648                 
649 ///////////////////////////////////////////////////////////
650 ////list paramter for different platform
651
652         IOTPeer=pMgntInfo->IOTPeer;
653         IOTPeerSubType=pMgntInfo->IOTPeerSubtype;
654         GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);
655
656
657         if(ICType==ODM_RTL8192D)
658         {      
659                 // Single PHY
660                 if(pDM_Odm->RFType==ODM_2T2R)
661                 {
662                         (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;
663                         (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;
664
665                 }
666                 else
667                 {
668                         (*EDCA_BE_UL) = 0x6ea42b;
669                         (*EDCA_BE_DL) = 0x6ea42b;
670                 }
671
672         }
673 ////============================
674 /// IOT case for MP
675 ////============================        
676
677         else
678         {
679
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;
684                         }
685                         else
686                         {
687                                 (*EDCA_BE_UL) = 0x6ea42b;
688                                 (*EDCA_BE_DL) = 0x6ea42b;
689                         }
690                 }
691         }
692  
693         if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)
694         {
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];
697         }
698      
699         #if (INTEL_PROXIMITY_SUPPORT == 1)
700         if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)
701         {
702                 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;
703         }
704         else
705         #endif          
706         {
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.
713                 }
714                 
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))
717                 {
718                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
719                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
720                 }
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)))
723                 {
724                         (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];
725                 }
726                 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))
727                 {
728                         (*EDCA_BE_DL) = 0xa630;
729                 }
730
731                 else if(IOTPeer == HT_IOT_PEER_MARVELL)
732                 {
733                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
734                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];
735                 }
736                 else if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)
737                 {
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];
741                         else
742                                 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];
743
744                         if(ICType == ODM_RTL8821)
745                                  (*EDCA_BE_DL) = 0x5ea630;
746                         
747                 }
748         }
749
750         if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))
751         {
752                 (*EDCA_BE_DL) = 0x432b;
753                 (*EDCA_BE_UL) = 0x432b;
754         }               
755
756
757
758         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE
759         {
760                 (*EDCA_BE_UL) = 0x5ea42b;
761                 (*EDCA_BE_DL) = 0x5ea42b;
762
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)));
764         }
765
766         if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK))           /*8814AU and 8814AR*/
767         {
768                 (*EDCA_BE_UL) = 0x5ea42b;
769                 (*EDCA_BE_DL) = 0xa42b;
770
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)));
772         }
773
774         
775
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))
779         {
780                 (*EDCA_BE_DL) = 0xa92b;
781         }
782
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));
784
785 }
786
787
788 VOID
789 odm_EdcaChooseTrafficIdx( 
790         IN      PVOID           pDM_VOID,
791         IN      u8Byte                          cur_tx_bytes,  
792         IN      u8Byte                          cur_rx_bytes, 
793         IN      BOOLEAN                 bBiasOnRx,
794         OUT BOOLEAN             *pbIsCurRDLState
795         )
796 {       
797         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
798         
799         if(bBiasOnRx)
800         {
801           
802                 if(cur_tx_bytes>(cur_rx_bytes*4))
803                 {
804                         *pbIsCurRDLState=FALSE;
805                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));
806
807                 }
808                 else
809                 {
810                         *pbIsCurRDLState=TRUE;
811                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
812
813                 }
814         }
815         else
816         {
817                 if(cur_rx_bytes>(cur_tx_bytes*4))
818                 {
819                         *pbIsCurRDLState=TRUE;
820                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));
821
822                 }
823                 else
824                 {
825                         *pbIsCurRDLState=FALSE;
826                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));
827                 }
828         }
829
830         return ;
831 }
832
833 #endif
834
835