mirror of
https://github.com/gnab/rtl8812au
synced 2024-11-27 07:34:24 +00:00
286 lines
6.6 KiB
C
286 lines
6.6 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* 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
|
||
|
*
|
||
|
*
|
||
|
******************************************************************************/
|
||
|
#define _HAL_PHY_C_
|
||
|
|
||
|
#include <drv_types.h>
|
||
|
|
||
|
//================================================================================
|
||
|
// Constant.
|
||
|
//================================================================================
|
||
|
// 2008/11/20 MH For Debug only, RF
|
||
|
static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
|
||
|
|
||
|
/**
|
||
|
* Function: PHY_CalculateBitShift
|
||
|
*
|
||
|
* OverView: Get shifted position of the BitMask
|
||
|
*
|
||
|
* Input:
|
||
|
* u4Byte BitMask,
|
||
|
*
|
||
|
* Output: none
|
||
|
* Return: u4Byte Return the shift bit bit position of the mask
|
||
|
*/
|
||
|
u32
|
||
|
PHY_CalculateBitShift(
|
||
|
u32 BitMask
|
||
|
)
|
||
|
{
|
||
|
u32 i;
|
||
|
|
||
|
for(i=0; i<=31; i++)
|
||
|
{
|
||
|
if ( ((BitMask>>i) & 0x1 ) == 1)
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return (i);
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// ==> RF shadow Operation API Code Section!!!
|
||
|
//
|
||
|
/*-----------------------------------------------------------------------------
|
||
|
* Function: PHY_RFShadowRead
|
||
|
* PHY_RFShadowWrite
|
||
|
* PHY_RFShadowCompare
|
||
|
* PHY_RFShadowRecorver
|
||
|
* PHY_RFShadowCompareAll
|
||
|
* PHY_RFShadowRecorverAll
|
||
|
* PHY_RFShadowCompareFlagSet
|
||
|
* PHY_RFShadowRecorverFlagSet
|
||
|
*
|
||
|
* Overview: When we set RF register, we must write shadow at first.
|
||
|
* When we are running, we must compare shadow abd locate error addr.
|
||
|
* Decide to recorver or not.
|
||
|
*
|
||
|
* Input: NONE
|
||
|
*
|
||
|
* Output: NONE
|
||
|
*
|
||
|
* Return: NONE
|
||
|
*
|
||
|
* Revised History:
|
||
|
* When Who Remark
|
||
|
* 11/20/2008 MHC Create Version 0.
|
||
|
*
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
u32
|
||
|
PHY_RFShadowRead(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset)
|
||
|
{
|
||
|
return RF_Shadow[eRFPath][Offset].Value;
|
||
|
|
||
|
} /* PHY_RFShadowRead */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowWrite(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset,
|
||
|
IN u32 Data)
|
||
|
{
|
||
|
RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
|
||
|
RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE;
|
||
|
|
||
|
} /* PHY_RFShadowWrite */
|
||
|
|
||
|
|
||
|
BOOLEAN
|
||
|
PHY_RFShadowCompare(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset)
|
||
|
{
|
||
|
u32 reg;
|
||
|
// Check if we need to check the register
|
||
|
if (RF_Shadow[eRFPath][Offset].Compare == _TRUE)
|
||
|
{
|
||
|
reg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);
|
||
|
// Compare shadow and real rf register for 20bits!!
|
||
|
if (RF_Shadow[eRFPath][Offset].Value != reg)
|
||
|
{
|
||
|
// Locate error position.
|
||
|
RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE;
|
||
|
//RT_TRACE(COMP_INIT, DBG_LOUD,
|
||
|
//("PHY_RFShadowCompare RF-%d Addr%02lx Err = %05lx\n",
|
||
|
//eRFPath, Offset, reg));
|
||
|
}
|
||
|
return RF_Shadow[eRFPath][Offset].ErrorOrNot ;
|
||
|
}
|
||
|
return _FALSE;
|
||
|
} /* PHY_RFShadowCompare */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowRecorver(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset)
|
||
|
{
|
||
|
// Check if the address is error
|
||
|
if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE)
|
||
|
{
|
||
|
// Check if we need to recorver the register.
|
||
|
if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE)
|
||
|
{
|
||
|
rtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,
|
||
|
RF_Shadow[eRFPath][Offset].Value);
|
||
|
//RT_TRACE(COMP_INIT, DBG_LOUD,
|
||
|
//("PHY_RFShadowRecorver RF-%d Addr%02lx=%05lx",
|
||
|
//eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowRecorver */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowCompareAll(
|
||
|
IN PADAPTER Adapter)
|
||
|
{
|
||
|
u8 eRFPath = 0 ;
|
||
|
u32 Offset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);
|
||
|
|
||
|
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
|
||
|
{
|
||
|
for (Offset = 0; Offset <= maxReg; Offset++)
|
||
|
{
|
||
|
PHY_RFShadowCompare(Adapter, eRFPath, Offset);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowCompareAll */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowRecorverAll(
|
||
|
IN PADAPTER Adapter)
|
||
|
{
|
||
|
u8 eRFPath =0;
|
||
|
u32 Offset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);
|
||
|
|
||
|
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
|
||
|
{
|
||
|
for (Offset = 0; Offset <= maxReg; Offset++)
|
||
|
{
|
||
|
PHY_RFShadowRecorver(Adapter, eRFPath, Offset);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowRecorverAll */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowCompareFlagSet(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset,
|
||
|
IN u8 Type)
|
||
|
{
|
||
|
// Set True or False!!!
|
||
|
RF_Shadow[eRFPath][Offset].Compare = Type;
|
||
|
|
||
|
} /* PHY_RFShadowCompareFlagSet */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowRecorverFlagSet(
|
||
|
IN PADAPTER Adapter,
|
||
|
IN u8 eRFPath,
|
||
|
IN u32 Offset,
|
||
|
IN u8 Type)
|
||
|
{
|
||
|
// Set True or False!!!
|
||
|
RF_Shadow[eRFPath][Offset].Recorver= Type;
|
||
|
|
||
|
} /* PHY_RFShadowRecorverFlagSet */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowCompareFlagSetAll(
|
||
|
IN PADAPTER Adapter)
|
||
|
{
|
||
|
u8 eRFPath = 0;
|
||
|
u32 Offset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);
|
||
|
|
||
|
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
|
||
|
{
|
||
|
for (Offset = 0; Offset <= maxReg; Offset++)
|
||
|
{
|
||
|
// 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
|
||
|
if (Offset != 0x26 && Offset != 0x27)
|
||
|
PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _FALSE);
|
||
|
else
|
||
|
PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowCompareFlagSetAll */
|
||
|
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowRecorverFlagSetAll(
|
||
|
IN PADAPTER Adapter)
|
||
|
{
|
||
|
u8 eRFPath = 0;
|
||
|
u32 Offset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);
|
||
|
|
||
|
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
|
||
|
{
|
||
|
for (Offset = 0; Offset <= maxReg; Offset++)
|
||
|
{
|
||
|
// 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
|
||
|
if (Offset != 0x26 && Offset != 0x27)
|
||
|
PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _FALSE);
|
||
|
else
|
||
|
PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _TRUE);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowCompareFlagSetAll */
|
||
|
|
||
|
VOID
|
||
|
PHY_RFShadowRefresh(
|
||
|
IN PADAPTER Adapter)
|
||
|
{
|
||
|
u8 eRFPath = 0;
|
||
|
u32 Offset = 0, maxReg= GET_RF6052_REAL_MAX_REG(Adapter);
|
||
|
|
||
|
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
|
||
|
{
|
||
|
for (Offset = 0; Offset <= maxReg; Offset++)
|
||
|
{
|
||
|
RF_Shadow[eRFPath][Offset].Value = 0;
|
||
|
RF_Shadow[eRFPath][Offset].Compare = _FALSE;
|
||
|
RF_Shadow[eRFPath][Offset].Recorver = _FALSE;
|
||
|
RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE;
|
||
|
RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} /* PHY_RFShadowRead */
|
||
|
|
||
|
|