--- /dev/null
+/******************************************************************************\r
+ *\r
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
+ * \r
+ * This program is free software; you can redistribute it and/or modify it\r
+ * under the terms of version 2 of the GNU General Public License as\r
+ * published by the Free Software Foundation.\r
+ *\r
+ * This program is distributed in the hope that it will be useful, but WITHOUT\r
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
+ * more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License along with\r
+ * this program; if not, write to the Free Software Foundation, Inc.,\r
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
+ *\r
+ *\r
+ ******************************************************************************/\r
+\r
+//============================================================\r
+// include files\r
+//============================================================\r
+\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