net: wireless: rockchip_wlan: add rtl8188fu support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8188fu / hal / phydm / phydm.c
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/hal/phydm/phydm.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/hal/phydm/phydm.c
new file mode 100644 (file)
index 0000000..d0ab8ca
--- /dev/null
@@ -0,0 +1,2165 @@
+/******************************************************************************\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
+\r
+#include "mp_precomp.h"\r
+#include "phydm_precomp.h"\r
+\r
+const u2Byte dB_Invert_Table[12][8] = {\r
+       {       1,              1,              1,              2,              2,              2,              2,              3},\r
+       {       3,              3,              4,              4,              4,              5,              6,              6},\r
+       {       7,              8,              9,              10,             11,             13,             14,             16},\r
+       {       18,             20,             22,             25,             28,             32,             35,             40},\r
+       {       45,             50,             56,             63,             71,             79,             89,             100},\r
+       {       112,            126,            141,            158,            178,            200,            224,            251},\r
+       {       282,            316,            355,            398,            447,            501,            562,            631},\r
+       {       708,            794,            891,            1000,   1122,   1259,   1413,   1585},\r
+       {       1778,   1995,   2239,   2512,   2818,   3162,   3548,   3981},\r
+       {       4467,   5012,   5623,   6310,   7079,   7943,   8913,   10000},\r
+       {       11220,  12589,  14125,  15849,  17783,  19953,  22387,  25119},\r
+       {       28184,  31623,  35481,  39811,  44668,  50119,  56234,  65535}\r
+};\r
+\r
+\r
+//============================================================\r
+// Local Function predefine.\r
+//============================================================\r
+\r
+/* START------------COMMON INFO RELATED--------------- */\r
+\r
+VOID\r
+odm_GlobalAdapterCheck(\r
+       IN              VOID\r
+       );\r
+\r
+//move to odm_PowerTacking.h by YuChen\r
+\r
+\r
+\r
+VOID\r
+odm_UpdatePowerTrainingState(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+);\r
+\r
+//============================================================\r
+//3 Export Interface\r
+//============================================================\r
+\r
+/*Y = 10*log(X)*/\r
+s4Byte\r
+ODM_PWdB_Conversion(\r
+       IN  s4Byte X,\r
+       IN  u4Byte TotalBit,\r
+       IN  u4Byte DecimalBit\r
+       )\r
+{\r
+       s4Byte Y, integer = 0, decimal = 0;\r
+       u4Byte i;\r
+\r
+       if(X == 0)\r
+               X = 1; // log2(x), x can't be 0\r
+\r
+       for(i = (TotalBit-1); i > 0; i--)\r
+       {\r
+               if(X & BIT(i))\r
+               {\r
+                       integer = i;\r
+                       if(i > 0)\r
+                               decimal = (X & BIT(i-1))?2:0; //decimal is 0.5dB*3=1.5dB~=2dB \r
+                       break;\r
+               }\r
+       }\r
+       \r
+       Y = 3*(integer-DecimalBit)+decimal; //10*log(x)=3*log2(x), \r
+\r
+       return Y;\r
+}\r
+\r
+s4Byte\r
+ODM_SignConversion(\r
+    IN  s4Byte value,\r
+    IN  u4Byte TotalBit\r
+    )\r
+{\r
+       if(value&BIT(TotalBit-1))\r
+               value -= BIT(TotalBit);\r
+       return value;\r
+}\r
+\r
+VOID\r
+ODM_InitMpDriverStatus(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+\r
+       // Decide when compile time\r
+       #if(MP_DRIVER == 1)\r
+       pDM_Odm->mp_mode = TRUE;\r
+       #else\r
+       pDM_Odm->mp_mode = FALSE;\r
+       #endif\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+       PADAPTER        Adapter =  pDM_Odm->Adapter;\r
+\r
+       // Update information every period\r
+       pDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;\r
+\r
+#else\r
+\r
+       // MP mode is always false at AP side\r
+       pDM_Odm->mp_mode = FALSE;\r
+\r
+#endif\r
+}\r
+\r
+VOID\r
+ODM_UpdateMpDriverStatus(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+\r
+       // Do nothing.\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+       PADAPTER        Adapter =  pDM_Odm->Adapter;\r
+\r
+       // Update information erery period\r
+       pDM_Odm->mp_mode = (BOOLEAN)Adapter->registrypriv.mp_mode;\r
+\r
+#else\r
+\r
+       // Do nothing.\r
+\r
+#endif\r
+}\r
+\r
+VOID\r
+PHYDM_InitTRXAntennaSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+#if (RTL8814A_SUPPORT == 1)\r
+\r
+       if (pDM_Odm->SupportICType & (ODM_RTL8814A)) {\r
+               u1Byte  RxAnt = 0, TxAnt = 0;\r
+\r
+               RxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH, pDM_Odm), ODM_BIT(BB_RX_PATH, pDM_Odm));\r
+               TxAnt = (u1Byte)ODM_GetBBReg(pDM_Odm, ODM_REG(BB_TX_PATH, pDM_Odm), ODM_BIT(BB_TX_PATH, pDM_Odm));\r
+               pDM_Odm->TXAntStatus =  (TxAnt & 0xf);\r
+               pDM_Odm->RXAntStatus =  (RxAnt & 0xf);\r
+       }\r
+#endif\r
+}\r
+\r
+VOID\r
+phydm_Init_cck_setting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+)\r
+{\r
+       u4Byte value_824,value_82c;\r
+\r
+       pDM_Odm->bCckHighPower = (BOOLEAN) ODM_GetBBReg(pDM_Odm, ODM_REG(CCK_RPT_FORMAT,pDM_Odm), ODM_BIT(CCK_RPT_FORMAT,pDM_Odm));\r
+\r
+       #if (RTL8192E_SUPPORT == 1)\r
+       if(pDM_Odm->SupportICType & (ODM_RTL8192E))\r
+       {\r
+               /* 0x824[9] = 0x82C[9] = 0xA80[7]  these regiaters settinh should be equal or CCK RSSI report may inaccurate */\r
+               value_824 = ODM_GetBBReg(pDM_Odm, 0x824, BIT9);\r
+               value_82c = ODM_GetBBReg(pDM_Odm, 0x82c, BIT9);\r
+               \r
+               if(value_824 != value_82c)\r
+               {\r
+                       ODM_SetBBReg(pDM_Odm, 0x82c , BIT9, value_824);\r
+               }\r
+               ODM_SetBBReg(pDM_Odm, 0xa80 , BIT7, value_824);\r
+               pDM_Odm->cck_agc_report_type = (BOOLEAN)value_824;\r
+       }\r
+       #endif\r
+       \r
+       #if (RTL8703B_SUPPORT == 1)\r
+       if (pDM_Odm->SupportICType & (ODM_RTL8703B)) {\r
+\r
+               pDM_Odm->cck_agc_report_type = ODM_GetBBReg(pDM_Odm, 0x950, BIT11) ? 1 : 0; /*1: 4bit LNA , 0: 3bit LNA */\r
+               \r
+               if (pDM_Odm->cck_agc_report_type != 1) {\r
+                       DbgPrint("[Warning] 8703B CCK should be 4bit LNA, ie. 0x950[11] = 1\n");\r
+                       /**/\r
+               }\r
+       }\r
+       #endif\r
+       \r
+}\r
+\r
+u1Byte DummyHubUsbMode = 1;/* USB 2.0 */\r
+void   phydm_hook_dummy_member(\r
+       IN      PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       if (pDM_Odm->HubUsbMode == NULL)\r
+               pDM_Odm->HubUsbMode = &DummyHubUsbMode;\r
+}\r
+\r
+\r
+VOID\r
+odm_CommonInfoSelfInit(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       phydm_Init_cck_setting(pDM_Odm);\r
+       pDM_Odm->RFPathRxEnable = (u1Byte) ODM_GetBBReg(pDM_Odm, ODM_REG(BB_RX_PATH,pDM_Odm), ODM_BIT(BB_RX_PATH,pDM_Odm));\r
+#if (DM_ODM_SUPPORT_TYPE != ODM_CE)    \r
+       pDM_Odm->pbNet_closed = &pDM_Odm->BOOLEAN_temp;\r
+#endif\r
+\r
+       PHYDM_InitDebugSetting(pDM_Odm);\r
+       ODM_InitMpDriverStatus(pDM_Odm);\r
+       PHYDM_InitTRXAntennaSetting(pDM_Odm);\r
+\r
+       pDM_Odm->TxRate = 0xFF;\r
+\r
+       pDM_Odm->number_linked_client = 0;\r
+       pDM_Odm->pre_number_linked_client = 0;\r
+       pDM_Odm->number_active_client = 0;\r
+       pDM_Odm->pre_number_active_client = 0;\r
+       phydm_hook_dummy_member(pDM_Odm);\r
+       \r
+}\r
+\r
+VOID\r
+odm_CommonInfoSelfUpdate(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       u1Byte  EntryCnt = 0, num_active_client = 0;\r
+       u4Byte  i, OneEntry_MACID = 0, ma_rx_tp = 0;\r
+       PSTA_INFO_T     pEntry;\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+       PADAPTER        Adapter =  pDM_Odm->Adapter;\r
+       PMGNT_INFO      pMgntInfo = &Adapter->MgntInfo;\r
+\r
+       pEntry = pDM_Odm->pODM_StaInfo[0];\r
+       if(pMgntInfo->mAssoc)\r
+       {\r
+               pEntry->bUsed=TRUE;\r
+               for (i=0; i<6; i++)\r
+                       pEntry->MacAddr[i] = pMgntInfo->Bssid[i];\r
+       }\r
+       else\r
+       {\r
+               pEntry->bUsed=FALSE;\r
+               for (i=0; i<6; i++)\r
+                       pEntry->MacAddr[i] = 0;\r
+       }\r
+\r
+       //STA mode is linked to AP\r
+       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[0]) && !ACTING_AS_AP(Adapter))\r
+               pDM_Odm->bsta_state = TRUE;\r
+       else\r
+               pDM_Odm->bsta_state = FALSE;\r
+#endif\r
+\r
+/* THis variable cannot be used because it is wrong*/\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
+       {\r
+               if (*(pDM_Odm->pSecChOffset) == 1)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 2;\r
+               else if (*(pDM_Odm->pSecChOffset) == 2)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 2;\r
+       } else if (*(pDM_Odm->pBandWidth) == ODM_BW80M) {\r
+               if (*(pDM_Odm->pSecChOffset) == 1)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 6;\r
+               else if (*(pDM_Odm->pSecChOffset) == 2)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 6;\r
+       } else\r
+               pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);\r
+#else\r
+       if (*(pDM_Odm->pBandWidth) == ODM_BW40M) {\r
+               if (*(pDM_Odm->pSecChOffset) == 1)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) - 2;\r
+               else if (*(pDM_Odm->pSecChOffset) == 2)\r
+                       pDM_Odm->ControlChannel = *(pDM_Odm->pChannel) + 2;\r
+       } else\r
+               pDM_Odm->ControlChannel = *(pDM_Odm->pChannel);\r
+#endif\r
+\r
+       for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+       {\r
+               pEntry = pDM_Odm->pODM_StaInfo[i];\r
+               if(IS_STA_VALID(pEntry))\r
+               {\r
+                       EntryCnt++;\r
+                       if(EntryCnt==1)\r
+                       {\r
+                               OneEntry_MACID=i;\r
+                       }\r
+\r
+                       #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+                               ma_rx_tp =  (pEntry->rx_byte_cnt_LowMAW)<<3; /*  low moving average RX  TP   ( bit /sec)*/\r
+\r
+                               ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("ClientTP[%d]: ((%d )) bit/sec\n", i, ma_rx_tp));\r
+                               \r
+                               if (ma_rx_tp > ACTIVE_TP_THRESHOLD)\r
+                                       num_active_client++;\r
+                       #endif\r
+                }\r
+       }\r
+       \r
+       if(EntryCnt == 1)\r
+       {\r
+               pDM_Odm->bOneEntryOnly = TRUE;\r
+               pDM_Odm->OneEntry_MACID=OneEntry_MACID;\r
+       }\r
+       else\r
+               pDM_Odm->bOneEntryOnly = FALSE;\r
+\r
+       pDM_Odm->pre_number_linked_client = pDM_Odm->number_linked_client;\r
+       pDM_Odm->pre_number_active_client = pDM_Odm->number_active_client;\r
+       \r
+       pDM_Odm->number_linked_client = EntryCnt;\r
+       pDM_Odm->number_active_client = num_active_client;      \r
+\r
+       /* Update MP driver status*/\r
+       ODM_UpdateMpDriverStatus(pDM_Odm);\r
+}\r
+\r
+VOID\r
+odm_CommonInfoSelfReset(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       pDM_Odm->PhyDbgInfo.NumQryBeaconPkt = 0;\r
+#endif\r
+}\r
+\r
+PVOID\r
+PhyDM_Get_Structure(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u1Byte                  Structure_Type\r
+)\r
+\r
+{\r
+       PVOID   pStruct = NULL;\r
+#if RTL8195A_SUPPORT\r
+       switch (Structure_Type){\r
+               case    PHYDM_FALSEALMCNT:\r
+                       pStruct = &FalseAlmCnt;\r
+               break;\r
+               \r
+               case    PHYDM_CFOTRACK:\r
+                       pStruct = &DM_CfoTrack;\r
+               break;\r
+\r
+               case    PHYDM_ADAPTIVITY:\r
+                       pStruct = &(pDM_Odm->Adaptivity);\r
+               break;\r
+               \r
+               default:\r
+               break;\r
+       }\r
+\r
+#else\r
+       switch (Structure_Type){\r
+               case    PHYDM_FALSEALMCNT:\r
+                       pStruct = &(pDM_Odm->FalseAlmCnt);\r
+               break;\r
+               \r
+               case    PHYDM_CFOTRACK:\r
+                       pStruct = &(pDM_Odm->DM_CfoTrack);\r
+               break;\r
+\r
+               case    PHYDM_ADAPTIVITY:\r
+                       pStruct = &(pDM_Odm->Adaptivity);\r
+               break;\r
+               \r
+               default:\r
+               break;\r
+       }\r
+\r
+#endif\r
+       return  pStruct;\r
+}\r
+\r
+VOID\r
+odm_HWSetting(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+#if (RTL8821A_SUPPORT == 1)\r
+       if(pDM_Odm->SupportICType & ODM_RTL8821)\r
+               odm_HWSetting_8821A(pDM_Odm);\r
+#endif\r
+\r
+}\r
+\r
+//\r
+// 2011/09/21 MH Add to describe different team necessary resource allocate??\r
+//\r
+VOID\r
+ODM_DMInit(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       odm_CommonInfoSelfInit(pDM_Odm);\r
+       odm_DIGInit(pDM_Odm);\r
+       Phydm_NHMCounterStatisticsInit(pDM_Odm);\r
+       Phydm_AdaptivityInit(pDM_Odm);\r
+       phydm_ra_info_init(pDM_Odm);\r
+       odm_RateAdaptiveMaskInit(pDM_Odm);\r
+       odm_RA_ParaAdjust_init(pDM_Odm);\r
+       ODM_CfoTrackingInit(pDM_Odm);\r
+       ODM_EdcaTurboInit(pDM_Odm);\r
+       odm_RSSIMonitorInit(pDM_Odm);\r
+       phydm_rf_init(pDM_Odm);\r
+       odm_TXPowerTrackingInit(pDM_Odm);\r
+       odm_AntennaDiversityInit(pDM_Odm);\r
+       odm_AutoChannelSelectInit(pDM_Odm);\r
+       odm_PathDiversityInit(pDM_Odm);\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
+       phydm_Beamforming_Init(pDM_Odm);\r
+#endif \r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               odm_DynamicBBPowerSavingInit(pDM_Odm);\r
+               odm_DynamicTxPowerInit(pDM_Odm);\r
+\r
+#if (RTL8188E_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)\r
+               {\r
+                       odm_PrimaryCCA_Init(pDM_Odm);\r
+                       ODM_RAInfo_Init_all(pDM_Odm);\r
+               }\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       \r
+       #if (RTL8723B_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+                       odm_SwAntDetectInit(pDM_Odm);\r
+       #endif\r
+\r
+       #if (RTL8192E_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType==ODM_RTL8192E)\r
+                       odm_PrimaryCCA_Check_Init(pDM_Odm);\r
+       #endif\r
+\r
+#endif\r
+\r
+       }\r
+\r
+}\r
+\r
+VOID\r
+ODM_DMReset(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+       \r
+       ODM_AntDivReset(pDM_Odm);       \r
+       phydm_setEDCCAThresholdAPI(pDM_Odm, pDM_DigTable->CurIGValue);\r
+}\r
+\r
+\r
+VOID\r
+phydm_support_ablity_debug(\r
+       IN              PVOID           pDM_VOID,\r
+       IN              u4Byte          *const dm_value,\r
+       IN              u4Byte                  *_used,\r
+       OUT             char                    *output,\r
+       IN              u4Byte                  *_out_len\r
+       )\r
+{\r
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+       u4Byte                  pre_support_ability;\r
+       u4Byte used = *_used;\r
+       u4Byte out_len = *_out_len;\r
+\r
+       pre_support_ability = pDM_Odm->SupportAbility ; \r
+       PHYDM_SNPRINTF((output+used, out_len-used,"\n%s\n", "================================"));\r
+       if(dm_value[0] == 100)\r
+       {\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "[Supportablity] PhyDM Selection\n"));\r
+               PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================"));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "00. (( %s ))DIG  \n", ((pDM_Odm->SupportAbility & ODM_BB_DIG)?("V"):(".")) ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "01. (( %s ))RA_MASK  \n", ((pDM_Odm->SupportAbility & ODM_BB_RA_MASK)?("V"):(".")) ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "02. (( %s ))DYNAMIC_TXPWR  \n", ((pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_TXPWR)?("V"):("."))   ));                \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "03. (( %s ))FA_CNT  \n", ((pDM_Odm->SupportAbility & ODM_BB_FA_CNT)?("V"):("."))  ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "04. (( %s ))RSSI_MONITOR  \n", ((pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR)?("V"):("."))   ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "05. (( %s ))CCK_PD  \n", ((pDM_Odm->SupportAbility & ODM_BB_CCK_PD)?("V"):("."))   ));      \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "06. (( %s ))ANT_DIV  \n", ((pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)?("V"):("."))  ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "07. (( %s ))PWR_SAVE  \n", ((pDM_Odm->SupportAbility & ODM_BB_PWR_SAVE)?("V"):("."))  ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "08. (( %s ))PWR_TRAIN  \n", ((pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN)?("V"):("."))   ));        \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "09. (( %s ))RATE_ADAPTIVE  \n", ((pDM_Odm->SupportAbility & ODM_BB_RATE_ADAPTIVE)?("V"):("."))   ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "10. (( %s ))PATH_DIV  \n", ((pDM_Odm->SupportAbility & ODM_BB_PATH_DIV)?("V"):("."))));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "11. (( %s ))PSD  \n", ((pDM_Odm->SupportAbility & ODM_BB_PSD)?("V"):(".")) ));      \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "12. (( %s ))RXHP  \n", ((pDM_Odm->SupportAbility & ODM_BB_RXHP)?("V"):("."))   ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "13. (( %s ))ADAPTIVITY  \n", ((pDM_Odm->SupportAbility & ODM_BB_ADAPTIVITY)?("V"):(".")) ));        \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "14. (( %s ))CFO_TRACKING  \n", ((pDM_Odm->SupportAbility & ODM_BB_CFO_TRACKING)?("V"):(".")) ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "15. (( %s ))NHM_CNT  \n", ((pDM_Odm->SupportAbility & ODM_BB_NHM_CNT)?("V"):("."))  ));     \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "16. (( %s ))PRIMARY_CCA  \n", ((pDM_Odm->SupportAbility & ODM_BB_PRIMARY_CCA)?("V"):(".")) ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "20. (( %s ))EDCA_TURBO  \n", ((pDM_Odm->SupportAbility & ODM_MAC_EDCA_TURBO)?("V"):("."))  ));      \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "21. (( %s ))EARLY_MODE  \n", ((pDM_Odm->SupportAbility & ODM_MAC_EARLY_MODE)?("V"):(".")) ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "24. (( %s ))TX_PWR_TRACK  \n", ((pDM_Odm->SupportAbility & ODM_RF_TX_PWR_TRACK)?("V"):("."))  ));   \r
+               PHYDM_SNPRINTF((output+used, out_len-used, "25. (( %s ))RX_GAIN_TRACK  \n", ((pDM_Odm->SupportAbility & ODM_RF_RX_GAIN_TRACK)?("V"):("."))  ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used, "26. (( %s ))RF_CALIBRATION  \n", ((pDM_Odm->SupportAbility & ODM_RF_CALIBRATION)?("V"):("."))   ));\r
+               PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================"));\r
+       }\r
+       /*\r
+       else if(dm_value[0] == 101)\r
+       {\r
+               pDM_Odm->SupportAbility = 0 ;\r
+               DbgPrint("Disable all SupportAbility components \n");\r
+               PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "Disable all SupportAbility components"));    \r
+       }\r
+       */\r
+       else\r
+       {\r
+\r
+               if(dm_value[1] == 1) //enable\r
+               {\r
+                       pDM_Odm->SupportAbility |= BIT(dm_value[0]) ;\r
+                       if(BIT(dm_value[0]) & ODM_BB_PATH_DIV)\r
+                       {\r
+                               odm_PathDiversityInit(pDM_Odm);\r
+                       }\r
+               }\r
+               else if(dm_value[1] == 2) //disable\r
+               {\r
+                       pDM_Odm->SupportAbility &= ~(BIT(dm_value[0])) ;\r
+               }\r
+               else\r
+               {\r
+                       //DbgPrint("\n[Warning!!!]  1:enable,  2:disable \n\n");\r
+                       PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "[Warning!!!]  1:enable,  2:disable"));\r
+               }\r
+       }\r
+       PHYDM_SNPRINTF((output+used, out_len-used,"pre-SupportAbility  =  0x%x\n",  pre_support_ability ));     \r
+       PHYDM_SNPRINTF((output+used, out_len-used,"Curr-SupportAbility =  0x%x\n", pDM_Odm->SupportAbility ));\r
+       PHYDM_SNPRINTF((output+used, out_len-used,"%s\n", "================================"));\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+//\r
+//tmp modify for LC Only\r
+//\r
+VOID\r
+ODM_DMWatchdog_LPS(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{      \r
+       odm_CommonInfoSelfUpdate(pDM_Odm);\r
+       odm_FalseAlarmCounterStatistics(pDM_Odm);\r
+       odm_RSSIMonitorCheck(pDM_Odm);\r
+       odm_DIGbyRSSI_LPS(pDM_Odm);     \r
+       odm_CCKPacketDetectionThresh(pDM_Odm);\r
+       odm_CommonInfoSelfReset(pDM_Odm);\r
+\r
+       if(*(pDM_Odm->pbPowerSaving)==TRUE)\r
+               return;\r
+}\r
+#endif\r
+//\r
+// 2011/09/20 MH This is the entry pointer for all team to execute HW out source DM.\r
+// You can not add any dummy function here, be care, you can only use DM structure\r
+// to perform any new ODM_DM.\r
+//\r
+VOID\r
+ODM_DMWatchdog(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       odm_CommonInfoSelfUpdate(pDM_Odm);\r
+       phydm_BasicDbgMessage(pDM_Odm);\r
+       odm_HWSetting(pDM_Odm);\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+       {\r
+       prtl8192cd_priv priv            = pDM_Odm->priv;\r
+       if( (priv->auto_channel != 0) && (priv->auto_channel != 2) )//if ACS running, do not do FA/CCA counter read\r
+               return;\r
+       }\r
+#endif \r
+       odm_FalseAlarmCounterStatistics(pDM_Odm);\r
+       phydm_NoisyDetection(pDM_Odm);\r
+       \r
+       odm_RSSIMonitorCheck(pDM_Odm);\r
+\r
+       if(*(pDM_Odm->pbPowerSaving) == TRUE)\r
+       {\r
+               odm_DIGbyRSSI_LPS(pDM_Odm);\r
+               {\r
+                       pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+                       Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);\r
+               }\r
+               #if (DM_ODM_SUPPORT_TYPE & (ODM_CE))\r
+               odm_AntennaDiversity(pDM_Odm); /*enable AntDiv in PS mode, request from SD4 Jeff*/\r
+               #endif\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD, ("DMWatchdog in power saving mode\n"));\r
+               return;\r
+       }\r
+       \r
+       Phydm_CheckAdaptivity(pDM_Odm);\r
+       odm_UpdatePowerTrainingState(pDM_Odm);\r
+       odm_DIG(pDM_Odm);\r
+       {\r
+               pDIG_T  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+               Phydm_Adaptivity(pDM_Odm, pDM_DigTable->CurIGValue);\r
+       }\r
+       odm_CCKPacketDetectionThresh(pDM_Odm);\r
+       phydm_ra_dynamic_retry_limit(pDM_Odm);\r
+       phydm_ra_dynamic_retry_count(pDM_Odm);\r
+       odm_RefreshRateAdaptiveMask(pDM_Odm);\r
+       odm_RefreshBasicRateMask(pDM_Odm);\r
+       odm_DynamicBBPowerSaving(pDM_Odm);\r
+       odm_EdcaTurboCheck(pDM_Odm);\r
+       odm_PathDiversity(pDM_Odm);\r
+       ODM_CfoTracking(pDM_Odm);\r
+       odm_DynamicTxPower(pDM_Odm);\r
+       odm_AntennaDiversity(pDM_Odm);\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
+       phydm_Beamforming_Watchdog(pDM_Odm);\r
+#endif\r
+\r
+       phydm_rf_watchdog(pDM_Odm);\r
+\r
+       if(pDM_Odm->SupportICType & ODM_IC_11N_SERIES)\r
+       {\r
+               \r
+#if (RTL8188E_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType==ODM_RTL8188E)\r
+                       odm_DynamicPrimaryCCA(pDM_Odm); \r
+#endif\r
+\r
+#if( DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+\r
+       #if (RTL8192E_SUPPORT == 1)\r
+               if(pDM_Odm->SupportICType==ODM_RTL8192E)\r
+                       odm_DynamicPrimaryCCA_Check(pDM_Odm); \r
+       #endif\r
+#endif\r
+       }\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+       odm_dtc(pDM_Odm);\r
+#endif\r
+\r
+       odm_CommonInfoSelfReset(pDM_Odm);\r
+       \r
+}\r
+\r
+\r
+//\r
+// Init /.. Fixed HW value. Only init time.\r
+//\r
+VOID\r
+ODM_CmnInfoInit(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              u4Byte                  Value   \r
+       )\r
+{\r
+       //\r
+       // This section is used for init value\r
+       //\r
+       switch  (CmnInfo)\r
+       {\r
+               //\r
+               // Fixed ODM value.\r
+               //\r
+               case    ODM_CMNINFO_ABILITY:\r
+                       pDM_Odm->SupportAbility = (u4Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RF_TYPE:\r
+                       pDM_Odm->RFType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_PLATFORM:\r
+                       pDM_Odm->SupportPlatform = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_INTERFACE:\r
+                       pDM_Odm->SupportInterface = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_MP_TEST_CHIP:\r
+                       pDM_Odm->bIsMPChip= (u1Byte)Value;\r
+                       break;\r
+            \r
+               case    ODM_CMNINFO_IC_TYPE:\r
+                       pDM_Odm->SupportICType = Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_CUT_VER:\r
+                       pDM_Odm->CutVersion = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_FAB_VER:\r
+                       pDM_Odm->FabVersion = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RFE_TYPE:\r
+                       pDM_Odm->RFEType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RF_ANTENNA_TYPE:\r
+                       pDM_Odm->AntDivType= (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BOARD_TYPE:\r
+                       pDM_Odm->BoardType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_PACKAGE_TYPE:\r
+                       pDM_Odm->PackageType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_EXT_LNA:\r
+                       pDM_Odm->ExtLNA = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_5G_EXT_LNA:\r
+                       pDM_Odm->ExtLNA5G = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_EXT_PA:\r
+                       pDM_Odm->ExtPA = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_5G_EXT_PA:\r
+                       pDM_Odm->ExtPA5G = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_GPA:\r
+                       pDM_Odm->TypeGPA = (u2Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_APA:\r
+                       pDM_Odm->TypeAPA = (u2Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_GLNA:\r
+                       pDM_Odm->TypeGLNA = (u2Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_ALNA:\r
+                       pDM_Odm->TypeALNA = (u2Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_EXT_TRSW:\r
+                       pDM_Odm->ExtTRSW = (u1Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_EXT_LNA_GAIN:\r
+                       pDM_Odm->ExtLNAGain = (u1Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_PATCH_ID:\r
+                       pDM_Odm->PatchID = (u1Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_BINHCT_TEST:\r
+                       pDM_Odm->bInHctTest = (BOOLEAN)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_BWIFI_TEST:\r
+                       pDM_Odm->bWIFITest = (BOOLEAN)Value;\r
+                       break;  \r
+               case    ODM_CMNINFO_SMART_CONCURRENT:\r
+                       pDM_Odm->bDualMacSmartConcurrent = (BOOLEAN )Value;\r
+                       break;\r
+               case    ODM_CMNINFO_DOMAIN_CODE_2G:\r
+                       pDM_Odm->odm_Regulation2_4G = (u1Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_DOMAIN_CODE_5G:\r
+                       pDM_Odm->odm_Regulation5G = (u1Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_CONFIG_BB_RF:\r
+                       pDM_Odm->ConfigBBRF = (BOOLEAN)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_IQKFWOFFLOAD:\r
+                       pDM_Odm->IQKFWOffload = (u1Byte)Value;\r
+                       break;\r
+               //To remove the compiler warning, must add an empty default statement to handle the other values.       \r
+               default:\r
+                       //do nothing\r
+                       break;  \r
+               \r
+       }\r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_CmnInfoHook(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              PVOID                   pValue  \r
+       )\r
+{\r
+       //\r
+       // Hook call by reference pointer.\r
+       //\r
+       switch  (CmnInfo)\r
+       {\r
+               //\r
+               // Dynamic call by reference pointer.\r
+               //\r
+               case    ODM_CMNINFO_MAC_PHY_MODE:\r
+                       pDM_Odm->pMacPhyMode = (u1Byte *)pValue;\r
+                       break;\r
+               \r
+               case    ODM_CMNINFO_TX_UNI:\r
+                       pDM_Odm->pNumTxBytesUnicast = (u8Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RX_UNI:\r
+                       pDM_Odm->pNumRxBytesUnicast = (u8Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_WM_MODE:\r
+                       pDM_Odm->pWirelessMode = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BAND:\r
+                       pDM_Odm->pBandType = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_SEC_CHNL_OFFSET:\r
+                       pDM_Odm->pSecChOffset = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_SEC_MODE:\r
+                       pDM_Odm->pSecurity = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BW:\r
+                       pDM_Odm->pBandWidth = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_CHNL:\r
+                       pDM_Odm->pChannel = (u1Byte *)pValue;\r
+                       break;\r
+               \r
+               case    ODM_CMNINFO_DMSP_GET_VALUE:\r
+                       pDM_Odm->pbGetValueFromOtherMac = (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BUDDY_ADAPTOR:\r
+                       pDM_Odm->pBuddyAdapter = (PADAPTER *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_DMSP_IS_MASTER:\r
+                       pDM_Odm->pbMasterOfDMSP = (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_SCAN:\r
+                       pDM_Odm->pbScanInProcess = (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_POWER_SAVING:\r
+                       pDM_Odm->pbPowerSaving = (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_ONE_PATH_CCA:\r
+                       pDM_Odm->pOnePathCCA = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_DRV_STOP:\r
+                       pDM_Odm->pbDriverStopped =  (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_PNP_IN:\r
+                       pDM_Odm->pbDriverIsGoingToPnpSetPowerSleep =  (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_INIT_ON:\r
+                       pDM_Odm->pinit_adpt_in_progress =  (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_ANT_TEST:\r
+                       pDM_Odm->pAntennaTest =  (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_NET_CLOSED:\r
+                       pDM_Odm->pbNet_closed = (BOOLEAN *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_FORCED_RATE:\r
+                       pDM_Odm->pForcedDataRate = (pu2Byte)pValue;\r
+                       break;\r
+\r
+               case  ODM_CMNINFO_FORCED_IGI_LB:\r
+                       pDM_Odm->pu1ForcedIgiLb = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_P2P_LINK:\r
+                       pDM_Odm->DM_DigTable.bP2PInProcess = (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_IS1ANTENNA:\r
+                       pDM_Odm->pIs1Antenna = (BOOLEAN *)pValue;\r
+                       break;\r
+                       \r
+               case    ODM_CMNINFO_RFDEFAULTPATH:\r
+                       pDM_Odm->pRFDefaultPath= (u1Byte *)pValue;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_FCS_MODE:\r
+                       pDM_Odm->pIsFcsModeEnable = (BOOLEAN *)pValue;\r
+                       break;\r
+               /*add by YuChen for beamforming PhyDM*/\r
+               case    ODM_CMNINFO_HUBUSBMODE:\r
+                       pDM_Odm->HubUsbMode = (u1Byte *)pValue;\r
+                       break;\r
+               case    ODM_CMNINFO_FWDWRSVDPAGEINPROGRESS:\r
+                       pDM_Odm->pbFwDwRsvdPageInProgress = (BOOLEAN *)pValue;\r
+                       break;\r
+               case    ODM_CMNINFO_TX_TP:\r
+                       pDM_Odm->pCurrentTxTP = (u4Byte *)pValue;\r
+                       break;\r
+               case    ODM_CMNINFO_RX_TP:\r
+                       pDM_Odm->pCurrentRxTP = (u4Byte *)pValue;\r
+                       break;\r
+               case    ODM_CMNINFO_SOUNDING_SEQ:\r
+                       pDM_Odm->pSoundingSeq = (u1Byte *)pValue;\r
+                       break;\r
+               //case  ODM_CMNINFO_RTSTA_AID:\r
+               //      pDM_Odm->pAidMap =  (u1Byte *)pValue;\r
+               //      break;\r
+\r
+               //case  ODM_CMNINFO_BT_COEXIST:\r
+               //      pDM_Odm->BTCoexist = (BOOLEAN *)pValue;         \r
+\r
+               //case  ODM_CMNINFO_STA_STATUS:\r
+                       //pDM_Odm->pODM_StaInfo[] = (PSTA_INFO_T)pValue;\r
+                       //break;\r
+\r
+               //case  ODM_CMNINFO_PHY_STATUS:\r
+               //      pDM_Odm->pPhyInfo = (ODM_PHY_INFO *)pValue;\r
+               //      break;\r
+\r
+               //case  ODM_CMNINFO_MAC_STATUS:\r
+               //      pDM_Odm->pMacInfo = (ODM_MAC_INFO *)pValue;\r
+               //      break;\r
+               //To remove the compiler warning, must add an empty default statement to handle the other values.                               \r
+               default:\r
+                       //do nothing\r
+                       break;\r
+\r
+       }\r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_CmnInfoPtrArrayHook(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              ODM_CMNINFO_E   CmnInfo,\r
+       IN              u2Byte                  Index,\r
+       IN              PVOID                   pValue  \r
+       )\r
+{\r
+       //\r
+       // Hook call by reference pointer.\r
+       //\r
+       switch  (CmnInfo)\r
+       {\r
+               //\r
+               // Dynamic call by reference pointer.\r
+               //              \r
+               case    ODM_CMNINFO_STA_STATUS:\r
+                       pDM_Odm->pODM_StaInfo[Index] = (PSTA_INFO_T)pValue;\r
+                       \r
+                       if (IS_STA_VALID(pDM_Odm->pODM_StaInfo[Index]))\r
+                       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+                               pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->AssociatedMacId] = Index; /*AssociatedMacId are unique bttween different Adapter*/\r
+                       #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+                               pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->aid] = Index;\r
+                       #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+                               pDM_Odm->platform2phydm_macid_table[((PSTA_INFO_T)pValue)->mac_id] = Index;\r
+                       #endif\r
+                       \r
+                       break;          \r
+               //To remove the compiler warning, must add an empty default statement to handle the other values.                               \r
+               default:\r
+                       //do nothing\r
+                       break;\r
+       }\r
+       \r
+}\r
+\r
+\r
+//\r
+// Update Band/CHannel/.. The values are dynamic but non-per-packet.\r
+//\r
+VOID\r
+ODM_CmnInfoUpdate(\r
+       IN              PDM_ODM_T               pDM_Odm,\r
+       IN              u4Byte                  CmnInfo,\r
+       IN              u8Byte                  Value   \r
+       )\r
+{\r
+       //\r
+       // This init variable may be changed in run time.\r
+       //\r
+       switch  (CmnInfo)\r
+       {\r
+               case ODM_CMNINFO_LINK_IN_PROGRESS:\r
+                       pDM_Odm->bLinkInProcess = (BOOLEAN)Value;\r
+                       break;\r
+               \r
+               case    ODM_CMNINFO_ABILITY:\r
+                       pDM_Odm->SupportAbility = (u4Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RF_TYPE:\r
+                       pDM_Odm->RFType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_WIFI_DIRECT:\r
+                       pDM_Odm->bWIFI_Direct = (BOOLEAN)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_WIFI_DISPLAY:\r
+                       pDM_Odm->bWIFI_Display = (BOOLEAN)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_LINK:\r
+                       pDM_Odm->bLinked = (BOOLEAN)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_STATION_STATE:\r
+                       pDM_Odm->bsta_state = (BOOLEAN)Value;\r
+                       break;\r
+                       \r
+               case    ODM_CMNINFO_RSSI_MIN:\r
+                       pDM_Odm->RSSI_Min= (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_DBG_COMP:\r
+                       pDM_Odm->DebugComponents = Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_DBG_LEVEL:\r
+                       pDM_Odm->DebugLevel = (u4Byte)Value;\r
+                       break;\r
+               case    ODM_CMNINFO_RA_THRESHOLD_HIGH:\r
+                       pDM_Odm->RateAdaptive.HighRSSIThresh = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_RA_THRESHOLD_LOW:\r
+                       pDM_Odm->RateAdaptive.LowRSSIThresh = (u1Byte)Value;\r
+                       break;\r
+#if defined(BT_30_SUPPORT) && (BT_30_SUPPORT == 1)\r
+               // The following is for BT HS mode and BT coexist mechanism.\r
+               case ODM_CMNINFO_BT_ENABLED:\r
+                       pDM_Odm->bBtEnabled = (BOOLEAN)Value;\r
+                       break;\r
+                       \r
+               case ODM_CMNINFO_BT_HS_CONNECT_PROCESS:\r
+                       pDM_Odm->bBtConnectProcess = (BOOLEAN)Value;\r
+                       break;\r
+               \r
+               case ODM_CMNINFO_BT_HS_RSSI:\r
+                       pDM_Odm->btHsRssi = (u1Byte)Value;\r
+                       break;\r
+                       \r
+               case    ODM_CMNINFO_BT_OPERATION:\r
+                       pDM_Odm->bBtHsOperation = (BOOLEAN)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BT_LIMITED_DIG:\r
+                       pDM_Odm->bBtLimitedDig = (BOOLEAN)Value;\r
+                       break;  \r
+\r
+               case ODM_CMNINFO_BT_DIG:\r
+                       pDM_Odm->btHsDigVal = (u1Byte)Value;\r
+                       break;\r
+                       \r
+               case    ODM_CMNINFO_BT_BUSY:\r
+                       pDM_Odm->bBtBusy = (BOOLEAN)Value;\r
+                       break;  \r
+\r
+               case    ODM_CMNINFO_BT_DISABLE_EDCA:\r
+                       pDM_Odm->bBtDisableEdcaTurbo = (BOOLEAN)Value;\r
+                       break;\r
+#endif\r
+\r
+#if(DM_ODM_SUPPORT_TYPE & ODM_AP)              // for repeater mode add by YuChen 2014.06.23\r
+#ifdef UNIVERSAL_REPEATER\r
+               case    ODM_CMNINFO_VXD_LINK:\r
+                       pDM_Odm->VXD_bLinked= (BOOLEAN)Value;\r
+                       break;\r
+#endif\r
+#endif\r
+\r
+               case    ODM_CMNINFO_AP_TOTAL_NUM:\r
+                       pDM_Odm->APTotalNum = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_POWER_TRAINING:\r
+                       pDM_Odm->bDisablePowerTraining = (BOOLEAN)Value;\r
+                       break;\r
+\r
+/*\r
+               case    ODM_CMNINFO_OP_MODE:\r
+                       pDM_Odm->OPMode = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_WM_MODE:\r
+                       pDM_Odm->WirelessMode = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BAND:\r
+                       pDM_Odm->BandType = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_SEC_CHNL_OFFSET:\r
+                       pDM_Odm->SecChOffset = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_SEC_MODE:\r
+                       pDM_Odm->Security = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_BW:\r
+                       pDM_Odm->BandWidth = (u1Byte)Value;\r
+                       break;\r
+\r
+               case    ODM_CMNINFO_CHNL:\r
+                       pDM_Odm->Channel = (u1Byte)Value;\r
+                       break;                  \r
+*/     \r
+                default:\r
+                       //do nothing\r
+                       break;\r
+       }\r
+\r
+       \r
+}\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+ODM_InitAllWorkItems(IN PDM_ODM_T      pDM_Odm )\r
+{\r
+\r
+       PADAPTER                pAdapter = pDM_Odm->Adapter;\r
+#if USE_WORKITEM\r
+       #ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY\r
+       ODM_InitializeWorkItem( pDM_Odm, \r
+                                                       &pDM_Odm->DM_SWAT_Table.phydm_SwAntennaSwitchWorkitem, \r
+                                                       (RT_WORKITEM_CALL_BACK)ODM_SW_AntDiv_WorkitemCallback,\r
+                                                       (PVOID)pAdapter,\r
+                                                       "AntennaSwitchWorkitem");\r
+       #endif\r
+       #ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\r
+       ODM_InitializeWorkItem(pDM_Odm, \r
+                                               &pDM_Odm->dm_sat_table.hl_smart_antenna_workitem, \r
+                                               (RT_WORKITEM_CALL_BACK)phydm_beam_switch_workitem_callback,\r
+                                               (PVOID)pAdapter,\r
+                                               "hl_smart_ant_workitem");\r
+\r
+       ODM_InitializeWorkItem(pDM_Odm, \r
+                                               &pDM_Odm->dm_sat_table.hl_smart_antenna_decision_workitem, \r
+                                               (RT_WORKITEM_CALL_BACK)phydm_beam_decision_workitem_callback,\r
+                                               (PVOID)pAdapter,\r
+                                               "hl_smart_ant_decision_workitem");\r
+       #endif\r
+       \r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->PathDivSwitchWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)odm_PathDivChkAntSwitchWorkitemCallback, \r
+               (PVOID)pAdapter,\r
+               "SWAS_WorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->CCKPathDiversityWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)odm_CCKTXPathDiversityWorkItemCallback, \r
+               (PVOID)pAdapter,\r
+               "CCKTXPathDiversityWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->MPT_DIGWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)odm_MPT_DIGWorkItemCallback, \r
+               (PVOID)pAdapter,\r
+               "MPT_DIGWorkitem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->RaRptWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)ODM_UpdateInitRateWorkItemCallback, \r
+               (PVOID)pAdapter,\r
+               "RaRptWorkitem");\r
+\r
+#if( defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY) ) ||( defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY) )\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->FastAntTrainingWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)odm_FastAntTrainingWorkItemCallback, \r
+               (PVOID)pAdapter,\r
+               "FastAntTrainingWorkitem");\r
+#endif\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem), \r
+               (RT_WORKITEM_CALL_BACK)odm_PSD_RXHPWorkitemCallback, \r
+               (PVOID)pAdapter,\r
+               "PSDRXHP_WorkItem");\r
+\r
+#endif /*#if USE_WORKITEM*/\r
+\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_EnterWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_EnterWorkItem");\r
+       \r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_LeaveWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_LeaveWorkItem");\r
+       \r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_FwNdpaWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_FwNdpaWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_ClkWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_ClkWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_RateWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_RateWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_StatusWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_StatusWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_ResetTxPathWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_ResetTxPathWorkItem");\r
+\r
+       ODM_InitializeWorkItem(\r
+               pDM_Odm,\r
+               &(pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_GetTxRateWorkItem),\r
+               (RT_WORKITEM_CALL_BACK)halComTxbf_GetTxRateWorkItemCallback,\r
+               (PVOID)pAdapter,\r
+               "Txbf_GetTxRateWorkItem");\r
+#endif\r
+}\r
+\r
+VOID\r
+ODM_FreeAllWorkItems(IN PDM_ODM_T      pDM_Odm )\r
+{\r
+#if USE_WORKITEM\r
+\r
+#ifdef CONFIG_S0S1_SW_ANTENNA_DIVERSITY\r
+       ODM_FreeWorkItem(&(pDM_Odm->DM_SWAT_Table.phydm_SwAntennaSwitchWorkitem));\r
+#endif\r
+\r
+#ifdef CONFIG_HL_SMART_ANTENNA_TYPE1\r
+       ODM_FreeWorkItem(&(pDM_Odm->dm_sat_table.hl_smart_antenna_workitem));\r
+       ODM_FreeWorkItem(&(pDM_Odm->dm_sat_table.hl_smart_antenna_decision_workitem));\r
+#endif\r
+\r
+       ODM_FreeWorkItem(&(pDM_Odm->PathDivSwitchWorkitem));      \r
+       ODM_FreeWorkItem(&(pDM_Odm->CCKPathDiversityWorkitem));\r
+#if (defined(CONFIG_5G_CG_SMART_ANT_DIVERSITY)) || (defined(CONFIG_2G_CG_SMART_ANT_DIVERSITY))\r
+       ODM_FreeWorkItem(&(pDM_Odm->FastAntTrainingWorkitem));\r
+#endif\r
+       ODM_FreeWorkItem(&(pDM_Odm->MPT_DIGWorkitem));\r
+       ODM_FreeWorkItem(&(pDM_Odm->RaRptWorkitem));\r
+       ODM_FreeWorkItem((&pDM_Odm->DM_RXHP_Table.PSDTimeWorkitem));\r
+       /*ODM_FreeWorkItem((&pDM_Odm->sbdcnt_workitem));*/\r
+#endif\r
+\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_EnterWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_LeaveWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ClkWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_RateWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_StatusWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_ResetTxPathWorkItem));\r
+       ODM_FreeWorkItem((&pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_GetTxRateWorkItem));\r
+#endif\r
+\r
+}\r
+#endif /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\r
+\r
+/*\r
+VOID\r
+odm_FindMinimumRSSI(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       u4Byte  i;\r
+       u1Byte  RSSI_Min = 0xFF;\r
+\r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+       {\r
+//             if(pDM_Odm->pODM_StaInfo[i] != NULL)\r
+               if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )\r
+               {\r
+                       if(pDM_Odm->pODM_StaInfo[i]->RSSI_Ave < RSSI_Min)\r
+                       {\r
+                               RSSI_Min = pDM_Odm->pODM_StaInfo[i]->RSSI_Ave;\r
+                       }\r
+               }\r
+       }\r
+\r
+       pDM_Odm->RSSI_Min = RSSI_Min;\r
+\r
+}\r
+\r
+VOID\r
+odm_IsLinked(\r
+       IN              PDM_ODM_T               pDM_Odm\r
+       )\r
+{\r
+       u4Byte i;\r
+       BOOLEAN Linked = FALSE;\r
+       \r
+       for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
+       {\r
+                       if(IS_STA_VALID(pDM_Odm->pODM_StaInfo[i]) )\r
+                       {                       \r
+                               Linked = TRUE;\r
+                               break;\r
+                       }\r
+               \r
+       }\r
+\r
+       pDM_Odm->bLinked = Linked;\r
+}\r
+*/\r
+\r
+VOID\r
+ODM_InitAllTimers(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
+       ODM_AntDivTimers(pDM_Odm,INIT_ANTDIV_TIMMER);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#ifdef MP_TEST\r
+       if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific) \r
+               ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, \r
+                       (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer"); \r
+#endif\r
+#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer, \r
+               (RT_TIMER_CALL_BACK)odm_MPT_DIGCallback, NULL, "MPT_DIGTimer");\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PSDTimer, \r
+               (RT_TIMER_CALL_BACK)dm_PSDMonitorCallback, NULL, "PSDTimer");\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer, \r
+               (RT_TIMER_CALL_BACK)odm_PathDivChkAntSwitchCallback, NULL, "PathDivTimer");\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer, \r
+               (RT_TIMER_CALL_BACK)odm_CCKTXPathDiversityCallback, NULL, "CCKPathDiversityTimer");\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer,\r
+               (RT_TIMER_CALL_BACK)odm_PSD_RXHPCallback, NULL, "PSDRXHPTimer"); \r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer,\r
+               (RT_TIMER_CALL_BACK)phydm_sbd_callback, NULL, "SbdTimer"); \r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer,\r
+               (RT_TIMER_CALL_BACK)halComTxbf_FwNdpaTimerCallback, NULL, "Txbf_FwNdpaTimer");\r
+#endif\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_InitializeTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer,\r
+               (RT_TIMER_CALL_BACK)Beamforming_SWTimerCallback, NULL, "BeamformingTimer");\r
+#endif\r
+#endif\r
+}\r
+\r
+VOID\r
+ODM_CancelAllTimers(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       //\r
+       // 2012/01/12 MH Temp BSOD fix. We need to find NIC allocate mem fail reason in \r
+       // win7 platform.\r
+       //\r
+       HAL_ADAPTER_STS_CHK(pDM_Odm)\r
+#endif \r
+\r
+#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
+       ODM_AntDivTimers(pDM_Odm,CANCEL_ANTDIV_TIMMER);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+#ifdef MP_TEST\r
+       if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific)\r
+               ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+#endif\r
+#elif (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PSDTimer);   \r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer);\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer);\r
+#endif\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_CancelTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer);\r
+#endif\r
+#endif\r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_ReleaseAllTimers(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
+       ODM_AntDivTimers(pDM_Odm,RELEASE_ANTDIV_TIMMER);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+    #ifdef MP_TEST\r
+       if (pDM_Odm->priv->pshare->rf_ft_var.mp_specific)\r
+               ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+    #endif\r
+#elif(DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PSDTimer);\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->PathDivSwitchTimer);\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->CCKPathDiversityTimer);\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->MPT_DIGTimer);\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->DM_RXHP_Table.PSDTimer);\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->sbdcnt_timer);\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.TxbfInfo.Txbf_FwNdpaTimer);\r
+#endif\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
+#if (BEAMFORMING_SUPPORT == 1)\r
+       ODM_ReleaseTimer(pDM_Odm, &pDM_Odm->BeamformingInfo.BeamformingTimer);\r
+#endif\r
+#endif\r
+}\r
+\r
+\r
+//3============================================================\r
+//3 Tx Power Tracking\r
+//3============================================================\r
+\r
+\r
+\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+VOID\r
+ODM_InitAllThreads(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+       #ifdef TPT_THREAD\r
+       kTPT_task_init(pDM_Odm->priv);\r
+       #endif\r
+}\r
+\r
+VOID\r
+ODM_StopAllThreads(\r
+       IN PDM_ODM_T    pDM_Odm \r
+       )\r
+{\r
+       #ifdef TPT_THREAD\r
+       kTPT_task_stop(pDM_Odm->priv);\r
+       #endif\r
+}\r
+#endif \r
+\r
+\r
+#if( DM_ODM_SUPPORT_TYPE == ODM_WIN) \r
+//\r
+// 2011/07/26 MH Add an API for testing IQK fail case.\r
+//\r
+BOOLEAN\r
+ODM_CheckPowerStatus(\r
+       IN      PADAPTER                Adapter)\r
+{\r
+\r
+       HAL_DATA_TYPE           *pHalData = GET_HAL_DATA(Adapter);\r
+       PDM_ODM_T                       pDM_Odm = &pHalData->DM_OutSrc;\r
+       RT_RF_POWER_STATE       rtState;\r
+       PMGNT_INFO                      pMgntInfo       = &(Adapter->MgntInfo);\r
+\r
+       // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.\r
+       if (pMgntInfo->init_adpt_in_progress == TRUE)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter\n"));\r
+               return  TRUE;\r
+       }\r
+       \r
+       //\r
+       //      2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.\r
+       //\r
+       Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));        \r
+       if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)\r
+       {\r
+               ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", \r
+               Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));\r
+               return  FALSE;\r
+       }\r
+       return  TRUE;\r
+}\r
+#elif( DM_ODM_SUPPORT_TYPE == ODM_AP)\r
+BOOLEAN\r
+ODM_CheckPowerStatus(\r
+               IN      PADAPTER                Adapter)\r
+{\r
+       /*\r
+          HAL_DATA_TYPE                *pHalData = GET_HAL_DATA(Adapter);\r
+          PDM_ODM_T                    pDM_Odm = &pHalData->DM_OutSrc;\r
+          RT_RF_POWER_STATE    rtState;\r
+          PMGNT_INFO                   pMgntInfo       = &(Adapter->MgntInfo);\r
+\r
+       // 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.\r
+       if (pMgntInfo->init_adpt_in_progress == TRUE)\r
+       {\r
+       ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return TRUE, due to initadapter"));\r
+       return  TRUE;\r
+       }\r
+\r
+       //\r
+       //      2011/07/19 MH We can not execute tx pwoer tracking/ LLC calibrate or IQK.\r
+       //\r
+       Adapter->HalFunc.GetHwRegHandler(Adapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));        \r
+       if(Adapter->bDriverStopped || Adapter->bDriverIsGoingToPnpSetPowerSleep || rtState == eRfOff)\r
+       {\r
+       ODM_RT_TRACE(pDM_Odm,COMP_INIT, DBG_LOUD, ("ODM_CheckPowerStatus Return FALSE, due to %d/%d/%d\n", \r
+       Adapter->bDriverStopped, Adapter->bDriverIsGoingToPnpSetPowerSleep, rtState));\r
+       return  FALSE;\r
+       }\r
+        */\r
+       return  TRUE;\r
+}\r
+#endif\r
+\r
+// need to ODM CE Platform\r
+//move to here for ANT detection mechanism using\r
+\r
+#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN)||(DM_ODM_SUPPORT_TYPE == ODM_CE))\r
+u4Byte\r
+GetPSDData(\r
+       IN PDM_ODM_T    pDM_Odm,\r
+       unsigned int    point,\r
+       u1Byte initial_gain_psd)\r
+{\r
+       //unsigned int  val, rfval;\r
+       //int   psd_report;\r
+       u4Byte  psd_report;\r
+       \r
+       //HAL_DATA_TYPE         *pHalData = GET_HAL_DATA(Adapter);\r
+       //Debug Message\r
+       //val = PHY_QueryBBReg(Adapter,0x908, bMaskDWord);\r
+       //DbgPrint("Reg908 = 0x%x\n",val);\r
+       //val = PHY_QueryBBReg(Adapter,0xDF4, bMaskDWord);\r
+       //rfval = PHY_QueryRFReg(Adapter, ODM_RF_PATH_A, 0x00, bRFRegOffsetMask);\r
+       //DbgPrint("RegDF4 = 0x%x, RFReg00 = 0x%x\n",val, rfval);\r
+       //DbgPrint("PHYTXON = %x, OFDMCCA_PP = %x, CCKCCA_PP = %x, RFReg00 = %x\n",\r
+               //(val&BIT25)>>25, (val&BIT14)>>14, (val&BIT15)>>15, rfval);\r
+\r
+       //Set DCO frequency index, offset=(40MHz/SamplePts)*point\r
+       ODM_SetBBReg(pDM_Odm, 0x808, 0x3FF, point);\r
+\r
+       //Start PSD calculation, Reg808[22]=0->1\r
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 1);\r
+       //Need to wait for HW PSD report\r
+       ODM_StallExecution(1000);\r
+       ODM_SetBBReg(pDM_Odm, 0x808, BIT22, 0);\r
+       //Read PSD report, Reg8B4[15:0]\r
+       psd_report = ODM_GetBBReg(pDM_Odm,0x8B4, bMaskDWord) & 0x0000FFFF;\r
+       \r
+#if 1//(DEV_BUS_TYPE == RT_PCI_INTERFACE) && ( (RT_PLATFORM == PLATFORM_LINUX) || (RT_PLATFORM == PLATFORM_MACOSX))\r
+       psd_report = (u4Byte) (odm_ConvertTo_dB(psd_report))+(u4Byte)(initial_gain_psd-0x1c);\r
+#else\r
+       psd_report = (int) (20*log10((double)psd_report))+(int)(initial_gain_psd-0x1c);\r
+#endif\r
+\r
+       return psd_report;\r
+       \r
+}\r
+#endif\r
+\r
+u4Byte \r
+odm_ConvertTo_dB(\r
+       u4Byte  Value)\r
+{\r
+       u1Byte i;\r
+       u1Byte j;\r
+       u4Byte dB;\r
+\r
+       Value = Value & 0xFFFF;\r
+\r
+       for (i = 0; i < 12; i++)\r
+       {\r
+               if (Value <= dB_Invert_Table[i][7])\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       if (i >= 12)\r
+       {\r
+               return (96);    // maximum 96 dB\r
+       }\r
+\r
+       for (j = 0; j < 8; j++)\r
+       {\r
+               if (Value <= dB_Invert_Table[i][j])\r
+               {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       dB = (i << 3) + j + 1;\r
+\r
+       return (dB);\r
+}\r
+\r
+u4Byte \r
+odm_ConvertTo_linear(\r
+       u4Byte  Value)\r
+{\r
+       u1Byte i;\r
+       u1Byte j;\r
+       u4Byte linear;\r
+       \r
+       /* 1dB~96dB */\r
+       \r
+       Value = Value & 0xFF;\r
+\r
+       i = (u1Byte)((Value - 1) >> 3);\r
+       j = (u1Byte)(Value - 1) - (i << 3);\r
+\r
+       linear = dB_Invert_Table[i][j];\r
+\r
+       return (linear);\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+VOID\r
+ODM_UpdateInitRateWorkItemCallback(\r
+    IN PVOID            pContext\r
+    )\r
+{\r
+       PADAPTER        Adapter = (PADAPTER)pContext;\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
+       PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
+\r
+       u1Byte                  p = 0;  \r
+\r
+       if(pDM_Odm->SupportICType == ODM_RTL8821)\r
+       {\r
+               ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+       {\r
+               for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++)    //DOn't know how to include &c\r
+               {\r
+                       ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8723B)\r
+       {\r
+                       ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
+       {\r
+               for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++)    //DOn't know how to include &c\r
+               {\r
+                       ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);\r
+               }\r
+       }\r
+       else if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+       {\r
+                       ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
+       }\r
+}\r
+#endif\r
+\r
+//\r
+// ODM multi-port consideration, added by Roger, 2013.10.01.\r
+//\r
+VOID\r
+ODM_AsocEntry_Init(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+       PADAPTER pLoopAdapter = GetDefaultAdapter(pDM_Odm->Adapter);\r
+       HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pLoopAdapter);\r
+       PDM_ODM_T                pDM_OutSrc = &pHalData->DM_OutSrc;\r
+       u1Byte  TotalAssocEntryNum = 0;\r
+       u1Byte  index = 0;\r
+\r
+\r
+       ODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, 0, &pLoopAdapter->MgntInfo.DefaultPort[0]);\r
+       pLoopAdapter->MgntInfo.DefaultPort[0].MultiPortStationIdx = TotalAssocEntryNum;\r
+               \r
+       pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
+       TotalAssocEntryNum +=1;\r
+\r
+       while(pLoopAdapter)\r
+       {\r
+               for (index = 0; index <ASSOCIATE_ENTRY_NUM; index++)\r
+               {\r
+                       ODM_CmnInfoPtrArrayHook(pDM_OutSrc, ODM_CMNINFO_STA_STATUS, TotalAssocEntryNum+index, &pLoopAdapter->MgntInfo.AsocEntry[index]);\r
+                       pLoopAdapter->MgntInfo.AsocEntry[index].MultiPortStationIdx = TotalAssocEntryNum+index;                         \r
+               }\r
+               \r
+               TotalAssocEntryNum+= index;\r
+               if(IS_HARDWARE_TYPE_8188E((pDM_Odm->Adapter)))\r
+                       pLoopAdapter->RASupport = TRUE;\r
+               pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
+       }\r
+#endif\r
+}\r
+\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
+/* Justin: According to the current RRSI to adjust Response Frame TX power, 2012/11/05 */\r
+void odm_dtc(PDM_ODM_T pDM_Odm)\r
+{\r
+#ifdef CONFIG_DM_RESP_TXAGC\r
+       #define DTC_BASE            35  /* RSSI higher than this value, start to decade TX power */\r
+       #define DTC_DWN_BASE       (DTC_BASE-5) /* RSSI lower than this value, start to increase TX power */\r
+\r
+       /* RSSI vs TX power step mapping: decade TX power */\r
+       static const u8 dtc_table_down[]={\r
+               DTC_BASE,\r
+               (DTC_BASE+5),\r
+               (DTC_BASE+10),\r
+               (DTC_BASE+15),\r
+               (DTC_BASE+20),\r
+               (DTC_BASE+25)\r
+       };\r
+\r
+       /* RSSI vs TX power step mapping: increase TX power */\r
+       static const u8 dtc_table_up[]={\r
+               DTC_DWN_BASE,\r
+               (DTC_DWN_BASE-5),\r
+               (DTC_DWN_BASE-10),\r
+               (DTC_DWN_BASE-15),\r
+               (DTC_DWN_BASE-15),\r
+               (DTC_DWN_BASE-20),\r
+               (DTC_DWN_BASE-20),\r
+               (DTC_DWN_BASE-25),\r
+               (DTC_DWN_BASE-25),\r
+               (DTC_DWN_BASE-30),\r
+               (DTC_DWN_BASE-35)\r
+       };\r
+\r
+       u8 i;\r
+       u8 dtc_steps=0;\r
+       u8 sign;\r
+       u8 resp_txagc=0;\r
+\r
+       #if 0\r
+       /* As DIG is disabled, DTC is also disable */\r
+       if(!(pDM_Odm->SupportAbility & ODM_XXXXXX))\r
+               return;\r
+       #endif\r
+\r
+       if (DTC_BASE < pDM_Odm->RSSI_Min) {\r
+               /* need to decade the CTS TX power */\r
+               sign = 1;\r
+               for (i=0;i<ARRAY_SIZE(dtc_table_down);i++)\r
+               {\r
+                       if ((dtc_table_down[i] >= pDM_Odm->RSSI_Min) || (dtc_steps >= 6))\r
+                               break;\r
+                       else\r
+                               dtc_steps++;\r
+               }\r
+       }\r
+#if 0\r
+       else if (DTC_DWN_BASE > pDM_Odm->RSSI_Min)\r
+       {\r
+               /* needs to increase the CTS TX power */\r
+               sign = 0;\r
+               dtc_steps = 1;\r
+               for (i=0;i<ARRAY_SIZE(dtc_table_up);i++)\r
+               {\r
+                       if ((dtc_table_up[i] <= pDM_Odm->RSSI_Min) || (dtc_steps>=10))\r
+                               break;\r
+                       else\r
+                               dtc_steps++;\r
+               }\r
+       }\r
+#endif\r
+       else\r
+       {\r
+               sign = 0;\r
+               dtc_steps = 0;\r
+       }\r
+\r
+       resp_txagc = dtc_steps | (sign << 4);\r
+       resp_txagc = resp_txagc | (resp_txagc << 5);\r
+       ODM_Write1Byte(pDM_Odm, 0x06d9, resp_txagc);\r
+\r
+       DBG_871X("%s RSSI_Min:%u, set RESP_TXAGC to %s %u\n", \r
+               __func__, pDM_Odm->RSSI_Min, sign?"minus":"plus", dtc_steps);\r
+#endif /* CONFIG_RESP_TXAGC_ADJUST */\r
+}\r
+\r
+#endif /* #if (DM_ODM_SUPPORT_TYPE == ODM_CE) */\r
+\r
+VOID\r
+odm_UpdatePowerTrainingState(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+       PFALSE_ALARM_STATISTICS         FalseAlmCnt = (PFALSE_ALARM_STATISTICS)PhyDM_Get_Structure( pDM_Odm , PHYDM_FALSEALMCNT);\r
+       pDIG_T                                          pDM_DigTable = &pDM_Odm->DM_DigTable;\r
+       u4Byte                                          score = 0;\r
+\r
+       if(!(pDM_Odm->SupportAbility & ODM_BB_PWR_TRAIN))\r
+               return;\r
+\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState()============>\n"));\r
+       pDM_Odm->bChangeState = FALSE;\r
+\r
+       // Debug command\r
+       if(pDM_Odm->ForcePowerTrainingState)\r
+       {\r
+               if(pDM_Odm->ForcePowerTrainingState == 1 && !pDM_Odm->bDisablePowerTraining)\r
+               {\r
+                       pDM_Odm->bChangeState = TRUE;\r
+                       pDM_Odm->bDisablePowerTraining = TRUE;\r
+               }\r
+               else if(pDM_Odm->ForcePowerTrainingState == 2 && pDM_Odm->bDisablePowerTraining)\r
+               {\r
+                       pDM_Odm->bChangeState = TRUE;\r
+                       pDM_Odm->bDisablePowerTraining = FALSE;\r
+               }\r
+\r
+               pDM_Odm->PT_score = 0;\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): ForcePowerTrainingState = %d\n", \r
+                       pDM_Odm->ForcePowerTrainingState));\r
+               return;\r
+       }\r
+       \r
+       if(!pDM_Odm->bLinked)\r
+               return;\r
+       \r
+       // First connect\r
+       if((pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE))\r
+       {\r
+               pDM_Odm->PT_score = 0;\r
+               pDM_Odm->bChangeState = TRUE;\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\r
+               pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): First Connect\n"));\r
+               return;\r
+       }\r
+\r
+       // Compute score\r
+       if(pDM_Odm->NHM_cnt_0 >= 215)\r
+               score = 2;\r
+       else if(pDM_Odm->NHM_cnt_0 >= 190) \r
+               score = 1;                                                      // unknow state\r
+       else\r
+       {\r
+               u4Byte  RX_Pkt_Cnt;\r
+               \r
+               RX_Pkt_Cnt = (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM) + (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK);\r
+               \r
+               if((FalseAlmCnt->Cnt_CCA_all > 31 && RX_Pkt_Cnt > 31) && (FalseAlmCnt->Cnt_CCA_all >= RX_Pkt_Cnt))\r
+               {\r
+                       if((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 1)) <= FalseAlmCnt->Cnt_CCA_all)\r
+                               score = 0;\r
+                       else if((RX_Pkt_Cnt + (RX_Pkt_Cnt >> 2)) <= FalseAlmCnt->Cnt_CCA_all)\r
+                               score = 1;\r
+                       else\r
+                               score = 2;\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): RX_Pkt_Cnt = %d, Cnt_CCA_all = %d\n", \r
+                       RX_Pkt_Cnt, FalseAlmCnt->Cnt_CCA_all));\r
+       }\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): NumQryPhyStatusOFDM = %d, NumQryPhyStatusCCK = %d\n",\r
+                       (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM), (u4Byte)(pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK)));\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): NHM_cnt_0 = %d, score = %d\n", \r
+               pDM_Odm->NHM_cnt_0, score));\r
+\r
+       // smoothing\r
+       pDM_Odm->PT_score = (score << 4) + (pDM_Odm->PT_score>>1) + (pDM_Odm->PT_score>>2);\r
+       score = (pDM_Odm->PT_score + 32) >> 6;\r
+       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): PT_score = %d, score after smoothing = %d\n", \r
+               pDM_Odm->PT_score, score));\r
+\r
+       // Mode decision\r
+       if(score == 2)\r
+       {\r
+               if(pDM_Odm->bDisablePowerTraining)\r
+               {\r
+                       pDM_Odm->bChangeState = TRUE;\r
+                       pDM_Odm->bDisablePowerTraining = FALSE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Change state\n"));\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Enable Power Training\n"));\r
+       }\r
+       else if(score == 0)\r
+       {\r
+               if(!pDM_Odm->bDisablePowerTraining)\r
+               {\r
+                       pDM_Odm->bChangeState = TRUE;\r
+                       pDM_Odm->bDisablePowerTraining = TRUE;\r
+                       ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Change state\n"));\r
+               }\r
+               ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_UpdatePowerTrainingState(): Disable Power Training\n"));\r
+       }\r
+\r
+       pDM_Odm->PhyDbgInfo.NumQryPhyStatusOFDM = 0;\r
+       pDM_Odm->PhyDbgInfo.NumQryPhyStatusCCK = 0;\r
+#endif\r
+}\r
+\r
+\r
+\r
+/*===========================================================*/\r
+/* The following is for compile only*/\r
+/*===========================================================*/\r
+/*#define TARGET_CHNL_NUM_2G_5G        59*/\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+\r
+u1Byte GetRightChnlPlaceforIQK(u1Byte chnl)\r
+{\r
+       u1Byte  channel_all[TARGET_CHNL_NUM_2G_5G] = {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, \r
+               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
+               for (place = 14; place < sizeof(channel_all); place++) {\r
+                       if (channel_all[place] == chnl)\r
+                               return place-13;\r
+               }\r
+       }\r
+       \r
+       return 0;\r
+}\r
+\r
+VOID\r
+FillH2CCmd92C( \r
+       IN      PADAPTER                Adapter,\r
+       IN      u1Byte  ElementID,\r
+       IN      u4Byte  CmdLen,\r
+       IN      pu1Byte pCmdBuffer\r
+)\r
+{}\r
+VOID\r
+PHY_SetTxPowerLevel8192C(\r
+       IN      PADAPTER                Adapter,\r
+       IN      u1Byte                  channel\r
+       )\r
+{\r
+}\r
+#endif\r
+/*===========================================================*/\r
+\r
+VOID\r
+phydm_NoisyDetection(\r
+       IN      PDM_ODM_T       pDM_Odm\r
+       )\r
+{\r
+       u4Byte  Total_FA_Cnt, Total_CCA_Cnt;\r
+       u4Byte  Score = 0, i, Score_Smooth;\r
+    \r
+       Total_CCA_Cnt = pDM_Odm->FalseAlmCnt.Cnt_CCA_all;\r
+       Total_FA_Cnt  = pDM_Odm->FalseAlmCnt.Cnt_all;    \r
+\r
+/*\r
+    if( Total_FA_Cnt*16>=Total_CCA_Cnt*14 )         // 87.5\r
+    \r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*12 )    // 75\r
+    \r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*10 )    // 56.25\r
+    \r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*8 )     // 50\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*7 )     // 43.75\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*6 )     // 37.5\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*5 )     // 31.25%\r
+        \r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*4 )     // 25%\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*3 )     // 18.75%\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*2 )     // 12.5%\r
+\r
+    else if( Total_FA_Cnt*16>=Total_CCA_Cnt*1 )     // 6.25%\r
+*/\r
+    for(i=0;i<=16;i++)\r
+    {\r
+        if( Total_FA_Cnt*16>=Total_CCA_Cnt*(16-i) )\r
+        {\r
+            Score = 16-i;\r
+            break;\r
+        }\r
+    }\r
+\r
+    // NoisyDecision_Smooth = NoisyDecision_Smooth>>1 + (Score<<3)>>1;\r
+    pDM_Odm->NoisyDecision_Smooth = (pDM_Odm->NoisyDecision_Smooth>>1) + (Score<<2);\r
+\r
+    // Round the NoisyDecision_Smooth: +"3" comes from (2^3)/2-1\r
+    Score_Smooth = (Total_CCA_Cnt>=300)?((pDM_Odm->NoisyDecision_Smooth+3)>>3):0;\r
+\r
+    pDM_Odm->NoisyDecision = (Score_Smooth>=3)?1:0;\r
+/*\r
+    switch(Score_Smooth)\r
+    {\r
+        case 0:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=0%%\n"));\r
+            break;\r
+        case 1:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=6.25%%\n"));\r
+            break;\r
+        case 2:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=12.5%%\n"));\r
+            break;\r
+        case 3:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=18.75%%\n"));\r
+            break;\r
+        case 4:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=25%%\n"));\r
+            break;\r
+        case 5:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=31.25%%\n"));\r
+            break;\r
+        case 6:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=37.5%%\n"));\r
+            break;\r
+        case 7:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=43.75%%\n"));\r
+            break;\r
+        case 8:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=50%%\n"));\r
+            break;\r
+        case 9:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=56.25%%\n"));\r
+            break;\r
+        case 10:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=62.5%%\n"));\r
+            break;\r
+        case 11:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=68.75%%\n"));\r
+            break;\r
+        case 12:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=75%%\n"));\r
+            break;\r
+        case 13:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=81.25%%\n"));\r
+            break;\r
+        case 14:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=87.5%%\n"));\r
+            break;\r
+        case 15:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=93.75%%\n"));            \r
+            break;\r
+        case 16:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Total_FA_Cnt/Total_CCA_Cnt=100%%\n"));\r
+            break;\r
+        default:\r
+            ODM_RT_TRACE(pDM_Odm,ODM_COMP_COMMON, ODM_DBG_LOUD,\r
+            ("[NoisyDetection] Unknown Value!! Need Check!!\n"));            \r
+    }\r
+*/        \r
+       ODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD,\r
+       ("[NoisyDetection] Total_CCA_Cnt=%d, Total_FA_Cnt=%d, NoisyDecision_Smooth=%d, Score=%d, Score_Smooth=%d, pDM_Odm->NoisyDecision=%d\n",\r
+       Total_CCA_Cnt, Total_FA_Cnt, pDM_Odm->NoisyDecision_Smooth, Score, Score_Smooth, pDM_Odm->NoisyDecision));\r
+       \r
+}\r
+\r
+\r