194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/****************************************************************************** 294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved. 394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * This program is distributed in the hope that it will be useful, but WITHOUT 594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * more details. 894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * You should have received a copy of the GNU General Public License along with 1094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * this program; if not, write to the Free Software Foundation, Inc., 1194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA 1294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 1394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * The full GNU General Public License is included in this distribution in the 1494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * file called LICENSE. 1594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * 1694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * Contact Information: 1794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger * wlanfae <wlanfae@realtek.com> 1894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger******************************************************************************/ 1994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_core.h" 2194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_hw.h" 2294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_phyreg.h" 2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8190P_rtl8256.h" 2494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_phy.h" 2594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_dm.h" 2694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_hwimg.h" 2894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 2994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic u32 RF_CHANNEL_TABLE_ZEBRA[] = { 3094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0, 3194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x085c, 3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x08dc, 3394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x095c, 3494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x09dc, 3594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0a5c, 3694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0adc, 3794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0b5c, 3894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0bdc, 3994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0c5c, 4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0cdc, 4194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0d5c, 4294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0ddc, 4394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0e5c, 4494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 0x0f72, 4594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}; 4694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 4794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/*************************Define local function prototype**********************/ 4894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 49547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerstatic u32 phy_FwRFSerialRead(struct net_device *dev, 50547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath, 51547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 Offset); 52547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerstatic void phy_FwRFSerialWrite(struct net_device *dev, 53547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath, 54547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 Offset, u32 Data); 5549aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger 5649aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic u32 rtl8192_CalculateBitShift(u32 dwBitMask) 5794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 5894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 i; 59547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i <= 31; i++) { 60547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (((dwBitMask >> i) & 0x1) == 1) 6194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 6294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 6394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return i; 6494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 65547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 66547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingeru8 rtl8192_phy_CheckIsLegalRFPath(struct net_device *dev, u32 eRFPath) 6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 ret = 1; 6994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 7094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rf_type == RF_2T4R) 7194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = 0; 72547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger else if (priv->rf_type == RF_1T2R) { 7394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B) 7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = 1; 7594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D) 7694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = 0; 7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 7894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 80547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 81547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_setBBreg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask, 82547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 dwData) 8394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 8494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 8594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 OriginalValue, BitShift, NewValue; 8694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 87547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (dwBitMask != bMaskDWord) { 8894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger OriginalValue = read_nic_dword(dev, dwRegAddr); 8994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger BitShift = rtl8192_CalculateBitShift(dwBitMask); 90547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger NewValue = (((OriginalValue) & (~dwBitMask)) | 91547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (dwData << BitShift)); 9294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, dwRegAddr, NewValue); 93547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else 9494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, dwRegAddr, dwData); 9594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 9694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 97547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 98547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingeru32 rtl8192_QueryBBReg(struct net_device *dev, u32 dwRegAddr, u32 dwBitMask) 9994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 10094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 Ret = 0, OriginalValue, BitShift; 10194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 10294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger OriginalValue = read_nic_dword(dev, dwRegAddr); 10394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger BitShift = rtl8192_CalculateBitShift(dwBitMask); 10494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Ret = (OriginalValue & dwBitMask) >> BitShift; 10594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 106547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return Ret; 10794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 10849aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic u32 rtl8192_phy_RFSerialRead(struct net_device *dev, 10949aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger enum rf90_radio_path eRFPath, u32 Offset) 11094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 11194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 11294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 ret = 0; 11394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 NewOffset = 0; 114547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath]; 11594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Offset &= 0x3f; 11694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_chip == RF_8256) { 11894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0); 119547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Offset >= 31) { 12094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] |= 0x140; 121547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, 122547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 123547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->RfReg0Value[eRFPath]<<16)); 124547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger NewOffset = Offset - 30; 125547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (Offset >= 16) { 12694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] |= 0x100; 12794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] &= (~0x40); 128547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, 129547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 130547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->RfReg0Value[eRFPath]<<16)); 13194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 13294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset - 15; 133547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else 13494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset; 135547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 136547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need" 137547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " to be 8256\n"); 13894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset; 13994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 140547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadAddress, 141547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger NewOffset); 14294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x0); 14394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadEdge, 0x1); 14494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 145547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger mdelay(1); 14694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 147547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger ret = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBack, 148547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bLSSIReadBackData); 14994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 150547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_chip == RF_8256) { 15194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] &= 0xebf; 15294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 153547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, 154547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->RfReg0Value[eRFPath] << 16)); 15594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3); 15794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 15894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 15994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 16194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 16394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 16449aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic void rtl8192_phy_RFSerialWrite(struct net_device *dev, 16549aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger enum rf90_radio_path eRFPath, u32 Offset, 16649aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger u32 Data) 16794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 16894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 DataAndAddr = 0, NewOffset = 0; 1709bf6e4c146a9da9d44f7bdb259c233db28b64003Larry Finger struct bb_reg_definition *pPhyReg = &priv->PHYRegDef[eRFPath]; 17194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 17294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Offset &= 0x3f; 173547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_chip == RF_8256) { 17494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0); 17594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 176547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Offset >= 31) { 17794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] |= 0x140; 178547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, 179547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 180547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->RfReg0Value[eRFPath] << 16)); 18194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset - 30; 182547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (Offset >= 16) { 18394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] |= 0x100; 18494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] &= (~0x40); 185547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, 186547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 187547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->RfReg0Value[eRFPath] << 16)); 18894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset - 15; 189547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else 19094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset; 191547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 192547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be" 193547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " 8256\n"); 19494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger NewOffset = Offset; 19594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 19694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 19794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger DataAndAddr = (Data<<16) | (NewOffset&0x3f); 19894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 19994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr); 20094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 201547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Offset == 0x0) 20294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] = Data; 20394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 204547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_chip == RF_8256) { 205547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Offset != 0) { 20694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RfReg0Value[eRFPath] &= 0xebf; 20794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg( 20894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dev, 20994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pPhyReg->rf3wireOffset, 21094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bMaskDWord, 21194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (priv->RfReg0Value[eRFPath] << 16)); 21294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 21394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3); 21494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 21594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 21694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 21794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 218547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phy_SetRFReg(struct net_device *dev, enum rf90_radio_path eRFPath, 219547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 RegAddr, u32 BitMask, u32 Data) 22094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 22194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 22294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 Original_Value, BitShift, New_Value; 22394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 22494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath)) 22594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 22694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter) 22794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 22894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 22994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n"); 230547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->Rf_Mode == RF_OP_By_FW) { 231547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (BitMask != bMask12Bits) { 232547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Original_Value = phy_FwRFSerialRead(dev, eRFPath, 233547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RegAddr); 23494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger BitShift = rtl8192_CalculateBitShift(BitMask); 235547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger New_Value = (((Original_Value) & (~BitMask)) | 236547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (Data << BitShift)); 23794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 23894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger phy_FwRFSerialWrite(dev, eRFPath, RegAddr, New_Value); 239547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else 24094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger phy_FwRFSerialWrite(dev, eRFPath, RegAddr, Data); 24194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger udelay(200); 24294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 243547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 244547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (BitMask != bMask12Bits) { 245547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, 246547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RegAddr); 24794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger BitShift = rtl8192_CalculateBitShift(BitMask); 248547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger New_Value = (((Original_Value) & (~BitMask)) | 249547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (Data << BitShift)); 25094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 251547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, 252547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger New_Value); 253547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else 25494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, Data); 25594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 25694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 25794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 25894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 259547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingeru32 rtl8192_phy_QueryRFReg(struct net_device *dev, enum rf90_radio_path eRFPath, 260547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 RegAddr, u32 BitMask) 26194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 26294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 Original_Value, Readback_Value, BitShift; 26394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 26494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath)) 26594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 26694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter) 26794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return 0; 26894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger down(&priv->rf_sem); 269547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->Rf_Mode == RF_OP_By_FW) { 27094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr); 27194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger udelay(200); 272547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 273547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, 274547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RegAddr); 27594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 27694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger BitShift = rtl8192_CalculateBitShift(BitMask); 27794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Readback_Value = (Original_Value & BitMask) >> BitShift; 27894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger up(&priv->rf_sem); 279547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return Readback_Value; 28094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 28194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 282547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerstatic u32 phy_FwRFSerialRead(struct net_device *dev, 283547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath, u32 Offset) 28494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 28594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 retValue = 0; 28694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 Data = 0; 28794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 time = 0; 288547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Data |= ((Offset & 0xFF) << 12); 289547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Data |= ((eRFPath & 0x3) << 20); 29094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Data |= 0x80000000; 291547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger while (read_nic_dword(dev, QPNR)&0x80000000) { 29294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (time++ < 100) 29394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger udelay(10); 29494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 29694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, QPNR, Data); 298547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger while (read_nic_dword(dev, QPNR) & 0x80000000) { 29994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (time++ < 100) 30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger udelay(10); 30194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 302547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return 0; 30394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 30494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger retValue = read_nic_dword(dev, RF_DATA); 30594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 306547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return retValue; 30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 30894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} /* phy_FwRFSerialRead */ 30994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 310547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerstatic void phy_FwRFSerialWrite(struct net_device *dev, 311547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath, 312547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 Offset, u32 Data) 31394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 31494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 time = 0; 31594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 316547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Data |= ((Offset & 0xFF) << 12); 317547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Data |= ((eRFPath & 0x3) << 20); 31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Data |= 0x400000; 31994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger Data |= 0x80000000; 32094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 321547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger while (read_nic_dword(dev, QPNR) & 0x80000000) { 32294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (time++ < 100) 32394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger udelay(10); 32494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 32594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 32694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 32794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, QPNR, Data); 32894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 32994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} /* phy_FwRFSerialWrite */ 33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 33194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 332547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phy_configmac(struct net_device *dev) 33394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 33494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 dwArrayLen = 0, i = 0; 335547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 *pdwArray = NULL; 33694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 337547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 338547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->bTXPowerDataReadFromEEPORM) { 33994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n"); 34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwArrayLen = MACPHY_Array_PGLength; 34194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pdwArray = Rtl819XMACPHY_Array_PG; 34294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 343547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 344547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PHY, "Read rtl819XMACPHY_Array\n"); 34594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwArrayLen = MACPHY_ArrayLength; 34694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pdwArray = Rtl819XMACPHY_Array; 34794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 348547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < dwArrayLen; i += 3) { 349547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_DBG, "The Rtl8190MACPHY_Array[0] is %x Rtl8190MAC" 350547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "PHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n", 351547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger pdwArray[i], pdwArray[i+1], pdwArray[i+2]); 35294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (pdwArray[i] == 0x318) 35394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pdwArray[i+2] = 0x00000800; 354547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, pdwArray[i], pdwArray[i+1], 355547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger pdwArray[i+2]); 35694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 35794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 35894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 35994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 36094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 361547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phyConfigBB(struct net_device *dev, u8 ConfigType) 36294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 36394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int i; 364547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 *Rtl819XPHY_REGArray_Table = NULL; 365547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 *Rtl819XAGCTAB_Array_Table = NULL; 366547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u16 AGCTAB_ArrayLen, PHY_REGArrayLen = 0; 36794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 368547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 369547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger AGCTAB_ArrayLen = AGCTAB_ArrayLength; 370547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array; 371547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_type == RF_2T4R) { 372547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger PHY_REGArrayLen = PHY_REGArrayLength; 373547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArray; 374547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (priv->rf_type == RF_1T2R) { 375547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger PHY_REGArrayLen = PHY_REG_1T2RArrayLength; 376547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArray; 37794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 37894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 379547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (ConfigType == BaseBand_Config_PHY_REG) { 380547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < PHY_REGArrayLen; i += 2) { 381547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table[i], 382547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 383547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XPHY_REGArray_Table[i+1]); 384547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_DBG, "i: %x, The Rtl819xUsbPHY_REGArray" 385547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "[0] is %x Rtl819xUsbPHY_REGArray[1] is %x\n", 386547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger i, Rtl819XPHY_REGArray_Table[i], 387547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XPHY_REGArray_Table[i+1]); 38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 389547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (ConfigType == BaseBand_Config_AGC_TAB) { 390547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < AGCTAB_ArrayLen; i += 2) { 391547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, Rtl819XAGCTAB_Array_Table[i], 392547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord, 393547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XAGCTAB_Array_Table[i+1]); 394547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_DBG, "i:%x, The rtl819XAGCTAB_Array[0] " 395547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "is %x rtl819XAGCTAB_Array[1] is %x\n", i, 396547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XAGCTAB_Array_Table[i], 397547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XAGCTAB_Array_Table[i+1]); 39894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 39994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 40194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 402547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 40349aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic void rtl8192_InitBBRFRegDef(struct net_device *dev) 40494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 406547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; 40894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; 40994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW; 41094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW; 41194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB; 41394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB; 41494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB; 41594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB; 41694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 41794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; 41894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; 41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE; 42094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE; 42194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 42294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; 42394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; 42494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE; 42594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE; 42694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 42794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; 42894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter; 42994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter; 43094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter; 43194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 43294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter; 43394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter; 43494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter; 43594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter; 43694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 43794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage; 43894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage; 43994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage; 44094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage; 44194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 44294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1; 44394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1; 44494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1; 44594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1; 44694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 44794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; 44894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; 44994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2; 45094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2; 45194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 45294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl; 45394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl; 45494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl; 45594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl; 45694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 45794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1; 45894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1; 45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1; 46094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1; 46194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 46294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2; 46394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2; 46494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2; 46594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2; 46694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 46794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance; 46894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance; 46994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance; 47094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance; 47194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 47294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE; 47394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE; 47494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE; 47594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE; 47694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 47794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance; 47894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance; 47994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance; 48094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance; 48194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 48294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE; 48394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE; 48494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE; 48594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE; 48694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack; 48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack; 48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack; 49094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack; 49194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 49294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 493547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 494547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerbool rtl8192_phy_checkBBAndRF(struct net_device *dev, 495547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum hw90_block CheckBlock, 496547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath) 49794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 49894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool ret = true; 49994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 i, CheckTimes = 4, dwRegRead = 0; 50094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 WriteAddr[4]; 50194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f}; 502547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 50394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger WriteAddr[HW90_BLOCK_MAC] = 0x100; 50494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger WriteAddr[HW90_BLOCK_PHY0] = 0x900; 50594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger WriteAddr[HW90_BLOCK_PHY1] = 0x800; 50694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger WriteAddr[HW90_BLOCK_RF] = 0x3; 507547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__, 508547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CheckBlock); 509547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < CheckTimes; i++) { 510547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (CheckBlock) { 51194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case HW90_BLOCK_MAC: 512547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "PHY_CheckBBRFOK(): Never Write " 513547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "0x100 here!"); 51494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 51594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 51694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case HW90_BLOCK_PHY0: 51794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case HW90_BLOCK_PHY1: 518547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, WriteAddr[CheckBlock], 519547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger WriteData[i]); 52094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwRegRead = read_nic_dword(dev, WriteAddr[CheckBlock]); 52194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 52294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 52394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case HW90_BLOCK_RF: 52494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger WriteData[i] &= 0xfff; 525547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, eRFPath, 526547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger WriteAddr[HW90_BLOCK_RF], 527547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMask12Bits, WriteData[i]); 52894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger mdelay(10); 529547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dwRegRead = rtl8192_phy_QueryRFReg(dev, eRFPath, 530547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger WriteAddr[HW90_BLOCK_RF], 531547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMaskDWord); 53294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger mdelay(10); 53394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 53494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 53594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 53694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = false; 53794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 53894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 53994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 54094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 541547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (dwRegRead != WriteData[i]) { 542547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "====>error=====dwRegRead: %x, " 543547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "WriteData: %x\n", dwRegRead, WriteData[i]); 54494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ret = false; 54594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 54694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 54794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 54894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 54994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return ret; 55094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 55194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55249aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic bool rtl8192_BB_Config_ParaFile(struct net_device *dev) 55394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 55494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 55594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool rtStatus = true; 55694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 bRegValue = 0, eCheckItem = 0; 55794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 dwRegValue = 0; 55894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 55994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bRegValue = read_nic_byte(dev, BB_GLOBAL_RESET); 560547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, BB_GLOBAL_RESET, (bRegValue|BB_GLOBAL_RESET_BIT)); 56194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 56294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwRegValue = read_nic_dword(dev, CPU_GEN); 56394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST))); 56494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 565547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (eCheckItem = (enum hw90_block)HW90_BLOCK_PHY0; 566547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger eCheckItem <= HW90_BLOCK_PHY1; eCheckItem++) { 567547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtStatus = rtl8192_phy_checkBBAndRF(dev, 568547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (enum hw90_block)eCheckItem, 569547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (enum rf90_radio_path)0); 570547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (rtStatus != true) { 571547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE((COMP_ERR | COMP_PHY), "PHY_RF8256_Config():" 572547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Check PHY%d Fail!!\n", eCheckItem-1); 57394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtStatus; 57494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 57594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 57694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0); 57794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_phyConfigBB(dev, BaseBand_Config_PHY_REG); 57894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 57994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwRegValue = read_nic_dword(dev, CPU_GEN); 58094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_dword(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST)); 58194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 58294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_phyConfigBB(dev, BaseBand_Config_AGC_TAB); 58394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 584547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->IC_Cut > VERSION_8190_BD) { 58594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->rf_type == RF_2T4R) 586547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dwRegValue = (priv->AntennaTxPwDiff[2]<<8 | 587547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->AntennaTxPwDiff[1]<<4 | 588547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->AntennaTxPwDiff[0]); 58994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 59094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwRegValue = 0x0; 59194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_TxGainStage, 59294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue); 59394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 59494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 59594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dwRegValue = priv->CrystalCap; 596547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap92x, 597547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dwRegValue); 59894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 59994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 60094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtStatus; 60194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 602547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerbool rtl8192_BBConfig(struct net_device *dev) 60394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 60494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool rtStatus = true; 605547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 60694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_InitBBRFRegDef(dev); 60794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtStatus = rtl8192_BB_Config_ParaFile(dev); 60894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtStatus; 60994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 61094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 611547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phy_getTxPower(struct net_device *dev) 61294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 61394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 614547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 61594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[0] = 61694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Rate18_06); 61794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[1] = 61894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Rate54_24); 61994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[2] = 62094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Mcs03_Mcs00); 62194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[3] = 62294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Mcs07_Mcs04); 62394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[4] = 62494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Mcs11_Mcs08); 62594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->MCSTxPowerLevelOriginalOffset[5] = 62694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger read_nic_dword(dev, rTxAGC_Mcs15_Mcs12); 62794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 62894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[0] = read_nic_byte(dev, rOFDM0_XAAGCCore1); 62994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[1] = read_nic_byte(dev, rOFDM0_XBAGCCore1); 63094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[2] = read_nic_byte(dev, rOFDM0_XCAGCCore1); 63194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[3] = read_nic_byte(dev, rOFDM0_XDAGCCore1); 632547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_INIT, "Default initial gain (c50=0x%x, c58=0x%x, " 633547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "c60=0x%x, c68=0x%x)\n", 63494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[0], priv->DefaultInitialGain[1], 63594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]); 63694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 63794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->framesync = read_nic_byte(dev, rOFDM0_RxDetector3); 63894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->framesyncC34 = read_nic_dword(dev, rOFDM0_RxDetector2); 639547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x\n", 64094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rOFDM0_RxDetector3, priv->framesync); 64194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->SifsTime = read_nic_word(dev, SIFS); 64294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 64394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 64494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 645547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phy_setTxPower(struct net_device *dev, u8 channel) 64694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 64794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 648547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u8 powerlevel = 0, powerlevelOFDM24G = 0; 64994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger char ant_pwr_diff; 65094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 u4RegValue; 65194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 652547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->epromtype == EEPROM_93C46) { 65394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevel = priv->TxPowerLevelCCK[channel-1]; 65494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1]; 655547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (priv->epromtype == EEPROM_93C56) { 656547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_type == RF_1T2R) { 65794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevel = priv->TxPowerLevelCCK_C[channel-1]; 65894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1]; 659547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (priv->rf_type == RF_2T4R) { 66094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevel = priv->TxPowerLevelCCK_A[channel-1]; 66194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1]; 66294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1] 664547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger - priv->TxPowerLevelOFDM24G_A[channel-1]; 66594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->RF_C_TxPwDiff = ant_pwr_diff; 66794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 66894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger ant_pwr_diff &= 0xf; 66994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 67094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->AntennaTxPwDiff[2] = 0; 67194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->AntennaTxPwDiff[1] = (u8)(ant_pwr_diff); 67294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->AntennaTxPwDiff[0] = 0; 67394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 674547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u4RegValue = (priv->AntennaTxPwDiff[2]<<8 | 675547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->AntennaTxPwDiff[1]<<4 | 676547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->AntennaTxPwDiff[0]); 67794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 67894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_TxGainStage, 67994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue); 68094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 68194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 682cb76215448947ddcc133c4b1c2ff2d4a77e851e0Mike McCormack switch (priv->rf_chip) { 68394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8225: 68494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 68594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8256: 68694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PHY_SetRF8256CCKTxPower(dev, powerlevel); 68794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G); 68894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 68994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8258: 69094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 69194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 692547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "unknown rf chip in funtion %s()\n", 693547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger __func__); 69494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 69594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 69694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 69794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 69894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 699547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerbool rtl8192_phy_RFConfig(struct net_device *dev) 70094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 70194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 70294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool rtStatus = true; 703547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rf_chip) { 704547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8225: 705547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 706547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8256: 707547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtStatus = PHY_RF8256_Config(dev); 708547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 70994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 710547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8258: 711547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 712547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_PSEUDO_11N: 71394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 71494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 715547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 716547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "error chip id\n"); 717547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 71894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 71994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return rtStatus; 72094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 72194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 722547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_phy_updateInitGain(struct net_device *dev) 72394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 72494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 72594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 72694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 727547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingeru8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device *dev, 728547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rf90_radio_path eRFPath) 72994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 73094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 73194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger int i; 73294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 ret = 0; 73394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 734547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (eRFPath) { 735547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF90_PATH_A: 736547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < RadioA_ArrayLength; i += 2) { 737547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Rtl819XRadioA_Array[i] == 0xfe) { 738547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger msleep(100); 739547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 74094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 741547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, eRFPath, 742547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioA_Array[i], 743547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMask12Bits, 744547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioA_Array[i+1]); 74594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 746547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 747547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 748547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF90_PATH_B: 749547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < RadioB_ArrayLength; i += 2) { 750547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Rtl819XRadioB_Array[i] == 0xfe) { 751547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger msleep(100); 752547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 75394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 754547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, eRFPath, 755547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioB_Array[i], 756547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMask12Bits, 757547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioB_Array[i+1]); 75894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 759547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 760547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 761547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF90_PATH_C: 762547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < RadioC_ArrayLength; i += 2) { 763547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Rtl819XRadioC_Array[i] == 0xfe) { 764547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger msleep(100); 765547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 76694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 767547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, eRFPath, 768547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioC_Array[i], 769547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bMask12Bits, 770547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioC_Array[i+1]); 77194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 772547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 773547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 774547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF90_PATH_D: 775547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (i = 0; i < RadioD_ArrayLength; i += 2) { 776547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Rtl819XRadioD_Array[i] == 0xfe) { 777547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger msleep(100); 778547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 77994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 780547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, eRFPath, 781547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioD_Array[i], bMask12Bits, 782547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger Rtl819XRadioD_Array[i+1]); 783547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 784547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 785547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 786547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 787547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 78894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 78994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 790547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return ret; 79194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 79294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 79349aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic void rtl8192_SetTxPowerLevel(struct net_device *dev, u8 channel) 79494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 79594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 79694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 powerlevel = priv->TxPowerLevelCCK[channel-1]; 79794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1]; 79894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 799547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rf_chip) { 80094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8225: 80194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 80294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 80394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8256: 80494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PHY_SetRF8256CCKTxPower(dev, powerlevel); 80594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G); 80694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 80794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 80894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8258: 80994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 81094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 811547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "unknown rf chip ID in rtl8192_SetTxPower" 812547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Level()\n"); 81394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 81494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 81594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 81694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 817547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 81849aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic u8 rtl8192_phy_SetSwChnlCmdArray(struct sw_chnl_cmd *CmdTable, 81949aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger u32 CmdTableIdx, u32 CmdTableSz, 82049aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger enum sw_chnl_cmd_id CmdID, 82149aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger u32 Para1, u32 Para2, u32 msDelay) 82294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 823547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger struct sw_chnl_cmd *pCmd; 82494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 825547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (CmdTable == NULL) { 826547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): CmdTable cannot " 827547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "be NULL.\n"); 82894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 82994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 830547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (CmdTableIdx >= CmdTableSz) { 831547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): Access invalid" 832547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " index, please check size of the table, CmdTableIdx:" 833547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "%d, CmdTableSz:%d\n", 83494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CmdTableIdx, CmdTableSz); 83594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 83694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 83794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 83894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pCmd = CmdTable + CmdTableIdx; 83994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pCmd->CmdID = CmdID; 84094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pCmd->Para1 = Para1; 84194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pCmd->Para2 = Para2; 84294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger pCmd->msDelay = msDelay; 84394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 84494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return true; 84594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 846547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 84749aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic u8 rtl8192_phy_SwChnlStepByStep(struct net_device *dev, u8 channel, 84849aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger u8 *stage, u8 *step, u32 *delay) 84994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 85094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 8512eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger struct rtllib_device *ieee = priv->rtllib; 85294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 PreCommonCmdCnt; 85394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 PostCommonCmdCnt; 85494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u32 RfDependCmdCnt; 85551ce231f6a77ffc42677e9dea57c5f1d31240ee3Larry Finger struct sw_chnl_cmd *CurrentCmd = NULL; 85694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 eRFPath; 85794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 858547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n", 859547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger __func__, *stage, *step, channel); 86094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 861976d534118219b04277fb6cfcdb71607b730746dSean MacLennan if (!rtllib_legal_channel(priv->rtllib, channel)) { 862547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "=============>set to illegal channel:%d\n", 863547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger channel); 86494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return true; 86594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 86694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 86794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger { 86894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PreCommonCmdCnt = 0; 8692eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->PreCommonCmd, 8702eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger PreCommonCmdCnt++, 871547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_PRECMD_CNT, CmdID_SetTxPowerLevel, 872547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0, 0, 0); 8732eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->PreCommonCmd, 8742eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger PreCommonCmdCnt++, 875547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_PRECMD_CNT, CmdID_End, 0, 0, 0); 87694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 87794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger PostCommonCmdCnt = 0; 87894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 8792eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->PostCommonCmd, 8802eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger PostCommonCmdCnt++, 881547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_POSTCMD_CNT, CmdID_End, 0, 0, 0); 88294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 88394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RfDependCmdCnt = 0; 884547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rf_chip) { 88594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8225: 886547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!(channel >= 1 && channel <= 14)) { 887547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "illegal channel for Zebra " 888547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "8225: %d\n", channel); 88994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 89094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 8912eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->RfDependCmd, 892547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, 893547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CmdID_RF_WriteReg, rZebra1_Channel, 894547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RF_CHANNEL_TABLE_ZEBRA[channel], 10); 8952eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->RfDependCmd, 896547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, 89794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CmdID_End, 0, 0, 0); 89894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 89994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 90094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8256: 901547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!(channel >= 1 && channel <= 14)) { 902547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "illegal channel for Zebra" 903547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " 8256: %d\n", channel); 90494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 90594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 9062eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->RfDependCmd, 907547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT, 908547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CmdID_RF_WriteReg, rZebra1_Channel, channel, 909547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 10); 9102eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger rtl8192_phy_SetSwChnlCmdArray(ieee->RfDependCmd, 9112eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger 912547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RfDependCmdCnt++, 913547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_RFDEPENDCMD_CNT, 91494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CmdID_End, 0, 0, 0); 91594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 91694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 91794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case RF_8258: 91894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 91994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 92094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 921547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", 922547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->rf_chip); 92394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 92494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 92594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 92694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 92794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 928547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger do { 929547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (*stage) { 93094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case 0: 9312eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger CurrentCmd = &ieee->PreCommonCmd[*step]; 93294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 93394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case 1: 9342eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger CurrentCmd = &ieee->RfDependCmd[*step]; 93594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 93694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case 2: 9372eed3dee92453c1798f0932613b1b66f0763ab2eLarry Finger CurrentCmd = &ieee->PostCommonCmd[*step]; 93894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 93994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 94094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 94152a7fb0951b35840a79a5b162fb853b78cec3c09Larry Finger if (CurrentCmd && CurrentCmd->CmdID == CmdID_End) { 942547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if ((*stage) == 2) { 94394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return true; 944547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 94594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (*stage)++; 946547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (*step) = 0; 94794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger continue; 94894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 94994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 95094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 95152a7fb0951b35840a79a5b162fb853b78cec3c09Larry Finger if (!CurrentCmd) 95252a7fb0951b35840a79a5b162fb853b78cec3c09Larry Finger continue; 953547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (CurrentCmd->CmdID) { 95494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case CmdID_SetTxPowerLevel: 95594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->IC_Cut > (u8)VERSION_8190_BD) 956547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_SetTxPowerLevel(dev, channel); 95794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 95894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case CmdID_WritePortUlong: 959547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, CurrentCmd->Para1, 960547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CurrentCmd->Para2); 96194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 96294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case CmdID_WritePortUshort: 963547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_word(dev, CurrentCmd->Para1, 964547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u16)CurrentCmd->Para2); 96594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 96694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case CmdID_WritePortUchar: 967547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, CurrentCmd->Para1, 968547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u8)CurrentCmd->Para2); 96994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 97094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case CmdID_RF_WriteReg: 971547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (eRFPath = 0; eRFPath < 972547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->NumTotalRFPath; eRFPath++) 973547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_SetRFReg(dev, 974547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (enum rf90_radio_path)eRFPath, 975547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CurrentCmd->Para1, bMask12Bits, 976547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CurrentCmd->Para2<<7); 97794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 97894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 97994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 98094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 98194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 98294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 983547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } while (true); 984547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } /*for (Number of RF paths)*/ 98594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 986547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (*delay) = CurrentCmd->msDelay; 98794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger (*step)++; 98894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 98994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 99094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 99149aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic void rtl8192_phy_FinishSwChnlNow(struct net_device *dev, u8 channel) 99294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 99394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 994547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 delay = 0; 99594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 996547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger while (!rtl8192_phy_SwChnlStepByStep(dev, channel, &priv->SwChnlStage, 997547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger &priv->SwChnlStep, &delay)) { 998547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (delay > 0) 99994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger msleep(delay); 100094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (IS_NIC_DOWN(priv)) 1001547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 100294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 100394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 100494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SwChnl_WorkItem(struct net_device *dev) 100594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 100694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 100794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 100894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 100994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n"); 101094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1011547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__, 1012547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->chan, priv); 101394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 101494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_phy_FinishSwChnlNow(dev , priv->chan); 101594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 101694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n"); 101794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 101894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1019547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingeru8 rtl8192_phy_SwChnl(struct net_device *dev, u8 channel) 102094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 102194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 102294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_PHY, "=====>%s()\n", __func__); 1023547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (IS_NIC_DOWN(priv)) { 1024547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "%s(): ERR !! driver is not up\n", __func__); 102594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 102694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 102794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->SwChnlInProgress) 102894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 102994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 103094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1031547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rtllib->mode) { 103294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case WIRELESS_MODE_A: 103394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case WIRELESS_MODE_N_5G: 1034547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (channel <= 14) { 103594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_ERR, "WIRELESS_MODE_A but channel<=14"); 103694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 103794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 103894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 103994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case WIRELESS_MODE_B: 1040547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (channel > 14) { 104194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_ERR, "WIRELESS_MODE_B but channel>14"); 104294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 104394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 104494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 104594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case WIRELESS_MODE_G: 104694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger case WIRELESS_MODE_N_24G: 1047547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (channel > 14) { 104894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_ERR, "WIRELESS_MODE_G but channel>14"); 104994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 105094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 105194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 105294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 105394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 105494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->SwChnlInProgress = true; 105594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (channel == 0) 105694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger channel = 1; 105794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1058547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->chan = channel; 105994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1060547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SwChnlStage = 0; 1061547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SwChnlStep = 0; 106294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1063547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!IS_NIC_DOWN(priv)) 106494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_SwChnl_WorkItem(dev); 106594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->SwChnlInProgress = false; 106694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return true; 106794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 106894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1069547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerstatic void CCK_Tx_Power_Track_BW_Switch_TSSI(struct net_device *dev) 107094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 107194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 107294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1073547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->CurrentChannelBW) { 1074547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20: 1075547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation = 1076547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation_20Mdefault + 1077547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation_difference; 107894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1079547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->CCKPresentAttentuation > 1080547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (CCKTxBBGainTableLength-1)) 1081547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation = 1082547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CCKTxBBGainTableLength-1; 1083547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->CCKPresentAttentuation < 0) 1084547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation = 0; 1085547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1086547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER_TRACKING, "20M, priv->CCKPresent" 1087547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Attentuation = %d\n", 1088547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation); 1089547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1090547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rtllib->current_network.channel == 14 && 1091547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger !priv->bcck_in_ch14) { 1092547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bcck_in_ch14 = true; 1093547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1094547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (priv->rtllib->current_network.channel != 1095547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 14 && priv->bcck_in_ch14) { 1096547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bcck_in_ch14 = false; 1097547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1098547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1099547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1100547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 110194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 110294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1103547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20_40: 1104547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation = 1105547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation_40Mdefault + 1106547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation_difference; 1107547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1108547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER_TRACKING, "40M, priv->CCKPresent" 1109547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Attentuation = %d\n", 1110547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation); 1111547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->CCKPresentAttentuation > 1112547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (CCKTxBBGainTableLength - 1)) 111394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->CCKPresentAttentuation = 1114547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CCKTxBBGainTableLength-1; 1115547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->CCKPresentAttentuation < 0) 1116547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCKPresentAttentuation = 0; 1117547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1118547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rtllib->current_network.channel == 14 && 1119547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger !priv->bcck_in_ch14) { 1120547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bcck_in_ch14 = true; 1121547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1122547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (priv->rtllib->current_network.channel != 14 1123547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger && priv->bcck_in_ch14) { 1124547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bcck_in_ch14 = false; 1125547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1126547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1127547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 1128547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 112994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 113094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 113194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 113294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 113394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void CCK_Tx_Power_Track_BW_Switch_ThermalMeter(struct net_device *dev) 113494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 113594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 113694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1137547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rtllib->current_network.channel == 14 && 1138547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger !priv->bcck_in_ch14) 113994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->bcck_in_ch14 = true; 1140547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger else if (priv->rtllib->current_network.channel != 14 && 1141547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bcck_in_ch14) 114294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->bcck_in_ch14 = false; 114394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1144547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->CurrentChannelBW) { 1145547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20: 1146547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->Record_CCK_20Mindex == 0) 1147547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->Record_CCK_20Mindex = 6; 1148547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCK_index = priv->Record_CCK_20Mindex; 1149547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER_TRACKING, "20MHz, CCK_Tx_Power_Track_BW_" 1150547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Switch_ThermalMeter(),CCK_index = %d\n", 1151547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCK_index); 1152547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1153547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1154547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20_40: 1155547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCK_index = priv->Record_CCK_40Mindex; 1156547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER_TRACKING, "40MHz, CCK_Tx_Power_Track_BW_" 1157547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Switch_ThermalMeter(), CCK_index = %d\n", 1158547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->CCK_index); 1159547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 116094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 116194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger dm_cck_txpower_adjust(dev, priv->bcck_in_ch14); 116294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 116394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 116494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void CCK_Tx_Power_Track_BW_Switch(struct net_device *dev) 116594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 116694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 116794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 116894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->IC_Cut >= IC_VersionCut_D) 116994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CCK_Tx_Power_Track_BW_Switch_TSSI(dev); 117094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 117194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger CCK_Tx_Power_Track_BW_Switch_ThermalMeter(dev); 117294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 117394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SetBWModeWorkItem(struct net_device *dev) 117594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 117694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 117794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 117894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 regBwOpMode; 117994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1180547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SWBW, "==>rtl8192_SetBWModeWorkItem() Switch to %s " 1181547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "bandwidth\n", priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ? 1182547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "20MHz" : "40MHz") 118394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 118494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1185547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rf_chip == RF_PSEUDO_11N) { 1186547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SetBWModeInProgress = false; 118794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 118894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 1189547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (IS_NIC_DOWN(priv)) { 1190547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "%s(): ERR!! driver is not up\n", __func__); 119194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 119294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 119394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger regBwOpMode = read_nic_byte(dev, BW_OPMODE); 119494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1195547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->CurrentChannelBW) { 1196547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20: 1197547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger regBwOpMode |= BW_OPMODE_20MHZ; 1198547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, BW_OPMODE, regBwOpMode); 1199547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 120094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1201547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20_40: 1202547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger regBwOpMode &= ~BW_OPMODE_20MHZ; 1203547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, BW_OPMODE, regBwOpMode); 1204547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 120594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1206547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1207547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown " 1208547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Bandwidth: %#X\n", priv->CurrentChannelBW); 1209547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 121094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 121194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1212547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->CurrentChannelBW) { 1213547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20: 1214547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0); 1215547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0); 1216547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1217547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!priv->btxpower_tracking) { 1218547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000); 1219547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317); 1220547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_DebugPort, 0x00000204); 1221547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1222547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CCK_Tx_Power_Track_BW_Switch(dev); 1223547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 122494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1225547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1); 122694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1227547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1228547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case HT_CHANNEL_WIDTH_20_40: 1229547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1); 1230547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1); 1231547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1232547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!priv->btxpower_tracking) { 1233547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_TxFilter1, 0x35360000); 1234547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_TxFilter2, 0x121c252e); 1235547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_dword(dev, rCCK0_DebugPort, 0x00000409); 1236547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1237547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger CCK_Tx_Power_Track_BW_Switch(dev); 1238547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 123994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1240547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, 1241547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (priv->nCur40MhzPrimeSC>>1)); 1242547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, 1243547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->nCur40MhzPrimeSC); 124494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1245547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0); 1246547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1247547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1248547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown " 1249547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Bandwidth: %#X\n", priv->CurrentChannelBW); 1250547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 125194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 125294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 125394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1254547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rf_chip) { 1255547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8225: 1256547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 125794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1258547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8256: 1259547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW); 1260547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 126194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1262547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8258: 1263547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 126494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1265547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_PSEUDO_11N: 1266547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 126794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1268547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1269547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip); 1270547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 127194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 12724f6807e8d2e972393009830d305ecec2d80c0449Mike McCormack 127394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger atomic_dec(&(priv->rtllib->atm_swbw)); 1274547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SetBWModeInProgress = false; 127594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 127694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()"); 127794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 127894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1279547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid rtl8192_SetBWMode(struct net_device *dev, enum ht_channel_width Bandwidth, 1280547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum ht_extchnl_offset Offset) 128194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 128294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 128394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 128494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 128594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->SetBWModeInProgress) 128694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return; 128794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1288547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger atomic_inc(&(priv->rtllib->atm_swbw)); 1289547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SetBWModeInProgress = true; 129094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 129194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->CurrentChannelBW = Bandwidth; 129294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1293547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (Offset == HT_EXTCHNL_OFFSET_LOWER) 129494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER; 1295547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger else if (Offset == HT_EXTCHNL_OFFSET_UPPER) 129694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER; 129794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger else 129894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE; 129994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 130094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_SetBWModeWorkItem(dev); 130194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 130294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 130394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 130494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid InitialGain819xPci(struct net_device *dev, u8 Operation) 130594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 130694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define SCAN_RX_INITIAL_GAIN 0x17 130794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define POWER_DETECTION_TH 0x08 130894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 1309547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 BitMask; 1310547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u8 initial_gain; 1311547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1312547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (!IS_NIC_DOWN(priv)) { 1313547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (Operation) { 1314547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case IG_Backup: 1315547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "IG_Backup, backup the initial" 1316547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " gain.\n"); 1317547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger initial_gain = SCAN_RX_INITIAL_GAIN; 1318547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask = bMaskByte0; 1319547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (dm_digtable.dig_algorithm == 1320547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger DIG_ALGO_BY_FALSE_ALARM) 1321547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); 1322547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->initgain_backup.xaagccore1 = 1323547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, 1324547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask); 1325547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->initgain_backup.xbagccore1 = 1326547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, 1327547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask); 1328547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->initgain_backup.xcagccore1 = 1329547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, 1330547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask); 1331547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->initgain_backup.xdagccore1 = 1332547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, 1333547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask); 1334547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask = bMaskByte2; 1335547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->initgain_backup.cca = (u8)rtl8192_QueryBBReg(dev, 1336547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rCCK0_CCA, BitMask); 1337547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1338547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc50 is" 1339547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %x\n", priv->initgain_backup.xaagccore1); 1340547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc58 is" 1341547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %x\n", priv->initgain_backup.xbagccore1); 1342547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc60 is" 1343547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %x\n", priv->initgain_backup.xcagccore1); 1344547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc68 is" 1345547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %x\n", priv->initgain_backup.xdagccore1); 1346547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xa0a is" 1347547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %x\n", priv->initgain_backup.cca); 1348547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1349547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x\n", 1350547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger initial_gain); 1351547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain); 1352547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain); 1353547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain); 1354547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain); 1355547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x\n", 1356547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger POWER_DETECTION_TH); 1357547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger write_nic_byte(dev, 0xa0a, POWER_DETECTION_TH); 1358547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1359547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case IG_Restore: 1360547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "IG_Restore, restore the initial " 1361547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "gain.\n"); 1362547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask = 0x7f; 1363547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (dm_digtable.dig_algorithm == 1364547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger DIG_ALGO_BY_FALSE_ALARM) 1365547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8); 1366547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1367547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask, 1368547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u32)priv->initgain_backup.xaagccore1); 1369547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask, 1370547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u32)priv->initgain_backup.xbagccore1); 1371547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask, 1372547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u32)priv->initgain_backup.xcagccore1); 1373547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask, 1374547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u32)priv->initgain_backup.xdagccore1); 1375547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BitMask = bMaskByte2; 1376547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rCCK0_CCA, BitMask, 1377547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (u32)priv->initgain_backup.cca); 1378547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1379547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc50" 1380547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " is %x\n", priv->initgain_backup.xaagccore1); 1381547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc58" 1382547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " is %x\n", priv->initgain_backup.xbagccore1); 1383547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc60" 1384547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " is %x\n", priv->initgain_backup.xcagccore1); 1385547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc68" 1386547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " is %x\n", priv->initgain_backup.xdagccore1); 1387547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xa0a" 1388547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " is %x\n", priv->initgain_backup.cca); 1389547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1390547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_phy_setTxPower(dev, 1391547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->rtllib->current_network.channel); 1392547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1393547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (dm_digtable.dig_algorithm == 1394547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger DIG_ALGO_BY_FALSE_ALARM) 1395547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1); 1396547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1397547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1398547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Unknown IG Operation.\n"); 1399547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 140094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 140194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 140294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 140394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1404547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingervoid PHY_SetRtl8192eRfOff(struct net_device *dev) 140594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 140694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 140794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0); 140894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x0); 140994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x0); 141094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0); 141194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0); 141294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x0); 141394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x0); 141494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_byte(dev, ANAPAR_FOR_8192PciE, 0x07); 141594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 141694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 141794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 141849aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingerstatic bool SetRFPowerState8190(struct net_device *dev, 141949aab5fd9df153a73992afa7cc386661d759c8e3Larry Finger enum rt_rf_power_state eRFPowerState) 142094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 142194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 1422547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger struct rt_pwr_save_ctrl *pPSC = (struct rt_pwr_save_ctrl *) 1423547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (&(priv->rtllib->PowerSaveControl)); 142494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool bResult = true; 142594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger u8 i = 0, QueueID = 0; 142694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct rtl8192_tx_ring *ring = NULL; 142794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 142894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->SetRFPowerStateInProgress == true) 142994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return false; 143094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger RT_TRACE(COMP_PS, "===========> SetRFPowerState8190()!\n"); 143194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->SetRFPowerStateInProgress = true; 143294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1433547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (priv->rf_chip) { 1434547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case RF_8256: 1435547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger switch (eRFPowerState) { 1436547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case eRfOn: 1437547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOn!\n"); 1438547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if ((priv->rtllib->eRFPowerState == eRfOff) && 1439547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) { 1440547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bool rtstatus = true; 1441547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger u32 InitilizeCount = 3; 1442547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger do { 1443547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger InitilizeCount--; 1444547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->RegRfOff = false; 1445547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtstatus = NicIFEnableNIC(dev); 1446547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } while ((rtstatus != true) && 1447547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (InitilizeCount > 0)); 1448547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1449547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (rtstatus != true) { 1450547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "%s():Initialize Ada" 1451547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "pter fail,return\n", 1452547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger __func__); 1453547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->SetRFPowerStateInProgress = false; 1454547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger return false; 1455547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 1456547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1457547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_CLEAR_PS_LEVEL(pPSC, 1458547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_RF_OFF_LEVL_HALT_NIC); 1459547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 146094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger write_nic_byte(dev, ANAPAR, 0x37); 146194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger mdelay(1); 1462547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 1463547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x4, 0x1); 146494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->bHwRfOffAction = 0; 146594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1466547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, 1467547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger BIT4, 0x1); 1468547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 1469547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x300, 0x3); 1470547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 1471547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x18, 0x3); 1472547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x3, 1473547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x3); 1474547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x3, 1475547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x3); 1476547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 1477547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 0x60, 0x3); 147894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1479547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 148094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1481547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1482547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1483547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case eRfSleep: 1484547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (priv->rtllib->eRFPowerState == eRfOff) 1485547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 148694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 148794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1488547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) { 1489547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger ring = &priv->tx_ring[QueueID]; 149094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1491547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (skb_queue_len(&ring->queue) == 0) { 1492547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger QueueID++; 1493547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 1494547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1495547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE((COMP_POWER|COMP_RF), "eRf Off" 1496547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "/Sleep: %d times TcbBusyQueue" 1497547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "[%d] !=0 before doze!\n", 1498547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger (i+1), QueueID); 1499547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger udelay(10); 1500547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger i++; 150194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 150294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1503547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (i >= MAX_DOZE_WAITING_TIMES_9x) { 1504547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER, "\n\n\n TimeOut!! " 1505547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "SetRFPowerState8190(): eRfOff" 1506547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger ": %d times TcbBusyQueue[%d] " 1507547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "!= 0 !!!\n", 1508547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_DOZE_WAITING_TIMES_9x, 1509547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger QueueID); 1510547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 151194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 151294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 1513547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger PHY_SetRtl8192eRfOff(dev); 1514547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1515547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1516547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case eRfOff: 1517547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOff/" 1518547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "Sleep !\n"); 1519547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1520547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) { 1521547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger ring = &priv->tx_ring[QueueID]; 1522547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1523547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (skb_queue_len(&ring->queue) == 0) { 1524547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger QueueID++; 1525547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger continue; 1526547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else { 1527547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER, "eRf Off/Sleep: %d" 1528547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " times TcbBusyQueue[%d] !=0 b" 1529547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "efore doze!\n", (i+1), 1530547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger QueueID); 1531547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger udelay(10); 1532547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger i++; 153394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 153494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1535547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (i >= MAX_DOZE_WAITING_TIMES_9x) { 1536547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_POWER, "\n\n\n SetZebra: " 1537547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "RFPowerState8185B(): eRfOff:" 1538547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " %d times TcbBusyQueue[%d] " 1539547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "!= 0 !!!\n", 1540547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger MAX_DOZE_WAITING_TIMES_9x, 1541547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger QueueID); 154294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 1543547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 1544547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 154594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1546547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC && 1547547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC)) { 1548547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger NicIFDisableNIC(dev); 1549547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC); 1550547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } else if (!(pPSC->RegRfPsLevel & 1551547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_RF_OFF_LEVL_HALT_NIC)) { 1552547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger PHY_SetRtl8192eRfOff(dev); 1553547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 155494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1555547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 155694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 155794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger default: 1558547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bResult = false; 1559547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "SetRFPowerState8190(): unknow state" 1560547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger " to set: 0x%X!!!\n", eRFPowerState); 156194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 1562547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger } 1563547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1564547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 1565547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger 1566547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1567547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n"); 1568547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 156994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 157094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 157194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (bResult) { 157294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->rtllib->eRFPowerState = eRFPowerState; 157394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1574d064307a1a67c564caf69e1555d1aa62662217fbLarry Finger switch (priv->rf_chip) { 1575d064307a1a67c564caf69e1555d1aa62662217fbLarry Finger case RF_8256: 157694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger break; 157794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1578d064307a1a67c564caf69e1555d1aa62662217fbLarry Finger default: 1579547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown " 1580547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "RF type\n"); 1581d064307a1a67c564caf69e1555d1aa62662217fbLarry Finger break; 158294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 158394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 158494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 158594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger priv->SetRFPowerStateInProgress = false; 1586547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "<=========== SetRFPowerState8190() bResult = %d!\n", 1587547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bResult); 158894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return bResult; 158994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 159094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1591547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Fingerbool SetRFPowerState(struct net_device *dev, 1592547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger enum rt_rf_power_state eRFPowerState) 159394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 159494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 159594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 159694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bool bResult = false; 159794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1598547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "---------> SetRFPowerState(): eRFPowerState(%d)\n", 1599547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger eRFPowerState); 1600547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger if (eRFPowerState == priv->rtllib->eRFPowerState && 1601547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->bHwRfOffAction == 0) { 1602547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): discard the " 1603547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger "request for eRFPowerState(%d) is the same.\n", 1604547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger eRFPowerState); 160594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return bResult; 160694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 160794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 160894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger bResult = SetRFPowerState8190(dev, eRFPowerState); 160994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1610547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): bResult(%d)\n", 1611547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger bResult); 161294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 161394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger return bResult; 161494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 161594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 161649aab5fd9df153a73992afa7cc386661d759c8e3Larry Fingervoid PHY_ScanOperationBackup8192(struct net_device *dev, u8 Operation) 161794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{ 161894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger struct r8192_priv *priv = rtllib_priv(dev); 161994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 162094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger if (priv->up) { 162194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger switch (Operation) { 1622547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case SCAN_OPT_BACKUP: 1623547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->rtllib->InitialGainHandler(dev, IG_Backup); 1624547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 162594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1626547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger case SCAN_OPT_RESTORE: 1627547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger priv->rtllib->InitialGainHandler(dev, IG_Restore); 1628547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 162994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 1630547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger default: 1631547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation.\n"); 1632547d0c34b71b1ced82d9652c78143bbcbe08ccdfLarry Finger break; 163394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 163494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger } 163594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger 163694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger} 1637