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