r8192E_phy.c revision 94a799425eee8225a1e3fbe5f473d2ef04002577
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#if (defined(RTL8192E) || defined(RTL8190P))
2094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
2194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
2294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_core.h"
2394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_hw.h"
2494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_phyreg.h"
2594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8190P_rtl8256.h"
2694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_phy.h"
2794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "rtl_dm.h"
2894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef ENABLE_DOT11D
2994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "dot11d.h"
3094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
3194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
3394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8190P_hwimg.h"
3494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
3594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
3694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8192E
3794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#include "r8192E_hwimg.h"
3894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
3994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
4094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic u32 RF_CHANNEL_TABLE_ZEBRA[] = {
4194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0,
4294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x085c,
4394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x08dc,
4494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x095c,
4594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x09dc,
4694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0a5c,
4794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0adc,
4894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0b5c,
4994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0bdc,
5094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0c5c,
5194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0cdc,
5294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0d5c,
5394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0ddc,
5494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0e5c,
5594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	0x0f72,
5694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger};
5794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
5894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger/*************************Define local function prototype**********************/
5994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
6094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic u32 phy_FwRFSerialRead(struct net_device* dev,RF90_RADIO_PATH_E	eRFPath,u32 Offset);
6194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void phy_FwRFSerialWrite(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 Offset,u32	Data);
6294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru32 rtl8192_CalculateBitShift(u32 dwBitMask)
6394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
6494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 i;
6594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	for (i=0; i<=31; i++)
6694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
6794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (((dwBitMask>>i)&0x1) == 1)
6894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
6994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
7094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return i;
7194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
7294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru8 rtl8192_phy_CheckIsLegalRFPath(struct net_device* dev, u32 eRFPath)
7394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
7494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 ret = 1;
7594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
7694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
7794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_type == RF_2T4R)
7894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
7994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		ret= 1;
8094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
8194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (priv->rf_type == RF_1T2R)
8294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
8394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
8494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret = 0;
8594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
8694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret =  1;
8794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
8894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
8994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
9094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_type == RF_2T4R)
9194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		ret = 0;
9294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (priv->rf_type == RF_1T2R)
9394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
9494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
9594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret = 1;
9694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
9794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret = 0;
9894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
9994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
10094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
10194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return ret;
10294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
10394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_setBBreg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask, u32 dwData)
10494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
10594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
10694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 OriginalValue, BitShift, NewValue;
10794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
10894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (dwBitMask!= bMaskDWord)
10994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
11094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		OriginalValue = read_nic_dword(dev, dwRegAddr);
11194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		BitShift = rtl8192_CalculateBitShift(dwBitMask);
11294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		NewValue = (((OriginalValue) & (~dwBitMask)) | (dwData << BitShift));
11394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		write_nic_dword(dev, dwRegAddr, NewValue);
11494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}else
11594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		write_nic_dword(dev, dwRegAddr, dwData);
11694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
11794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
11894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru32 rtl8192_QueryBBReg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask)
11994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
12094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 Ret = 0, OriginalValue, BitShift;
12194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
12294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	OriginalValue = read_nic_dword(dev, dwRegAddr);
12394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	BitShift = rtl8192_CalculateBitShift(dwBitMask);
12494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Ret = (OriginalValue & dwBitMask) >> BitShift;
12594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
12694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return (Ret);
12794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
12894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru32 rtl8192_phy_RFSerialRead(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 Offset)
12994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
13094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
13194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 ret = 0;
13294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 NewOffset = 0;
13394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	BB_REGISTER_DEFINITION_T* pPhyReg = &priv->PHYRegDef[eRFPath];
13494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Offset &= 0x3f;
13594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
13694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_chip == RF_8256)
13794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
13894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
13994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
14094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
14194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
14294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
14394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
14494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
14594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (Offset >= 31)
14694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
14794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] |= 0x140;
14894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16) );
14994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset -30;
15094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
15194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (Offset >= 16)
15294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
15394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] |= 0x100;
15494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] &= (~0x40);
15594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16) );
15694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
15794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset - 15;
15894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
15994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
16094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset;
16194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
16294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
16394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
16494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be 8256\n");
16594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		NewOffset = Offset;
16694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
16794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadAddress, NewOffset);
16894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2,  bLSSIReadEdge, 0x0);
16994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2,  bLSSIReadEdge, 0x1);
17094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	msleep(1);
17394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	ret = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);
17594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
17794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_chip == RF_8256)
17894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
17994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->RfReg0Value[eRFPath] &= 0xebf;
18094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
18194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(
18294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			dev,
18394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			pPhyReg->rf3wireOffset,
18494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			bMaskDWord,
18594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			(priv->RfReg0Value[eRFPath] << 16));
18694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
18794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
18894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->rf_type == RF_2T4R)
18994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
19094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
19194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
19294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (priv->rf_type == RF_1T2R)
19394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
19494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
19594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
19694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
19794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
19894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
19994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
20094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
20194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
20294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
20394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
20494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return ret;
20594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
20694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
20794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
20894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_RFSerialWrite(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 Offset, u32 Data)
20994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
21094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
21194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 DataAndAddr = 0, NewOffset = 0;
21294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	BB_REGISTER_DEFINITION_T	*pPhyReg = &priv->PHYRegDef[eRFPath];
21394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
21494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Offset &= 0x3f;
21594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_chip == RF_8256)
21694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
21794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
21894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
21994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
22094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
22194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
22294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
22394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
22494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
22594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
22694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (Offset >= 31)
22794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
22894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] |= 0x140;
22994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath] << 16));
23094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset - 30;
23194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
23294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (Offset >= 16)
23394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
23494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] |= 0x100;
23594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] &= (~0x40);
23694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16));
23794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset - 15;
23894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
23994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
24094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			NewOffset = Offset;
24194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
24294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
24394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
24494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be 8256\n");
24594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		NewOffset = Offset;
24694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
24794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
24894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	DataAndAddr = (Data<<16) | (NewOffset&0x3f);
24994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
25094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
25194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
25294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
25394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (Offset==0x0)
25494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->RfReg0Value[eRFPath] = Data;
25594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
25694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_chip == RF_8256)
25794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
25894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (Offset != 0)
25994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
26094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RfReg0Value[eRFPath] &= 0xebf;
26194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(
26294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dev,
26394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pPhyReg->rf3wireOffset,
26494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				bMaskDWord,
26594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				(priv->RfReg0Value[eRFPath] << 16));
26694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
26794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
26894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->rf_type == RF_2T4R)
26994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
27094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
27194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
27294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (priv->rf_type == RF_1T2R)
27394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
27494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
27594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
27694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
27794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
27894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
27994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
28094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
28194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
28294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
28394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
28494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
28594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
28694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_SetRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
28794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
28894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
28994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 Original_Value, BitShift, New_Value;
29094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
29194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
29294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
29394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8192E
29494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
29594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
29694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
29794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
29894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n");
29994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->Rf_Mode == RF_OP_By_FW)
30094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
30194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (BitMask != bMask12Bits)
30294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
30394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
30494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			BitShift =  rtl8192_CalculateBitShift(BitMask);
30594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
30694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
30794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			phy_FwRFSerialWrite(dev, eRFPath, RegAddr, New_Value);
30894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}else
30994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			phy_FwRFSerialWrite(dev, eRFPath, RegAddr, Data);
31094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		udelay(200);
31194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
31294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
31394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
31494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
31594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (BitMask != bMask12Bits)
31694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	        {
31794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, RegAddr);
31894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			BitShift =  rtl8192_CalculateBitShift(BitMask);
31994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
32094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
32194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, New_Value);
32294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	        }else
32394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, Data);
32494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
32594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
32694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
32794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
32894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru32 rtl8192_phy_QueryRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask)
32994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
33094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 Original_Value, Readback_Value, BitShift;
33194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
33294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
33394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return 0;
33494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8192E
33594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
33694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return	0;
33794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
33894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	down(&priv->rf_sem);
33994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->Rf_Mode == RF_OP_By_FW)
34094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
34194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
34294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		udelay(200);
34394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
34494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
34594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
34694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, RegAddr);
34794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
34894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
34994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	BitShift =  rtl8192_CalculateBitShift(BitMask);
35094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Readback_Value = (Original_Value & BitMask) >> BitShift;
35194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	up(&priv->rf_sem);
35294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return (Readback_Value);
35394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
35494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
35594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic u32 phy_FwRFSerialRead(
35694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct net_device* dev,
35794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RF90_RADIO_PATH_E	eRFPath,
35894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32				Offset	)
35994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
36094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32		retValue = 0;
36194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32		Data = 0;
36294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8		time = 0;
36394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= ((Offset&0xFF)<<12);
36494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= ((eRFPath&0x3)<<20);
36594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= 0x80000000;
36694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	while (read_nic_dword(dev, QPNR)&0x80000000)
36794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
36894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (time++ < 100)
36994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
37094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			udelay(10);
37194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
37294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
37394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
37494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
37594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_dword(dev, QPNR, Data);
37694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	while (read_nic_dword(dev, QPNR)&0x80000000)
37794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
37894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (time++ < 100)
37994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
38094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			udelay(10);
38194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
38294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
38394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return	(0);
38494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
38594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	retValue = read_nic_dword(dev, RF_DATA);
38694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
38794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return	(retValue);
38894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
38994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}	/* phy_FwRFSerialRead */
39094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
39194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void
39294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerphy_FwRFSerialWrite(
39394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		struct net_device* dev,
39494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RF90_RADIO_PATH_E	eRFPath,
39594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		u32				Offset,
39694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		u32				Data	)
39794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
39894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	time = 0;
39994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
40094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
40194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= ((Offset&0xFF)<<12);
40294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= ((eRFPath&0x3)<<20);
40394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= 0x400000;
40494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	Data |= 0x80000000;
40594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
40694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	while (read_nic_dword(dev, QPNR)&0x80000000)
40794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
40894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (time++ < 100)
40994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
41094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			udelay(10);
41194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
41294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
41394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
41494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
41594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_dword(dev, QPNR, Data);
41694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
41794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}	/* phy_FwRFSerialWrite */
41894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
41994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
42094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_configmac(struct net_device* dev)
42194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
42294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 dwArrayLen = 0, i = 0;
42394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32* pdwArray = NULL;
42494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
42594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
42694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerif (dev->bInHctTest)
42794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
42894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_PHY, "Rtl819XMACPHY_ArrayDTM\n");
42994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		dwArrayLen = MACPHY_ArrayLengthDTM;
43094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pdwArray = Rtl819XMACPHY_ArrayDTM;
43194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
43294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (priv->bTXPowerDataReadFromEEPORM)
43394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
43494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	 if (priv->bTXPowerDataReadFromEEPORM)
43594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
43694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n");
43794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		dwArrayLen = MACPHY_Array_PGLength;
43894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pdwArray = Rtl819XMACPHY_Array_PG;
43994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
44094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
44194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
44294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
44394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_PHY,"Read rtl819XMACPHY_Array\n");
44494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		dwArrayLen = MACPHY_ArrayLength;
44594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pdwArray = Rtl819XMACPHY_Array;
44694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
44794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	for (i = 0; i<dwArrayLen; i=i+3){
44894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_DBG, "The Rtl8190MACPHY_Array[0] is %x Rtl8190MACPHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n",
44994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
45094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (pdwArray[i] == 0x318)
45194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
45294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			pdwArray[i+2] = 0x00000800;
45394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
45494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
45594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
45694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
45794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
45894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
45994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
46094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phyConfigBB(struct net_device* dev, u8 ConfigType)
46194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
46294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	int i;
46394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32*	Rtl819XPHY_REGArray_Table = NULL;
46494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32*	Rtl819XAGCTAB_Array_Table = NULL;
46594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u16	AGCTAB_ArrayLen, PHY_REGArrayLen = 0;
46694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
46794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
46894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 *rtl8192PhyRegArrayTable = NULL, *rtl8192AgcTabArrayTable = NULL;
46994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (dev->bInHctTest)
47094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
47194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		AGCTAB_ArrayLen = AGCTAB_ArrayLengthDTM;
47294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_ArrayDTM;
47394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
47494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->RF_Type == RF_2T4R)
47594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
47694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_REGArrayLen = PHY_REGArrayLengthDTM;
47794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArrayDTM;
47894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
47994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (priv->RF_Type == RF_1T2R)
48094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
48194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_REGArrayLen = PHY_REG_1T2RArrayLengthDTM;
48294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArrayDTM;
48394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
48494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
48594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
48694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
48794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
48894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		AGCTAB_ArrayLen = AGCTAB_ArrayLength;
48994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array;
49094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->rf_type == RF_2T4R)
49194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
49294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_REGArrayLen = PHY_REGArrayLength;
49394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArray;
49494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
49594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (priv->rf_type == RF_1T2R)
49694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
49794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_REGArrayLen = PHY_REG_1T2RArrayLength;
49894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArray;
49994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
50094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
50194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
50294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (ConfigType == BaseBand_Config_PHY_REG)
50394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
50494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		for (i=0; i<PHY_REGArrayLen; i+=2)
50594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
50694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table[i], bMaskDWord, Rtl819XPHY_REGArray_Table[i+1]);
50794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_DBG, "i: %x, The Rtl819xUsbPHY_REGArray[0] is %x Rtl819xUsbPHY_REGArray[1] is %x \n",i, Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]);
50894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
50994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
51094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (ConfigType == BaseBand_Config_AGC_TAB)
51194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
51294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		for (i=0; i<AGCTAB_ArrayLen; i+=2)
51394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
51494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, Rtl819XAGCTAB_Array_Table[i], bMaskDWord, Rtl819XAGCTAB_Array_Table[i+1]);
51594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_DBG, "i:%x, The rtl819XAGCTAB_Array[0] is %x rtl819XAGCTAB_Array[1] is %x \n",i, Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]);
51694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
51794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
51894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
51994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
52094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
52194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
52294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_InitBBRFRegDef(struct net_device* dev)
52394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
52494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
52594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW;
52694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW;
52794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;
52894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;
52994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
53094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB;
53194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;
53294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;
53394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;
53494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
53594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE;
53694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE;
53794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE;
53894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE;
53994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
54094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE;
54194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE;
54294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE;
54394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE;
54494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
54594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter;
54694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
54794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter;
54894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter;
54994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
55094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter;
55194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
55294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
55394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
55494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
55594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage;
55694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage;
55794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage;
55894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage;
55994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
56094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
56194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
56294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1;
56394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1;
56494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
56594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
56694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
56794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2;
56894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2;
56994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
57094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl;
57194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
57294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
57394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
57494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
57594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
57694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
57794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
57894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
57994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
58094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
58194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
58294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
58394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
58494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
58594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
58694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
58794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
58894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
58994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
59094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
59194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
59294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
59394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
59494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
59594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
59694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
59794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
59894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
59994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
60094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
60194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
60294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
60394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
60494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
60594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
60694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
60794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
60894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
60994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
61094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
61194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool rtl8192_phy_checkBBAndRF(struct net_device* dev, HW90_BLOCK_E CheckBlock, RF90_RADIO_PATH_E eRFPath)
61294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
61394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool ret = true;
61494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 i, CheckTimes = 4, dwRegRead = 0;
61594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 WriteAddr[4];
61694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
61794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	WriteAddr[HW90_BLOCK_MAC] = 0x100;
61894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	WriteAddr[HW90_BLOCK_PHY0] = 0x900;
61994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	WriteAddr[HW90_BLOCK_PHY1] = 0x800;
62094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	WriteAddr[HW90_BLOCK_RF] = 0x3;
62194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__, CheckBlock);
62294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	for (i=0 ; i < CheckTimes ; i++)
62394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
62494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
62594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (CheckBlock)
62694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
62794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HW90_BLOCK_MAC:
62894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "PHY_CheckBBRFOK(): Never Write 0x100 here!");
62994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
63094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
63194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HW90_BLOCK_PHY0:
63294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HW90_BLOCK_PHY1:
63394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			write_nic_dword(dev, WriteAddr[CheckBlock], WriteData[i]);
63494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			dwRegRead = read_nic_dword(dev, WriteAddr[CheckBlock]);
63594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
63694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
63794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HW90_BLOCK_RF:
63894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			WriteData[i] &= 0xfff;
63994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_SetRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bMask12Bits, WriteData[i]);
64094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			mdelay(10);
64194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			dwRegRead = rtl8192_phy_QueryRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord);
64294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			mdelay(10);
64394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
64494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
64594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
64694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret = false;
64794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
64894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
64994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
65094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
65194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (dwRegRead != WriteData[i])
65294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
65394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "====>error=====dwRegRead: %x, WriteData: %x \n", dwRegRead, WriteData[i]);
65494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ret = false;
65594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
65694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
65794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
65894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
65994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return ret;
66094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
66194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
66294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool rtl8192_BB_Config_ParaFile(struct net_device* dev)
66394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
66494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
66594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool rtStatus = true;
66694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 bRegValue = 0, eCheckItem = 0;
66794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32 dwRegValue = 0;
66894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	/**************************************
66994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	**************************************/
67094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
67194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bRegValue = read_nic_byte(dev, BB_GLOBAL_RESET);
67294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_byte(dev, BB_GLOBAL_RESET,(bRegValue|BB_GLOBAL_RESET_BIT));
67394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
67494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	dwRegValue = read_nic_dword(dev, CPU_GEN);
67594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_dword(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST)));
67694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
67794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	for (eCheckItem=(HW90_BLOCK_E)HW90_BLOCK_PHY0; eCheckItem<=HW90_BLOCK_PHY1; eCheckItem++)
67894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
67994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtStatus  = rtl8192_phy_checkBBAndRF(dev, (HW90_BLOCK_E)eCheckItem, (RF90_RADIO_PATH_E)0);
68094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (rtStatus != true)
68194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
68294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE((COMP_ERR | COMP_PHY), "PHY_RF8256_Config():Check PHY%d Fail!!\n", eCheckItem-1);
68394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return rtStatus;
68494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
68594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
68694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0);
68794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_phyConfigBB(dev, BaseBand_Config_PHY_REG);
68894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
68994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	dwRegValue = read_nic_dword(dev, CPU_GEN);
69094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_dword(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST));
69194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
69294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_phyConfigBB(dev, BaseBand_Config_AGC_TAB);
69394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
69494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->IC_Cut  > VERSION_8190_BD)
69594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
69694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->rf_type == RF_2T4R)
69794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
69894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		dwRegValue = (  priv->AntennaTxPwDiff[2]<<8 |
69994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->AntennaTxPwDiff[1]<<4 |
70094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->AntennaTxPwDiff[0]);
70194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
70294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else
70394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			dwRegValue = 0x0;
70494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
70594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			(bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue);
70694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
70794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
70894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
70994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	dwRegValue = priv->CrystalCap & 0x3;
71094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap01, dwRegValue);
71194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	dwRegValue = ((priv->CrystalCap & 0xc)>>2);
71294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, bXtalCap23, dwRegValue);
71394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
71494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
71594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		dwRegValue = priv->CrystalCap;
71694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap92x, dwRegValue);
71794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
71894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
71994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
72094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
72194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
72294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return rtStatus;
72394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
72494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool rtl8192_BBConfig(struct net_device* dev)
72594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
72694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool rtStatus = true;
72794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_InitBBRFRegDef(dev);
72894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtStatus = rtl8192_BB_Config_ParaFile(dev);
72994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return rtStatus;
73094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
73194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
73294a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_getTxPower(struct net_device* dev)
73394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
73494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
73594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
73694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[0] =
73794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, MCS_TXAGC);
73894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[1] =
73994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, (MCS_TXAGC+4));
74094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->CCKTxPowerLevelOriginalOffset =
74194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, CCK_TXAGC);
74294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
74394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
74494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[0] =
74594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Rate18_06);
74694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[1] =
74794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Rate54_24);
74894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[2] =
74994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Mcs03_Mcs00);
75094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[3] =
75194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Mcs07_Mcs04);
75294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[4] =
75394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Mcs11_Mcs08);
75494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->MCSTxPowerLevelOriginalOffset[5] =
75594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		read_nic_dword(dev, rTxAGC_Mcs15_Mcs12);
75694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
75794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
75894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
75994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->DefaultInitialGain[0] = read_nic_byte(dev, rOFDM0_XAAGCCore1);
76094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->DefaultInitialGain[1] = read_nic_byte(dev, rOFDM0_XBAGCCore1);
76194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->DefaultInitialGain[2] = read_nic_byte(dev, rOFDM0_XCAGCCore1);
76294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->DefaultInitialGain[3] = read_nic_byte(dev, rOFDM0_XDAGCCore1);
76394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_INIT, "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n",
76494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
76594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
76694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
76794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->framesync = read_nic_byte(dev, rOFDM0_RxDetector3);
76894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->framesyncC34 = read_nic_dword(dev, rOFDM0_RxDetector2);
76994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x \n",
77094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rOFDM0_RxDetector3, priv->framesync);
77194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SifsTime = read_nic_word(dev, SIFS);
77294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
77394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
77494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
77594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_setTxPower(struct net_device* dev, u8 channel)
77694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
77794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
77894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	powerlevel = 0,powerlevelOFDM24G = 0;
77994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	char ant_pwr_diff;
78094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32	u4RegValue;
78194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
78294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->epromtype == EEPROM_93C46)
78394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
78494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		powerlevel = priv->TxPowerLevelCCK[channel-1];
78594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
78694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
78794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (priv->epromtype == EEPROM_93C56)
78894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
78994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (priv->rf_type == RF_1T2R)
79094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
79194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevel = priv->TxPowerLevelCCK_C[channel-1];
79294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1];
79394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
79494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		else if (priv->rf_type == RF_2T4R)
79594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
79694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevel = priv->TxPowerLevelCCK_A[channel-1];
79794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1];
79894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
79994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1]
80094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						-priv->TxPowerLevelOFDM24G_A[channel-1];
80194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
80294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->RF_C_TxPwDiff = ant_pwr_diff;
80394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
80494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			ant_pwr_diff &= 0xf;
80594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
80694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->AntennaTxPwDiff[2] = 0;
80794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->AntennaTxPwDiff[1] = (u8)(ant_pwr_diff);
80894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->AntennaTxPwDiff[0] = 0;
80994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
81094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			u4RegValue = (  priv->AntennaTxPwDiff[2]<<8 |
81194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->AntennaTxPwDiff[1]<<4 |
81294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->AntennaTxPwDiff[0]);
81394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
81494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
81594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			(bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
81694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
81794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
81894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TODO
81994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (	pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE &&
82094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		pMgntInfo->bWithCcxCellPwr &&
82194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		channel == pMgntInfo->dot11CurrentChannelNumber)
82294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
82394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		u8	CckCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_B, pMgntInfo->CcxCellPwr);
82494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		u8	LegacyOfdmCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_G, pMgntInfo->CcxCellPwr);
82594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		u8	OfdmCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_N_24G, pMgntInfo->CcxCellPwr);
82694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
82794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_TXAGC, DBG_LOUD,
82894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
82994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			pMgntInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx));
83094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_TXAGC, DBG_LOUD,
83194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
83294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			channel, powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
83394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
83494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (powerlevel > CckCellPwrIdx)
83594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevel = CckCellPwrIdx;
83694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff > OfdmCellPwrIdx)
83794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
83894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if ((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)
83994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
84094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				powerlevelOFDM24G = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff;
84194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
84294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else
84394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
84494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				LegacyOfdmCellPwrIdx = 0;
84594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
84694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
84794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
84894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_TXAGC, DBG_LOUD,
84994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
85094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
85194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
85294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
85394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pHalData->CurrentCckTxPwrIdx = powerlevel;
85494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pHalData->CurrentOfdm24GTxPwrIdx = powerlevelOFDM24G;
85594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
85694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_GET_CHANNEL, &channel, &pChannelInfo);
85794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
85894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (pChannelInfo)
85994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
86094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (pChannelInfo->MaxTxPwrDbm != UNSPECIFIED_PWR_DBM)
86194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
86294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			u1Byte CckMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pChannelInfo->MaxTxPwrDbm);
86394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			u1Byte LegacyOfdmMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pChannelInfo->MaxTxPwrDbm);
86494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			u1Byte OfdmMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pChannelInfo->MaxTxPwrDbm);
86594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
86694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_TXAGC, DBG_LOUD,
86794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					("CCX Cell Limit: %ld dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
86894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					pChannelInfo->MaxTxPwrDbm, CckMaxPwrIdx, LegacyOfdmMaxPwrIdx, OfdmMaxPwrIdx));
86994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_TXAGC, DBG_LOUD,
87094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
87194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					channel, powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
87294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
87394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (powerlevel > CckMaxPwrIdx)
87494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				powerlevel = CckMaxPwrIdx;
87594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff > OfdmMaxPwrIdx)
87694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
87794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if ((OfdmMaxPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)
87894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
87994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					powerlevelOFDM24G = OfdmMaxPwrIdx - pHalData->LegacyHTTxPowerDiff;
88094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
88194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				else
88294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
88394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					LegacyOfdmMaxPwrIdx = 0;
88494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
88594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
88694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
88794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_TXAGC, DBG_LOUD,
88894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
88994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
89094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
89194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
89294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
89394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->rf_chip)
89494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
89594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8225:
89694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
89794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8256:
89894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8256CCKTxPower(dev, powerlevel);
89994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
90094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
90194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8258:
90294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
90394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	default:
90494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "unknown rf chip in funtion %s()\n", __func__);
90594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
90694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
90794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
90894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
90994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
91094a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool rtl8192_phy_RFConfig(struct net_device* dev)
91194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
91294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
91394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool rtStatus = true;
91494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->rf_chip)
91594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
91694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8225:
91794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
91894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8256:
91994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtStatus = PHY_RF8256_Config(dev);
92094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
92194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
92294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8258:
92394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
92494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_PSEUDO_11N:
92594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
92694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
92794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
92894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "error chip id\n");
92994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
93094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
93194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return rtStatus;
93294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
93394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
93494a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_updateInitGain(struct net_device* dev)
93594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
93694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
93794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
93894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
93994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device* dev, RF90_RADIO_PATH_E	eRFPath)
94094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
94194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
94294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	int i;
94394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 ret = 0;
94494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
94594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (eRFPath){
94694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF90_PATH_A:
94794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			for (i = 0;i<RadioA_ArrayLength; i=i+2){
94894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
94994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (Rtl819XRadioA_Array[i] == 0xfe){
95094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						msleep(100);
95194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						continue;
95294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
95394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioA_Array[i], bMask12Bits, Rtl819XRadioA_Array[i+1]);
95494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
95594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
95694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
95794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF90_PATH_B:
95894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			for (i = 0;i<RadioB_ArrayLength; i=i+2){
95994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
96094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (Rtl819XRadioB_Array[i] == 0xfe){
96194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						msleep(100);
96294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						continue;
96394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
96494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioB_Array[i], bMask12Bits, Rtl819XRadioB_Array[i+1]);
96594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
96694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
96794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
96894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF90_PATH_C:
96994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			for (i = 0;i<RadioC_ArrayLength; i=i+2){
97094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
97194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (Rtl819XRadioC_Array[i] == 0xfe){
97294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						msleep(100);
97394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						continue;
97494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
97594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioC_Array[i], bMask12Bits, Rtl819XRadioC_Array[i+1]);
97694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
97794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
97894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
97994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF90_PATH_D:
98094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			for (i = 0;i<RadioD_ArrayLength; i=i+2){
98194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
98294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (Rtl819XRadioD_Array[i] == 0xfe){
98394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						msleep(100);
98494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						continue;
98594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
98694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioD_Array[i], bMask12Bits, Rtl819XRadioD_Array[i+1]);
98794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
98894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
98994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
99094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
99194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
99294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
99394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
99494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return ret;;
99594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
99694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
99794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SetTxPowerLevel(struct net_device *dev, u8 channel)
99894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
99994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
100094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	powerlevel = priv->TxPowerLevelCCK[channel-1];
100194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
100294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
100394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->rf_chip)
100494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
100594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8225:
100694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
100794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8225CckTxPower(dev, powerlevel);
100894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8225OfdmTxPower(dev, powerlevelOFDM24G);
100994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
101094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
101194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
101294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8256:
101394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8256CCKTxPower(dev, powerlevel);
101494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
101594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
101694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
101794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case RF_8258:
101894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
101994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	default:
102094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "unknown rf chip ID in rtl8192_SetTxPowerLevel()\n");
102194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
102294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
102394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return;
102494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
102594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru8 rtl8192_phy_SetSwChnlCmdArray(
102694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd*		CmdTable,
102794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32			CmdTableIdx,
102894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32			CmdTableSz,
102994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmdID		CmdID,
103094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32			Para1,
103194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32			Para2,
103294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32			msDelay
103394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	)
103494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
103594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd* pCmd;
103694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
103794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (CmdTable == NULL)
103894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
103994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n");
104094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
104194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
104294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (CmdTableIdx >= CmdTableSz)
104394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
104494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%d, CmdTableSz:%d\n",
104594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CmdTableIdx, CmdTableSz);
104694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
104794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
104894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
104994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pCmd = CmdTable + CmdTableIdx;
105094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pCmd->CmdID = CmdID;
105194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pCmd->Para1 = Para1;
105294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pCmd->Para2 = Para2;
105394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	pCmd->msDelay = msDelay;
105494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
105594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return true;
105694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
105794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru8 rtl8192_phy_SwChnlStepByStep(struct net_device *dev, u8 channel, u8* stage, u8* step, u32* delay)
105894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
105994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
106094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd				PreCommonCmd[MAX_PRECMD_CNT];
106194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32					PreCommonCmdCnt;
106294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd				PostCommonCmd[MAX_POSTCMD_CNT];
106394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32					PostCommonCmdCnt;
106494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd				RfDependCmd[MAX_RFDEPENDCMD_CNT];
106594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32					RfDependCmdCnt;
106694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	SwChnlCmd				*CurrentCmd = NULL;
106794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8		eRFPath;
106894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
106994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n", __func__, *stage, *step, channel);
107094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
107194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef ENABLE_DOT11D
107294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (!IsLegalChannel(priv->rtllib, channel))
107394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
107494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "=============>set to illegal channel:%d\n", channel);
107594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return true;
107694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
107794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
107894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
107994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
108094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PreCommonCmdCnt = 0;
108194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
108294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					CmdID_SetTxPowerLevel, 0, 0, 0);
108394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
108494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					CmdID_End, 0, 0, 0);
108594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
108694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		PostCommonCmdCnt = 0;
108794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
108894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT,
108994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					CmdID_End, 0, 0, 0);
109094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
109194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RfDependCmdCnt = 0;
109294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch ( priv->rf_chip )
109394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
109494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8225:
109594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (!(channel >= 1 && channel <= 14))
109694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
109794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_ERR, "illegal channel for Zebra 8225: %d\n", channel);
109894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				return false;
109994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
110094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
110194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CmdID_RF_WriteReg, rZebra1_Channel, RF_CHANNEL_TABLE_ZEBRA[channel], 10);
110294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
110394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CmdID_End, 0, 0, 0);
110494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
110594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
110694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8256:
110794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (!(channel >= 1 && channel <= 14))
110894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
110994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_ERR, "illegal channel for Zebra 8256: %d\n", channel);
111094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				return false;
111194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
111294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
111394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CmdID_RF_WriteReg, rZebra1_Channel, channel, 10);
111494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
111594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			CmdID_End, 0, 0, 0);
111694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
111794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
111894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8258:
111994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
112094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
112194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
112294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip);
112394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
112494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
112594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
112694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
112794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
112894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		do{
112994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			switch (*stage)
113094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
113194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case 0:
113294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CurrentCmd=&PreCommonCmd[*step];
113394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
113494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case 1:
113594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CurrentCmd=&RfDependCmd[*step];
113694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
113794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case 2:
113894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CurrentCmd=&PostCommonCmd[*step];
113994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
114094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
114194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
114294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (CurrentCmd->CmdID==CmdID_End)
114394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
114494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if ((*stage)==2)
114594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
114694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					return true;
114794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
114894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				else
114994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
115094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					(*stage)++;
115194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					(*step)=0;
115294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					continue;
115394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
115494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
115594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
115694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			switch (CurrentCmd->CmdID)
115794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
115894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case CmdID_SetTxPowerLevel:
115994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (priv->IC_Cut > (u8)VERSION_8190_BD)
116094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_SetTxPowerLevel(dev,channel);
116194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
116294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case CmdID_WritePortUlong:
116394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, CurrentCmd->Para1, CurrentCmd->Para2);
116494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
116594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case CmdID_WritePortUshort:
116694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_word(dev, CurrentCmd->Para1, (u16)CurrentCmd->Para2);
116794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
116894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case CmdID_WritePortUchar:
116994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, CurrentCmd->Para1, (u8)CurrentCmd->Para2);
117094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
117194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case CmdID_RF_WriteReg:
117294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				for (eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
117394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bMask12Bits, CurrentCmd->Para2<<7);
117494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
117594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			default:
117694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
117794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
117894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
117994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
118094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}while(true);
118194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}/*for (Number of RF paths)*/
118294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
118394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	(*delay)=CurrentCmd->msDelay;
118494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	(*step)++;
118594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return false;
118694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
118794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
118894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_phy_FinishSwChnlNow(struct net_device *dev, u8 channel)
118994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
119094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
119194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32	delay = 0;
119294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
119394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	while(!rtl8192_phy_SwChnlStepByStep(dev,channel,&priv->SwChnlStage,&priv->SwChnlStep,&delay))
119494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
119594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (delay>0)
119694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			msleep(delay);
119794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (IS_NIC_DOWN(priv))
119894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		        break;
119994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
120094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
120194a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SwChnl_WorkItem(struct net_device *dev)
120294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
120394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
120494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
120594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
120694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n");
120794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
120894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__, priv->chan, priv);
120994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
121094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_phy_FinishSwChnlNow(dev , priv->chan);
121194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
121294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n");
121394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
121494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
121594a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingeru8 rtl8192_phy_SwChnl(struct net_device* dev, u8 channel)
121694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
121794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
121894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PHY, "=====>%s()\n", __func__);
121994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (IS_NIC_DOWN(priv))
122094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
122194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR, "%s(): ERR !! driver is not up\n",__func__);
122294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
122394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
122494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->SwChnlInProgress)
122594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
122694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
122794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
122894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->rtllib->mode)
122994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
123094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case WIRELESS_MODE_A:
123194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case WIRELESS_MODE_N_5G:
123294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (channel<=14){
123394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "WIRELESS_MODE_A but channel<=14");
123494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
123594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
123694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
123794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case WIRELESS_MODE_B:
123894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (channel>14){
123994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "WIRELESS_MODE_B but channel>14");
124094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
124194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
124294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
124394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case WIRELESS_MODE_G:
124494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	case WIRELESS_MODE_N_24G:
124594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		if (channel>14){
124694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "WIRELESS_MODE_G but channel>14");
124794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			return false;
124894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
124994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
125094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
125194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
125294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SwChnlInProgress = true;
125394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (channel == 0)
125494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		channel = 1;
125594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
125694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->chan=channel;
125794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
125894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SwChnlStage=0;
125994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SwChnlStep=0;
126094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
126194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (!IS_NIC_DOWN(priv)){
126294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_SwChnl_WorkItem(dev);
126394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
126494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SwChnlInProgress = false;
126594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return true;
126694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
126794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
126894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void CCK_Tx_Power_Track_BW_Switch_TSSI(struct net_device *dev	)
126994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
127094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
127194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
127294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->CurrentChannelBW)
127394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
127494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20:
127594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->CCKPresentAttentuation =
127694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation_20Mdefault + priv->CCKPresentAttentuation_difference;
127794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
127894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
127994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
128094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->CCKPresentAttentuation < 0)
128194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation = 0;
128294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
128394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_POWER_TRACKING, "20M, priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
128494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
128594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->rtllib->current_network.channel== 14 && !priv->bcck_in_ch14)
128694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
128794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->bcck_in_ch14 = true;
128894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
128994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
129094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
129194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
129294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->bcck_in_ch14 = false;
129394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
129494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
129594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else
129694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
129794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
129894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
129994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20_40:
130094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->CCKPresentAttentuation =
130194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation_40Mdefault + priv->CCKPresentAttentuation_difference;
130294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
130394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_POWER_TRACKING, "40M, priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
130494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
130594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
130694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->CCKPresentAttentuation < 0)
130794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->CCKPresentAttentuation = 0;
130894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
130994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
131094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
131194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->bcck_in_ch14 = true;
131294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
131394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
131494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
131594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
131694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->bcck_in_ch14 = false;
131794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
131894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
131994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else
132094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
132194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
132294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
132394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
132494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
132594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifndef RTL8190P
132694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void CCK_Tx_Power_Track_BW_Switch_ThermalMeter(struct net_device *dev)
132794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
132894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
132994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
133094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
133194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->bcck_in_ch14 = true;
133294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
133394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->bcck_in_ch14 = false;
133494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
133594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->CurrentChannelBW)
133694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
133794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20:
133894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->Record_CCK_20Mindex == 0)
133994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->Record_CCK_20Mindex = 6;
134094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->CCK_index = priv->Record_CCK_20Mindex;
134194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_POWER_TRACKING, "20MHz, CCK_Tx_Power_Track_BW_Switch_ThermalMeter(),CCK_index = %d\n", priv->CCK_index);
134294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
134394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
134494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20_40:
134594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			priv->CCK_index = priv->Record_CCK_40Mindex;
134694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_POWER_TRACKING, "40MHz, CCK_Tx_Power_Track_BW_Switch_ThermalMeter(), CCK_index = %d\n", priv->CCK_index);
134794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
134894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
134994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
135094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
135194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
135294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
135394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerstatic void CCK_Tx_Power_Track_BW_Switch(struct net_device *dev)
135494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
135594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8192E
135694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
135794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
135894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
135994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
136094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	CCK_Tx_Power_Track_BW_Switch_TSSI(dev);
136194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
136294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->IC_Cut >= IC_VersionCut_D)
136394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		CCK_Tx_Power_Track_BW_Switch_TSSI(dev);
136494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
136594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		CCK_Tx_Power_Track_BW_Switch_ThermalMeter(dev);
136694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
136794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
136894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
136994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SetBWModeWorkItem(struct net_device *dev)
137094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
137194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
137294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
137394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 regBwOpMode;
137494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
137594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_SWBW, "==>rtl8192_SetBWModeWorkItem()  Switch to %s bandwidth\n", \
137694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")
137794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
137894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
137994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_chip== RF_PSEUDO_11N)
138094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
138194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->SetBWModeInProgress= false;
138294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
138394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
138494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (IS_NIC_DOWN(priv)){
138594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_ERR,"%s(): ERR!! driver is not up\n",__func__);
138694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
138794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
138894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	regBwOpMode = read_nic_byte(dev, BW_OPMODE);
138994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
139094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->CurrentChannelBW)
139194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
139294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20:
139394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			regBwOpMode |= BW_OPMODE_20MHZ;
139494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			write_nic_byte(dev, BW_OPMODE, regBwOpMode);
139594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
139694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
139794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20_40:
139894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			regBwOpMode &= ~BW_OPMODE_20MHZ;
139994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			write_nic_byte(dev, BW_OPMODE, regBwOpMode);
140094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
140194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
140294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
140394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown Bandwidth: %#X\n",priv->CurrentChannelBW);
140494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
140594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
140694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
140794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->CurrentChannelBW)
140894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
140994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20:
141094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
141194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
141294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
141394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (!priv->btxpower_tracking)
141494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
141594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000);
141694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317);
141794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_DebugPort, 0x00000204);
141894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
141994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else
142094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CCK_Tx_Power_Track_BW_Switch(dev);
142194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
142294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
142394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 1);
142494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rOFDM0_RxDetector1, bMaskByte0, 0x44);
142594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
142694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
142794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
142894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
142994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
143094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
143194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
143294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case HT_CHANNEL_WIDTH_20_40:
143394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
143494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
143594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
143694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (!priv->btxpower_tracking)
143794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
143894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_TxFilter1, 0x35360000);
143994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_TxFilter2, 0x121c252e);
144094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_dword(dev, rCCK0_DebugPort, 0x00000409);
144194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
144294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			else
144394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				CCK_Tx_Power_Track_BW_Switch(dev);
144494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
144594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
144694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
144794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
144894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
144994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
145094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 0);
145194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rOFDM0_RxDetector1, bMaskByte0, 0x42);
145294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
145394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			if (priv->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
145494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
145594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rFPGA0_RFMOD, (BIT6|BIT5), 0x01);
145694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}else if (priv->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
145794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
145894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rFPGA0_RFMOD, (BIT6|BIT5), 0x02);
145994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
146094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
146194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
146294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#ifdef RTL8192E
146394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0);
146494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	#endif
146594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
146694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
146794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
146894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown Bandwidth: %#X\n" ,priv->CurrentChannelBW);
146994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
147094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
147194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
147294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
147394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if 1
147494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch ( priv->rf_chip )
147594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
147694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8225:
147794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
147894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_SetRF8225Bandwidth(dev, pHalData->CurrentChannelBW);
147994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
148094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
148194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
148294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8256:
148394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
148494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
148594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
148694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8258:
148794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
148894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
148994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_PSEUDO_11N:
149094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
149194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
149294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
149394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip);
149494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
149594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
149694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
149794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	atomic_dec(&(priv->rtllib->atm_swbw));
149894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SetBWModeInProgress= false;
149994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
150094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()");
150194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
150294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
150394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid rtl8192_SetBWMode(struct net_device *dev, HT_CHANNEL_WIDTH	Bandwidth, HT_EXTCHNL_OFFSET Offset)
150494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
150594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
150694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
150794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
150894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->SetBWModeInProgress)
150994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return;
151094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
151194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	 atomic_inc(&(priv->rtllib->atm_swbw));
151294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SetBWModeInProgress= true;
151394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
151494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->CurrentChannelBW = Bandwidth;
151594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
151694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (Offset==HT_EXTCHNL_OFFSET_LOWER)
151794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
151894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else if (Offset==HT_EXTCHNL_OFFSET_UPPER)
151994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
152094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	else
152194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
152294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
152394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_SetBWModeWorkItem(dev);
152494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
152594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
152694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
152794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
152894a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingervoid InitialGain819xPci(struct net_device *dev, u8 Operation)
152994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
153094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define SCAN_RX_INITIAL_GAIN	0x17
153194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#define POWER_DETECTION_TH	0x08
153294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
153394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u32					BitMask;
153494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8					initial_gain;
153594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
153694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (!IS_NIC_DOWN(priv)){
153794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (Operation)
153894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
153994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case IG_Backup:
154094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "IG_Backup, backup the initial gain.\n");
154194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				initial_gain = SCAN_RX_INITIAL_GAIN;
154294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				BitMask = bMaskByte0;
154394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
154494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
154594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->initgain_backup.xaagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, BitMask);
154694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->initgain_backup.xbagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, BitMask);
154794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->initgain_backup.xcagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, BitMask);
154894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->initgain_backup.xdagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, BitMask);
154994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				BitMask  = bMaskByte2;
155094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->initgain_backup.cca		= (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, BitMask);
155194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
155294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
155394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
155494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
155594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
155694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xa0a is %x\n",priv->initgain_backup.cca);
155794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
155894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x \n", initial_gain);
155994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
156094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
156194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
156294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
156394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x \n", POWER_DETECTION_TH);
156494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, 0xa0a, POWER_DETECTION_TH);
156594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
156694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case IG_Restore:
156794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "IG_Restore, restore the initial gain.\n");
156894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				BitMask = 0x7f;
156994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
157094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
157194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
157294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask, (u32)priv->initgain_backup.xaagccore1);
157394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask, (u32)priv->initgain_backup.xbagccore1);
157494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask, (u32)priv->initgain_backup.xcagccore1);
157594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask, (u32)priv->initgain_backup.xdagccore1);
157694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				BitMask  = bMaskByte2;
157794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_setBBreg(dev, rCCK0_CCA, BitMask, (u32)priv->initgain_backup.cca);
157894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
157994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
158094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
158194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
158294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
158394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xa0a is %x\n",priv->initgain_backup.cca);
158494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
158594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				rtl8192_phy_setTxPower(dev,priv->rtllib->current_network.channel);
158694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
158794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
158894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
158994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
159094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
159194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			default:
159294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_SCAN, "Unknown IG Operation. \n");
159394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
159494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
159594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
159694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
159794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
159894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined RTL8190P
159994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerextern	void
160094a799425eee8225a1e3fbe5f473d2ef04002577Larry FingerPHY_SetRtl8190pRfOff(struct net_device* dev	)
160194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
160294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
160394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
160494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->rf_type == RF_2T4R)
160594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
160694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
160794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
160894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x0);
160994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
161094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e0, 0x0);
161194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
161294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
161394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e00, 0x0);
161494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
161594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
161694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
161794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
161894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined RTL8192E
161994a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerextern	void
162094a799425eee8225a1e3fbe5f473d2ef04002577Larry FingerPHY_SetRtl8192eRfOff(struct net_device* dev	)
162194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
162294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
162394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
162494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x0);
162594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x0);
162694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
162794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
162894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x0);
162994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x0);
163094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	write_nic_byte(dev, ANAPAR_FOR_8192PciE, 0x07);
163194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
163294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
163394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
163494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
163594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifndef RTL8192SE
163694a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool
163794a799425eee8225a1e3fbe5f473d2ef04002577Larry FingerSetRFPowerState8190(
163894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct net_device* dev,
163994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_RF_POWER_STATE	eRFPowerState
164094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	)
164194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
164294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
164394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined RTL8192E
164494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	PRT_POWER_SAVE_CONTROL	pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
164594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
164694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool bResult = true;
164794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8	i = 0, QueueID = 0;
164894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct rtl8192_tx_ring  *ring = NULL;
164994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
165094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->SetRFPowerStateInProgress == true)
165194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return false;
165294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PS, "===========> SetRFPowerState8190()!\n");
165394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SetRFPowerStateInProgress = true;
165494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
165594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	switch (priv->rf_chip)
165694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	{
165794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		case RF_8256:
165894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch ( eRFPowerState )
165994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
166094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case eRfOn:
166194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOn !\n");
166294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				#ifdef RTL8190P
166394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (priv->rf_type == RF_2T4R)
166494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
166594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x1);
166694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
166794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
166894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e0, 0xf);
166994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0xf);
167094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0xf);
167194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e00, 0xf);
167294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
167394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				else if (priv->rf_type == RF_1T2R)
167494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
167594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
167694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
167794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x180, 0x3);
167894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xc, 0x3);
167994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xc, 0x3);
168094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1800, 0x3);
168194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
168294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				else if (priv->rf_type == RF_1T1R)
168394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
168494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
168594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x400, 0x1);
168694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x80, 0x1);
168794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x4, 0x1);
168894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x4, 0x1);
168994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x800, 0x1);
169094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
169194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
169294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#elif defined RTL8192E
169394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if ((priv->rtllib->eRFPowerState == eRfOff) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC))
169494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
169594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					bool rtstatus = true;
169694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					u32 InitilizeCount = 3;
169794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					do
169894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
169994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						InitilizeCount--;
170094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->RegRfOff = false;
170194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						rtstatus = NicIFEnableNIC(dev);
170294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}while( (rtstatus != true) &&(InitilizeCount >0) );
170394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
170494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (rtstatus != true)
170594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
170694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						RT_TRACE(COMP_ERR,"%s():Initialize Adapter fail,return\n",__func__);
170794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						priv->SetRFPowerStateInProgress = false;
170894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						return false;
170994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
171094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
171194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
171294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				} else {
171394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				write_nic_byte(dev, ANAPAR, 0x37);
171494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				mdelay(1);
171594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x1);
171694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->bHwRfOffAction = 0;
171794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
171894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x1);
171994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
172094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x3);
172194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x3, 0x3);
172294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x3, 0x3);
172394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x3);
172494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
172594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
172694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
172794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				#endif
172894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						break;
172994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
173094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case eRfSleep:
173194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
173294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				if (priv->rtllib->eRFPowerState == eRfOff)
173394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
173494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
173594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
173694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
173794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )
173894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
173994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							ring = &priv->tx_ring[QueueID];
174094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
174194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							if (skb_queue_len(&ring->queue) == 0) {
174294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								QueueID++;
174394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								continue;
174494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							}
174594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
174694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							else if (IsLowPowerState(Adapter))
174794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							{
174894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								RT_TRACE((COMP_POWER|COMP_RF), "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID);
174994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								break;
175094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							}
175194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
175294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							else
175394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							{
175494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								RT_TRACE((COMP_POWER|COMP_RF), "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID);
175594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								udelay(10);
175694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								i++;
175794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							}
175894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
175994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							if (i >= MAX_DOZE_WAITING_TIMES_9x)
176094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							{
176194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								RT_TRACE(COMP_POWER, "\n\n\n TimeOut!! SetRFPowerState8190(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID);
176294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								break;
176394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							}
176494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						}
176594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
176694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
176794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef RTL8190P
176894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
176994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					PHY_SetRtl8190pRfOff(dev);
177094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
177194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#elif defined RTL8192E
177294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
177394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					PHY_SetRtl8192eRfOff(dev);
177494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
177594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
177694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
177794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger								break;
177894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
177994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case eRfOff:
178094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOff/Sleep !\n");
178194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
178294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
178394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
178494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					ring = &priv->tx_ring[QueueID];
178594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
178694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (skb_queue_len(&ring->queue) == 0) {
178794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							QueueID++;
178894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							continue;
178994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
179094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
179194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					else if (IsLowPowerState(Adapter))
179294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
179394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						RT_TRACE(COMP_POWER,
179494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID);
179594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						break;
179694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
179794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
179894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						else
179994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						{
180094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						RT_TRACE(COMP_POWER,
180194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						"eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID);
180294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							udelay(10);
180394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							i++;
180494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						}
180594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
180694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						if (i >= MAX_DOZE_WAITING_TIMES_9x)
180794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						{
180894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						RT_TRACE(COMP_POWER, "\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID);
180994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger							break;
181094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						}
181194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
181294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
181394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#if defined RTL8190P
181494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
181594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					PHY_SetRtl8190pRfOff(dev);
181694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
181794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#elif defined RTL8192E
181894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
181994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC && !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC))
182094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
182194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
182294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						NicIFDisableNIC(dev);
182394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
182494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
182594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					else if (!(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC))
182694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
182794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						PHY_SetRtl8192eRfOff(dev);
182894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
182994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#ifdef TO_DO_LIST
183094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (pMgntInfo->RfOffReason == RF_CHANGE_BY_IPS )
183194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
183294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						Adapter->HalFunc.LedControlHandler(dev,LED_CTL_NO_LINK);
183394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
183494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					else
183594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					{
183694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						Adapter->HalFunc.LedControlHandler(dev, LED_CTL_POWER_OFF);
183794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
183894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
183994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
184094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#else
184194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				else
184294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				{
184394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					RT_TRACE(COMP_DBG,DBG_TRACE,("It is not 8190Pci and 8192PciE \n"));
184494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				}
184594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				#endif
184694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
184794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
184894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
184994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			default:
185094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					bResult = false;
185194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					RT_TRACE(COMP_ERR, "SetRFPowerState8190(): unknow state to set: 0x%X!!!\n", eRFPowerState);
185294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
185394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
185494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
185594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		break;
185694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
185794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		default:
185894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n");
185994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
186094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
186194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
186294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (bResult) {
186394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		priv->rtllib->eRFPowerState = eRFPowerState;
186494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
186594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (priv->rf_chip )
186694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		{
186794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case RF_8256:
186894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			switch (priv->rtllib->eRFPowerState)
186994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			{
187094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				case eRfOff:
187194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if (priv->rtllib->RfOffReason==RF_CHANGE_BY_IPS ) {
187294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#ifdef TO_DO
187394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						dev->HalFunc.LedControlHandler(dev,LED_CTL_NO_LINK);
187494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#endif
187594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					} else {
187694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#ifdef TO_DO
187794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						dev->HalFunc.LedControlHandler(dev, LED_CTL_POWER_OFF);
187894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#endif
187994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
188094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
188194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
188294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				case eRfOn:
188394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					if ( priv->rtllib->state == RTLLIB_LINKED) {
188494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#ifdef TO_DO
188594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						dev->HalFunc.LedControlHandler(dev, LED_CTL_LINK);
188694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#endif
188794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					} else {
188894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#ifdef TO_DO
188994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						dev->HalFunc.LedControlHandler(dev, LED_CTL_NO_LINK);
189094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger						#endif
189194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					}
189294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
189394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
189494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				default:
189594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger					break;
189694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			}
189794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
189894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			break;
189994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
190094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			default:
190194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n");
190294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
190394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
190494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
190594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
190694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	priv->SetRFPowerStateInProgress = false;
190794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PS, "<=========== SetRFPowerState8190() bResult = %d!\n", bResult);
190894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return bResult;
190994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
191094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
191194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
191294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
191394a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerbool
191494a799425eee8225a1e3fbe5f473d2ef04002577Larry FingerSetRFPowerState(
191594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct net_device* dev,
191694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_RF_POWER_STATE	eRFPowerState
191794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	)
191894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
191994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
192094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
192194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bool bResult = false;
192294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
192394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PS,"---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
192494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (eRFPowerState == priv->rtllib->eRFPowerState && priv->bHwRfOffAction == 0) {
192594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
192694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		return bResult;
192794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
192894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
192994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	bResult = SetRFPowerState8190(dev, eRFPowerState);
193094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
193194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): bResult(%d)\n", bResult);
193294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
193394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	return bResult;
193494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
193594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
193694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
193794a799425eee8225a1e3fbe5f473d2ef04002577Larry Fingerextern void
193894a799425eee8225a1e3fbe5f473d2ef04002577Larry FingerPHY_ScanOperationBackup8192(
193994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct net_device* dev,
194094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	u8 Operation
194194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	)
194294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger{
194394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	struct r8192_priv *priv = rtllib_priv(dev);
194494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
194594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	if (priv->up) {
194694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		switch (Operation) {
194794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case SCAN_OPT_BACKUP:
194894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->rtllib->InitialGainHandler(dev,IG_Backup);
194994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
195094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
195194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			case SCAN_OPT_RESTORE:
195294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				priv->rtllib->InitialGainHandler(dev,IG_Restore);
195394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
195494a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
195594a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger			default:
195694a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation. \n");
195794a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger				break;
195894a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger		}
195994a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger	}
196094a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
196194a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger}
196294a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger
196394a799425eee8225a1e3fbe5f473d2ef04002577Larry Finger#endif
1964