net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / hal / phydm / 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_RTL8188E) {\r
157                 if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\r
158                         bBiasOnRx = _TRUE;\r
159         }\r
160 \r
161         // Check if the status needs to be changed.\r
162         if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\r
163         {\r
164                 cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
165                 cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
166 \r
167                 //traffic, TX or RX\r
168                 if(bBiasOnRx)\r
169                 {\r
170                         if (cur_tx_bytes > (cur_rx_bytes << 2))\r
171                         { // Uplink TP is present.\r
172                                 trafficIndex = UP_LINK; \r
173                         }\r
174                         else\r
175                         { // Balance TP is present.\r
176                                 trafficIndex = DOWN_LINK;\r
177                         }\r
178                 }\r
179                 else\r
180                 {\r
181                         if (cur_rx_bytes > (cur_tx_bytes << 2))\r
182                         { // Downlink TP is present.\r
183                                 trafficIndex = DOWN_LINK;\r
184                         }\r
185                         else\r
186                         { // Balance TP is present.\r
187                                 trafficIndex = UP_LINK;\r
188                         }\r
189                 }\r
190 \r
191                 //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\r
192                 {\r
193                         if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) {\r
194                                 EDCA_BE_UL = 0x6ea42b;\r
195                                 EDCA_BE_DL = 0x6ea42b;\r
196                         }\r
197 \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
200                         {\r
201                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
202                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
203                         }\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
206                         {\r
207                                 EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\r
208                         }\r
209                         else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
210                         {\r
211                                 EDCA_BE_DL = 0xa630;\r
212                         }\r
213                         else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
214                         {\r
215                                 EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
216                                 EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
217                         }\r
218                         else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
219                         {\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
222                         }\r
223 \r
224                         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
225                         {\r
226                                 EDCA_BE_UL = 0x5ea42b;\r
227                                 EDCA_BE_DL = 0x5ea42b;\r
228 \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
230                         }\r
231 \r
232                         if (trafficIndex == DOWN_LINK)\r
233                                 edca_param = EDCA_BE_DL;\r
234                         else\r
235                                 edca_param = EDCA_BE_UL;\r
236 \r
237                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\r
238 \r
239                         pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\r
240                 }\r
241                 \r
242                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\r
243         }\r
244         else\r
245         {\r
246                 //\r
247                 // Turn Off EDCA turbo here.\r
248                 // Restore original EDCA according to the declaration of AP.\r
249                 //\r
250                  if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
251                 {\r
252                         rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\r
253                         pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\r
254                 }\r
255         }\r
256 \r
257 }\r
258 \r
259 \r
260 #elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
261 VOID\r
262 odm_EdcaTurboCheckMP(\r
263         IN      PVOID           pDM_VOID\r
264         )\r
265 {\r
266 \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
270 \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
280 \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
287         u1Byte                         IOTPeer=0;\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
293         u8Byte                          value64;        \r
294 \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
297 \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
303 \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
307 \r
308         pMgntInfo->NumNonBePkt = 0;\r
309 \r
310        // Caculate TX/RX TP:\r
311         curTxOkCnt = pDM_Odm->curTxOkCnt;\r
312         curRxOkCnt = pDM_Odm->curRxOkCnt;\r
313 \r
314 \r
315         if(pExtAdapter == NULL) \r
316                 pExtAdapter = pDefaultAdapter;\r
317 \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
323         {\r
324                 curTxOkCnt = Ext_curTxOkCnt ;\r
325                 curRxOkCnt = Ext_curRxOkCnt ;\r
326         }\r
327         //\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
332 \r
333 \r
334 ////===============================\r
335 ////check if edca turbo is disabled\r
336 ////===============================\r
337         if(odm_IsEdcaTurboDisable(pDM_Odm))\r
338         {\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
344 \r
345         }\r
346 \r
347 ////===============================\r
348 ////remove iot case out\r
349 ////===============================\r
350         ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\r
351 \r
352 \r
353 ////===============================\r
354 ////Check if the status needs to be changed.\r
355 ////===============================\r
356         if(bEdcaTurboOn)\r
357         {\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
361                 if(bBiasOnRx)\r
362                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   TRUE,  pbIsCurRDLState);\r
363                 else\r
364                         odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt,   FALSE,  pbIsCurRDLState);\r
365 \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
369                         else\r
370                                 EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\r
371                         if(IS_HARDWARE_TYPE_8821U(Adapter))\r
372                         {\r
373                                 if(pMgntInfo->RegTxDutyEnable)\r
374                                 {\r
375                                         //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\r
376                                         if(!pMgntInfo->ForcedDataRate) //auto rate\r
377                                         {\r
378                                                 if(pDM_Odm->TxRate != 0xFF)\r
379                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
380                                         }\r
381                                         else //force rate\r
382                                         {\r
383                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
384                                         }\r
385 \r
386                                         value64 = (curRxOkCnt<<2);\r
387                                         if(curTxOkCnt < value64) //Downlink\r
388                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
389                                         else //Uplink\r
390                                         {\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
395                                                 else\r
396                                                 {\r
397                                                         switch (TxRate)\r
398                                                         {\r
399                                                                 case MGN_VHT1SS_MCS6:\r
400                                                                 case MGN_VHT1SS_MCS5:\r
401                                                                 case MGN_MCS6:\r
402                                                                 case MGN_MCS5:\r
403                                                                 case MGN_48M:\r
404                                                                 case MGN_54M:\r
405                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\r
406                                                                 break;\r
407                                                                 case MGN_VHT1SS_MCS4:\r
408                                                                 case MGN_MCS4:\r
409                                                                 case MGN_36M:\r
410                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\r
411                                                                 break;\r
412                                                                 case MGN_VHT1SS_MCS3:\r
413                                                                 case MGN_MCS3:\r
414                                                                 case MGN_24M:\r
415                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\r
416                                                                 break;\r
417                                                                 case MGN_VHT1SS_MCS2:\r
418                                                                 case MGN_MCS2:\r
419                                                                 case MGN_18M:\r
420                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\r
421                                                                 break;\r
422                                                                 case MGN_VHT1SS_MCS1:\r
423                                                                 case MGN_MCS1:\r
424                                                                 case MGN_9M:\r
425                                                                 case MGN_12M:\r
426                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\r
427                                                                 break;\r
428                                                                 case MGN_VHT1SS_MCS0:\r
429                                                                 case MGN_MCS0:\r
430                                                                 case MGN_6M:\r
431                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
432                                                                 break;\r
433                                                                 default:\r
434                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
435                                                                 break;\r
436                                                         }\r
437                                                 }\r
438                                         }                               \r
439                                 }\r
440                                 else\r
441                                 {\r
442                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
443                                 }\r
444 \r
445                         }\r
446                         else if (IS_HARDWARE_TYPE_8812AU(Adapter)){\r
447                                 if(pMgntInfo->RegTxDutyEnable)\r
448                                 {\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
452                                         {\r
453                                                 if(pDM_Odm->TxRate != 0xFF)\r
454                                                         TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
455                                         }\r
456                                         else //force rate\r
457                                         {\r
458                                                 TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
459                                         }\r
460 \r
461                                         value64 = (curRxOkCnt<<2);\r
462                                         if(curTxOkCnt < value64) //Downlink\r
463                                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
464                                         else //Uplink\r
465                                         {\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
470                                                 else\r
471                                                 {\r
472                                                         switch (TxRate)\r
473                                                         {\r
474                                                                 case MGN_VHT2SS_MCS9:\r
475                                                                 case MGN_VHT1SS_MCS9:                                                                   \r
476                                                                 case MGN_VHT1SS_MCS8:\r
477                                                                 case MGN_MCS15:\r
478                                                                 case MGN_MCS7:                                                                  \r
479                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f);                                                     \r
480                                                                 case MGN_VHT2SS_MCS8:\r
481                                                                 case MGN_VHT1SS_MCS7:\r
482                                                                 case MGN_MCS14:\r
483                                                                 case MGN_MCS6:\r
484                                                                 case MGN_54M:                                                                   \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
490                                                                 case MGN_MCS13:\r
491                                                                 case MGN_MCS5:\r
492                                                                 case MGN_48M:\r
493                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\r
494                                                                 break;\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
499                                                                 case MGN_MCS12:\r
500                                                                 case MGN_MCS4:  \r
501                                                                 case MGN_MCS3:  \r
502                                                                 case MGN_36M:\r
503                                                                 case MGN_24M:   \r
504                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\r
505                                                                 break;\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
511                                                                 case MGN_MCS11: \r
512                                                                 case MGN_MCS10: \r
513                                                                 case MGN_MCS9:          \r
514                                                                 case MGN_MCS2:  \r
515                                                                 case MGN_MCS1:\r
516                                                                 case MGN_18M:   \r
517                                                                 case MGN_12M:\r
518                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\r
519                                                                 break;\r
520                                                                 case MGN_VHT2SS_MCS0:\r
521                                                                 case MGN_VHT1SS_MCS0:\r
522                                                                 case MGN_MCS0:  \r
523                                                                 case MGN_MCS8:\r
524                                                                 case MGN_9M:    \r
525                                                                 case MGN_6M:\r
526                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
527                                                                 break;\r
528                                                                 default:\r
529                                                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
530                                                                 break;\r
531                                                         }\r
532                                                 }\r
533                                         }                               \r
534                                 }\r
535                                 else\r
536                                 {\r
537                                         ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
538                                 }\r
539                         }\r
540                         else\r
541                                 ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
542 \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
544 \r
545                 pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\r
546                 \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
548 \r
549         }\r
550         else\r
551         {\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
555                 {\r
556                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\r
557 \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
560 \r
561                 }\r
562         }\r
563 \r
564 }\r
565 \r
566 \r
567 //check if edca turbo is disabled\r
568 BOOLEAN\r
569 odm_IsEdcaTurboDisable(\r
570         IN      PVOID           pDM_VOID\r
571 )\r
572 {\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
577 \r
578         if(pDM_Odm->bBtDisableEdcaTurbo)\r
579         {\r
580                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));\r
581                 return TRUE;\r
582         }\r
583 \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
587         {\r
588                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));\r
589                 return TRUE;\r
590         }\r
591 \r
592 \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
597                 return  TRUE;\r
598                 }\r
599                 \r
600         return  FALSE;\r
601         \r
602 \r
603 }\r
604 \r
605 //add iot case here: for MP/CE\r
606 VOID \r
607 ODM_EdcaParaSelByIot(\r
608         IN      PVOID           pDM_VOID,\r
609         OUT     u4Byte          *EDCA_BE_UL,\r
610         OUT u4Byte              *EDCA_BE_DL\r
611         )\r
612 {\r
613         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
614         PADAPTER                       Adapter = pDM_Odm->Adapter;\r
615         u4Byte                         IOTPeer=0;\r
616         u4Byte                         ICType=pDM_Odm->SupportICType;\r
617         u1Byte                         WirelessMode=0xFF;                   //invalid value\r
618         u4Byte                         IOTPeerSubType = 0;\r
619 \r
620         PMGNT_INFO                      pMgntInfo = &Adapter->MgntInfo;\r
621         u1Byte                          TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
622 \r
623         if(pDM_Odm->pWirelessMode!=NULL)\r
624                 WirelessMode=*(pDM_Odm->pWirelessMode);\r
625                 \r
626 ///////////////////////////////////////////////////////////\r
627 ////list paramter for different platform\r
628 \r
629         IOTPeer=pMgntInfo->IOTPeer;\r
630         IOTPeerSubType=pMgntInfo->IOTPeerSubtype;\r
631         GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
632 \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
639         }\r
640  \r
641         if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
642         {\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
645         }\r
646      \r
647         #if (INTEL_PROXIMITY_SUPPORT == 1)\r
648         if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\r
649         {\r
650                 (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\r
651         }\r
652         else\r
653         #endif          \r
654         {\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
661                 }\r
662                 \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
665                 {\r
666                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
667                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
668                 }\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
671                 {\r
672                         (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
673                 }\r
674                 else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
675                 {\r
676                         (*EDCA_BE_DL) = 0xa630;\r
677                 }\r
678 \r
679                 else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
680                 {\r
681                         (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
682                         (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
683                 }\r
684                 else if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)\r
685                 {\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
689                         else\r
690                                 (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
691 \r
692                         if(ICType == ODM_RTL8821)\r
693                                  (*EDCA_BE_DL) = 0x5ea630;\r
694                         \r
695                 }\r
696         }\r
697 \r
698         if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E))           //add 8812AU/8812AE\r
699         {\r
700                 (*EDCA_BE_UL) = 0x5ea42b;\r
701                 (*EDCA_BE_DL) = 0x5ea42b;\r
702 \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
704         }\r
705 \r
706         if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK))           /*8814AU and 8814AR*/\r
707         {\r
708                 (*EDCA_BE_UL) = 0x5ea42b;\r
709                 (*EDCA_BE_DL) = 0xa42b;\r
710 \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
712         }\r
713 \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
715 \r
716 }\r
717 \r
718 \r
719 VOID\r
720 odm_EdcaChooseTrafficIdx( \r
721         IN      PVOID           pDM_VOID,\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
726         )\r
727 {       \r
728         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
729         \r
730         if(bBiasOnRx)\r
731         {\r
732           \r
733                 if(cur_tx_bytes>(cur_rx_bytes*4))\r
734                 {\r
735                         *pbIsCurRDLState=FALSE;\r
736                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));\r
737 \r
738                 }\r
739                 else\r
740                 {\r
741                         *pbIsCurRDLState=TRUE;\r
742                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
743 \r
744                 }\r
745         }\r
746         else\r
747         {\r
748                 if(cur_rx_bytes>(cur_tx_bytes*4))\r
749                 {\r
750                         *pbIsCurRDLState=TRUE;\r
751                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink        Traffic\n"));\r
752 \r
753                 }\r
754                 else\r
755                 {\r
756                         *pbIsCurRDLState=FALSE;\r
757                         ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
758                 }\r
759         }\r
760 \r
761         return ;\r
762 }\r
763 \r
764 #endif\r
765 \r
766 \r