Path: blob/master/ALFA-W1F1/RTL8814AU/hal/hal_phy.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _HAL_PHY_C_1516#include <drv_types.h>1718/**19* Function: PHY_CalculateBitShift20*21* OverView: Get shifted position of the BitMask22*23* Input:24* u32 BitMask,25*26* Output: none27* Return: u32 Return the shift bit bit position of the mask28*/29u3230PHY_CalculateBitShift(31u32 BitMask32)33{34u32 i;3536for (i = 0; i <= 31; i++) {37if (((BitMask >> i) & 0x1) == 1)38break;39}4041return i;42}434445#ifdef CONFIG_RF_SHADOW_RW46/* ********************************************************************************47* Constant.48* ********************************************************************************49* 2008/11/20 MH For Debug only, RF */50static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];5152/*53* ==> RF shadow Operation API Code Section!!!54*55*-----------------------------------------------------------------------------56* Function: PHY_RFShadowRead57* PHY_RFShadowWrite58* PHY_RFShadowCompare59* PHY_RFShadowRecorver60* PHY_RFShadowCompareAll61* PHY_RFShadowRecorverAll62* PHY_RFShadowCompareFlagSet63* PHY_RFShadowRecorverFlagSet64*65* Overview: When we set RF register, we must write shadow at first.66* When we are running, we must compare shadow abd locate error addr.67* Decide to recorver or not.68*69* Input: NONE70*71* Output: NONE72*73* Return: NONE74*75* Revised History:76* When Who Remark77* 11/20/2008 MHC Create Version 0.78*79*---------------------------------------------------------------------------*/80u3281PHY_RFShadowRead(82PADAPTER Adapter,83enum rf_path eRFPath,84u32 Offset)85{86return RF_Shadow[eRFPath][Offset].Value;8788} /* PHY_RFShadowRead */899091void92PHY_RFShadowWrite(93PADAPTER Adapter,94enum rf_path eRFPath,95u32 Offset,96u32 Data)97{98RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);99RF_Shadow[eRFPath][Offset].Driver_Write = _TRUE;100101} /* PHY_RFShadowWrite */102103104BOOLEAN105PHY_RFShadowCompare(106PADAPTER Adapter,107enum rf_path eRFPath,108u32 Offset)109{110u32 reg;111/* Check if we need to check the register */112if (RF_Shadow[eRFPath][Offset].Compare == _TRUE) {113reg = rtw_hal_read_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask);114/* Compare shadow and real rf register for 20bits!! */115if (RF_Shadow[eRFPath][Offset].Value != reg) {116/* Locate error position. */117RF_Shadow[eRFPath][Offset].ErrorOrNot = _TRUE;118}119return RF_Shadow[eRFPath][Offset].ErrorOrNot ;120}121return _FALSE;122} /* PHY_RFShadowCompare */123124125void126PHY_RFShadowRecorver(127PADAPTER Adapter,128enum rf_path eRFPath,129u32 Offset)130{131/* Check if the address is error */132if (RF_Shadow[eRFPath][Offset].ErrorOrNot == _TRUE) {133/* Check if we need to recorver the register. */134if (RF_Shadow[eRFPath][Offset].Recorver == _TRUE) {135rtw_hal_write_rfreg(Adapter, eRFPath, Offset, bRFRegOffsetMask,136RF_Shadow[eRFPath][Offset].Value);137}138}139140} /* PHY_RFShadowRecorver */141142143void144PHY_RFShadowCompareAll(145PADAPTER Adapter)146{147enum rf_path eRFPath = RF_PATH_A;148u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);149150for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {151for (Offset = 0; Offset < maxReg; Offset++)152PHY_RFShadowCompare(Adapter, eRFPath, Offset);153}154155} /* PHY_RFShadowCompareAll */156157158void159PHY_RFShadowRecorverAll(160PADAPTER Adapter)161{162enum rf_path eRFPath = RF_PATH_A;163u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);164165for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {166for (Offset = 0; Offset < maxReg; Offset++)167PHY_RFShadowRecorver(Adapter, eRFPath, Offset);168}169170} /* PHY_RFShadowRecorverAll */171172173void174PHY_RFShadowCompareFlagSet(175PADAPTER Adapter,176enum rf_path eRFPath,177u32 Offset,178u8 Type)179{180/* Set True or False!!! */181RF_Shadow[eRFPath][Offset].Compare = Type;182183} /* PHY_RFShadowCompareFlagSet */184185186void187PHY_RFShadowRecorverFlagSet(188PADAPTER Adapter,189enum rf_path eRFPath,190u32 Offset,191u8 Type)192{193/* Set True or False!!! */194RF_Shadow[eRFPath][Offset].Recorver = Type;195196} /* PHY_RFShadowRecorverFlagSet */197198199void200PHY_RFShadowCompareFlagSetAll(201PADAPTER Adapter)202{203enum rf_path eRFPath = RF_PATH_A;204u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);205206for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {207for (Offset = 0; Offset < maxReg; Offset++) {208/* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */209if (Offset != 0x26 && Offset != 0x27)210PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _FALSE);211else212PHY_RFShadowCompareFlagSet(Adapter, eRFPath, Offset, _TRUE);213}214}215216} /* PHY_RFShadowCompareFlagSetAll */217218219void220PHY_RFShadowRecorverFlagSetAll(221PADAPTER Adapter)222{223enum rf_path eRFPath = RF_PATH_A;224u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);225226for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {227for (Offset = 0; Offset < maxReg; Offset++) {228/* 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!! */229if (Offset != 0x26 && Offset != 0x27)230PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _FALSE);231else232PHY_RFShadowRecorverFlagSet(Adapter, eRFPath, Offset, _TRUE);233}234}235236} /* PHY_RFShadowCompareFlagSetAll */237238void239PHY_RFShadowRefresh(240PADAPTER Adapter)241{242enum rf_path eRFPath = RF_PATH_A;243u32 Offset = 0, maxReg = GET_RF6052_REAL_MAX_REG(Adapter);244245for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++) {246for (Offset = 0; Offset < maxReg; Offset++) {247RF_Shadow[eRFPath][Offset].Value = 0;248RF_Shadow[eRFPath][Offset].Compare = _FALSE;249RF_Shadow[eRFPath][Offset].Recorver = _FALSE;250RF_Shadow[eRFPath][Offset].ErrorOrNot = _FALSE;251RF_Shadow[eRFPath][Offset].Driver_Write = _FALSE;252}253}254255} /* PHY_RFShadowRead */256#endif /*CONFIG_RF_SHADOW_RW*/257258259