18fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*
28fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang  This is part of the rtl8192 driver
38fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang  released under the GPL (See file COPYING for details).
48fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
58fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang  This files contains programming code for the rtl8256
68fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang  radio frontend.
78fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
88fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang  *Many* thanks to Realtek Corp. for their great support!
98fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang*/
118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U.h"
138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8192U_hw.h"
148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r819xU_phyreg.h"
158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r819xU_phy.h"
168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang#include "r8190_rtl8256.h"
178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*--------------------------------------------------------------------------
198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Overview:   	set RF band width (20M or 40M)
208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Input:       struct net_device*	dev
218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * 		WIRELESS_BANDWIDTH_E	Bandwidth	//20M or 40M
228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Output:      NONE
238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Return:      NONE
248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Note:	8226 support both 20M  and 40 MHz
258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *---------------------------------------------------------------------------*/
268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid PHY_SetRF8256Bandwidth(struct net_device* dev , HT_CHANNEL_WIDTH Bandwidth)	//20M or 40M
278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	eRFPath;
298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//for(eRFPath = RF90_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(eRFPath = 0; eRFPath <RF90_PATH_MAX; eRFPath++)
338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				continue;
368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(Bandwidth)
388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case HT_CHANNEL_WIDTH_20:
408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(priv->card_8192_version == VERSION_819xU_A || priv->card_8192_version == VERSION_819xU_B)// 8256 D-cut, E-cut, xiong: consider it later!
418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x100); //phy para:1ba
438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3d7);
448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x021);
458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//cosa add for sd3's request 01/23/2008
478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x14, bMask12Bits, 0x5ab);
488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			case HT_CHANNEL_WIDTH_20_40:
568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				if(priv->card_8192_version == VERSION_819xU_A ||priv->card_8192_version == VERSION_819xU_B)// 8256 D-cut, E-cut, xiong: consider it later!
578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x300); //phy para:3ba
598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3df);
608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x0a1);
618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					//cosa add for sd3's request 01/23/2008
638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					if(priv->chan == 3 || priv->chan == 9) //I need to set priv->chan whenever current channel changes
648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x14, bMask12Bits, 0x59b);
658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					else
668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang						rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x14, bMask12Bits, 0x5ab);
678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				else
698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				{
708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang					RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				}
728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			default:
768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				break;
788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*--------------------------------------------------------------------------
848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Overview:    Interface to config 8256
858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Input:       struct net_device*	dev
868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Output:      NONE
878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Return:      NONE
888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *---------------------------------------------------------------------------*/
898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid PHY_RF8256_Config(struct net_device* dev)
908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Initialize general global value
938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//
948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// TODO: Extend RF_PATH_C and RF_PATH_D in the future
958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	priv->NumTotalRFPath = RTL819X_TOTAL_RF_PATH;
968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	// Config BB and RF
978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	phy_RF8256_Config_ParaFile(dev);
988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
1008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
1018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang/*--------------------------------------------------------------------------
1028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Overview:    Interface to config 8256
1038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Input:       struct net_device*	dev
1048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Output:      NONE
1058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang * Return:      NONE
1068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang *---------------------------------------------------------------------------*/
1078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid phy_RF8256_Config_ParaFile(struct net_device* dev)
1088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
1098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 	u4RegValue = 0;
1108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//static s1Byte				szRadioAFile[] = RTL819X_PHY_RADIO_A;
1118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//static s1Byte				szRadioBFile[] = RTL819X_PHY_RADIO_B;
1128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//static s1Byte				szRadioCFile[] = RTL819X_PHY_RADIO_C;
1138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//static s1Byte				szRadioDFile[] = RTL819X_PHY_RADIO_D;
1148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 	eRFPath;
1158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	BB_REGISTER_DEFINITION_T	*pPhyReg;
1168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
1178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	RegOffSetToBeCheck = 0x3;
1188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 	RegValueToBeCheck = 0x7f1;
1198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	RF3_Final_Value = 0;
1208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8	ConstRetryTimes = 5, RetryTimes = 5;
1218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 ret = 0;
1228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//3//-----------------------------------------------------------------
1238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//3// <2> Initialize RF
1248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//3//-----------------------------------------------------------------
1258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(eRFPath = (RF90_RADIO_PATH_E)RF90_PATH_A; eRFPath <priv->NumTotalRFPath; eRFPath++)
1268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
1278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
1288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				continue;
1298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		pPhyReg = &priv->PHYRegDef[eRFPath];
1318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// Joseph test for shorten RF config
1338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//	pHalData->RfReg0Value[eRFPath] =  rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, rGlobalCtrl, bMaskDWord);
1348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Store original RFENV control type----*/
1368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(eRFPath)
1378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
1388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_A:
1398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_C:
1408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
1418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
1428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_B :
1438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_D:
1448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
1458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
1468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
1478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Set RF_ENV enable----*/
1498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
1508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Set RF_ENV output high----*/
1528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
1538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/* Set bit number of Address and Data for RF register */
1558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); 	// Set 0 to 4 bits for Z-serial and set 1 to 6 bits for 8258
1568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);	// Set 0 to 12 bits for Z-serial and 8258, and set 1 to 14 bits for ???
1578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E) eRFPath, 0x0, bMask12Bits, 0xbf);
1598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Check RF block (for FPGA platform only)----*/
1618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		// TODO: this function should be removed on ASIC , Emily 2007.2.2
1628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if (rtl8192_phy_checkBBAndRF(dev, HW90_BLOCK_RF, (RF90_RADIO_PATH_E)eRFPath))
1638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
1648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR, "PHY_RF8256_Config():Check Radio[%d] Fail!!\n", eRFPath);
1658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			goto phy_RF8256_Config_ParaFile_Fail;
1668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
1678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
1688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RetryTimes = ConstRetryTimes;
1698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		RF3_Final_Value = 0;
1708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Initialize RF fom connfiguration file----*/
1718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(eRFPath)
1728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
1738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_A:
1748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			while(RF3_Final_Value!=RegValueToBeCheck && RetryTimes!=0)
1758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
1768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
1778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
1788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
1798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RetryTimes--;
1808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
1818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
1828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_B:
1838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			while(RF3_Final_Value!=RegValueToBeCheck && RetryTimes!=0)
1848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
1858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
1868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
1878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
1888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RetryTimes--;
1898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
1908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
1918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_C:
1928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			while(RF3_Final_Value!=RegValueToBeCheck && RetryTimes!=0)
1938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
1948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
1958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
1968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
1978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RetryTimes--;
1988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
1998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_D:
2018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			while(RF3_Final_Value!=RegValueToBeCheck && RetryTimes!=0)
2028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			{
2038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
2048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
2058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
2068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang				RetryTimes--;
2078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			}
2088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		/*----Restore RFENV control type----*/;
2128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		switch(eRFPath)
2138fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
2148fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_A:
2158fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_C:
2168fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
2178fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2188fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_B :
2198fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		case RF90_PATH_D:
2208fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
2218fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			break;
2228fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2238fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2248fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(ret){
2258fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			RT_TRACE(COMP_ERR, "phy_RF8256_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
2268fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			goto phy_RF8256_Config_ParaFile_Fail;
2278fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2288fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2298fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2308fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2318fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_PHY, "PHY Initialization Success\n") ;
2328fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ;
2338fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2348fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangphy_RF8256_Config_ParaFile_Fail:
2358fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	RT_TRACE(COMP_ERR, "PHY Initialization failed\n") ;
2368fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return ;
2378fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2388fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2398fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2408fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid PHY_SetRF8256CCKTxPower(struct net_device*	dev, u8	powerlevel)
2418fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2428fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32	TxAGC=0;
2438fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
2448fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//modified by vivi, 20080109
2458fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	TxAGC = powerlevel;
2468fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2478fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(priv->bDynamicTxLowPower == TRUE ) //cosa 05/22/2008 for scan
2488fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
2498fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->CustomerID == RT_CID_819x_Netcore)
2508fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			TxAGC = 0x22;
2518fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
2528fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TxAGC += priv->CckPwEnl;
2538fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
2548fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2558fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	if(TxAGC > 0x24)
2568fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		TxAGC = 0x24;
2578fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
2588fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
2598fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2608fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2618fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuangvoid PHY_SetRF8256OFDMTxPower(struct net_device* dev, u8 powerlevel)
2628fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang{
2638fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	struct r8192_priv *priv = ieee80211_priv(dev);
2648fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	//Joseph TxPower for 8192 testing
2658fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u32 writeVal, powerBase0, powerBase1, writeVal_tmp;
2668fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 index = 0;
2678fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
2688fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	u8 byte0, byte1, byte2, byte3;
2698fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2708fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	powerBase0 = powerlevel + priv->TxPowerDiff;	//OFDM rates
2718fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
2728fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	powerBase1 = powerlevel;							//MCS rates
2738fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
2748fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2758fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	for(index=0; index<6; index++)
2768fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	{
2778fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		writeVal = priv->MCSTxPowerLevelOriginalOffset[index] + ((index<2)?powerBase0:powerBase1);
2788fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		byte0 = (u8)(writeVal & 0x7f);
2798fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		byte1 = (u8)((writeVal & 0x7f00)>>8);
2808fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		byte2 = (u8)((writeVal & 0x7f0000)>>16);
2818fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		byte3 = (u8)((writeVal & 0x7f000000)>>24);
2828fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(byte0 > 0x24)	// Max power index = 0x24
2838fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			byte0 = 0x24;
2848fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(byte1 > 0x24)
2858fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			byte1 = 0x24;
2868fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(byte2 > 0x24)
2878fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			byte2 = 0x24;
2888fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(byte3 > 0x24)
2898fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			byte3 = 0x24;
2908fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2918fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		//for tx power track
2928fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(index == 3)
2938fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
2948fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			writeVal_tmp = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
2958fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			priv->Pwr_Track = writeVal_tmp;
2968fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
2978fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
2988fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		if(priv->bDynamicTxHighPower == TRUE)     //Add by Jacken 2008/03/06
2998fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
3008fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			// Emily, 20080613. Set low tx power for both MCS and legacy OFDM
3018fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			writeVal = 0x03030303;
3028fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
3038fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		else
3048fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		{
3058fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang			writeVal = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
3068fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		}
3078fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang		rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
3088fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	}
3098fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang	return;
3108fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
3118fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang}
3128fc8598e61f6f384f3eaf1d9b09500c12af47b37Jerry Chuang
313