OSDN Git Service

Add rtl8723bu driver version 4.4.5
[android-x86/external-kernel-drivers.git] / rtl8723bu / hal / phydm / phydm_interface.c
diff --git a/rtl8723bu/hal/phydm/phydm_interface.c b/rtl8723bu/hal/phydm/phydm_interface.c
new file mode 100644 (file)
index 0000000..5fa8981
--- /dev/null
@@ -0,0 +1,1012 @@
+/******************************************************************************
+ *
+ * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ *
+ ******************************************************************************/
+
+//============================================================
+// include files
+//============================================================
+
+#include "mp_precomp.h"
+#include "phydm_precomp.h"
+
+//
+// ODM IO Relative API.
+//
+
+u1Byte
+ODM_Read1Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       return  RTL_R8(RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return rtw_read8(Adapter,RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return  PlatformEFIORead1Byte(Adapter, RegAddr);
+#endif
+
+}
+
+
+u2Byte
+ODM_Read2Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       return  RTL_R16(RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return rtw_read16(Adapter,RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return  PlatformEFIORead2Byte(Adapter, RegAddr);
+#endif
+
+}
+
+
+u4Byte
+ODM_Read4Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       return  RTL_R32(RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return rtw_read32(Adapter,RegAddr);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return  PlatformEFIORead4Byte(Adapter, RegAddr);
+#endif
+
+}
+
+
+VOID
+ODM_Write1Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr,
+       IN      u1Byte                  Data
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       RTL_W8(RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       rtw_write8(Adapter,RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformEFIOWrite1Byte(Adapter, RegAddr, Data);
+#endif
+
+}
+
+
+VOID
+ODM_Write2Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr,
+       IN      u2Byte                  Data
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       RTL_W16(RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       rtw_write16(Adapter,RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformEFIOWrite2Byte(Adapter, RegAddr, Data);
+#endif
+
+}
+
+
+VOID
+ODM_Write4Byte(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u4Byte                  RegAddr,
+       IN      u4Byte                  Data
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       prtl8192cd_priv priv    = pDM_Odm->priv;
+       RTL_W32(RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       rtw_write32(Adapter,RegAddr, Data);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformEFIOWrite4Byte(Adapter, RegAddr, Data);
+#endif
+
+}
+
+
+VOID
+ODM_SetMACReg(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          RegAddr,
+       IN      u4Byte          BitMask,
+       IN      u4Byte          Data
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
+#endif
+}
+
+
+u4Byte
+ODM_GetMACReg(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          RegAddr,
+       IN      u4Byte          BitMask
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
+       return PHY_QueryMacReg(pDM_Odm->Adapter, RegAddr, BitMask);
+#endif
+}
+
+
+VOID
+ODM_SetBBReg(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          RegAddr,
+       IN      u4Byte          BitMask,
+       IN      u4Byte          Data
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       PHY_SetBBReg(pDM_Odm->priv, RegAddr, BitMask, Data);
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PHY_SetBBReg(Adapter, RegAddr, BitMask, Data);
+#endif
+}
+
+
+u4Byte
+ODM_GetBBReg(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u4Byte          RegAddr,
+       IN      u4Byte          BitMask
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return PHY_QueryBBReg(pDM_Odm->priv, RegAddr, BitMask);
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return PHY_QueryBBReg(Adapter, RegAddr, BitMask);
+#endif
+}
+
+
+VOID
+ODM_SetRFReg(
+       IN      PDM_ODM_T                       pDM_Odm,
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,
+       IN      u4Byte                          RegAddr,
+       IN      u4Byte                          BitMask,
+       IN      u4Byte                          Data
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       PHY_SetRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, Data);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PHY_SetRFReg(Adapter, eRFPath, RegAddr, BitMask, Data);
+       ODM_delay_us(2);
+
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PHY_SetRFReg(pDM_Odm->Adapter, eRFPath, RegAddr, BitMask, Data);
+#endif
+}
+
+
+u4Byte
+ODM_GetRFReg(
+       IN      PDM_ODM_T                       pDM_Odm,
+       IN      ODM_RF_RADIO_PATH_E     eRFPath,
+       IN      u4Byte                          RegAddr,
+       IN      u4Byte                          BitMask
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return PHY_QueryRFReg(pDM_Odm->priv, eRFPath, RegAddr, BitMask, 1);
+#elif(DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       return PHY_QueryRFReg(Adapter, eRFPath, RegAddr, BitMask);
+#endif
+}
+
+
+
+
+//
+// ODM Memory relative API.
+//
+VOID
+ODM_AllocateMemory(
+       IN      PDM_ODM_T       pDM_Odm,
+       OUT     PVOID           *pPtr,
+       IN      u4Byte          length
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       *pPtr = kmalloc(length, GFP_ATOMIC);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       *pPtr = rtw_zvmalloc(length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformAllocateMemory(Adapter, pPtr, length);
+#endif
+}
+
+// length could be ignored, used to detect memory leakage.
+VOID
+ODM_FreeMemory(
+       IN      PDM_ODM_T       pDM_Odm,
+       OUT     PVOID           pPtr,
+       IN      u4Byte          length
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       kfree(pPtr);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       rtw_vmfree(pPtr, length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       //PADAPTER    Adapter = pDM_Odm->Adapter;
+       PlatformFreeMemory(pPtr, length);
+#endif
+}
+
+VOID
+ODM_MoveMemory(
+       IN      PDM_ODM_T       pDM_Odm,
+       OUT PVOID               pDest,
+       IN  PVOID               pSrc,
+       IN  u4Byte              Length
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       memcpy(pDest, pSrc, Length);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       _rtw_memcpy(pDest, pSrc, Length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformMoveMemory(pDest, pSrc, Length);
+#endif
+}
+
+void ODM_Memory_Set(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      PVOID           pbuf,
+       IN      s1Byte          value,
+       IN      u4Byte          length
+)
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       memset(pbuf, value, length);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       _rtw_memset(pbuf,value, length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformFillMemory(pbuf,length,value);
+#endif
+}
+s4Byte ODM_CompareMemory(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      PVOID           pBuf1,
+       IN      PVOID           pBuf2,
+       IN      u4Byte          length
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return memcmp(pBuf1,pBuf2,length);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       return _rtw_memcmp(pBuf1,pBuf2,length);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       return PlatformCompareMemory(pBuf1,pBuf2,length);
+#endif
+}
+
+
+
+//
+// ODM MISC relative API.
+//
+VOID
+ODM_AcquireSpinLock(
+       IN      PDM_ODM_T                       pDM_Odm,
+       IN      RT_SPINLOCK_TYPE        type
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       rtw_odm_acquirespinlock(Adapter, type);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformAcquireSpinLock(Adapter, type);
+#endif
+}
+VOID
+ODM_ReleaseSpinLock(
+       IN      PDM_ODM_T                       pDM_Odm,
+       IN      RT_SPINLOCK_TYPE        type
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE )
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       rtw_odm_releasespinlock(Adapter, type);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformReleaseSpinLock(Adapter, type);
+#endif
+}
+
+//
+// Work item relative API. FOr MP driver only~!
+//
+VOID
+ODM_InitializeWorkItem(
+       IN      PDM_ODM_T                                       pDM_Odm,
+       IN      PRT_WORK_ITEM                           pRtWorkItem,
+       IN      RT_WORKITEM_CALL_BACK           RtWorkItemCallback,
+       IN      PVOID                                           pContext,
+       IN      const char*                                     szID
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformInitializeWorkItem(Adapter, pRtWorkItem, RtWorkItemCallback, pContext, szID);
+#endif
+}
+
+
+VOID
+ODM_StartWorkItem(
+       IN      PRT_WORK_ITEM   pRtWorkItem
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformStartWorkItem(pRtWorkItem);
+#endif
+}
+
+
+VOID
+ODM_StopWorkItem(
+       IN      PRT_WORK_ITEM   pRtWorkItem
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformStopWorkItem(pRtWorkItem);
+#endif
+}
+
+
+VOID
+ODM_FreeWorkItem(
+       IN      PRT_WORK_ITEM   pRtWorkItem
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformFreeWorkItem(pRtWorkItem);
+#endif
+}
+
+
+VOID
+ODM_ScheduleWorkItem(
+       IN      PRT_WORK_ITEM   pRtWorkItem
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformScheduleWorkItem(pRtWorkItem);
+#endif
+}
+
+
+VOID
+ODM_IsWorkItemScheduled(
+       IN      PRT_WORK_ITEM   pRtWorkItem
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformIsWorkItemScheduled(pRtWorkItem);
+#endif
+}
+
+
+
+//
+// ODM Timer relative API.
+//
+VOID
+ODM_StallExecution(
+       IN      u4Byte  usDelay
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       rtw_udelay_os(usDelay);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformStallExecution(usDelay);
+#endif
+}
+
+VOID
+ODM_delay_ms(IN u4Byte ms)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       delay_ms(ms);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       rtw_mdelay_os(ms);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       delay_ms(ms);
+#endif
+}
+
+VOID
+ODM_delay_us(IN u4Byte us)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       delay_us(us);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       rtw_udelay_os(us);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PlatformStallExecution(us);
+#endif
+}
+
+VOID
+ODM_sleep_ms(IN u4Byte ms)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       rtw_msleep_os(ms);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+#endif
+}
+
+VOID
+ODM_sleep_us(IN u4Byte us)
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       rtw_usleep_os(us);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+#endif
+}
+
+VOID
+ODM_SetTimer(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      PRT_TIMER               pTimer,
+       IN      u4Byte                  msDelay
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       mod_timer(pTimer, jiffies + RTL_MILISECONDS_TO_JIFFIES(msDelay));
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       _set_timer(pTimer,msDelay ); //ms
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER                Adapter = pDM_Odm->Adapter;
+       PlatformSetTimer(Adapter, pTimer, msDelay);
+#endif
+
+}
+
+VOID
+ODM_InitializeTimer(
+       IN      PDM_ODM_T                       pDM_Odm,
+       IN      PRT_TIMER                       pTimer,
+       IN      RT_TIMER_CALL_BACK      CallBackFunc,
+       IN      PVOID                           pContext,
+       IN      const char*                     szID
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       init_timer(pTimer);
+       pTimer->function = CallBackFunc;
+       pTimer->data = (unsigned long)pDM_Odm;
+       mod_timer(pTimer, jiffies+RTL_MILISECONDS_TO_JIFFIES(10));
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       _init_timer(pTimer,Adapter->pnetdev,CallBackFunc,pDM_Odm);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PlatformInitializeTimer(Adapter, pTimer, CallBackFunc,pContext,szID);
+#endif
+}
+
+
+VOID
+ODM_CancelTimer(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      PRT_TIMER               pTimer
+       )
+{
+#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
+       del_timer(pTimer);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
+       _cancel_timer_ex(pTimer);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       PADAPTER Adapter = pDM_Odm->Adapter;
+       PlatformCancelTimer(Adapter, pTimer);
+#endif
+}
+
+
+VOID
+ODM_ReleaseTimer(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      PRT_TIMER               pTimer
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+
+       PADAPTER Adapter = pDM_Odm->Adapter;
+
+    // <20120301, Kordan> If the initilization fails, InitializeAdapterXxx will return regardless of InitHalDm.
+    // Hence, uninitialized timers cause BSOD when the driver releases resources since the init fail.
+    if (pTimer == 0)
+    {
+        ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_SERIOUS, ("=====>ODM_ReleaseTimer(), The timer is NULL! Please check it!\n"));
+        return;
+    }
+
+       PlatformReleaseTimer(Adapter, pTimer);
+#endif
+}
+
+BOOLEAN
+phydm_actingDetermine(
+       IN PDM_ODM_T            pDM_Odm,
+       IN PHYDM_ACTING_TYPE    type
+       )
+{
+       BOOLEAN         ret = FALSE;
+#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER        Adapter = pDM_Odm->BeamformingInfo.SourceAdapter;
+#else
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+#endif
+
+#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       if (type == PhyDM_ACTING_AS_AP)
+               ret = ACTING_AS_AP(Adapter);
+       else if (type == PhyDM_ACTING_AS_IBSS)
+               ret = ACTING_AS_IBSS(Adapter);
+#elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
+       struct mlme_priv                        *pmlmepriv = &(Adapter->mlmepriv);
+
+       if (type == PhyDM_ACTING_AS_AP)
+               ret = check_fwstate(pmlmepriv, WIFI_AP_STATE);
+       else if (type == PhyDM_ACTING_AS_IBSS)
+               ret = check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) || check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE);
+#endif
+
+       return ret;
+
+}
+
+
+u1Byte
+phydm_trans_h2c_id(
+       IN      PDM_ODM_T       pDM_Odm,
+       IN      u1Byte          phydm_h2c_id
+)
+{
+       u1Byte platform_h2c_id=0xff;
+
+
+       switch(phydm_h2c_id)
+       {
+               //1 [0]
+               case ODM_H2C_RSSI_REPORT:
+
+                       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                               if(pDM_Odm->SupportICType == ODM_RTL8188E)
+                               {
+                                       platform_h2c_id = H2C_88E_RSSI_REPORT;
+                               }
+                               else if(pDM_Odm->SupportICType == ODM_RTL8814A)
+                               {
+                                       platform_h2c_id =H2C_8814A_RSSI_REPORT;
+                               }
+                               else
+                               {
+                                       platform_h2c_id = H2C_RSSI_REPORT;
+                               }
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+                               platform_h2c_id = H2C_RSSI_SETTING;
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+                               #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
+                                       if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B))
+                                       {
+                                               platform_h2c_id =H2C_88XX_RSSI_REPORT;
+                                               /*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] H2C_88XX_RSSI_REPORT CMD_ID = (( %d ))\n", platform_h2c_id));*/
+                                       } else
+                               #endif
+                               #if(RTL8812A_SUPPORT==1)
+                                       if(pDM_Odm->SupportICType == ODM_RTL8812)
+                                       {
+                                               platform_h2c_id = H2C_8812_RSSI_REPORT;
+                                       } else
+                               #endif
+                                       {}
+                       #endif
+
+                               break;
+
+               //1 [3]
+               case ODM_H2C_WIFI_CALIBRATION:
+                       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                                       platform_h2c_id =H2C_WIFI_CALIBRATION;
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+                               #if(RTL8723B_SUPPORT==1)
+                                       platform_h2c_id = H2C_8723B_BT_WLAN_CALIBRATION;
+                               #endif
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+
+
+                       #endif
+
+                               break;
+
+
+               //1 [4]
+               case ODM_H2C_IQ_CALIBRATION:
+                       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                               platform_h2c_id =H2C_IQ_CALIBRATION;
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+                               #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))
+                               platform_h2c_id = H2C_8812_IQ_CALIBRATION;
+                               #endif
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+
+
+                       #endif
+
+                               break;
+               //1 [5]
+               case ODM_H2C_RA_PARA_ADJUST:
+
+                       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                               if (pDM_Odm->SupportICType & (ODM_RTL8814A | ODM_RTL8822B))
+                                       platform_h2c_id = H2C_8814A_RA_PARA_ADJUST;
+                               else
+                                       platform_h2c_id = H2C_RA_PARA_ADJUST;
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+                               #if((RTL8812A_SUPPORT==1) ||(RTL8821A_SUPPORT==1))
+                                       platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
+                               #elif ((RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
+                                       platform_h2c_id = H2C_RA_PARA_ADJUST;
+                               #elif(RTL8192E_SUPPORT==1)
+                                       platform_h2c_id =H2C_8192E_RA_PARA_ADJUST;
+                               #elif(RTL8723B_SUPPORT==1)
+                                       platform_h2c_id =H2C_8723B_RA_PARA_ADJUST;
+                               #endif
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+                               #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
+                                       if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B)) {
+                                               platform_h2c_id =H2C_88XX_RA_PARA_ADJUST;
+                                               /*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));*/
+                                       } else
+                               #endif
+                               #if(RTL8812A_SUPPORT==1)
+                                       if(pDM_Odm->SupportICType == ODM_RTL8812)
+                                       {
+                                               platform_h2c_id = H2C_8812_RA_PARA_ADJUST;
+                                       } else
+                               #endif
+                                       {}
+                       #endif
+
+                               break;
+
+
+               //1 [6]
+               case PHYDM_H2C_DYNAMIC_TX_PATH:
+
+                       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                               if(pDM_Odm->SupportICType == ODM_RTL8814A)
+                               {
+                                       platform_h2c_id =H2C_8814A_DYNAMIC_TX_PATH;
+                               }
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+                               #if (RTL8814A_SUPPORT == 1)
+                               if (pDM_Odm->SupportICType == ODM_RTL8814A)
+                                       platform_h2c_id = H2C_DYNAMIC_TX_PATH;
+                               #endif
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+                               #if(RTL8814A_SUPPORT==1)
+                                       if( pDM_Odm->SupportICType == ODM_RTL8814A)
+                                       {
+                                               platform_h2c_id = H2C_88XX_DYNAMIC_TX_PATH;
+                                       }
+                               #endif
+
+                       #endif
+
+                               break;
+
+               /* [7]*/
+               case PHYDM_H2C_FW_TRACE_EN:
+
+                       #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
+                               if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))
+                                       platform_h2c_id = H2C_8814A_FW_TRACE_EN;
+                               else
+                                       platform_h2c_id = H2C_FW_TRACE_EN;
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+
+
+                       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+                               #if ((RTL8881A_SUPPORT == 1) || (RTL8192E_SUPPORT == 1) || (RTL8814A_SUPPORT == 1) || (RTL8822B_SUPPORT == 1))
+                                       if (pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8814A || (pDM_Odm->SupportICType == ODM_RTL8822B))
+                                               platform_h2c_id  = H2C_88XX_FW_TRACE_EN;
+                                       else
+                               #endif
+                               #if (RTL8812A_SUPPORT == 1)
+                                       if (pDM_Odm->SupportICType == ODM_RTL8812) {
+                                               platform_h2c_id = H2C_8812_FW_TRACE_EN;
+                                       } else
+                               #endif
+                                       {}
+
+                       #endif
+
+                               break;
+
+               case PHYDM_H2C_TXBF:
+#if ((RTL8192E_SUPPORT == 1) || (RTL8812A_SUPPORT == 1))
+                       platform_h2c_id  = 0x41;        /*H2C_TxBF*/
+#endif
+               break;
+
+               default:
+                       platform_h2c_id=0xff;
+                       break;
+       }
+
+       return platform_h2c_id;
+
+}
+
+//
+// ODM FW relative API.
+//
+
+VOID
+ODM_FillH2CCmd(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u1Byte                  phydm_h2c_id,
+       IN      u4Byte                  CmdLen,
+       IN      pu1Byte                 pCmdBuffer
+)
+{
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       u1Byte          platform_h2c_id;
+
+       platform_h2c_id=phydm_trans_h2c_id(pDM_Odm, phydm_h2c_id);
+
+       if(platform_h2c_id==0xff)
+       {
+               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));
+               return;
+       }
+
+       #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+               if (pDM_Odm->SupportICType == ODM_RTL8188E)
+                       if (!pDM_Odm->RaSupport88E)
+                               FillH2CCmd88E(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+               else if (pDM_Odm->SupportICType == ODM_RTL8192C)
+                       FillH2CCmd92C(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+               else if (pDM_Odm->SupportICType == ODM_RTL8814A)
+                       FillH2CCmd8814A(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+               else if (pDM_Odm->SupportICType == ODM_RTL8822B)
+#if (RTL8822B_SUPPORT == 1)
+                       FillH2CCmd8822B(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+#endif
+               else
+                       FillH2CCmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+
+       #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+               rtw_hal_fill_h2c_cmd(Adapter, platform_h2c_id, CmdLen, pCmdBuffer);
+
+       #elif(DM_ODM_SUPPORT_TYPE & ODM_AP)
+               #if((RTL8881A_SUPPORT==1)||(RTL8192E_SUPPORT==1)||(RTL8814A_SUPPORT==1))
+                       if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E|| pDM_Odm->SupportICType == ODM_RTL8814A)
+                       {
+                               GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);
+                               //FillH2CCmd88XX(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);
+                       } else
+               #endif
+               #if(RTL8812A_SUPPORT==1)
+                       if(pDM_Odm->SupportICType == ODM_RTL8812)
+                       {
+                               FillH2CCmd8812(pDM_Odm->priv, platform_h2c_id, CmdLen, pCmdBuffer);
+                       } else
+               #endif
+                       {}
+       #endif
+}
+
+u1Byte
+phydm_c2H_content_parsing(
+       IN      PVOID                   pDM_VOID,
+       IN      u1Byte                  c2hCmdId,
+       IN      u1Byte                  c2hCmdLen,
+       IN      pu1Byte                 tmpBuf
+)
+{
+       PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;
+       #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+       PADAPTER        Adapter = pDM_Odm->Adapter;
+       #endif
+       u1Byte  Extend_c2hSubID = 0;
+       u1Byte  find_c2h_cmd = TRUE;
+
+       switch (c2hCmdId) {
+       case PHYDM_C2H_DBG:
+               if (pDM_Odm->SupportICType & (ODM_RTL8814A|ODM_RTL8822B))
+                       phydm_fw_trace_handler(pDM_Odm, tmpBuf, c2hCmdLen);
+
+               break;
+
+       case PHYDM_C2H_RA_RPT:
+               phydm_c2h_ra_report_handler(pDM_Odm, tmpBuf, c2hCmdLen);
+               break;
+
+       case PHYDM_C2H_RA_PARA_RPT:
+               ODM_C2HRaParaReportHandler(pDM_Odm, tmpBuf, c2hCmdLen);
+               break;
+
+       case PHYDM_C2H_DYNAMIC_TX_PATH_RPT:
+               if (pDM_Odm->SupportICType & (ODM_RTL8814A))
+                       phydm_c2h_dtp_handler(pDM_Odm, tmpBuf, c2hCmdLen);
+
+               break;
+
+       case PHYDM_C2H_IQK_FINISH:
+               #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
+
+               if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8821)) {
+
+                       RT_TRACE(COMP_MP, DBG_LOUD, ("== FW IQK Finish ==\n"));
+                       PlatformAcquireSpinLock(Adapter, RT_IQK_SPINLOCK);
+                       pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE;
+                       PlatformReleaseSpinLock(Adapter, RT_IQK_SPINLOCK);
+                       pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = 0;
+                       pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime);
+               }
+
+               #endif
+               break;
+
+       case PHYDM_C2H_DBG_CODE:
+               phydm_fw_trace_handler_code(pDM_Odm, tmpBuf, c2hCmdLen);
+               break;
+
+       case PHYDM_C2H_EXTEND:
+               Extend_c2hSubID = tmpBuf[0];
+               if (Extend_c2hSubID == PHYDM_EXTEND_C2H_DBG_PRINT)
+                       phydm_fw_trace_handler_8051(pDM_Odm, tmpBuf, c2hCmdLen);
+
+               break;
+
+       default:
+               find_c2h_cmd = FALSE;
+               break;
+       }
+
+       return find_c2h_cmd;
+
+}
+
+u8Byte
+ODM_GetCurrentTime(
+       IN      PDM_ODM_T               pDM_Odm
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return  0;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       return (u8Byte)rtw_get_current_time();
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       return  PlatformGetCurrentTime();
+#endif
+}
+
+u8Byte
+ODM_GetProgressingTime(
+       IN      PDM_ODM_T               pDM_Odm,
+       IN      u8Byte                  Start_Time
+       )
+{
+#if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
+       return  0;
+#elif(DM_ODM_SUPPORT_TYPE & ODM_CE)
+       return rtw_get_passing_time_ms((u4Byte)Start_Time);
+#elif(DM_ODM_SUPPORT_TYPE & ODM_WIN)
+       return   ((PlatformGetCurrentTime() - Start_Time)>>10);
+#endif
+}