1 /******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
4 * This program is distributed in the hope that it will be useful, but WITHOUT
5 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
9 * You should have received a copy of the GNU General Public License along with
10 * this program; if not, write to the Free Software Foundation, Inc.,
11 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
13 * The full GNU General Public License is included in this distribution in the
14 * file called LICENSE.
16 * Contact Information:
17 * wlanfae <wlanfae@realtek.com>
18 ******************************************************************************/
21 #include "../rtl_core.h"
22 #include "../rtl_dm.h"
23 #include "r8192S_phyreg.h"
24 #include "r8192S_phy.h"
25 #include "r8192S_rtl6052.h"
27 /*---------------------------Define Local Constant---------------------------*/
28 typedef struct RF_Shadow_Compare_Map {
35 /*---------------------------Define Local Constant---------------------------*/
38 /*------------------------Define global variable-----------------------------*/
39 /*------------------------Define global variable-----------------------------*/
44 /*---------------------Define local function prototype-----------------------*/
45 void phy_RF6052_Config_HardCode(struct net_device* dev);
47 bool phy_RF6052_Config_ParaFile(struct net_device* dev);
48 /*---------------------Define local function prototype-----------------------*/
50 /*------------------------Define function prototype--------------------------*/
51 extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate);
53 /*------------------------Define function prototype--------------------------*/
55 /*------------------------Define local variable------------------------------*/
56 static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
57 /*------------------------Define local variable------------------------------*/
59 /*------------------------Define function prototype--------------------------*/
60 extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate)
63 static u1Byte RF_Path_Type = 2;
64 static u4Byte tx_gain_tbl1[6]
65 = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100};
66 static u4Byte tx_gain_tbl2[6]
67 = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030};
70 if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7)
72 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
73 RF_TXPA_G2, bMask20Bits, 0x0f000);
74 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
75 RF_TXPA_G3, bMask20Bits, 0xeacf1);
77 for (i = 0; i < 6; i++)
78 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
79 RF_TX_AGC, bMask20Bits, tx_gain_tbl1[i]);
81 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
82 RF_TXPA_G2, bMask20Bits, 0x01e39);
84 else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8)
86 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
87 RF_TXPA_G2, bMask20Bits, 0x04440);
88 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
89 RF_TXPA_G3, bMask20Bits, 0xea4f1);
91 for (i = 0; i < 6; i++)
92 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
93 RF_TX_AGC, bMask20Bits, tx_gain_tbl2[i]);
95 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
96 RF_TXPA_G2, bMask20Bits, 0x01e19);
100 } /* RF_ChangeTxPath */
103 void PHY_RF6052SetBandwidth(struct net_device* dev, HT_CHANNEL_WIDTH Bandwidth)
106 struct r8192_priv *priv = rtllib_priv(dev);
109 if (IS_HARDWARE_TYPE_8192SE(dev))
111 #if (RTL92SE_FPGA_VERIFY == 0)
114 case HT_CHANNEL_WIDTH_20:
116 priv->RfRegChnlVal[0] = ((priv->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400);
117 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, priv->RfRegChnlVal[0]);
119 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x01);
122 case HT_CHANNEL_WIDTH_20_40:
124 priv->RfRegChnlVal[0] = ((priv->RfRegChnlVal[0] & 0xfffff3ff));
125 rtl8192_phy_SetRFReg(dev, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, priv->RfRegChnlVal[0]);
127 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x00);
131 RT_TRACE(COMP_DBG, "PHY_SetRF6052Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth);
138 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
142 case HT_CHANNEL_WIDTH_20:
144 case HT_CHANNEL_WIDTH_20_40:
147 RT_TRACE(COMP_DBG, "PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
156 extern void PHY_RF6052SetCckTxPower(struct net_device* dev, u8 powerlevel)
158 struct r8192_priv *priv = rtllib_priv(dev);
160 bool dontIncCCKOrTurboScanOff=false;
162 if (((priv->eeprom_version >= 2) && (priv->TxPwrSafetyFlag == 1)) ||
163 ((priv->eeprom_version >= 2) && (priv->EEPROMRegulatory != 0))) {
164 dontIncCCKOrTurboScanOff = true;
167 if(rtllib_act_scanning(priv->rtllib,true) == true){
170 if(dontIncCCKOrTurboScanOff )
175 if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
177 else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
181 if(TxAGC > RF6052_MAX_TX_PWR)
182 TxAGC = RF6052_MAX_TX_PWR;
184 rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
186 } /* PHY_RF6052SetCckTxPower */
190 extern void PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8 powerlevel, u8 Channel)
192 struct r8192_priv *priv = rtllib_priv(dev);
193 u32 writeVal, powerBase0, powerBase1;
195 u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
197 u8 rfa_lower_bound = 0, rfa_upper_bound = 0;
199 u8 rf_pwr_diff = 0, chnlGroup = 0;
200 u8 Legacy_pwrdiff=0, HT20_pwrdiff=0;
202 if (priv->eeprom_version < 2)
203 powerBase0 = powerlevel + (priv->LegacyHTTxPowerDiff & 0xf);
204 else if (priv->eeprom_version >= 2)
206 Legacy_pwrdiff = priv->TxPwrLegacyHtDiff[RF90_PATH_A][Channel-1];
207 powerBase0 = powerlevel + Legacy_pwrdiff;
208 RT_TRACE(COMP_POWER, " [LagacyToHT40 pwr diff = %d]\n", Legacy_pwrdiff);
209 RT_TRACE(COMP_POWER, " [OFDM power base index = 0x%x]\n", powerBase0);
211 powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
213 if(priv->eeprom_version >= 2)
216 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
218 HT20_pwrdiff = priv->TxPwrHt20Diff[RF90_PATH_A][Channel-1];
220 if (HT20_pwrdiff < 8)
221 powerlevel += HT20_pwrdiff;
223 powerlevel -= (16-HT20_pwrdiff);
225 RT_TRACE(COMP_POWER, " [HT20 to HT40 pwrdiff = %d]\n", HT20_pwrdiff);
226 RT_TRACE(COMP_POWER, " [MCS power base index = 0x%x]\n", powerlevel);
229 powerBase1 = powerlevel;
230 powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
232 RT_TRACE(COMP_POWER, " [Legacy/HT power index= %x/%x]\n", powerBase0, powerBase1);
234 for(index=0; index<6; index++)
237 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
239 writeVal = ((index<2)?powerBase0:powerBase1);
243 if(priv->pwrGroupCnt == 0)
245 if(priv->pwrGroupCnt >= 3)
249 else if(Channel >= 4 && Channel <= 9)
251 else if(Channel >= 10)
253 if(priv->pwrGroupCnt == 4)
258 writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
259 ((index<2)?powerBase0:powerBase1);
261 RT_TRACE(COMP_POWER, "Reg 0x%x, chnlGroup = %d, Original=%x writeVal=%x\n",
262 RegOffset[index], chnlGroup, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index],
265 if (priv->rf_type == RF_2T2R)
267 rf_pwr_diff = priv->AntennaTxPwDiff[0];
268 RT_TRACE(COMP_POWER, "2T2R RF-B to RF-A PWR DIFF=%d\n", rf_pwr_diff);
270 if (rf_pwr_diff >= 8)
272 rfa_lower_bound = 0x10-rf_pwr_diff;
273 RT_TRACE(COMP_POWER, "rfa_lower_bound= %d\n", rfa_lower_bound);
275 else if (rf_pwr_diff >= 0)
277 rfa_upper_bound = RF6052_MAX_TX_PWR-rf_pwr_diff;
278 RT_TRACE(COMP_POWER, "rfa_upper_bound= %d\n", rfa_upper_bound);
282 for (i= 0; i <4; i++)
284 rfa_pwr[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
285 if (rfa_pwr[i] > RF6052_MAX_TX_PWR)
286 rfa_pwr[i] = RF6052_MAX_TX_PWR;
288 if (priv->rf_type == RF_2T2R)
290 if (rf_pwr_diff >= 8)
292 if (rfa_pwr[i] <rfa_lower_bound)
294 RT_TRACE(COMP_POWER, "Underflow");
295 rfa_pwr[i] = rfa_lower_bound;
298 else if (rf_pwr_diff >= 1)
300 if (rfa_pwr[i] > rfa_upper_bound)
302 RT_TRACE(COMP_POWER, "Overflow");
303 rfa_pwr[i] = rfa_upper_bound;
306 RT_TRACE(COMP_POWER, "rfa_pwr[%d]=%x\n", i, rfa_pwr[i]);
312 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
313 RT_TRACE(COMP_POWER, "WritePower=%08x\n", writeVal);
315 if(priv->bDynamicTxHighPower == true)
319 writeVal = 0x03030303;
323 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
325 RT_TRACE(COMP_POWER, "HighPower=%08x\n", writeVal);
329 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
330 RT_TRACE(COMP_POWER, "NormalPower=%08x\n", writeVal);
333 rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
336 } /* PHY_RF6052SetOFDMTxPower */
340 struct net_device* dev,
348 struct r8192_priv *priv = rtllib_priv(dev);
349 u32 powerBase0, powerBase1;
350 u8 Legacy_pwrdiff=0, HT20_pwrdiff=0;
354 powerlevel[i] = pPowerLevel[i];
355 if (priv->eeprom_version < 2)
356 powerBase0 = powerlevel[0] + (priv->LegacyHTTxPowerDiff & 0xf);
357 else if (priv->eeprom_version >= 2)
359 Legacy_pwrdiff = priv->TxPwrLegacyHtDiff[RF90_PATH_A][Channel-1];
360 powerBase0 = powerlevel[0] + Legacy_pwrdiff;
362 powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
363 *OfdmBase = powerBase0;
364 RT_TRACE(COMP_POWER, " [OFDM power base index = 0x%x]\n", powerBase0);
366 if(priv->eeprom_version >= 2)
368 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
372 HT20_pwrdiff = priv->TxPwrHt20Diff[i][Channel-1];
373 if (HT20_pwrdiff < 8)
374 powerlevel[i] += HT20_pwrdiff;
376 powerlevel[i] -= (16-HT20_pwrdiff);
380 powerBase1 = powerlevel[0];
381 powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
382 *MCSBase = powerBase1;
384 RT_TRACE(COMP_POWER, " [MCS power base index = 0x%x]\n", powerBase1);
386 pFinalPowerIndex[0] = powerlevel[0];
387 pFinalPowerIndex[1] = powerlevel[1];
388 switch(priv->EEPROMRegulatory)
391 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
393 pFinalPowerIndex[0] += priv->PwrGroupHT40[RF90_PATH_A][Channel-1];
394 pFinalPowerIndex[1] += priv->PwrGroupHT40[RF90_PATH_B][Channel-1];
398 pFinalPowerIndex[0] += priv->PwrGroupHT20[RF90_PATH_A][Channel-1];
399 pFinalPowerIndex[1] += priv->PwrGroupHT20[RF90_PATH_B][Channel-1];
405 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
407 RT_TRACE(COMP_POWER, "40MHz finalPowerIndex (A / B) = 0x%x / 0x%x\n",
408 pFinalPowerIndex[0], pFinalPowerIndex[1]);
412 RT_TRACE(COMP_POWER, "20MHz finalPowerIndex (A / B) = 0x%x / 0x%x\n",
413 pFinalPowerIndex[0], pFinalPowerIndex[1]);
417 void getTxPowerWriteValByRegulatory(
418 struct net_device* dev,
426 struct r8192_priv *priv = rtllib_priv(dev);
427 u8 i, chnlGroup, pwr_diff_limit[4];
428 u32 writeVal, customer_limit;
430 switch(priv->EEPROMRegulatory)
434 RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
435 chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
436 writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
437 ((index<2)?powerBase0:powerBase1);
438 RT_TRACE(COMP_POWER,"RTK better performance, writeVal = 0x%x\n", writeVal);
441 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
443 writeVal = ((index<2)?powerBase0:powerBase1);
444 RT_TRACE(COMP_POWER,"Realtek regulatory, 40MHz, writeVal = 0x%x\n", writeVal);
448 if(priv->pwrGroupCnt == 1)
450 if(priv->pwrGroupCnt >= 3)
454 else if(Channel >= 4 && Channel <= 8)
458 if(priv->pwrGroupCnt == 4)
461 RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
462 chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
463 writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
464 ((index<2)?powerBase0:powerBase1);
465 RT_TRACE(COMP_POWER,"Realtek regulatory, 20MHz, writeVal = 0x%x\n", writeVal);
469 writeVal = ((index<2)?powerBase0:powerBase1);
470 RT_TRACE(COMP_POWER,"Better regulatory, writeVal = 0x%x\n", writeVal);
474 RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
475 chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
477 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
479 RT_TRACE(COMP_POWER,"customer's limit, 40MHz = 0x%x\n",
480 priv->PwrGroupHT40[RF90_PATH_A][Channel-1]);
484 RT_TRACE(COMP_POWER,"customer's limit, 20MHz = 0x%x\n",
485 priv->PwrGroupHT20[RF90_PATH_A][Channel-1]);
489 pwr_diff_limit[i] = (u8)((priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]&(0x7f<<(i*8)))>>(i*8));
490 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
492 if(pwr_diff_limit[i] > priv->PwrGroupHT40[RF90_PATH_A][Channel-1])
494 pwr_diff_limit[i] = priv->PwrGroupHT40[RF90_PATH_A][Channel-1];
499 if(pwr_diff_limit[i] > priv->PwrGroupHT20[RF90_PATH_A][Channel-1])
501 pwr_diff_limit[i] = priv->PwrGroupHT20[RF90_PATH_A][Channel-1];
505 customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) |
506 (pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]);
507 RT_TRACE(COMP_POWER,"Customer's limit = 0x%x\n", customer_limit);
509 writeVal = customer_limit + ((index<2)?powerBase0:powerBase1);
510 RT_TRACE(COMP_POWER,"Customer, writeVal = 0x%x\n", writeVal);
514 writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
515 ((index<2)?powerBase0:powerBase1);
516 RT_TRACE(COMP_POWER,"RTK better performance, writeVal = 0x%x\n", writeVal);
520 if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
521 writeVal = 0x10101010;
522 else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
525 *pOutWriteVal = writeVal;
530 struct net_device* dev,
534 struct r8192_priv *priv = rtllib_priv(dev);
538 if (priv->rf_type == RF_2T2R)
540 ant_pwr_diff = pFinalPowerIndex[1] - pFinalPowerIndex[0];
544 if(ant_pwr_diff < -8)
546 RT_TRACE(COMP_POWER,"Antenna Diff from RF-B to RF-A = %d (0x%x)\n",
547 ant_pwr_diff, ant_pwr_diff&0xf);
550 priv->AntennaTxPwDiff[2] = 0;
551 priv->AntennaTxPwDiff[1] = 0;
552 priv->AntennaTxPwDiff[0] = (u8)(ant_pwr_diff);
554 u4RegValue = (priv->AntennaTxPwDiff[2]<<8 |
555 priv->AntennaTxPwDiff[1]<<4 |
556 priv->AntennaTxPwDiff[0] );
558 rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
559 (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
561 RT_TRACE(COMP_POWER,"Write BCD-Diff(0x%x) = 0x%x\n",
562 rFPGA0_TxGainStage, u4RegValue);
565 void writeOFDMPowerReg(
566 struct net_device* dev,
571 struct r8192_priv *priv = rtllib_priv(dev);
572 u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
574 u8 rfa_lower_bound = 0, rfa_upper_bound = 0, rf_pwr_diff = 0;
576 if (priv->rf_type == RF_2T2R)
578 rf_pwr_diff = priv->AntennaTxPwDiff[0];
580 if (rf_pwr_diff >= 8)
582 rfa_lower_bound = 0x10-rf_pwr_diff;
583 RT_TRACE(COMP_POWER,"rfa_lower_bound= %d\n", rfa_lower_bound);
587 rfa_upper_bound = RF6052_MAX_TX_PWR-rf_pwr_diff;
588 RT_TRACE(COMP_POWER,"rfa_upper_bound= %d\n", rfa_upper_bound);
594 rfa_pwr[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
595 if (rfa_pwr[i] > RF6052_MAX_TX_PWR)
596 rfa_pwr[i] = RF6052_MAX_TX_PWR;
598 if (priv->rf_type == RF_2T2R)
600 if (rf_pwr_diff >= 8)
602 if (rfa_pwr[i] <rfa_lower_bound)
604 RT_TRACE(COMP_POWER,"Underflow");
605 rfa_pwr[i] = rfa_lower_bound;
608 else if (rf_pwr_diff >= 1)
610 if (rfa_pwr[i] > rfa_upper_bound)
612 RT_TRACE(COMP_POWER,"Overflow");
613 rfa_pwr[i] = rfa_upper_bound;
616 RT_TRACE(COMP_POWER,"rfa_pwr[%d]=%x\n", i, rfa_pwr[i]);
621 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
623 rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
624 RT_TRACE(COMP_POWER,"Set 0x%x = %08x\n",RegOffset[index], writeVal);
627 /*-----------------------------------------------------------------------------
628 * Function: PHY_RF6052SetOFDMTxPower
630 * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for
631 * different channel and read original value in TX power register area from
632 * 0xe00. We increase offset and original value to be correct tx pwr.
642 * 11/05/2008 MHC Simulate 8192 series method.
643 * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to
644 * A/B pwr difference or legacy/HT pwr diff.
645 * 2. We concern with path B legacy/HT OFDM difference.
646 * 01/22/2009 MHC Support new EPRO format from SD3.
648 *---------------------------------------------------------------------------*/
650 PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8* pPowerLevel, u8 Channel)
652 u32 writeVal, powerBase0, powerBase1;
654 u8 finalPowerIndex[4];
656 getPowerBase(dev, pPowerLevel, Channel, &powerBase0, &powerBase1, &finalPowerIndex[0]);
657 setAntennaDiff(dev, &finalPowerIndex[0] );
659 for(index=0; index<6; index++)
661 getTxPowerWriteValByRegulatory(dev, Channel, index,
662 powerBase0, powerBase1, &writeVal);
664 writeOFDMPowerReg(dev, index, writeVal);
668 bool PHY_RF6052_Config(struct net_device* dev)
670 struct r8192_priv *priv = rtllib_priv(dev);
671 bool rtStatus = true;
672 u8 bRegHwParaFile = 1;
674 if(priv->rf_type == RF_1T1R)
675 priv->NumTotalRFPath = 1;
677 priv->NumTotalRFPath = 2;
679 switch(bRegHwParaFile)
682 phy_RF6052_Config_HardCode(dev);
686 rtStatus = phy_RF6052_Config_ParaFile(dev);
690 phy_RF6052_Config_HardCode(dev);
691 phy_RF6052_Config_ParaFile(dev);
695 phy_RF6052_Config_HardCode(dev);
702 void phy_RF6052_Config_HardCode(struct net_device* dev)
709 bool phy_RF6052_Config_ParaFile(struct net_device* dev)
713 bool rtStatus = true;
714 struct r8192_priv *priv = rtllib_priv(dev);
715 BB_REGISTER_DEFINITION_T *pPhyReg;
718 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
721 pPhyReg = &priv->PHYRegDef[eRFPath];
727 u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
731 u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
735 rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
737 rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
739 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);
740 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);
746 #if RTL8190_Download_Firmware_From_Header
747 rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
749 rtStatus = PHY_ConfigRFWithParaFile(dev, (char* )&szRadioAFile, (RF90_RADIO_PATH_E)eRFPath);
753 #if RTL8190_Download_Firmware_From_Header
754 rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
756 if(priv->rf_type == RF_2T2R_GREEN)
757 rtStatus = PHY_ConfigRFWithParaFile(dev, (char *)&szRadioBGMFile, (RF90_RADIO_PATH_E)eRFPath);
759 rtStatus = PHY_ConfigRFWithParaFile(dev, (char* )&szRadioBFile, (RF90_RADIO_PATH_E)eRFPath);
772 rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
776 rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
780 if(rtStatus != true){
781 printk("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
782 goto phy_RF6052_Config_ParaFile_Fail;
787 RT_TRACE(COMP_INIT, "<---phy_RF6052_Config_ParaFile()\n");
790 phy_RF6052_Config_ParaFile_Fail:
795 extern u32 PHY_RFShadowRead(
796 struct net_device * dev,
797 RF90_RADIO_PATH_E eRFPath,
800 return RF_Shadow[eRFPath][Offset].Value;
802 } /* PHY_RFShadowRead */
805 extern void PHY_RFShadowWrite(
806 struct net_device * dev,
807 RF90_RADIO_PATH_E eRFPath,
811 RF_Shadow[eRFPath][Offset].Value = (Data & bMask20Bits);
812 RF_Shadow[eRFPath][Offset].Driver_Write = true;
814 } /* PHY_RFShadowWrite */
817 extern bool PHY_RFShadowCompare(
818 struct net_device * dev,
819 RF90_RADIO_PATH_E eRFPath,
824 if (RF_Shadow[eRFPath][Offset].Compare == true)
826 reg = rtl8192_phy_QueryRFReg(dev, eRFPath, Offset, bMask20Bits);
827 if (RF_Shadow[eRFPath][Offset].Value != reg)
829 RF_Shadow[eRFPath][Offset].ErrorOrNot = true;
830 RT_TRACE(COMP_INIT, "PHY_RFShadowCompare RF-%d Addr%02xErr = %05x", eRFPath, Offset, reg);
834 RT_TRACE(COMP_INIT, "PHY_RFShadowCompare RF-%d Addr%02x Err = %05x return false\n", eRFPath, Offset, reg);
835 RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
837 return RF_Shadow[eRFPath][Offset].ErrorOrNot;
840 } /* PHY_RFShadowCompare */
842 extern void PHY_RFShadowRecorver(
843 struct net_device * dev,
844 RF90_RADIO_PATH_E eRFPath,
847 if (RF_Shadow[eRFPath][Offset].ErrorOrNot == true)
849 if (RF_Shadow[eRFPath][Offset].Recorver == true)
851 rtl8192_phy_SetRFReg(dev, eRFPath, Offset, bMask20Bits, RF_Shadow[eRFPath][Offset].Value);
852 RT_TRACE(COMP_INIT, "PHY_RFShadowRecorver RF-%d Addr%02x=%05x",
853 eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value);
857 } /* PHY_RFShadowRecorver */
860 extern void PHY_RFShadowCompareAll(struct net_device * dev)
865 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
867 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
869 PHY_RFShadowCompare(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
873 } /* PHY_RFShadowCompareAll */
876 extern void PHY_RFShadowRecorverAll(struct net_device * dev)
881 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
883 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
885 PHY_RFShadowRecorver(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
889 } /* PHY_RFShadowRecorverAll */
892 extern void PHY_RFShadowCompareFlagSet(
893 struct net_device * dev,
894 RF90_RADIO_PATH_E eRFPath,
898 RF_Shadow[eRFPath][Offset].Compare = Type;
900 } /* PHY_RFShadowCompareFlagSet */
903 extern void PHY_RFShadowRecorverFlagSet(
904 struct net_device * dev,
905 RF90_RADIO_PATH_E eRFPath,
909 RF_Shadow[eRFPath][Offset].Recorver= Type;
911 } /* PHY_RFShadowRecorverFlagSet */
914 extern void PHY_RFShadowCompareFlagSetAll(struct net_device * dev)
919 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
921 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
923 if (Offset != 0x26 && Offset != 0x27)
924 PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, false);
926 PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, true);
930 } /* PHY_RFShadowCompareFlagSetAll */
933 extern void PHY_RFShadowRecorverFlagSetAll(struct net_device * dev)
938 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
940 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
942 if (Offset != 0x26 && Offset != 0x27)
943 PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, false);
945 PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, true);
949 } /* PHY_RFShadowCompareFlagSetAll */
953 extern void PHY_RFShadowRefresh(struct net_device * dev)
958 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
960 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
962 RF_Shadow[eRFPath][Offset].Value = 0;
963 RF_Shadow[eRFPath][Offset].Compare = false;
964 RF_Shadow[eRFPath][Offset].Recorver = false;
965 RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
966 RF_Shadow[eRFPath][Offset].Driver_Write = false;
970 } /* PHY_RFShadowRead */
972 /* End of HalRf6052.c */