--- /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
+//\r
+// ODM IO Relative API.\r
+//\r
+\r
+u1Byte\r
+ODM_Read1Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ return RTL_R8(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return rtw_read8(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return PlatformEFIORead1Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+u2Byte\r
+ODM_Read2Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ return RTL_R16(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return rtw_read16(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return PlatformEFIORead2Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+u4Byte\r
+ODM_Read4Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ return RTL_R32(RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return rtw_read32(Adapter,RegAddr);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return PlatformEFIORead4Byte(Adapter, RegAddr);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_Write1Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u1Byte Data\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ RTL_W8(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ rtw_write8(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformEFIOWrite1Byte(Adapter, RegAddr, Data);\r
+#endif\r
+ \r
+}\r
+\r
+\r
+VOID\r
+ODM_Write2Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u2Byte Data\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ RTL_W16(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ rtw_write16(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformEFIOWrite2Byte(Adapter, RegAddr, Data);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_Write4Byte(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte Data\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ prtl8192cd_priv priv = pDM_Odm->priv;\r
+ RTL_W32(RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ rtw_write32(Adapter,RegAddr, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformEFIOWrite4Byte(Adapter, RegAddr, Data);\r
+#endif \r
+\r
+}\r
+\r
+\r
+VOID\r
+ODM_SetMACReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask,\r
+ IN u4Byte Data\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetMACReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
+ return PHY_QueryMacReg(pDM_Odm->Adapter, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_SetBBReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask,\r
+ IN u4Byte Data\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetBBReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return PHY_QueryBBReg(Adapter, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_SetRFReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN ODM_RF_RADIO_PATH_E eRFPath,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask,\r
+ IN u4Byte Data\r
+ )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);\r
+ ODM_delay_us(2);\r
+ \r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PHY_SetRFReg(pDM_Odm->Adapter, eRFPath, RegAddr, BitMask, Data);\r
+#endif \r
+}\r
+\r
+\r
+u4Byte \r
+ODM_GetRFReg( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN ODM_RF_RADIO_PATH_E eRFPath,\r
+ IN u4Byte RegAddr,\r
+ IN u4Byte BitMask\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);\r
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);\r
+#endif \r
+}\r
+\r
+\r
+\r
+\r
+//\r
+// ODM Memory relative API.\r
+//\r
+VOID\r
+ODM_AllocateMemory( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ OUT PVOID *pPtr,\r
+ IN u4Byte length\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ *pPtr = kmalloc(length, GFP_ATOMIC);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\r
+ *pPtr = rtw_zvmalloc(length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformAllocateMemory(Adapter, pPtr, length);\r
+#endif \r
+}\r
+\r
+// length could be ignored, used to detect memory leakage.\r
+VOID\r
+ODM_FreeMemory( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ OUT PVOID pPtr,\r
+ IN u4Byte length\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ kfree(pPtr);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) \r
+ rtw_vmfree(pPtr, length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ //PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformFreeMemory(pPtr, length);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_MoveMemory( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ OUT PVOID pDest,\r
+ IN PVOID pSrc,\r
+ IN u4Byte Length\r
+ )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ memcpy(pDest, pSrc, Length);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) \r
+ _rtw_memcpy(pDest, pSrc, Length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformMoveMemory(pDest, pSrc, Length);\r
+#endif \r
+}\r
+\r
+void ODM_Memory_Set(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PVOID pbuf,\r
+ IN s1Byte value,\r
+ IN u4Byte length\r
+)\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ memset(pbuf, value, length);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) \r
+ _rtw_memset(pbuf,value, length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformFillMemory(pbuf,length,value);\r
+#endif\r
+}\r
+s4Byte ODM_CompareMemory(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PVOID pBuf1,\r
+ IN PVOID pBuf2,\r
+ IN u4Byte length\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return memcmp(pBuf1,pBuf2,length);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE ) \r
+ return _rtw_memcmp(pBuf1,pBuf2,length);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) \r
+ return PlatformCompareMemory(pBuf1,pBuf2,length);\r
+#endif \r
+}\r
+\r
+\r
+\r
+//\r
+// ODM MISC relative API.\r
+//\r
+VOID\r
+ODM_AcquireSpinLock( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN RT_SPINLOCK_TYPE type\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ rtw_odm_acquirespinlock(Adapter, type);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformAcquireSpinLock(Adapter, type);\r
+#endif \r
+}\r
+VOID\r
+ODM_ReleaseSpinLock( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN RT_SPINLOCK_TYPE type\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ rtw_odm_releasespinlock(Adapter, type);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformReleaseSpinLock(Adapter, type);\r
+#endif \r
+}\r
+\r
+//\r
+// Work item relative API. FOr MP driver only~!\r
+//\r
+VOID\r
+ODM_InitializeWorkItem( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PRT_WORK_ITEM pRtWorkItem,\r
+ IN RT_WORKITEM_CALL_BACK RtWorkItemCallback,\r
+ IN PVOID pContext,\r
+ IN const char* szID\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_StartWorkItem( \r
+ IN PRT_WORK_ITEM pRtWorkItem\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformStartWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_StopWorkItem( \r
+ IN PRT_WORK_ITEM pRtWorkItem\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformStopWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_FreeWorkItem( \r
+ IN PRT_WORK_ITEM pRtWorkItem\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformFreeWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_ScheduleWorkItem( \r
+ IN PRT_WORK_ITEM pRtWorkItem\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformScheduleWorkItem(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_IsWorkItemScheduled( \r
+ IN PRT_WORK_ITEM pRtWorkItem\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformIsWorkItemScheduled(pRtWorkItem);\r
+#endif \r
+}\r
+\r
+\r
+\r
+//\r
+// ODM Timer relative API.\r
+//\r
+VOID\r
+ODM_StallExecution( \r
+ IN u4Byte usDelay\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_udelay_os(usDelay);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformStallExecution(usDelay);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_delay_ms(IN u4Byte ms)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ delay_ms(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_mdelay_os(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ delay_ms(ms);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_delay_us(IN u4Byte us)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ delay_us(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_udelay_os(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PlatformStallExecution(us);\r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_sleep_ms(IN u4Byte ms)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_msleep_os(ms);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) \r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_sleep_us(IN u4Byte us)\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_usleep_os(us);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) \r
+#endif \r
+}\r
+\r
+VOID\r
+ODM_SetTimer( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PRT_TIMER pTimer, \r
+ IN u4Byte msDelay\r
+ )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ mod_timer(pTimer, jiffies + RTL_MILISECONDS_TO_JIFFIES(msDelay));\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ _set_timer(pTimer,msDelay ); //ms\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformSetTimer(Adapter, pTimer, msDelay);\r
+#endif \r
+\r
+}\r
+\r
+VOID\r
+ODM_InitializeTimer(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PRT_TIMER pTimer, \r
+ IN RT_TIMER_CALL_BACK CallBackFunc, \r
+ IN PVOID pContext,\r
+ IN const char* szID\r
+ )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ init_timer(pTimer);\r
+ pTimer->function = CallBackFunc;\r
+ pTimer->data = (unsigned long)pDM_Odm;\r
+ mod_timer(pTimer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10)); \r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);\r
+#endif \r
+}\r
+\r
+\r
+VOID\r
+ODM_CancelTimer(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PRT_TIMER pTimer\r
+ )\r
+{\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ del_timer(pTimer);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ _cancel_timer_ex(pTimer);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ PlatformCancelTimer(Adapter, pTimer);\r
+#endif\r
+}\r
+\r
+\r
+VOID\r
+ODM_ReleaseTimer(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PRT_TIMER pTimer\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+\r
+ // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm. \r
+ // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.\r
+ if (pTimer == 0) \r
+ {\r
+ ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n"));\r
+ return;\r
+ }\r
+ \r
+ PlatformReleaseTimer(Adapter, pTimer);\r
+#endif\r
+}\r
+\r
+BOOLEAN\r
+phydm_actingDetermine(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN PHYDM_ACTING_TYPE type\r
+ )\r
+{\r
+ BOOLEAN ret = FALSE;\r
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->BeamformingInfo.SourceAdapter;\r
+#else\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+#endif\r
+\r
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if (type == PhyDM_ACTING_AS_AP)\r
+ ret = ACTING_AS_AP(Adapter);\r
+ else if (type == PhyDM_ACTING_AS_IBSS)\r
+ ret = ACTING_AS_IBSS(Adapter);\r
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ struct mlme_priv *pmlmepriv = &(Adapter->mlmepriv);\r
+\r
+ if (type == PhyDM_ACTING_AS_AP)\r
+ ret = check_fwstate(pmlmepriv, WIFI_AP_STATE);\r
+ else if (type == PhyDM_ACTING_AS_IBSS)\r
+ ret = check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);\r
+#endif\r
+\r
+ return ret;\r
+\r
+}\r
+\r
+\r
+u1Byte\r
+phydm_trans_h2c_id(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u1Byte phydm_h2c_id\r
+)\r
+{\r
+ u1Byte platform_h2c_id=0xff;\r
+\r
+ \r
+ switch(phydm_h2c_id)\r
+ {\r
+ //1 [0]\r
+ case ODM_H2C_RSSI_REPORT:\r
+\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if(pDM_Odm->SupportICType == ODM_RTL8188E)\r
+ {\r
+ platform_h2c_id = H2C_88E_RSSI_REPORT;\r
+ }\r
+ else if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
+ {\r
+ platform_h2c_id =H2C_8814A_RSSI_REPORT; \r
+ }\r
+ else\r
+ {\r
+ platform_h2c_id = H2C_RSSI_REPORT;\r
+ }\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ platform_h2c_id = H2C_RSSI_SETTING;\r
+\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\r
+ if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B)) \r
+ {\r
+ platform_h2c_id =H2C_88XX_RSSI_REPORT; \r
+ /*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] H2C_88XX_RSSI_REPORT CMD_ID = (( %d ))\n", platform_h2c_id));*/\r
+ } else\r
+ #endif\r
+ #if(RTL8812A_SUPPORT==1) \r
+ if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+ {\r
+ platform_h2c_id = H2C_8812_RSSI_REPORT;\r
+ } else\r
+ #endif \r
+ {}\r
+ #endif\r
+ \r
+ break;\r
+\r
+ //1 [3] \r
+ case ODM_H2C_WIFI_CALIBRATION:\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ platform_h2c_id =H2C_WIFI_CALIBRATION;\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ #if(RTL8723B_SUPPORT==1) \r
+ platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;\r
+ #endif\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+\r
+ \r
+ #endif\r
+ \r
+ break; \r
+ \r
+ \r
+ //1 [4]\r
+ case ODM_H2C_IQ_CALIBRATION:\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ platform_h2c_id =H2C_IQ_CALIBRATION;\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\r
+ platform_h2c_id = H2C_8812_IQ_CALIBRATION;\r
+ #endif\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+\r
+ \r
+ #endif\r
+ \r
+ break;\r
+ //1 [5]\r
+ case ODM_H2C_RA_PARA_ADJUST:\r
+\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B))\r
+ platform_h2c_id = H2C_8814A_RA_PARA_ADJUST;\r
+ else\r
+ platform_h2c_id = H2C_RA_PARA_ADJUST;\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))\r
+ platform_h2c_id = H2C_8812_RA_PARA_ADJUST;\r
+ #elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\r
+ platform_h2c_id = H2C_RA_PARA_ADJUST;\r
+ #elif(RTL8192E_SUPPORT==1)\r
+ platform_h2c_id =H2C_8192E_RA_PARA_ADJUST;\r
+ #elif(RTL8723B_SUPPORT==1) \r
+ platform_h2c_id =H2C_8723B_RA_PARA_ADJUST;\r
+ #endif\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1)) \r
+ if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B)) {\r
+ platform_h2c_id =H2C_88XX_RA_PARA_ADJUST; \r
+ /*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] H2C_88XX_RA_PARA_ADJUST CMD_ID = (( %d ))\n", platform_h2c_id));*/\r
+ } else\r
+ #endif\r
+ #if(RTL8812A_SUPPORT==1) \r
+ if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+ {\r
+ platform_h2c_id = H2C_8812_RA_PARA_ADJUST;\r
+ } else\r
+ #endif\r
+ {}\r
+ #endif\r
+ \r
+ break;\r
+\r
+\r
+ //1 [6]\r
+ case PHYDM_H2C_DYNAMIC_TX_PATH:\r
+\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if(pDM_Odm->SupportICType == ODM_RTL8814A)\r
+ {\r
+ platform_h2c_id =H2C_8814A_DYNAMIC_TX_PATH;\r
+ }\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ #if (RTL8814A_SUPPORT == 1)\r
+ if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
+ platform_h2c_id = H2C_DYNAMIC_TX_PATH;\r
+ #endif\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ #if(RTL8814A_SUPPORT==1)\r
+ if( pDM_Odm->SupportICType == ODM_RTL8814A)\r
+ {\r
+ platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH; \r
+ } \r
+ #endif\r
+\r
+ #endif\r
+ \r
+ break;\r
+\r
+ /* [7]*/\r
+ case PHYDM_H2C_FW_TRACE_EN:\r
+\r
+ #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))\r
+ platform_h2c_id = H2C_8814A_FW_TRACE_EN;\r
+ else \r
+ platform_h2c_id = H2C_FW_TRACE_EN;\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)\r
+ #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))\r
+ if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B))\r
+ platform_h2c_id = H2C_88XX_FW_TRACE_EN;\r
+ else\r
+ #endif\r
+ #if (RTL8812A_SUPPORT == 1) \r
+ if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
+ platform_h2c_id = H2C_8812_FW_TRACE_EN;\r
+ } else\r
+ #endif\r
+ {}\r
+\r
+ #endif\r
+ \r
+ break;\r
+\r
+ case PHYDM_H2C_TXBF:\r
+#if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))\r
+ platform_h2c_id = 0x41; /*H2C_TxBF*/\r
+#endif\r
+ break;\r
+\r
+ default:\r
+ platform_h2c_id=0xff;\r
+ break; \r
+ } \r
+ \r
+ return platform_h2c_id;\r
+ \r
+}\r
+\r
+//\r
+// ODM FW relative API.\r
+//\r
+\r
+VOID\r
+ODM_FillH2CCmd(\r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u1Byte phydm_h2c_id,\r
+ IN u4Byte CmdLen,\r
+ IN pu1Byte pCmdBuffer\r
+)\r
+{\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ u1Byte platform_h2c_id;\r
+\r
+ platform_h2c_id=phydm_trans_h2c_id(pDM_Odm, phydm_h2c_id);\r
+\r
+ if(platform_h2c_id==0xff)\r
+ {\r
+ ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Wrong H2C CMD-ID !! platform_h2c_id==0xff , PHYDM_ElementID=((%d )) \n",phydm_h2c_id));\r
+ return;\r
+ }\r
+\r
+ #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ if (pDM_Odm->SupportICType == ODM_RTL8188E) \r
+ if (!pDM_Odm->RaSupport88E)\r
+ FillH2CCmd88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); \r
+ else if (pDM_Odm->SupportICType == ODM_RTL8192C) \r
+ FillH2CCmd92C(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); \r
+ else if (pDM_Odm->SupportICType == ODM_RTL8814A) \r
+ FillH2CCmd8814A(Adapter, platform_h2c_id, CmdLen, pCmdBuffer); \r
+ else if (pDM_Odm->SupportICType == ODM_RTL8822B) \r
+#if (RTL8822B_SUPPORT == 1)\r
+ FillH2CCmd8822B(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\r
+#endif \r
+ else \r
+ FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\r
+ \r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ rtw_hal_fill_h2c_cmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);\r
+\r
+ #elif(DM_ODM_SUPPORT_TYPE & ODM_AP) \r
+ #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1)) \r
+ if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A) \r
+ {\r
+ GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);\r
+ //FillH2CCmd88XX(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer); \r
+ } else\r
+ #endif\r
+ #if(RTL8812A_SUPPORT==1) \r
+ if(pDM_Odm->SupportICType == ODM_RTL8812)\r
+ {\r
+ FillH2CCmd8812(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);\r
+ } else\r
+ #endif\r
+ {}\r
+ #endif\r
+}\r
+\r
+u1Byte\r
+phydm_c2H_content_parsing(\r
+ IN PVOID pDM_VOID,\r
+ IN u1Byte c2hCmdId,\r
+ IN u1Byte c2hCmdLen,\r
+ IN pu1Byte tmpBuf\r
+)\r
+{\r
+ PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
+ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+ PADAPTER Adapter = pDM_Odm->Adapter;\r
+ #endif\r
+ u1Byte Extend_c2hSubID = 0;\r
+ u1Byte find_c2h_cmd = TRUE;\r
+\r
+ switch (c2hCmdId) {\r
+ case PHYDM_C2H_DBG:\r
+ if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))\r
+ phydm_fw_trace_handler(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ \r
+ break;\r
+\r
+ case PHYDM_C2H_RA_RPT:\r
+ phydm_c2h_ra_report_handler(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ break;\r
+\r
+ case PHYDM_C2H_RA_PARA_RPT:\r
+ ODM_C2HRaParaReportHandler(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ break;\r
+ \r
+ case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:\r
+ if (pDM_Odm->SupportICType & (ODM_RTL8814A))\r
+ phydm_c2h_dtp_handler(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ \r
+ break;\r
+ \r
+ case PHYDM_C2H_IQK_FINISH:\r
+ #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
+ \r
+ if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821)) {\r
+ \r
+ RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));\r
+ PlatformAcquireSpinLock(Adapter, RT_IQK_SPINLOCK);\r
+ pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;\r
+ PlatformReleaseSpinLock(Adapter, RT_IQK_SPINLOCK);\r
+ pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = 0;\r
+ pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime);\r
+ }\r
+ \r
+ #endif\r
+ break;\r
+\r
+ case PHYDM_C2H_DBG_CODE:\r
+ phydm_fw_trace_handler_code(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ break; \r
+\r
+ case PHYDM_C2H_EXTEND:\r
+ Extend_c2hSubID = tmpBuf[0];\r
+ if (Extend_c2hSubID == PHYDM_EXTEND_C2H_DBG_PRINT)\r
+ phydm_fw_trace_handler_8051(pDM_Odm, tmpBuf, c2hCmdLen);\r
+ \r
+ break;\r
+\r
+ default:\r
+ find_c2h_cmd = FALSE;\r
+ break;\r
+ }\r
+\r
+ return find_c2h_cmd;\r
+\r
+}\r
+\r
+u8Byte\r
+ODM_GetCurrentTime( \r
+ IN PDM_ODM_T pDM_Odm\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return 0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ return (u8Byte)rtw_get_current_time();\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN) \r
+ return PlatformGetCurrentTime();\r
+#endif\r
+}\r
+\r
+u8Byte\r
+ODM_GetProgressingTime( \r
+ IN PDM_ODM_T pDM_Odm,\r
+ IN u8Byte Start_Time\r
+ )\r
+{\r
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
+ return 0;\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
+ return rtw_get_passing_time_ms((u4Byte)Start_Time);\r
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
+ return ((PlatformGetCurrentTime() - Start_Time)>>10);\r
+#endif\r
+}\r
+\r
+\r