rtl8723cs/hal/phydm/txbf/halcomtxbf.c
2017-01-30 21:28:09 +01:00

548 lines
14 KiB
C

//============================================================
// Description:
//
// This file is for TXBF mechanism
//
//============================================================
#include "mp_precomp.h"
#include "../phydm_precomp.h"
#if (BEAMFORMING_SUPPORT == 1)
/*Beamforming halcomtxbf API create by YuChen 2015/05*/
VOID
halComTxbf_beamformInit(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_Init(pDM_Odm);
}
/*Only used for MU BFer Entry when get GID management frame (self is as MU STA)*/
VOID
halComTxbf_ConfigGtab(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_ConfigGtab(pDM_Odm);
}
VOID
phydm_beamformSetSoundingEnter(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_EnterWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_EnterWorkItem));
#else
halComTxbf_EnterWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetSoundingLeave(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_LeaveWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_LeaveWorkItem));
#else
halComTxbf_LeaveWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetSoundingRate(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_RateWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_RateWorkItem));
#else
halComTxbf_RateWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetSoundingStatus(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_StatusWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_StatusWorkItem));
#else
halComTxbf_StatusWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetSoundingFwNdpa(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (*pDM_Odm->pbFwDwRsvdPageInProgress)
ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
else
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
#else
halComTxbf_FwNdpaWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetSoundingClk(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ClkWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ClkWorkItem));
#else
halComTxbf_ClkWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetResetTxPath(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_ResetTxPathWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_ResetTxPathWorkItem));
#else
halComTxbf_ResetTxPathWorkItemCallback(pDM_Odm);
#endif
}
VOID
phydm_beamformSetGetTxRate(
IN PVOID pDM_VOID
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
if (PlatformIsWorkItemScheduled(&(pTxbfInfo->Txbf_GetTxRateWorkItem)) == FALSE)
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_GetTxRateWorkItem));
#else
halComTxbf_GetTxRateWorkItemCallback(pDM_Odm);
#endif
}
VOID
halComTxbf_EnterWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte Idx = pTxbfInfo->TXBFIdx;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
HalTxbfJaguar_Enter(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8192E)
HalTxbf8192E_Enter(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_Enter(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8821B)
HalTxbf8821B_Enter(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_Enter(pDM_Odm, Idx);
}
VOID
halComTxbf_LeaveWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte Idx = pTxbfInfo->TXBFIdx;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
HalTxbfJaguar_Leave(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8192E)
HalTxbf8192E_Leave(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_Leave(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8821B)
HalTxbf8821B_Leave(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_Leave(pDM_Odm, Idx);
}
VOID
halComTxbf_FwNdpaWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte Idx = pTxbfInfo->NdpaIdx;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
HalTxbfJaguar_FwTxBF(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8192E)
HalTxbf8192E_FwTxBF(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_FwTxBF(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8821B)
HalTxbf8821B_FwTxBF(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_FwTxBF(pDM_Odm, Idx);
}
VOID
halComTxbf_ClkWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & ODM_RTL8812)
HalTxbfJaguar_Clk_8812A(pDM_Odm);
}
VOID
halComTxbf_RateWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte BW = pTxbfInfo->BW;
u1Byte Rate = pTxbfInfo->Rate;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & ODM_RTL8812)
HalTxbf8812A_setNDPArate(pDM_Odm, BW, Rate);
else if (pDM_Odm->SupportICType & ODM_RTL8192E)
HalTxbf8192E_setNDPArate(pDM_Odm, BW, Rate);
else if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_setNDPArate(pDM_Odm, BW, Rate);
}
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
VOID
halComTxbf_FwNdpaTimerCallback(
IN PRT_TIMER pTimer
)
{
PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (*pDM_Odm->pbFwDwRsvdPageInProgress)
ODM_SetTimer(pDM_Odm, &(pTxbfInfo->Txbf_FwNdpaTimer), 5);
else
PlatformScheduleWorkItem(&(pTxbfInfo->Txbf_FwNdpaWorkItem));
}
#endif
VOID
halComTxbf_StatusWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte Idx = pTxbfInfo->TXBFIdx;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8821))
HalTxbfJaguar_Status(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8192E)
HalTxbf8192E_Status(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_Status(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8821B)
HalTxbf8821B_Status(pDM_Odm, Idx);
else if (pDM_Odm->SupportICType & ODM_RTL8822B)
HalTxbf8822B_Status(pDM_Odm, Idx);
}
VOID
halComTxbf_ResetTxPathWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
u1Byte Idx = pTxbfInfo->TXBFIdx;
if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_ResetTxPath(pDM_Odm, Idx);
}
VOID
halComTxbf_GetTxRateWorkItemCallback(
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
IN PADAPTER Adapter
#else
IN PVOID pDM_VOID
#endif
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
#else
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
#endif
if (pDM_Odm->SupportICType & ODM_RTL8814A)
HalTxbf8814A_GetTxRate(pDM_Odm);
}
BOOLEAN
HalComTxbf_Set(
IN PVOID pDM_VOID,
IN u1Byte setType,
IN PVOID pInBuf
)
{
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
PBOOLEAN pBoolean=(PBOOLEAN)pInBuf;
pu1Byte pU1Tmp=(pu1Byte)pInBuf;
pu4Byte pU4Tmp=(pu4Byte)pInBuf;
PHAL_TXBF_INFO pTxbfInfo = &pDM_Odm->BeamformingInfo.TxbfInfo;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] setType = 0x%X\n", __func__, setType));
switch(setType){
case TXBF_SET_SOUNDING_ENTER:
pTxbfInfo->TXBFIdx = *pU1Tmp;
phydm_beamformSetSoundingEnter(pDM_Odm);
break;
case TXBF_SET_SOUNDING_LEAVE:
pTxbfInfo->TXBFIdx = *pU1Tmp;
phydm_beamformSetSoundingLeave(pDM_Odm);
break;
case TXBF_SET_SOUNDING_RATE:
pTxbfInfo->BW = pU1Tmp[0];
pTxbfInfo->Rate = pU1Tmp[1];
phydm_beamformSetSoundingRate(pDM_Odm);
break;
case TXBF_SET_SOUNDING_STATUS:
pTxbfInfo->TXBFIdx = *pU1Tmp;
phydm_beamformSetSoundingStatus(pDM_Odm);
break;
case TXBF_SET_SOUNDING_FW_NDPA:
pTxbfInfo->NdpaIdx = *pU1Tmp;
phydm_beamformSetSoundingFwNdpa(pDM_Odm);
break;
case TXBF_SET_SOUNDING_CLK:
phydm_beamformSetSoundingClk(pDM_Odm);
break;
case TXBF_SET_TX_PATH_RESET:
pTxbfInfo->TXBFIdx = *pU1Tmp;
phydm_beamformSetResetTxPath(pDM_Odm);
break;
case TXBF_SET_GET_TX_RATE:
phydm_beamformSetGetTxRate(pDM_Odm);
break;
}
return TRUE;
}
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
BOOLEAN
HalComTxbf_Get(
IN PADAPTER Adapter,
IN u1Byte getType,
OUT PVOID pOutBuf
)
{
PHAL_DATA_TYPE pHalData=GET_HAL_DATA(Adapter);
PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
PBOOLEAN pBoolean=(PBOOLEAN)pOutBuf;
ps4Byte pS4Tmp=(ps4Byte)pOutBuf;
pu4Byte pU4Tmp=(pu4Byte)pOutBuf;
pu1Byte pU1Tmp=(pu1Byte)pOutBuf;
ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_TXBF, ODM_DBG_LOUD, ("[%s] Start!\n", __func__));
if (getType == TXBF_GET_EXPLICIT_BEAMFORMEE) {
if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
*pBoolean = FALSE;
else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
IS_HARDWARE_TYPE_8821B(Adapter) ||
IS_HARDWARE_TYPE_8192E(Adapter) ||
IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter))
*pBoolean = TRUE;
else
*pBoolean = FALSE;
} else if (getType == TXBF_GET_EXPLICIT_BEAMFORMER) {
if (IS_HARDWARE_TYPE_OLDER_THAN_8812A(Adapter))
*pBoolean = FALSE;
else if (/*IS_HARDWARE_TYPE_8822B(Adapter) ||*/
IS_HARDWARE_TYPE_8821B(Adapter) ||
IS_HARDWARE_TYPE_8192E(Adapter) ||
IS_HARDWARE_TYPE_JAGUAR(Adapter) || IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {
if(pHalData->RF_Type == RF_2T2R || pHalData->RF_Type == RF_3T3R)
*pBoolean = TRUE;
else
*pBoolean = FALSE;
} else
*pBoolean = FALSE;
} else if (getType == TXBF_GET_MU_MIMO_STA) {
#if (RTL8822B_SUPPORT == 1)
if (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/
IS_HARDWARE_TYPE_8822B(Adapter))
*pBoolean = TRUE;
else
#endif
*pBoolean = FALSE;
} else if (getType == TXBF_GET_MU_MIMO_AP) {
#if (RTL8822B_SUPPORT == 1)
if (/*pDM_Odm->SupportICType & (ODM_RTL8822B)*/
IS_HARDWARE_TYPE_8822B(Adapter))
*pBoolean = TRUE;
else
#endif
*pBoolean = FALSE;
}
return TRUE;
}
#endif
#endif