8723BU: Update 8723BU wifi driver to version v4.3.16_14189.20150519_BTCOEX2015119...
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / OUTSRC / phydm_EdcaTurboCheck.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *                                        \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
8  *\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
12  * more details.\r
13  *\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
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 //============================================================\r
22 // include files\r
23 //============================================================\r
24 #include "Mp_Precomp.h"\r
25 #include "phydm_precomp.h"\r
26 \r
27 VOID\r
28 ODM_EdcaTurboInit(\r
29         IN      PVOID           pDM_VOID)\r
30 {\r
31         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
32 \r
33 #if (DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
34         PADAPTER        Adapter = NULL;\r
35         HAL_DATA_TYPE   *pHalData = NULL;\r
36 \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
39                 return;\r
40         }\r
41 \r
42         Adapter=pDM_Odm->Adapter;\r
43         pHalData=GET_HAL_DATA(Adapter);\r
44 \r
45         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;       \r
46         pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
47         pHalData->bIsAnyNonBEPkts = FALSE;\r
48         \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
54 \r
55 #endif  \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
60 \r
61         \r
62 }       // ODM_InitEdcaTurbo\r
63 \r
64 VOID\r
65 odm_EdcaTurboCheck(\r
66         IN      PVOID           pDM_VOID\r
67         )\r
68 {\r
69         // \r
70         // For AP/ADSL use prtl8192cd_priv\r
71         // For CE/NIC use PADAPTER\r
72         //\r
73 \r
74         //\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
78         //\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
81 \r
82         if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))\r
83                 return;\r
84 \r
85         switch  (pDM_Odm->SupportPlatform)\r
86         {\r
87                 case    ODM_WIN:\r
88 \r
89 #if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
90                         odm_EdcaTurboCheckMP(pDM_Odm);\r
91 #endif\r
92                         break;\r
93 \r
94                 case    ODM_CE:\r
95 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
96                         odm_EdcaTurboCheckCE(pDM_Odm);\r
97 #endif\r
98                         break;\r
99         }\r
100         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));\r
101 \r
102 }       // odm_CheckEdcaTurbo\r
103 \r
104 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
105 \r
106 \r
107 VOID\r
108 odm_EdcaTurboCheckCE(\r
109         IN      PVOID           pDM_VOID\r
110         )\r
111 {\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
117         u32     IOTPeer=0;\r
118         u8      WirelessMode=0xFF;                   //invalid value\r
119         u32     trafficIndex;\r
120         u32     edca_param;\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
132 \r
133         if(pDM_Odm->bLinked != _TRUE)\r
134         {\r
135                 precvpriv->bIsAnyNonBEPkts = _FALSE;\r
136                 return;\r
137         }\r
138 \r
139         if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))\r
140         {\r
141                 precvpriv->bIsAnyNonBEPkts = _FALSE;\r
142                 return;\r
143         }\r
144 \r
145         if(pDM_Odm->pWirelessMode!=NULL)\r
146                 WirelessMode=*(pDM_Odm->pWirelessMode);\r
147 \r
148         IOTPeer = pmlmeinfo->assoc_AP_vendor;\r
149 \r
150         if (IOTPeer >=  HT_IOT_PEER_MAX)\r
151         {\r
152                 precvpriv->bIsAnyNonBEPkts = _FALSE;\r
153                 return;\r
154         }\r
155 \r
156         if(     (pDM_Odm->SupportICType == ODM_RTL8192C) ||\r
157                 (pDM_Odm->SupportICType == ODM_RTL8723A) ||\r
158                 (pDM_Odm->SupportICType == ODM_RTL8188E))\r
159         {\r
160                 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\r
161                         bBiasOnRx = _TRUE;\r
162         }\r
163 \r
164         // Check if the status needs to be changed.\r
165         if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\r
166         {\r
167                 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
168                 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
169 \r
170                 //traffic, TX or RX\r
171                 if(bBiasOnRx)\r
172                 {\r
173                         if (cur_tx_bytes > (cur_rx_bytes << 2))\r
174                         { // Uplink TP is present.\r
175                                 trafficIndex = UP_LINK; \r
176                         }\r
177                         else\r
178                         { // Balance TP is present.\r
179                                 trafficIndex = DOWN_LINK;\r
180                         }\r
181                 }\r
182                 else\r
183                 {\r
184                         if (cur_rx_bytes > (cur_tx_bytes << 2))\r
185                         { // Downlink TP is present.\r
186                                 trafficIndex = DOWN_LINK;\r
187                         }\r
188                         else\r
189                         { // Balance TP is present.\r
190                                 trafficIndex = UP_LINK;\r
191                         }\r
192                 }\r
193 \r
194                 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\r
195                 {\r
196                         if (ICType == ODM_RTL8192D) {\r
197                                 // Single PHY\r
198                                 if (pDM_Odm->RFType == ODM_2T2R) {\r
199                                         EDCA_BE_UL = 0x60a42b;    //0x5ea42b;\r
200                                         EDCA_BE_DL = 0x60a42b;    //0x5ea42b;\r
201                         } else {\r
202                                         EDCA_BE_UL = 0x6ea42b;\r
203                                         EDCA_BE_DL = 0x6ea42b;\r
204                         }\r
205                         }\r
206                         else\r
207                         {\r
208                                 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE) {\r
209                                         if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R)) {\r
210                                                 EDCA_BE_UL = 0x60a42b;\r
211                                                 EDCA_BE_DL = 0x60a42b;\r
212                                         } else {\r
213                                                 EDCA_BE_UL = 0x6ea42b;\r
214                                                 EDCA_BE_DL = 0x6ea42b;\r
215                                         }\r
216                                 }\r
217                         }\r
218                 \r
219                         //92D txop can't be set to 0x3e for cisco1250\r
220                         if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
221                         {\r
222                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
223                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
224                         }\r
225                         //merge from 92s_92c_merge temp brunch v2445    20120215 \r
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)))\r
227                         {\r
228                                 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\r
229                         }\r
230                         else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
231                         {\r
232                                 EDCA_BE_DL = 0xa630;\r
233                         }\r
234                         else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
235                         {\r
236                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
237                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
238                         }\r
239                         else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
240                         {\r
241                                 // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
242                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
243                         }\r
244 \r
245                         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
246                         {\r
247                                 EDCA_BE_UL = 0x5ea42b;\r
248                                 EDCA_BE_DL = 0x5ea42b;\r
249 \r
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));\r
251                         }\r
252 \r
253                         if (trafficIndex == DOWN_LINK)\r
254                                 edca_param = EDCA_BE_DL;\r
255                         else\r
256                                 edca_param = EDCA_BE_UL;\r
257 \r
258                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\r
259 \r
260                         pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\r
261                 }\r
262                 \r
263                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\r
264         }\r
265         else\r
266         {\r
267                 //\r
268                 // Turn Off EDCA turbo here.\r
269                 // Restore original EDCA according to the declaration of AP.\r
270                 //\r
271                  if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
272                 {\r
273                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\r
274                         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\r
275                 }\r
276         }\r
277 \r
278 }\r
279 \r
280 \r
281 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
282 VOID\r
283 odm_EdcaTurboCheckMP(\r
284         IN      PVOID           pDM_VOID\r
285         )\r
286 {\r
287 \r
288         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
289         PADAPTER                       Adapter = pDM_Odm->Adapter;\r
290         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
291 \r
292         PADAPTER                        pDefaultAdapter = GetDefaultAdapter(Adapter);\r
293         PADAPTER                        pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;\r
294         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
295         PSTA_QOS                        pStaQos = Adapter->MgntInfo.pStaQos;\r
296         //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn\r
297         u8Byte                          Ext_curTxOkCnt = 0;\r
298         u8Byte                          Ext_curRxOkCnt = 0;     \r
299         //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.      \r
300         u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
301 \r
302         // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.\r
303         u8Byte                          curTxOkCnt = 0;\r
304         u8Byte                          curRxOkCnt = 0; \r
305         u4Byte                          EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[pMgntInfo->IOTPeer];\r
306         u4Byte                          EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[pMgntInfo->IOTPeer];\r
307         u4Byte                         EDCA_BE = 0x5ea42b;\r
308         u1Byte                         IOTPeer=0;\r
309         BOOLEAN                      *pbIsCurRDLState=NULL;\r
310         BOOLEAN                      bLastIsCurRDLState=FALSE;\r
311         BOOLEAN                          bBiasOnRx=FALSE;\r
312         BOOLEAN                         bEdcaTurboOn=FALSE;\r
313         u1Byte                          TxRate = 0xFF;\r
314         u8Byte                          value64;        \r
315 \r
316         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));\r
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)));\r
318 \r
319 ////===============================\r
320 ////list paramter for different platform\r
321 ////===============================\r
322         bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;\r
323         pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState);       \r
324 \r
325         //2012/09/14 MH Add \r
326         if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !Adapter->MgntInfo.bWiFiConfg)\r
327                 pHalData->bIsAnyNonBEPkts = TRUE;\r
328 \r
329         pMgntInfo->NumNonBePkt = 0;\r
330 \r
331        // Caculate TX/RX TP:\r
332         //curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
333         //curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
334         curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_Odm->lastTxOkCnt;\r
335         curRxOkCnt = Adapter->RxStats.NumRxBytesUnicast - pDM_Odm->lastRxOkCnt;\r
336         pDM_Odm->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
337         pDM_Odm->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
338 \r
339         if(pExtAdapter == NULL) \r
340                 pExtAdapter = pDefaultAdapter;\r
341 \r
342         Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;\r
343         Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;\r
344         GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
345         //For future Win7  Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\r
346         if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
347         {\r
348                 curTxOkCnt = Ext_curTxOkCnt ;\r
349                 curRxOkCnt = Ext_curRxOkCnt ;\r
350         }\r
351         //\r
352         IOTPeer=pMgntInfo->IOTPeer;\r
353         bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;\r
354         bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;\r
355         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx  \n",pHalData->bIsAnyNonBEPkts));\r
356 \r
357 \r
358 ////===============================\r
359 ////check if edca turbo is disabled\r
360 ////===============================\r
361         if(odm_IsEdcaTurboDisable(pDM_Odm))\r
362         {\r
363                 pHalData->bIsAnyNonBEPkts = FALSE;\r
364                 pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
365                 pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
366                 pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;\r
367                 pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;\r
368 \r
369         }\r
370 \r
371 ////===============================\r
372 ////remove iot case out\r
373 ////===============================\r
374         ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\r
375 \r
376 \r
377 ////===============================\r
378 ////Check if the status needs to be changed.\r
379 ////===============================\r
380         if(bEdcaTurboOn)\r
381         {\r
382                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));\r
383                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));\r
384                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));\r
385                 if(bBiasOnRx)\r
386                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);\r
387                 else\r
388                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);\r
389 \r
390 //modify by Guo.Mingzhi 2011-12-29\r
391                         EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\r
392                         if(IS_HARDWARE_TYPE_8821U(Adapter))\r
393                         {\r
394                                 if(pMgntInfo->RegTxDutyEnable)\r
395                                 {\r
396                                         //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\r
397                                         if(!pMgntInfo->ForcedDataRate) //auto rate\r
398                                         {\r
399                                                 if(pDM_Odm->TxRate != 0xFF)\r
400                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
401                                         }\r
402                                         else //force rate\r
403                                         {\r
404                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
405                                         }\r
406 \r
407                                         value64 = (curRxOkCnt<<2);\r
408                                         if(curTxOkCnt < value64) //Downlink\r
409                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
410                                         else //Uplink\r
411                                         {\r
412                                                 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/\r
413                                                 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\r
414                                                 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
415                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
416                                                 else\r
417                                                 {\r
418                                                         switch (TxRate)\r
419                                                         {\r
420                                                                 case MGN_VHT1SS_MCS6:\r
421                                                                 case MGN_VHT1SS_MCS5:\r
422                                                                 case MGN_MCS6:\r
423                                                                 case MGN_MCS5:\r
424                                                                 case MGN_48M:\r
425                                                                 case MGN_54M:\r
426                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\r
427                                                                 break;\r
428                                                                 case MGN_VHT1SS_MCS4:\r
429                                                                 case MGN_MCS4:\r
430                                                                 case MGN_36M:\r
431                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\r
432                                                                 break;\r
433                                                                 case MGN_VHT1SS_MCS3:\r
434                                                                 case MGN_MCS3:\r
435                                                                 case MGN_24M:\r
436                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\r
437                                                                 break;\r
438                                                                 case MGN_VHT1SS_MCS2:\r
439                                                                 case MGN_MCS2:\r
440                                                                 case MGN_18M:\r
441                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\r
442                                                                 break;\r
443                                                                 case MGN_VHT1SS_MCS1:\r
444                                                                 case MGN_MCS1:\r
445                                                                 case MGN_9M:\r
446                                                                 case MGN_12M:\r
447                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\r
448                                                                 break;\r
449                                                                 case MGN_VHT1SS_MCS0:\r
450                                                                 case MGN_MCS0:\r
451                                                                 case MGN_6M:\r
452                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
453                                                                 break;\r
454                                                                 default:\r
455                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
456                                                                 break;\r
457                                                         }\r
458                                                 }\r
459                                         }                               \r
460                                 }\r
461                                 else\r
462                                 {\r
463                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
464                                 }\r
465 \r
466                         }\r
467                         else if (IS_HARDWARE_TYPE_8812AU(Adapter)){\r
468                                 if(pMgntInfo->RegTxDutyEnable)\r
469                                 {\r
470                                         //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)\r
471                                         // it;s the same issue as 8811AU\r
472                                         if(!pMgntInfo->ForcedDataRate) //auto rate\r
473                                         {\r
474                                                 if(pDM_Odm->TxRate != 0xFF)\r
475                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
476                                         }\r
477                                         else //force rate\r
478                                         {\r
479                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
480                                         }\r
481 \r
482                                         value64 = (curRxOkCnt<<2);\r
483                                         if(curTxOkCnt < value64) //Downlink\r
484                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
485                                         else //Uplink\r
486                                         {\r
487                                                 /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/\r
488                                                 /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\r
489                                                 if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
490                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
491                                                 else\r
492                                                 {\r
493                                                         switch (TxRate)\r
494                                                         {\r
495                                                                 case MGN_VHT2SS_MCS9:\r
496                                                                 case MGN_VHT1SS_MCS9:                                                                   \r
497                                                                 case MGN_VHT1SS_MCS8:\r
498                                                                 case MGN_MCS15:\r
499                                                                 case MGN_MCS7:                                                                  \r
500                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     \r
501                                                                 case MGN_VHT2SS_MCS8:\r
502                                                                 case MGN_VHT1SS_MCS7:\r
503                                                                 case MGN_MCS14:\r
504                                                                 case MGN_MCS6:\r
505                                                                 case MGN_54M:                                                                   \r
506                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);\r
507                                                                 case MGN_VHT2SS_MCS7:\r
508                                                                 case MGN_VHT2SS_MCS6:\r
509                                                                 case MGN_VHT1SS_MCS6:\r
510                                                                 case MGN_VHT1SS_MCS5:\r
511                                                                 case MGN_MCS13:\r
512                                                                 case MGN_MCS5:\r
513                                                                 case MGN_48M:\r
514                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\r
515                                                                 break;\r
516                                                                 case MGN_VHT2SS_MCS5:\r
517                                                                 case MGN_VHT2SS_MCS4:\r
518                                                                 case MGN_VHT1SS_MCS4:\r
519                                                                 case MGN_VHT1SS_MCS3:   \r
520                                                                 case MGN_MCS12:\r
521                                                                 case MGN_MCS4:  \r
522                                                                 case MGN_MCS3:  \r
523                                                                 case MGN_36M:\r
524                                                                 case MGN_24M:   \r
525                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\r
526                                                                 break;\r
527                                                                 case MGN_VHT2SS_MCS3:\r
528                                                                 case MGN_VHT2SS_MCS2:\r
529                                                                 case MGN_VHT2SS_MCS1:\r
530                                                                 case MGN_VHT1SS_MCS2:\r
531                                                                 case MGN_VHT1SS_MCS1:   \r
532                                                                 case MGN_MCS11: \r
533                                                                 case MGN_MCS10: \r
534                                                                 case MGN_MCS9:          \r
535                                                                 case MGN_MCS2:  \r
536                                                                 case MGN_MCS1:\r
537                                                                 case MGN_18M:   \r
538                                                                 case MGN_12M:\r
539                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\r
540                                                                 break;\r
541                                                                 case MGN_VHT2SS_MCS0:\r
542                                                                 case MGN_VHT1SS_MCS0:\r
543                                                                 case MGN_MCS0:  \r
544                                                                 case MGN_MCS8:\r
545                                                                 case MGN_9M:    \r
546                                                                 case MGN_6M:\r
547                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
548                                                                 break;\r
549                                                                 default:\r
550                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
551                                                                 break;\r
552                                                         }\r
553                                                 }\r
554                                         }                               \r
555                                 }\r
556                                 else\r
557                                 {\r
558                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
559                                 }\r
560                         }\r
561                         else\r
562                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
563 \r
564                 ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));\r
565 \r
566                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\r
567                 \r
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));\r
569 \r
570         }\r
571         else\r
572         {\r
573                 // Turn Off EDCA turbo here.\r
574                 // Restore original EDCA according to the declaration of AP.\r
575                  if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
576                 {\r
577                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\r
578 \r
579                         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\r
580                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx  \n",pDM_Odm->WMMEDCA_BE));\r
581 \r
582                 }\r
583         }\r
584 \r
585 }\r
586 \r
587 \r
588 //check if edca turbo is disabled\r
589 BOOLEAN\r
590 odm_IsEdcaTurboDisable(\r
591         IN      PVOID           pDM_VOID\r
592 )\r
593 {\r
594         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
595         PADAPTER                       Adapter = pDM_Odm->Adapter;\r
596         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
597         u4Byte                          IOTPeer=pMgntInfo->IOTPeer;\r
598 \r
599         if(pDM_Odm->bBtDisableEdcaTurbo)\r
600         {\r
601                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));\r
602                 return TRUE;\r
603         }\r
604 \r
605         if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||\r
606                 (pDM_Odm->bWIFITest)||\r
607                 (IOTPeer>= HT_IOT_PEER_MAX))\r
608         {\r
609                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));\r
610                 return TRUE;\r
611         }\r
612 \r
613 \r
614         // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue\r
615         // 2. User may disable EDCA Turbo mode with OID settings.\r
616         if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){\r
617                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));\r
618                 return  TRUE;\r
619                 }\r
620                 \r
621         return  FALSE;\r
622         \r
623 \r
624 }\r
625 \r
626 //add iot case here: for MP/CE\r
627 VOID \r
628 ODM_EdcaParaSelByIot(\r
629         IN      PVOID           pDM_VOID,\r
630         OUT     u4Byte          *EDCA_BE_UL,\r
631         OUT u4Byte              *EDCA_BE_DL\r
632         )\r
633 {\r
634         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
635         PADAPTER                       Adapter = pDM_Odm->Adapter;\r
636         HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
637         u4Byte                         IOTPeer=0;\r
638         u4Byte                         ICType=pDM_Odm->SupportICType;\r
639         u1Byte                         WirelessMode=0xFF;                   //invalid value\r
640         u4Byte                          RFType=pDM_Odm->RFType;\r
641         u4Byte                         IOTPeerSubType = 0;\r
642 \r
643         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
644         u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
645 \r
646         if(pDM_Odm->pWirelessMode!=NULL)\r
647                 WirelessMode=*(pDM_Odm->pWirelessMode);\r
648                 \r
649 ///////////////////////////////////////////////////////////\r
650 ////list paramter for different platform\r
651 \r
652         IOTPeer=pMgntInfo->IOTPeer;\r
653         IOTPeerSubType=pMgntInfo->IOTPeerSubtype;\r
654         GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
655 \r
656 \r
657         if(ICType==ODM_RTL8192D)\r
658         {      \r
659                 // Single PHY\r
660                 if(pDM_Odm->RFType==ODM_2T2R)\r
661                 {\r
662                         (*EDCA_BE_UL) = 0x60a42b;    //0x5ea42b;\r
663                         (*EDCA_BE_DL) = 0x60a42b;    //0x5ea42b;\r
664 \r
665                 }\r
666                 else\r
667                 {\r
668                         (*EDCA_BE_UL) = 0x6ea42b;\r
669                         (*EDCA_BE_DL) = 0x6ea42b;\r
670                 }\r
671 \r
672         }\r
673 ////============================\r
674 /// IOT case for MP\r
675 ////============================        \r
676 \r
677         else\r
678         {\r
679 \r
680                 if(pDM_Odm->SupportInterface==ODM_ITRF_PCIE){\r
681                         if((ICType==ODM_RTL8192C)&&(pDM_Odm->RFType==ODM_2T2R))                 {\r
682                                 (*EDCA_BE_UL) = 0x60a42b;\r
683                                 (*EDCA_BE_DL) = 0x60a42b;\r
684                         }\r
685                         else\r
686                         {\r
687                                 (*EDCA_BE_UL) = 0x6ea42b;\r
688                                 (*EDCA_BE_DL) = 0x6ea42b;\r
689                         }\r
690                 }\r
691         }\r
692  \r
693         if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
694         {\r
695                 (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];\r
696                 (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott  //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];\r
697         }\r
698      \r
699         #if (INTEL_PROXIMITY_SUPPORT == 1)\r
700         if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\r
701         {\r
702                 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\r
703         }\r
704         else\r
705         #endif          \r
706         {\r
707                 if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))\r
708                 {// To check whether we shall force turn on TXOP configuration.\r
709                         if(!((*EDCA_BE_UL) & 0xffff0000))\r
710                                 (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.\r
711                         if(!((*EDCA_BE_DL) & 0xffff0000))\r
712                                 (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.\r
713                 }\r
714                 \r
715                 //92D txop can't be set to 0x3e for cisco1250\r
716                 if((ICType!=ODM_RTL8192D) && (IOTPeer== HT_IOT_PEER_CISCO) &&(WirelessMode==ODM_WM_N24G))\r
717                 {\r
718                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
719                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
720                 }\r
721                 //merge from 92s_92c_merge temp brunch v2445    20120215 \r
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)))\r
723                 {\r
724                         (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
725                 }\r
726                 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
727                 {\r
728                         (*EDCA_BE_DL) = 0xa630;\r
729                 }\r
730 \r
731                 else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
732                 {\r
733                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
734                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
735                 }\r
736                 else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
737                 {\r
738                         // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
739                         if(WirelessMode==ODM_WM_G)\r
740                                 (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
741                         else\r
742                                 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
743 \r
744                         if(ICType == ODM_RTL8821)\r
745                                  (*EDCA_BE_DL) = 0x5ea630;\r
746                         \r
747                 }\r
748         }\r
749 \r
750         if((ICType == ODM_RTL8192D)&&(IOTPeerSubType == HT_IOT_PEER_LINKSYS_E4200_V1)&&((WirelessMode==ODM_WM_N5G)))\r
751         {\r
752                 (*EDCA_BE_DL) = 0x432b;\r
753                 (*EDCA_BE_UL) = 0x432b;\r
754         }               \r
755 \r
756 \r
757 \r
758         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
759         {\r
760                 (*EDCA_BE_UL) = 0x5ea42b;\r
761                 (*EDCA_BE_DL) = 0x5ea42b;\r
762 \r
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)));\r
764         }\r
765 \r
766         if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK))           /*8814AU and 8814AR*/\r
767         {\r
768                 (*EDCA_BE_UL) = 0x5ea42b;\r
769                 (*EDCA_BE_DL) = 0xa42b;\r
770 \r
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)));\r
772         }\r
773 \r
774         \r
775 \r
776         // Revised for Atheros DIR-655 IOT issue to improve down link TP, added by Roger, 2013.03.22.\r
777         if((ICType == ODM_RTL8723A) && (IOTPeerSubType== HT_IOT_PEER_ATHEROS_DIR655) && \r
778                 (pMgntInfo->dot11CurrentChannelNumber == 6))\r
779         {\r
780                 (*EDCA_BE_DL) = 0xa92b;\r
781         }\r
782 \r
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));\r
784 \r
785 }\r
786 \r
787 \r
788 VOID\r
789 odm_EdcaChooseTrafficIdx( \r
790         IN      PVOID           pDM_VOID,\r
791         IN      u8Byte                          cur_tx_bytes,  \r
792         IN      u8Byte                          cur_rx_bytes, \r
793         IN      BOOLEAN                 bBiasOnRx,\r
794         OUT BOOLEAN             *pbIsCurRDLState\r
795         )\r
796 {       \r
797         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
798         \r
799         if(bBiasOnRx)\r
800         {\r
801           \r
802                 if(cur_tx_bytes>(cur_rx_bytes*4))\r
803                 {\r
804                         *pbIsCurRDLState=FALSE;\r
805                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));\r
806 \r
807                 }\r
808                 else\r
809                 {\r
810                         *pbIsCurRDLState=TRUE;\r
811                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
812 \r
813                 }\r
814         }\r
815         else\r
816         {\r
817                 if(cur_rx_bytes>(cur_tx_bytes*4))\r
818                 {\r
819                         *pbIsCurRDLState=TRUE;\r
820                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));\r
821 \r
822                 }\r
823                 else\r
824                 {\r
825                         *pbIsCurRDLState=FALSE;\r
826                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
827                 }\r
828         }\r
829 \r
830         return ;\r
831 }\r
832 \r
833 #endif\r
834 \r
835 \r