--- /dev/null
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ * \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+#include "mp_precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+VOID\r
+ODM_EdcaTurboInit(\r
+ IN PVOID pDM_VOID)\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+ PADAPTER Adapter = NULL;\r
+ HAL_DATA_TYPE *pHalData = NULL;\r
+\r
+ if(pDM_Odm->Adapter==NULL) {\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EdcaTurboInit fail!!!\n"));\r
+ return;\r
+ }\r
+\r
+ Adapter=pDM_Odm->Adapter;\r
+ pHalData=GET_HAL_DATA(Adapter);\r
+\r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE; \r
+ pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+ pHalData->bIsAnyNonBEPkts = FALSE;\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter; \r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE; \r
+ pDM_Odm->DM_EDCA_Table.bIsCurRDLState = FALSE;\r
+ Adapter->recvpriv.bIsAnyNonBEPkts =FALSE;\r
+\r
+#endif \r
+ 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
+ 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
+ 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
+ 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
+\r
+ \r
+} // ODM_InitEdcaTurbo\r
+\r
+VOID\r
+odm_EdcaTurboCheck(\r
+ IN PVOID pDM_VOID\r
+ )\r
+{\r
+ // \r
+ // For AP/ADSL use prtl8192cd_priv\r
+ // For CE/NIC use PADAPTER\r
+ //\r
+\r
+ //\r
+ // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
+ // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
+ // HW dynamic mechanism.\r
+ //\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheck========================>\n"));\r
+\r
+ if(!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))\r
+ return;\r
+\r
+ switch (pDM_Odm->SupportPlatform)\r
+ {\r
+ case ODM_WIN:\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+ odm_EdcaTurboCheckMP(pDM_Odm);\r
+#endif\r
+ break;\r
+\r
+ case ODM_CE:\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+ odm_EdcaTurboCheckCE(pDM_Odm);\r
+#endif\r
+ break;\r
+ }\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("<========================odm_EdcaTurboCheck\n"));\r
+\r
+} // odm_CheckEdcaTurbo\r
+\r
+#if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
+\r
+\r
+VOID\r
+odm_EdcaTurboCheckCE(\r
+ IN PVOID pDM_VOID\r
+ )\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ u32 EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];\r
+ u32 EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];\r
+ u32 ICType=pDM_Odm->SupportICType;\r
+ u32 IOTPeer=0;\r
+ u8 WirelessMode=0xFF; //invalid value\r
+ u32 trafficIndex;\r
+ u32 edca_param;\r
+ u64 cur_tx_bytes = 0;\r
+ u64 cur_rx_bytes = 0;\r
+ u8 bbtchange = _FALSE;\r
+ u8 bBiasOnRx = _FALSE;\r
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\r
+ struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);\r
+ struct xmit_priv *pxmitpriv = &(Adapter->xmitpriv);\r
+ struct recv_priv *precvpriv = &(Adapter->recvpriv);\r
+ struct registry_priv *pregpriv = &Adapter->registrypriv;\r
+ struct mlme_ext_priv *pmlmeext = &(Adapter->mlmeextpriv);\r
+ struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);\r
+\r
+ if(pDM_Odm->bLinked != _TRUE)\r
+ {\r
+ precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+ return;\r
+ }\r
+\r
+ if ((pregpriv->wifi_spec == 1) )//|| (pmlmeinfo->HT_enable == 0))\r
+ {\r
+ precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+ return;\r
+ }\r
+\r
+ if(pDM_Odm->pWirelessMode!=NULL)\r
+ WirelessMode=*(pDM_Odm->pWirelessMode);\r
+\r
+ IOTPeer = pmlmeinfo->assoc_AP_vendor;\r
+\r
+ if (IOTPeer >= HT_IOT_PEER_MAX)\r
+ {\r
+ precvpriv->bIsAnyNonBEPkts = _FALSE;\r
+ return;\r
+ }\r
+\r
+ if (pDM_Odm->SupportICType & ODM_RTL8188E) {\r
+ if((IOTPeer == HT_IOT_PEER_RALINK)||(IOTPeer == HT_IOT_PEER_ATHEROS))\r
+ bBiasOnRx = _TRUE;\r
+ }\r
+\r
+ // Check if the status needs to be changed.\r
+ if((bbtchange) || (!precvpriv->bIsAnyNonBEPkts) )\r
+ {\r
+ cur_tx_bytes = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
+ cur_rx_bytes = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
+\r
+ //traffic, TX or RX\r
+ if(bBiasOnRx)\r
+ {\r
+ if (cur_tx_bytes > (cur_rx_bytes << 2))\r
+ { // Uplink TP is present.\r
+ trafficIndex = UP_LINK; \r
+ }\r
+ else\r
+ { // Balance TP is present.\r
+ trafficIndex = DOWN_LINK;\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if (cur_rx_bytes > (cur_tx_bytes << 2))\r
+ { // Downlink TP is present.\r
+ trafficIndex = DOWN_LINK;\r
+ }\r
+ else\r
+ { // Balance TP is present.\r
+ trafficIndex = UP_LINK;\r
+ }\r
+ }\r
+\r
+ //if ((pDM_Odm->DM_EDCA_Table.prv_traffic_idx != trafficIndex) || (!pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA))\r
+ {\r
+ if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) {\r
+ EDCA_BE_UL = 0x6ea42b;\r
+ EDCA_BE_DL = 0x6ea42b;\r
+ }\r
+\r
+ //92D txop can't be set to 0x3e for cisco1250\r
+ if ((IOTPeer == HT_IOT_PEER_CISCO) && (WirelessMode == ODM_WM_N24G))\r
+ {\r
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+ EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+ }\r
+ //merge from 92s_92c_merge temp brunch v2445 20120215 \r
+ 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
+ {\r
+ EDCA_BE_DL = edca_setting_DL_GMode[IOTPeer];\r
+ }\r
+ else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+ {\r
+ EDCA_BE_DL = 0xa630;\r
+ }\r
+ else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+ {\r
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+ EDCA_BE_UL = edca_setting_UL[IOTPeer];\r
+ }\r
+ else if(IOTPeer == HT_IOT_PEER_ATHEROS)\r
+ {\r
+ // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+ EDCA_BE_DL = edca_setting_DL[IOTPeer];\r
+ }\r
+\r
+ if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8821)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE\r
+ {\r
+ EDCA_BE_UL = 0x5ea42b;\r
+ EDCA_BE_DL = 0x5ea42b;\r
+\r
+ 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
+ }\r
+\r
+ if (ICType == ODM_RTL8822B) { \r
+ /* aggressively to send TCP ack while DL */\r
+ EDCA_BE_UL = 0x6ea42b;\r
+ EDCA_BE_DL = 0x6ea42b;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("8822B: EDCA_BE_UL=0x%x EDCA_BE_DL =0x%x",EDCA_BE_UL,EDCA_BE_DL));\r
+ }\r
+\r
+ if (trafficIndex == DOWN_LINK)\r
+ edca_param = EDCA_BE_DL;\r
+ else\r
+ edca_param = EDCA_BE_UL;\r
+\r
+ rtw_write32(Adapter, REG_EDCA_BE_PARAM, edca_param);\r
+\r
+ pDM_Odm->DM_EDCA_Table.prv_traffic_idx = trafficIndex;\r
+ }\r
+ \r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _TRUE;\r
+ }\r
+ else\r
+ {\r
+ //\r
+ // Turn Off EDCA turbo here.\r
+ // Restore original EDCA according to the declaration of AP.\r
+ //\r
+ if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+ {\r
+ rtw_write32(Adapter, REG_EDCA_BE_PARAM, pHalData->AcParam_BE);\r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = _FALSE;\r
+ }\r
+ }\r
+\r
+}\r
+\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE==ODM_WIN)\r
+VOID\r
+odm_EdcaTurboCheckMP(\r
+ IN PVOID pDM_VOID\r
+ )\r
+{\r
+\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\r
+\r
+ PADAPTER pDefaultAdapter = GetDefaultAdapter(Adapter);\r
+ PADAPTER pExtAdapter = GetFirstExtAdapter(Adapter);//NULL;\r
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;\r
+ PSTA_QOS pStaQos = Adapter->MgntInfo.pStaQos;\r
+ //[Win7 Count Tx/Rx statistic for Extension Port] odm_CheckEdcaTurbo's Adapter is always Default. 2009.08.20, by Bohn\r
+ u8Byte Ext_curTxOkCnt = 0;\r
+ u8Byte Ext_curRxOkCnt = 0; \r
+ //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn. \r
+ u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+ // Keep past Tx/Rx packet count for RT-to-RT EDCA turbo.\r
+ u8Byte curTxOkCnt = 0;\r
+ u8Byte curRxOkCnt = 0; \r
+ u4Byte EDCA_BE_UL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[pMgntInfo->IOTPeer];\r
+ u4Byte EDCA_BE_DL = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[pMgntInfo->IOTPeer];\r
+ u4Byte EDCA_BE = 0x5ea42b;\r
+ u1Byte IOTPeer=0;\r
+ BOOLEAN *pbIsCurRDLState=NULL;\r
+ BOOLEAN bLastIsCurRDLState=FALSE;\r
+ BOOLEAN bBiasOnRx=FALSE;\r
+ BOOLEAN bEdcaTurboOn=FALSE;\r
+ u1Byte TxRate = 0xFF;\r
+ u8Byte value64; \r
+\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("odm_EdcaTurboCheckMP========================>"));\r
+ 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
+\r
+////===============================\r
+////list paramter for different platform\r
+////===============================\r
+ bLastIsCurRDLState=pDM_Odm->DM_EDCA_Table.bIsCurRDLState;\r
+ pbIsCurRDLState=&(pDM_Odm->DM_EDCA_Table.bIsCurRDLState); \r
+\r
+ //2012/09/14 MH Add \r
+ if (pMgntInfo->NumNonBePkt > pMgntInfo->RegEdcaThresh && !(Adapter->MgntInfo.bWiFiConfg & RT_WIFI_LOGO))\r
+ pHalData->bIsAnyNonBEPkts = TRUE;\r
+\r
+ pMgntInfo->NumNonBePkt = 0;\r
+\r
+ // Caculate TX/RX TP:\r
+ curTxOkCnt = pDM_Odm->curTxOkCnt;\r
+ curRxOkCnt = pDM_Odm->curRxOkCnt;\r
+\r
+\r
+ if(pExtAdapter == NULL) \r
+ pExtAdapter = pDefaultAdapter;\r
+\r
+ Ext_curTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->Ext_lastTxOkCnt;\r
+ Ext_curRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->Ext_lastRxOkCnt;\r
+ GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+ //For future Win7 Enable Default Port to modify AMPDU size dynamically, 2009.08.20, Bohn.\r
+ if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+ {\r
+ curTxOkCnt = Ext_curTxOkCnt ;\r
+ curRxOkCnt = Ext_curRxOkCnt ;\r
+ }\r
+ //\r
+ IOTPeer=pMgntInfo->IOTPeer;\r
+ bBiasOnRx=(pMgntInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)?TRUE:FALSE;\r
+ bEdcaTurboOn=((!pHalData->bIsAnyNonBEPkts))?TRUE:FALSE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bIsAnyNonBEPkts : 0x%lx \n",pHalData->bIsAnyNonBEPkts));\r
+\r
+\r
+////===============================\r
+////check if edca turbo is disabled\r
+////===============================\r
+ if(odm_IsEdcaTurboDisable(pDM_Odm))\r
+ {\r
+ pHalData->bIsAnyNonBEPkts = FALSE;\r
+ pMgntInfo->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;\r
+ pMgntInfo->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;\r
+ pMgntInfo->Ext_lastTxOkCnt = pExtAdapter->TxStats.NumTxBytesUnicast;\r
+ pMgntInfo->Ext_lastRxOkCnt = pExtAdapter->RxStats.NumRxBytesUnicast;\r
+\r
+ }\r
+\r
+////===============================\r
+////remove iot case out\r
+////===============================\r
+ ODM_EdcaParaSelByIot(pDM_Odm, &EDCA_BE_UL, &EDCA_BE_DL);\r
+\r
+\r
+////===============================\r
+////Check if the status needs to be changed.\r
+////===============================\r
+ if(bEdcaTurboOn)\r
+ {\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("bEdcaTurboOn : 0x%x bBiasOnRx : 0x%x\n",bEdcaTurboOn,bBiasOnRx));\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curTxOkCnt : 0x%lx \n",curTxOkCnt));\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("curRxOkCnt : 0x%lx \n",curRxOkCnt));\r
+ if(bBiasOnRx)\r
+ odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, TRUE, pbIsCurRDLState);\r
+ else\r
+ odm_EdcaChooseTrafficIdx(pDM_Odm,curTxOkCnt, curRxOkCnt, FALSE, pbIsCurRDLState);\r
+\r
+//modify by Guo.Mingzhi 2011-12-29\r
+ if( Adapter->AP_EDCA_PARAM[0] != EDCA_BE )\r
+ EDCA_BE = Adapter->AP_EDCA_PARAM[0];\r
+ else\r
+ EDCA_BE=((*pbIsCurRDLState)==TRUE)?EDCA_BE_DL:EDCA_BE_UL;\r
+\r
+// For TPLINK 8188EU test \r
+ if ((IS_HARDWARE_TYPE_8188EU(Adapter))&&(pHalData->UndecoratedSmoothedPWDB < 28)) { // Set to origimal EDCA 0x5EA42B now need to update. \r
+ } \r
+ else\r
+ {\r
+ // Use TPLINk prefered EDCA parameters. \r
+ EDCA_BE = pMgntInfo->EDCABEPara ;\r
+ } \r
+\r
+ if(IS_HARDWARE_TYPE_8821U(Adapter))\r
+ {\r
+ if(pMgntInfo->RegTxDutyEnable)\r
+ {\r
+ //2013.01.23 LukeLee: debug for 8811AU thermal issue (reduce Tx duty cycle)\r
+ if(!pMgntInfo->ForcedDataRate) //auto rate\r
+ {\r
+ if(pDM_Odm->TxRate != 0xFF)\r
+ TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+ }\r
+ else //force rate\r
+ {\r
+ TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+ }\r
+\r
+ value64 = (curRxOkCnt<<2);\r
+ if(curTxOkCnt < value64) //Downlink\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ else //Uplink\r
+ {\r
+ /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/\r
+ /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\r
+ if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ else\r
+ {\r
+ switch (TxRate)\r
+ {\r
+ case MGN_VHT1SS_MCS6:\r
+ case MGN_VHT1SS_MCS5:\r
+ case MGN_MCS6:\r
+ case MGN_MCS5:\r
+ case MGN_48M:\r
+ case MGN_54M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea42b);\r
+ break;\r
+ case MGN_VHT1SS_MCS4:\r
+ case MGN_MCS4:\r
+ case MGN_36M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa42b);\r
+ break;\r
+ case MGN_VHT1SS_MCS3:\r
+ case MGN_MCS3:\r
+ case MGN_24M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa47f);\r
+ break;\r
+ case MGN_VHT1SS_MCS2:\r
+ case MGN_MCS2:\r
+ case MGN_18M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa57f);\r
+ break;\r
+ case MGN_VHT1SS_MCS1:\r
+ case MGN_MCS1:\r
+ case MGN_9M:\r
+ case MGN_12M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa77f);\r
+ break;\r
+ case MGN_VHT1SS_MCS0:\r
+ case MGN_MCS0:\r
+ case MGN_6M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+ break;\r
+ default:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ break;\r
+ }\r
+ }\r
+ } \r
+ }\r
+ else\r
+ {\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ }\r
+\r
+ }\r
+ else if (IS_HARDWARE_TYPE_8812AU(Adapter)){\r
+ if(pMgntInfo->RegTxDutyEnable)\r
+ {\r
+ //2013.07.26 Wilson: debug for 8812AU thermal issue (reduce Tx duty cycle)\r
+ // it;s the same issue as 8811AU\r
+ if(!pMgntInfo->ForcedDataRate) //auto rate\r
+ {\r
+ if(pDM_Odm->TxRate != 0xFF)\r
+ TxRate = Adapter->HalFunc.GetHwRateFromMRateHandler(pDM_Odm->TxRate); \r
+ }\r
+ else //force rate\r
+ {\r
+ TxRate = (u1Byte) pMgntInfo->ForcedDataRate;\r
+ }\r
+\r
+ value64 = (curRxOkCnt<<2);\r
+ if(curTxOkCnt < value64) //Downlink\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ else //Uplink\r
+ {\r
+ /*DbgPrint("pRFCalibrateInfo->ThermalValue = 0x%X\n", pRFCalibrateInfo->ThermalValue);*/\r
+ /*if(pRFCalibrateInfo->ThermalValue < pHalData->EEPROMThermalMeter)*/\r
+ if((pDM_Odm->RFCalibrateInfo.ThermalValue < 0x2c) || (*pDM_Odm->pBandType == BAND_ON_2_4G))\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ else\r
+ {\r
+ switch (TxRate)\r
+ {\r
+ case MGN_VHT2SS_MCS9:\r
+ case MGN_VHT1SS_MCS9: \r
+ case MGN_VHT1SS_MCS8:\r
+ case MGN_MCS15:\r
+ case MGN_MCS7: \r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0x1ea44f); \r
+ case MGN_VHT2SS_MCS8:\r
+ case MGN_VHT1SS_MCS7:\r
+ case MGN_MCS14:\r
+ case MGN_MCS6:\r
+ case MGN_54M: \r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa44f);\r
+ case MGN_VHT2SS_MCS7:\r
+ case MGN_VHT2SS_MCS6:\r
+ case MGN_VHT1SS_MCS6:\r
+ case MGN_VHT1SS_MCS5:\r
+ case MGN_MCS13:\r
+ case MGN_MCS5:\r
+ case MGN_48M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa630);\r
+ break;\r
+ case MGN_VHT2SS_MCS5:\r
+ case MGN_VHT2SS_MCS4:\r
+ case MGN_VHT1SS_MCS4:\r
+ case MGN_VHT1SS_MCS3: \r
+ case MGN_MCS12:\r
+ case MGN_MCS4: \r
+ case MGN_MCS3: \r
+ case MGN_36M:\r
+ case MGN_24M: \r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa730);\r
+ break;\r
+ case MGN_VHT2SS_MCS3:\r
+ case MGN_VHT2SS_MCS2:\r
+ case MGN_VHT2SS_MCS1:\r
+ case MGN_VHT1SS_MCS2:\r
+ case MGN_VHT1SS_MCS1: \r
+ case MGN_MCS11: \r
+ case MGN_MCS10: \r
+ case MGN_MCS9: \r
+ case MGN_MCS2: \r
+ case MGN_MCS1:\r
+ case MGN_18M: \r
+ case MGN_12M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa830);\r
+ break;\r
+ case MGN_VHT2SS_MCS0:\r
+ case MGN_VHT1SS_MCS0:\r
+ case MGN_MCS0: \r
+ case MGN_MCS8:\r
+ case MGN_9M: \r
+ case MGN_6M:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,0xa87f);\r
+ break;\r
+ default:\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ break;\r
+ }\r
+ }\r
+ } \r
+ }\r
+ else\r
+ {\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+ }\r
+ }\r
+ else\r
+ ODM_Write4Byte(pDM_Odm,ODM_EDCA_BE_PARAM,EDCA_BE);\r
+\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("EDCA Turbo on: EDCA_BE:0x%lx\n",EDCA_BE));\r
+\r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = TRUE;\r
+ \r
+ 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
+\r
+ }\r
+ else\r
+ {\r
+ // Turn Off EDCA turbo here.\r
+ // Restore original EDCA according to the declaration of AP.\r
+ if(pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA)\r
+ {\r
+ Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_AC_PARAM, GET_WMM_PARAM_ELE_SINGLE_AC_PARAM(pStaQos->WMMParamEle, AC0_BE) );\r
+\r
+ pDM_Odm->DM_EDCA_Table.bCurrentTurboEDCA = FALSE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Restore EDCA BE: 0x%lx \n",pDM_Odm->WMMEDCA_BE));\r
+\r
+ }\r
+ }\r
+\r
+}\r
+\r
+\r
+//check if edca turbo is disabled\r
+BOOLEAN\r
+odm_IsEdcaTurboDisable(\r
+ IN PVOID pDM_VOID\r
+)\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;\r
+ u4Byte IOTPeer=pMgntInfo->IOTPeer;\r
+\r
+ if(pDM_Odm->bBtDisableEdcaTurbo)\r
+ {\r
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable for BT!!\n"));\r
+ return TRUE;\r
+ }\r
+\r
+ if((!(pDM_Odm->SupportAbility& ODM_MAC_EDCA_TURBO ))||\r
+ (pDM_Odm->WIFITest & RT_WIFI_LOGO)||\r
+ (IOTPeer>= HT_IOT_PEER_MAX))\r
+ {\r
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("EdcaTurboDisable\n"));\r
+ return TRUE;\r
+ }\r
+\r
+\r
+ // 1. We do not turn on EDCA turbo mode for some AP that has IOT issue\r
+ // 2. User may disable EDCA Turbo mode with OID settings.\r
+ if(pMgntInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO){\r
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD, ("IOTAction:EdcaTurboDisable\n"));\r
+ return TRUE;\r
+ }\r
+ \r
+ return FALSE;\r
+ \r
+\r
+}\r
+\r
+//add iot case here: for MP/CE\r
+VOID \r
+ODM_EdcaParaSelByIot(\r
+ IN PVOID pDM_VOID,\r
+ OUT u4Byte *EDCA_BE_UL,\r
+ OUT u4Byte *EDCA_BE_DL\r
+ )\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ u4Byte IOTPeer=0;\r
+ u4Byte ICType=pDM_Odm->SupportICType;\r
+ u1Byte WirelessMode=0xFF; //invalid value\r
+ u4Byte IOTPeerSubType = 0;\r
+\r
+ PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;\r
+ u1Byte TwoPortStatus = (u1Byte)TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE;\r
+\r
+ if(pDM_Odm->pWirelessMode!=NULL)\r
+ WirelessMode=*(pDM_Odm->pWirelessMode);\r
+ \r
+///////////////////////////////////////////////////////////\r
+////list paramter for different platform\r
+\r
+ IOTPeer=pMgntInfo->IOTPeer;\r
+ IOTPeerSubType=pMgntInfo->IOTPeerSubtype;\r
+ GetTwoPortSharedResource(Adapter,TWO_PORT_SHARED_OBJECT__STATUS,NULL,&TwoPortStatus);\r
+\r
+////============================\r
+/// IOT case for MP\r
+////============================ \r
+ if (pDM_Odm->SupportInterface == ODM_ITRF_PCIE) {\r
+ (*EDCA_BE_UL) = 0x6ea42b;\r
+ (*EDCA_BE_DL) = 0x6ea42b;\r
+ }\r
+ \r
+ if(TwoPortStatus == TWO_PORT_STATUS__EXTENSION_ONLY)\r
+ {\r
+ (*EDCA_BE_UL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_UL[ExtAdapter->MgntInfo.IOTPeer];\r
+ (*EDCA_BE_DL) = 0x5ea42b;//Parameter suggested by Scott //edca_setting_DL[ExtAdapter->MgntInfo.IOTPeer];\r
+ }\r
+ \r
+ #if (INTEL_PROXIMITY_SUPPORT == 1)\r
+ if(pMgntInfo->IntelClassModeInfo.bEnableCA == TRUE)\r
+ {\r
+ (*EDCA_BE_UL) = (*EDCA_BE_DL) = 0xa44f;\r
+ }\r
+ else\r
+ #endif \r
+ {\r
+ if((pMgntInfo->IOTAction & (HT_IOT_ACT_FORCED_ENABLE_BE_TXOP|HT_IOT_ACT_AMSDU_ENABLE)))\r
+ {// To check whether we shall force turn on TXOP configuration.\r
+ if(!((*EDCA_BE_UL) & 0xffff0000))\r
+ (*EDCA_BE_UL) |= 0x005e0000; // Force TxOP limit to 0x005e for UL.\r
+ if(!((*EDCA_BE_DL) & 0xffff0000))\r
+ (*EDCA_BE_DL) |= 0x005e0000; // Force TxOP limit to 0x005e for DL.\r
+ }\r
+ \r
+ //92D txop can't be set to 0x3e for cisco1250\r
+ if ((IOTPeer == HT_IOT_PEER_CISCO) && (WirelessMode == ODM_WM_N24G))\r
+ {\r
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+ (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+ }\r
+ //merge from 92s_92c_merge temp brunch v2445 20120215 \r
+ 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
+ {\r
+ (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+ }\r
+ else if((IOTPeer== HT_IOT_PEER_AIRGO )&& ((WirelessMode==ODM_WM_G)||(WirelessMode==ODM_WM_A)))\r
+ {\r
+ (*EDCA_BE_DL) = 0xa630;\r
+ }\r
+\r
+ else if(IOTPeer == HT_IOT_PEER_MARVELL)\r
+ {\r
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+ (*EDCA_BE_UL) = edca_setting_UL[IOTPeer];\r
+ }\r
+ else if(IOTPeer == HT_IOT_PEER_ATHEROS && IOTPeerSubType != HT_IOT_PEER_TPLINK_AC1750)\r
+ {\r
+ // Set DL EDCA for Atheros peer to 0x3ea42b. Suggested by SD3 Wilson for ASUS TP issue. \r
+ if(WirelessMode==ODM_WM_G)\r
+ (*EDCA_BE_DL) = edca_setting_DL_GMode[IOTPeer];\r
+ else\r
+ (*EDCA_BE_DL) = edca_setting_DL[IOTPeer];\r
+\r
+ if(ICType == ODM_RTL8821)\r
+ (*EDCA_BE_DL) = 0x5ea630;\r
+ \r
+ }\r
+ }\r
+\r
+ if((ICType==ODM_RTL8812)||(ICType==ODM_RTL8192E)) //add 8812AU/8812AE\r
+ {\r
+ (*EDCA_BE_UL) = 0x5ea42b;\r
+ (*EDCA_BE_DL) = 0x5ea42b;\r
+\r
+ 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
+ }\r
+\r
+ if((ICType==ODM_RTL8814A) && (IOTPeer == HT_IOT_PEER_REALTEK)) /*8814AU and 8814AR*/\r
+ {\r
+ (*EDCA_BE_UL) = 0x5ea42b;\r
+ (*EDCA_BE_DL) = 0xa42b;\r
+\r
+ 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
+ }\r
+\r
+ 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
+\r
+}\r
+\r
+\r
+VOID\r
+odm_EdcaChooseTrafficIdx( \r
+ IN PVOID pDM_VOID,\r
+ IN u8Byte cur_tx_bytes, \r
+ IN u8Byte cur_rx_bytes, \r
+ IN BOOLEAN bBiasOnRx,\r
+ OUT BOOLEAN *pbIsCurRDLState\r
+ )\r
+{ \r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ \r
+ if(bBiasOnRx)\r
+ {\r
+ \r
+ if(cur_tx_bytes>(cur_rx_bytes*4))\r
+ {\r
+ *pbIsCurRDLState=FALSE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Uplink Traffic\n "));\r
+\r
+ }\r
+ else\r
+ {\r
+ *pbIsCurRDLState=TRUE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+\r
+ }\r
+ }\r
+ else\r
+ {\r
+ if(cur_rx_bytes>(cur_tx_bytes*4))\r
+ {\r
+ *pbIsCurRDLState=TRUE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Downlink Traffic\n"));\r
+\r
+ }\r
+ else\r
+ {\r
+ *pbIsCurRDLState=FALSE;\r
+ ODM_RT_TRACE(pDM_Odm,ODM_COMP_EDCA_TURBO,ODM_DBG_LOUD,("Balance Traffic\n"));\r
+ }\r
+ }\r
+\r
+ return ;\r
+}\r
+\r
+#endif\r
+\r
+\r