--- /dev/null
+/******************************************************************************
+ *
+ * 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
+}