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