net: wireless: rockchip_wlan: add rtl8188fu support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8188fu / hal / phydm / phydm_interface.c
diff --git a/drivers/net/wireless/rockchip_wlan/rtl8188fu/hal/phydm/phydm_interface.c b/drivers/net/wireless/rockchip_wlan/rtl8188fu/hal/phydm/phydm_interface.c
new file mode 100644 (file)
index 0000000..6b97b03
--- /dev/null
@@ -0,0 +1,1014 @@
+/******************************************************************************\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