net: wireless: rockchip: add rtl8822be pcie wifi driver
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8822be / hal / phydm / halphyrf_win.c
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8822be/hal/phydm/halphyrf_win.c b/drivers/net/wireless/rockchip_wlan/rtl8822be/hal/phydm/halphyrf_win.c
new file mode 100644 (file)
index 0000000..8f0240d
--- /dev/null
@@ -0,0 +1,787 @@
+/******************************************************************************\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
+#include "mp_precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+#define        CALCULATE_SWINGTALBE_OFFSET(_offset, _direction, _size, _deltaThermal) \\r
+                                       do {\\r
+                                               for(_offset = 0; _offset < _size; _offset++)\\r
+                                               {\\r
+                                                       if(_deltaThermal < thermalThreshold[_direction][_offset])\\r
+                                                       {\\r
+                                                               if(_offset != 0)\\r
+                                                                       _offset--;\\r
+                                                               break;\\r
+                                                       }\\r
+                                               }                       \\r
+                                               if(_offset >= _size)\\r
+                                                       _offset = _size-1;\\r
+                                       } while(0)\r
+\r
+void ConfigureTxpowerTrack(\r
+       IN      PDM_ODM_T               pDM_Odm,\r
+       OUT     PTXPWRTRACK_CFG pConfig\r
+       )\r
+{\r
+#if RTL8192E_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
+               ConfigureTxpowerTrack_8192E(pConfig);\r
+#endif \r
+#if RTL8821A_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8821)\r
+               ConfigureTxpowerTrack_8821A(pConfig);\r
+#endif\r
+#if RTL8812A_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8812)\r
+               ConfigureTxpowerTrack_8812A(pConfig);\r
+#endif\r
+#if RTL8188E_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
+               ConfigureTxpowerTrack_8188E(pConfig);\r
+#endif \r
+\r
+#if RTL8188F_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8188F)\r
+               ConfigureTxpowerTrack_8188F(pConfig);\r
+#endif \r
+\r
+#if RTL8723B_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
+               ConfigureTxpowerTrack_8723B(pConfig);\r
+#endif\r
+\r
+#if RTL8814A_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
+               ConfigureTxpowerTrack_8814A(pConfig);\r
+#endif\r
+\r
+#if RTL8703B_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8703B)\r
+               ConfigureTxpowerTrack_8703B(pConfig);\r
+#endif\r
+\r
+#if RTL8822B_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8822B)\r
+               ConfigureTxpowerTrack_8822B(pConfig);\r
+#endif\r
+\r
+#if RTL8723D_SUPPORT\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723D)\r
+               ConfigureTxpowerTrack_8723D(pConfig);\r
+#endif\r
+}\r
+\r
+//======================================================================\r
+// <20121113, Kordan> This function should be called when TxAGC changed.\r
+// Otherwise the previous compensation is gone, because we record the \r
+// delta of temperature between two TxPowerTracking watch dogs.\r
+//\r
+// NOTE: If Tx BB swing or Tx scaling is varified during run-time, still \r
+//       need to call this function.\r
+//======================================================================\r
+VOID\r
+ODM_ClearTxPowerTrackingState(\r
+       IN PDM_ODM_T            pDM_Odm\r
+       )\r
+{\r
+       PHAL_DATA_TYPE  pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
+       u1Byte                  p = 0;\r
+       PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
+       \r
+       pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->DefaultCckIndex;\r
+       pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->DefaultCckIndex;\r
+       pRFCalibrateInfo->CCK_index = 0;\r
+       \r
+       for (p = ODM_RF_PATH_A; p < MAX_RF_PATH; ++p)\r
+       {\r
+               pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
+               pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
+               pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->DefaultOfdmIndex;\r
+\r
+               pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
+               pRFCalibrateInfo->DeltaPowerIndex[p] = 0;\r
+               pRFCalibrateInfo->DeltaPowerIndexLast[p] = 0;\r
+\r
+               pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] = 0;    /* Initial Mix mode power tracking*/\r
+               pRFCalibrateInfo->Remnant_OFDMSwingIdx[p] = 0;                    \r
+               pRFCalibrateInfo->KfreeOffset[p] = 0;\r
+       }\r
+       \r
+       pRFCalibrateInfo->Modify_TxAGC_Flag_PathA = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
+       pRFCalibrateInfo->Modify_TxAGC_Flag_PathB = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
+       pRFCalibrateInfo->Modify_TxAGC_Flag_PathC = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
+       pRFCalibrateInfo->Modify_TxAGC_Flag_PathD = FALSE;       /*Initial at Modify Tx Scaling Mode*/\r
+       pRFCalibrateInfo->Remnant_CCKSwingIdx = 0;\r
+       pRFCalibrateInfo->ThermalValue = pHalData->EEPROMThermalMeter;\r
+\r
+       pRFCalibrateInfo->Modify_TxAGC_Value_CCK=0;                     //modify by Mingzhi.Guo\r
+       pRFCalibrateInfo->Modify_TxAGC_Value_OFDM=0;            //modify by Mingzhi.Guo\r
+\r
+}\r
+\r
+VOID\r
+ODM_TXPowerTrackingCallback_ThermalMeter(\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+       IN PDM_ODM_T            pDM_Odm\r
+#else\r
+       IN PADAPTER     Adapter\r
+#endif\r
+       )\r
+{\r
+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       PDM_ODM_T               pDM_Odm = &pHalData->odmpriv;\r
+#endif\r
+#endif\r
+\r
+       PODM_RF_CAL_T   pRFCalibrateInfo = &(pDM_Odm->RFCalibrateInfo);\r
+\r
+       u1Byte                  ThermalValue = 0, delta, delta_LCK, delta_IQK, p = 0, i = 0;\r
+       s1Byte                  diff_DPK[4] = {0};\r
+       u1Byte                  ThermalValue_AVG_count = 0;\r
+       u4Byte                  ThermalValue_AVG = 0, RegC80, RegCd0, RegCd4, Regab4;   \r
+\r
+       u1Byte                  OFDM_min_index = 0;  // OFDM BB Swing should be less than +3.0dB, which is required by Arthur\r
+       u1Byte                  Indexforchannel = 0; // GetRightChnlPlaceforIQK(pHalData->CurrentChannel)\r
+       u1Byte                  PowerTrackingType = pHalData->RfPowerTrackingType;\r
+       u1Byte                  XtalOffsetEanble = 0;\r
+\r
+       TXPWRTRACK_CFG  c;\r
+\r
+       //4 1. The following TWO tables decide the final index of OFDM/CCK swing table.\r
+       pu1Byte                 deltaSwingTableIdx_TUP_A = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TDOWN_A = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TUP_B = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TDOWN_B = NULL;\r
+       /*for 8814 add by Yu Chen*/\r
+       pu1Byte                 deltaSwingTableIdx_TUP_C = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TDOWN_C = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TUP_D = NULL;\r
+       pu1Byte                 deltaSwingTableIdx_TDOWN_D = NULL;\r
+       /*for Xtal Offset by James.Tung*/\r
+       ps1Byte                 deltaSwingTableXtal_UP = NULL;\r
+       ps1Byte                 deltaSwingTableXtal_DOWN = NULL;\r
+\r
+       //4 2. Initilization ( 7 steps in total )\r
+\r
+       ConfigureTxpowerTrack(pDM_Odm, &c);\r
+\r
+       (*c.GetDeltaSwingTable)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_A, (pu1Byte *)&deltaSwingTableIdx_TDOWN_A,\r
+                       (pu1Byte *)&deltaSwingTableIdx_TUP_B, (pu1Byte *)&deltaSwingTableIdx_TDOWN_B);\r
+\r
+       if (pDM_Odm->SupportICType & ODM_RTL8814A)      /*for 8814 path C & D*/\r
+               (*c.GetDeltaSwingTable8814only)(pDM_Odm, (pu1Byte *)&deltaSwingTableIdx_TUP_C, (pu1Byte *)&deltaSwingTableIdx_TDOWN_C,\r
+                       (pu1Byte *)&deltaSwingTableIdx_TUP_D, (pu1Byte *)&deltaSwingTableIdx_TDOWN_D);\r
+\r
+       if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D))     /*for Xtal Offset*/\r
+               (*c.GetDeltaSwingXtalTable)(pDM_Odm, (ps1Byte *)&deltaSwingTableXtal_UP, (ps1Byte *)&deltaSwingTableXtal_DOWN);\r
+       \r
+\r
+       pRFCalibrateInfo->TXPowerTrackingCallbackCnt++; /*cosa add for debug*/\r
+       pRFCalibrateInfo->bTXPowerTrackingInit = TRUE;\r
+\r
+       /*pRFCalibrateInfo->TxPowerTrackControl = pHalData->TxPowerTrackControl;\r
+       <Kordan> We should keep updating the control variable according to HalData. \r
+       <Kordan> RFCalibrateInfo.RegA24 will be initialized when ODM HW configuring, but MP configures with para files. */\r
+       #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+       #if (MP_DRIVER == 1)\r
+               pRFCalibrateInfo->RegA24 = 0x090e1317;\r
+       #endif\r
+       #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+               if (pDM_Odm->mp_mode == TRUE)\r
+                       pRFCalibrateInfo->RegA24 = 0x090e1317;\r
+       #endif\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+               ("===>ODM_TXPowerTrackingCallback_ThermalMeter\n pRFCalibrateInfo->BbSwingIdxCckBase: %d, pRFCalibrateInfo->BbSwingIdxOfdmBase[A]: %d, pRFCalibrateInfo->DefaultOfdmIndex: %d\n", \r
+               pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->BbSwingIdxOfdmBase[ODM_RF_PATH_A], pRFCalibrateInfo->DefaultOfdmIndex));\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
+               ("pRFCalibrateInfo->TxPowerTrackControl=%d,  pHalData->EEPROMThermalMeter %d\n", pRFCalibrateInfo->TxPowerTrackControl,  pHalData->EEPROMThermalMeter));\r
+       ThermalValue = (u1Byte)ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, c.ThermalRegAddr, 0xfc00);  //0x42: RF Reg[15:10] 88E\r
+\r
+       /*add log by zhao he, check c80/c94/c14/ca0 value*/\r
+       if (pDM_Odm->SupportICType == ODM_RTL8723D) {   \r
+               RegC80 = ODM_GetBBReg(pDM_Odm, 0xc80, bMaskDWord);\r
+               RegCd0 = ODM_GetBBReg(pDM_Odm, 0xcd0, bMaskDWord);\r
+               RegCd4 = ODM_GetBBReg(pDM_Odm, 0xcd4, bMaskDWord);\r
+               Regab4 = ODM_GetBBReg(pDM_Odm, 0xab4, 0x000007FF);\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("0xc80 = 0x%x 0xcd0 = 0x%x 0xcd4 = 0x%x 0xab4 = 0x%x\n", RegC80, RegCd0, RegCd4, Regab4));\r
+       }\r
+\r
+       if (!pRFCalibrateInfo->TxPowerTrackControl)\r
+               return;\r
+\r
+\r
+       /*4 3. Initialize ThermalValues of RFCalibrateInfo*/\r
+\r
+       if (pRFCalibrateInfo->bReloadtxpowerindex)\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,("reload ofdm index for band switch\n"));                              \r
+\r
+       /*4 4. Calculate average thermal meter*/\r
+       \r
+       pRFCalibrateInfo->ThermalValue_AVG[pRFCalibrateInfo->ThermalValue_AVG_index] = ThermalValue;\r
+       pRFCalibrateInfo->ThermalValue_AVG_index++;\r
+       if (pRFCalibrateInfo->ThermalValue_AVG_index == c.AverageThermalNum)   /*Average times =  c.AverageThermalNum*/\r
+               pRFCalibrateInfo->ThermalValue_AVG_index = 0;\r
+\r
+       for(i = 0; i < c.AverageThermalNum; i++)\r
+       {\r
+               if (pRFCalibrateInfo->ThermalValue_AVG[i]) {\r
+                       ThermalValue_AVG += pRFCalibrateInfo->ThermalValue_AVG[i];\r
+                       ThermalValue_AVG_count++;\r
+               }\r
+       }\r
+\r
+       if(ThermalValue_AVG_count)               //Calculate Average ThermalValue after average enough times\r
+       {\r
+               ThermalValue = (u1Byte)(ThermalValue_AVG / ThermalValue_AVG_count);\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                       ("AVG Thermal Meter = 0x%X, EFUSE Thermal Base = 0x%X\n", ThermalValue, pHalData->EEPROMThermalMeter));                                 \r
+       }\r
+                       \r
+       //4 5. Calculate delta, delta_LCK, delta_IQK.\r
+\r
+       //"delta" here is used to determine whether thermal value changes or not.\r
+       delta   = (ThermalValue > pRFCalibrateInfo->ThermalValue)?(ThermalValue - pRFCalibrateInfo->ThermalValue):(pRFCalibrateInfo->ThermalValue - ThermalValue);\r
+       delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\r
+       delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\r
+\r
+       if (pRFCalibrateInfo->ThermalValue_IQK == 0xff) {       /*no PG, use thermal value for IQK*/\r
+               pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;\r
+               delta_IQK = (ThermalValue > pRFCalibrateInfo->ThermalValue_IQK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_IQK):(pRFCalibrateInfo->ThermalValue_IQK - ThermalValue);\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, use ThermalValue for IQK\n"));\r
+       }\r
+       \r
+       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+               diff_DPK[p] = (s1Byte)ThermalValue - (s1Byte)pRFCalibrateInfo->DpkThermal[p];\r
+\r
+       /*4 6. If necessary, do LCK.*/\r
+\r
+       if (!(pDM_Odm->SupportICType & ODM_RTL8821)) {  /*no PG , do LCK at initial status*/\r
+               if (pRFCalibrateInfo->ThermalValue_LCK == 0xff) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("no PG, do LCK\n"));\r
+                       pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\r
+\r
+                       /*Use RTLCK, so close power tracking driver LCK*/\r
+                       if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
+                               if (c.PHY_LCCalibrate)\r
+                                       (*c.PHY_LCCalibrate)(pDM_Odm);\r
+                       }\r
+                       \r
+                       delta_LCK = (ThermalValue > pRFCalibrateInfo->ThermalValue_LCK)?(ThermalValue - pRFCalibrateInfo->ThermalValue_LCK):(pRFCalibrateInfo->ThermalValue_LCK - ThermalValue);\r
+               }\r
+\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("(delta, delta_LCK, delta_IQK) = (%d, %d, %d)\n", delta, delta_LCK, delta_IQK));\r
+\r
+                /* Delta temperature is equal to or larger than 20 centigrade.*/\r
+               if (delta_LCK >= c.Threshold_IQK) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_LCK(%d) >= Threshold_IQK(%d)\n", delta_LCK, c.Threshold_IQK));\r
+                       pRFCalibrateInfo->ThermalValue_LCK = ThermalValue;\r
+\r
+                       /*Use RTLCK, so close power tracking driver LCK*/\r
+                       if (!(pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
+                               if (c.PHY_LCCalibrate)\r
+                                       (*c.PHY_LCCalibrate)(pDM_Odm);\r
+                       }\r
+               }\r
+       }\r
+\r
+       /*3 7. If necessary, move the index of swing table to adjust Tx power.*/        \r
+       \r
+       if (delta > 0 && pRFCalibrateInfo->TxPowerTrackControl)\r
+       {\r
+               //"delta" here is used to record the absolute value of differrence.\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                   \r
+           delta = ThermalValue > pHalData->EEPROMThermalMeter?(ThermalValue - pHalData->EEPROMThermalMeter):(pHalData->EEPROMThermalMeter - ThermalValue);            \r
+#else\r
+           delta = (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)?(ThermalValue - pDM_Odm->priv->pmib->dot11RFEntry.ther):(pDM_Odm->priv->pmib->dot11RFEntry.ther - ThermalValue);            \r
+#endif\r
+               if (delta >= TXPWR_TRACK_TABLE_SIZE)\r
+                       delta = TXPWR_TRACK_TABLE_SIZE - 1;\r
+\r
+               /*4 7.1 The Final Power Index = BaseIndex + PowerIndexOffset*/\r
+               \r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))                           \r
+               if(ThermalValue > pHalData->EEPROMThermalMeter) {\r
+#else\r
+               if(ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\r
+#endif\r
+\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+                               pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];        /*recording poer index offset*/\r
+                               switch (p) {\r
+                               case ODM_RF_PATH_B:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TUP_B[%d] = %d\n", delta, deltaSwingTableIdx_TUP_B[delta])); \r
+\r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_B[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_B[delta];       /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+\r
+                               case ODM_RF_PATH_C:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TUP_C[%d] = %d\n", delta, deltaSwingTableIdx_TUP_C[delta]));\r
+\r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_C[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_C[delta];       /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                                       ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+\r
+                               case ODM_RF_PATH_D:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TUP_D[%d] = %d\n", delta, deltaSwingTableIdx_TUP_D[delta]));\r
+\r
+                                               pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_D[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_D[delta];       /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+\r
+                               default:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
+                                               ("deltaSwingTableIdx_TUP_A[%d] = %d\n", delta, deltaSwingTableIdx_TUP_A[delta]));\r
+\r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = deltaSwingTableIdx_TUP_A[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  deltaSwingTableIdx_TUP_A[delta];        /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                                       ("******Temp is higher and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {\r
+                               /*Save XtalOffset from Xtal table*/\r
+                               pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset;        /*recording last Xtal offset*/\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
+                                                               ("[Xtal] deltaSwingTableXtal_UP[%d] = %d\n", delta, deltaSwingTableXtal_UP[delta]));\r
+                               pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_UP[delta];\r
+\r
+                               if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)\r
+                                       XtalOffsetEanble = 0;\r
+                               else\r
+                                       XtalOffsetEanble = 1;\r
+                       }\r
+               \r
+               } else {\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+                               pRFCalibrateInfo->DeltaPowerIndexLast[p] = pRFCalibrateInfo->DeltaPowerIndex[p];        /*recording poer index offset*/\r
+\r
+                               switch (p) {\r
+                               case ODM_RF_PATH_B:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TDOWN_B[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_B[delta]));  \r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_B[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_B[delta];        /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_B] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p])); \r
+                                       break;\r
+\r
+                               case ODM_RF_PATH_C:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TDOWN_C[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_C[delta]));  \r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_C[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_C[delta];        /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_C] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));   \r
+                                       break;\r
+\r
+                               case ODM_RF_PATH_D:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TDOWN_D[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_D[delta]));  \r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_D[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_D[delta];        /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_D] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+\r
+                               default:\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("deltaSwingTableIdx_TDOWN_A[%d] = %d\n", delta, deltaSwingTableIdx_TDOWN_A[delta]));  \r
+                                       pRFCalibrateInfo->DeltaPowerIndex[p] = -1 * deltaSwingTableIdx_TDOWN_A[delta];\r
+                                       pRFCalibrateInfo->Absolute_OFDMSwingIdx[p] =  -1 * deltaSwingTableIdx_TDOWN_A[delta];        /*Record delta swing for mix mode power tracking*/\r
+                                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                               ("******Temp is lower and pRFCalibrateInfo->Absolute_OFDMSwingIdx[ODM_RF_PATH_A] = %d\n", pRFCalibrateInfo->Absolute_OFDMSwingIdx[p]));  \r
+                                       break;\r
+                               }       \r
+                       }\r
+\r
+                       if (pDM_Odm->SupportICType & (ODM_RTL8703B | ODM_RTL8723D)) {\r
+                               /*Save XtalOffset from Xtal table*/\r
+                               pRFCalibrateInfo->XtalOffsetLast = pRFCalibrateInfo->XtalOffset;        /*recording last Xtal offset*/\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, \r
+                                                               ("[Xtal] deltaSwingTableXtal_DOWN[%d] = %d\n", delta, deltaSwingTableXtal_DOWN[delta]));\r
+                               pRFCalibrateInfo->XtalOffset = deltaSwingTableXtal_DOWN[delta];\r
+\r
+                               if (pRFCalibrateInfo->XtalOffsetLast == pRFCalibrateInfo->XtalOffset)\r
+                                       XtalOffsetEanble = 0;\r
+                               else\r
+                                       XtalOffsetEanble = 1;\r
+                       }\r
+\r
+               }\r
+               \r
+               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("\n\n=========================== [Path-%d] Calculating PowerIndexOffset===========================\n", p));  \r
+\r
+                       if (pRFCalibrateInfo->DeltaPowerIndex[p] == pRFCalibrateInfo->DeltaPowerIndexLast[p])         /*If Thermal value changes but lookup table value still the same*/\r
+                               pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
+                       else\r
+                               pRFCalibrateInfo->PowerIndexOffset[p] = pRFCalibrateInfo->DeltaPowerIndex[p] - pRFCalibrateInfo->DeltaPowerIndexLast[p];      /*Power Index Diff between 2 times Power Tracking*/\r
+\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("[Path-%d] PowerIndexOffset(%d) = DeltaPowerIndex(%d) - DeltaPowerIndexLast(%d)\n", p, pRFCalibrateInfo->PowerIndexOffset[p], pRFCalibrateInfo->DeltaPowerIndex[p], pRFCalibrateInfo->DeltaPowerIndexLast[p]));\r
+               \r
+                       pRFCalibrateInfo->OFDM_index[p] = pRFCalibrateInfo->BbSwingIdxOfdmBase[p] + pRFCalibrateInfo->PowerIndexOffset[p];\r
+                       pRFCalibrateInfo->CCK_index = pRFCalibrateInfo->BbSwingIdxCckBase + pRFCalibrateInfo->PowerIndexOffset[p];\r
+\r
+                       pRFCalibrateInfo->BbSwingIdxCck = pRFCalibrateInfo->CCK_index;  \r
+                       pRFCalibrateInfo->BbSwingIdxOfdm[p] = pRFCalibrateInfo->OFDM_index[p];  \r
+\r
+                       /*************Print BB Swing Base and Index Offset*************/\r
+\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("The 'CCK' final index(%d) = BaseIndex(%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxCck, pRFCalibrateInfo->BbSwingIdxCckBase, pRFCalibrateInfo->PowerIndexOffset[p]));\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("The 'OFDM' final index(%d) = BaseIndex[%d](%d) + PowerIndexOffset(%d)\n", pRFCalibrateInfo->BbSwingIdxOfdm[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p], pRFCalibrateInfo->PowerIndexOffset[p]));\r
+\r
+                       /*4 7.1 Handle boundary conditions of index.*/\r
+               \r
+                       if (pRFCalibrateInfo->OFDM_index[p] > c.SwingTableSize_OFDM-1)\r
+                               pRFCalibrateInfo->OFDM_index[p] = c.SwingTableSize_OFDM-1;\r
+                       else if (pRFCalibrateInfo->OFDM_index[p] <= OFDM_min_index)\r
+                               pRFCalibrateInfo->OFDM_index[p] = OFDM_min_index;\r
+               }\r
+               \r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                       ("\n\n========================================================================================================\n"));  \r
+\r
+               if (pRFCalibrateInfo->CCK_index > c.SwingTableSize_CCK-1)\r
+                       pRFCalibrateInfo->CCK_index = c.SwingTableSize_CCK-1;\r
+               else if (pRFCalibrateInfo->CCK_index <= 0)\r
+                       pRFCalibrateInfo->CCK_index = 0;\r
+       } else {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                       ("The thermal meter is unchanged or TxPowerTracking OFF(%d): ThermalValue: %d , pRFCalibrateInfo->ThermalValue: %d\n", \r
+                       pRFCalibrateInfo->TxPowerTrackControl, ThermalValue, pRFCalibrateInfo->ThermalValue));\r
+\r
+               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                       pRFCalibrateInfo->PowerIndexOffset[p] = 0;\r
+       }\r
+\r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+               ("TxPowerTracking: [CCK] Swing Current Index: %d, Swing Base Index: %d\n", \r
+                       pRFCalibrateInfo->CCK_index, pRFCalibrateInfo->BbSwingIdxCckBase));       /*Print Swing base & current*/\r
+\r
+       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                       ("TxPowerTracking: [OFDM] Swing Current Index: %d, Swing Base Index[%d]: %d\n",\r
+                       pRFCalibrateInfo->OFDM_index[p], p, pRFCalibrateInfo->BbSwingIdxOfdmBase[p]));\r
+       }\r
+\r
+       if ((pDM_Odm->SupportICType & ODM_RTL8814A)) {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("PowerTrackingType=%d\n", PowerTrackingType));\r
+               \r
+               if (PowerTrackingType == 0) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                               (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
+               } else if (PowerTrackingType == 1) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(2G) TSSI(5G) MODE**********\n"));\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                               (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_2G_TSSI_5G_MODE, p, 0);\r
+               } else if (PowerTrackingType == 2) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX(5G) TSSI(2G)MODE**********\n"));\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                               (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_5G_TSSI_2G_MODE, p, 0);\r
+               } else if (PowerTrackingType == 3) {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking TSSI MODE**********\n"));\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                               (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, TSSI_MODE, p, 0);\r
+               }\r
+               pRFCalibrateInfo->ThermalValue = ThermalValue;         /*Record last Power Tracking Thermal Value*/\r
+       \r
+       } else if ((pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_A] != 0 ||\r
+               pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_B] != 0 ||\r
+               pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_C] != 0 ||\r
+               pRFCalibrateInfo->PowerIndexOffset[ODM_RF_PATH_D] != 0) && \r
+               pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {\r
+               //4 7.2 Configure the Swing Table to adjust Tx Power.\r
+               \r
+               pRFCalibrateInfo->bTxPowerChanged = TRUE;       /*Always TRUE after Tx Power is adjusted by power tracking.*/                   \r
+               //\r
+               // 2012/04/23 MH According to Luke's suggestion, we can not write BB digital\r
+               // to increase TX power. Otherwise, EVM will be bad.\r
+               //\r
+               // 2012/04/25 MH Add for tx power tracking to set tx power in tx agc for 88E.\r
+               if (ThermalValue > pRFCalibrateInfo->ThermalValue) {\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                       ("Temperature Increasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n", \r
+                                       p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));  \r
+                       }\r
+               } else if (ThermalValue < pRFCalibrateInfo->ThermalValue) {     /*Low temperature*/\r
+                       for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++) {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                       ("Temperature Decreasing(%d): delta_pi: %d , delta_t: %d, Now_t: %d, EFUSE_t: %d, Last_t: %d\n",\r
+                                       p, pRFCalibrateInfo->PowerIndexOffset[p], delta, ThermalValue, pHalData->EEPROMThermalMeter, pRFCalibrateInfo->ThermalValue));                          \r
+                       }\r
+               }\r
+\r
+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+               if (ThermalValue > pHalData->EEPROMThermalMeter)\r
+#else\r
+               if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther)\r
+#endif\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                    \r
+\r
+                       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8723D) {\r
+\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
+                               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, 0);\r
+                       } else {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));\r
+                               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                               ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));\r
+\r
+                       if (pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8821 ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8814A ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8188F || pDM_Odm->SupportICType == ODM_RTL8822B ||\r
+                               pDM_Odm->SupportICType == ODM_RTL8723D) {\r
+\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking MIX_MODE**********\n"));\r
+                               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, MIX_MODE, p, Indexforchannel);\r
+                       } else {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter POWER Tracking BBSWING_MODE**********\n"));\r
+                               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                                       (*c.ODM_TxPwrTrackSetPwr)(pDM_Odm, BBSWING, p, Indexforchannel);\r
+                       }\r
+                       \r
+               }\r
+\r
+               pRFCalibrateInfo->BbSwingIdxCckBase = pRFCalibrateInfo->BbSwingIdxCck;    /*Record last time Power Tracking result as base.*/\r
+               for (p = ODM_RF_PATH_A; p < c.RfPathCount; p++)\r
+                       pRFCalibrateInfo->BbSwingIdxOfdmBase[p] = pRFCalibrateInfo->BbSwingIdxOfdm[p];\r
+\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                       ("pRFCalibrateInfo->ThermalValue = %d ThermalValue= %d\n", pRFCalibrateInfo->ThermalValue, ThermalValue));\r
+               \r
+               pRFCalibrateInfo->ThermalValue = ThermalValue;         /*Record last Power Tracking Thermal Value*/\r
+\r
+       }\r
+\r
+\r
+       if (pDM_Odm->SupportICType == ODM_RTL8703B || pDM_Odm->SupportICType == ODM_RTL8723D) {\r
+\r
+               if (XtalOffsetEanble != 0 && pRFCalibrateInfo->TxPowerTrackControl && (pHalData->EEPROMThermalMeter != 0xff)) {\r
+\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********Enter Xtal Tracking**********\n"));\r
+\r
+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+                       if (ThermalValue > pHalData->EEPROMThermalMeter) {\r
+#else\r
+                       if (ThermalValue > pDM_Odm->priv->pmib->dot11RFEntry.ther) {\r
+#endif\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                       ("Temperature(%d) higher than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                    \r
+                               (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);\r
+                       } else {\r
+                               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,\r
+                                       ("Temperature(%d) lower than PG value(%d)\n", ThermalValue, pHalData->EEPROMThermalMeter));                     \r
+                               (*c.ODM_TxXtalTrackSetXtal)(pDM_Odm);\r
+                       }\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("**********End Xtal Tracking**********\n"));\r
+       }\r
+\r
+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+\r
+       if (!IS_HARDWARE_TYPE_8723B(Adapter)) {\r
+               /*Delta temperature is equal to or larger than 20 centigrade (When threshold is 8).*/\r
+               if (delta_IQK >= c.Threshold_IQK) {\r
+                       pRFCalibrateInfo->ThermalValue_IQK = ThermalValue;\r
+                       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("delta_IQK(%d) >= Threshold_IQK(%d)\n", delta_IQK, c.Threshold_IQK));\r
+                       if (!pRFCalibrateInfo->bIQKInProgress) \r
+                               (*c.DoIQK)(pDM_Odm, delta_IQK, ThermalValue, 8);\r
+               }\r
+       }\r
+       if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_A] != 0) {\r
+               if (diff_DPK[ODM_RF_PATH_A] >= c.Threshold_DPK) { \r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK));\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
+               } else if ((diff_DPK[ODM_RF_PATH_A] <= -1 * c.Threshold_DPK)) {\r
+                       s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_A] / c.Threshold_DPK);      \r
+\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
+               } else {\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xcc4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);     \r
+               }\r
+       }\r
+       if (pRFCalibrateInfo->DpkThermal[ODM_RF_PATH_B] != 0) {\r
+               if (diff_DPK[ODM_RF_PATH_B] >= c.Threshold_DPK) { \r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK));\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
+               } else if ((diff_DPK[ODM_RF_PATH_B] <= -1 * c.Threshold_DPK)) {\r
+                       s4Byte value = 0x20 + (diff_DPK[ODM_RF_PATH_B] / c.Threshold_DPK);      \r
+\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, value);\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);\r
+               } else {\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x1);\r
+                       ODM_SetBBReg(pDM_Odm, 0xec4, BIT14|BIT13|BIT12|BIT11|BIT10, 0);\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c, BIT(31), 0x0);     \r
+               }\r
+       }\r
+\r
+#endif         \r
+                       \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("<===ODM_TXPowerTrackingCallback_ThermalMeter\n"));\r
+       \r
+       pRFCalibrateInfo->TXPowercount = 0;\r
+}\r
+\r
+\r
+\r
+//3============================================================\r
+//3 IQ Calibration\r
+//3============================================================\r
+\r
+VOID\r
+ODM_ResetIQKResult(\r
+       IN PDM_ODM_T    pDM_Odm \r
+)\r
+{\r
+       return;\r
+}\r
+#if !(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+u1Byte ODM_GetRightChnlPlaceforIQK(u1Byte chnl)\r
+{\r
+       u1Byte  channel_all[ODM_TARGET_CHNL_NUM_2G_5G] = \r
+       {1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,149,151,153,155,157,159,161,163,165};\r
+       u1Byte  place = chnl;\r
+\r
+       \r
+       if(chnl > 14)\r
+       {\r
+               for(place = 14; place<sizeof(channel_all); place++)\r
+               {\r
+                       if(channel_all[place] == chnl)\r
+                       {\r
+                               return place-13;\r
+                       }\r
+               }\r
+       }       \r
+       return 0;\r
+\r
+}\r
+#endif\r
+\r
+VOID\r
+odm_IQCalibrate(\r
+               IN      PDM_ODM_T       pDM_Odm \r
+               )\r
+{\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)   \r
+       if (*pDM_Odm->pIsFcsModeEnable)\r
+               return;\r
+#endif\r
+\r
+       if (pDM_Odm->bLinked) {\r
+\r
+               if ((*pDM_Odm->pChannel != pDM_Odm->preChannel) && (!*pDM_Odm->pbScanInProcess)) {\r
+                       pDM_Odm->preChannel = *pDM_Odm->pChannel;\r
+                       pDM_Odm->LinkedInterval = 0;\r
+               }\r
+\r
+               if (pDM_Odm->LinkedInterval < 3)\r
+                       pDM_Odm->LinkedInterval++;\r
+                       \r
+               if (pDM_Odm->LinkedInterval == 2) {\r
+                       PHY_IQCalibrate(Adapter, FALSE);\r
+               }\r
+       } else\r
+               pDM_Odm->LinkedInterval = 0;\r
+               \r
+}\r
+\r
+void phydm_rf_init(IN          PDM_ODM_T               pDM_Odm)\r
+{\r
+\r
+       odm_TXPowerTrackingInit(pDM_Odm);\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       ODM_ClearTxPowerTrackingState(pDM_Odm); \r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
+#if (RTL8814A_SUPPORT == 1)            \r
+       if (pDM_Odm->SupportICType & ODM_RTL8814A)\r
+               PHY_IQCalibrate_8814A_Init(pDM_Odm);\r
+#endif \r
+#endif\r
+\r
+}\r
+\r
+void phydm_rf_watchdog(IN              PDM_ODM_T               pDM_Odm)\r
+{\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PADAPTER        Adapter = pDM_Odm->Adapter;\r
+       PMGNT_INFO      pMgntInfo = &Adapter->MgntInfo;\r
+\r
+       ODM_TXPowerTrackingCheck(pDM_Odm);      \r
+\r
+       if(!pMgntInfo->IQKBeforeConnection)\r
+       {\r
+               if (pDM_Odm->SupportICType & ODM_IC_11AC_SERIES)\r
+                       odm_IQCalibrate(pDM_Odm);\r
+       }\r
+#endif\r
+}\r