1 /******************************************************************************
3 * (c) Copyright 2008, RealTEK Technologies Inc. All Rights Reserved.
5 * Module: HalRf6052.c ( Source C File)
7 * Note: Provide RF 6052 series relative API.
18 * 09/25/2008 MHC Create initial version.
19 * 11/05/2008 MHC Add API for tw power setting.
22 ******************************************************************************/
24 #include "r8192S_rtl6052.h"
27 #include "r8192S_hw.h"
28 #include "r8192S_phyreg.h"
29 #include "r8192S_phy.h"
31 #include "r8192U_hw.h"
32 #include "r819xU_phyreg.h"
33 #include "r819xU_phy.h"
37 /*---------------------------Define Local Constant---------------------------*/
38 // Define local structure for debug!!!!!
39 typedef struct RF_Shadow_Compare_Map {
40 // Shadow register value
42 // Compare or not flag
44 // Record If it had ever modified unpredicted
51 /*---------------------------Define Local Constant---------------------------*/
54 /*------------------------Define global variable-----------------------------*/
55 /*------------------------Define global variable-----------------------------*/
60 /*---------------------Define local function prototype-----------------------*/
61 void phy_RF6052_Config_HardCode(struct net_device* dev);
63 RT_STATUS phy_RF6052_Config_ParaFile(struct net_device* dev);
64 /*---------------------Define local function prototype-----------------------*/
66 /*------------------------Define function prototype--------------------------*/
67 extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate);
69 /*------------------------Define function prototype--------------------------*/
71 /*------------------------Define local variable------------------------------*/
72 // 2008/11/20 MH For Debug only, RF
73 static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];// = {{0}};//FIXLZM
74 /*------------------------Define local variable------------------------------*/
76 /*------------------------Define function prototype--------------------------*/
77 /*-----------------------------------------------------------------------------
78 * Function: RF_ChangeTxPath
80 * Overview: For RL6052, we must change some RF settign for 1T or 2T.
82 * Input: u16 DataRate // 0x80-8f, 0x90-9f
90 * 09/25/2008 MHC Create Version 0.
91 * Firmwaer support the utility later.
93 *---------------------------------------------------------------------------*/
94 extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate)
96 // We do not support gain table change inACUT now !!!! Delete later !!!
97 #if 0//(RTL92SE_FPGA_VERIFY == 0)
98 static u1Byte RF_Path_Type = 2; // 1 = 1T 2= 2T
99 static u4Byte tx_gain_tbl1[6]
100 = {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100};
101 static u4Byte tx_gain_tbl2[6]
102 = {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030};
105 if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7)
107 // Set TX SYNC power G2G3 loop filter
108 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
109 RF_TXPA_G2, bMask20Bits, 0x0f000);
110 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
111 RF_TXPA_G3, bMask20Bits, 0xeacf1);
113 // Change TX AGC gain table
114 for (i = 0; i < 6; i++)
115 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
116 RF_TX_AGC, bMask20Bits, tx_gain_tbl1[i]);
118 // Set PA to high value
119 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
120 RF_TXPA_G2, bMask20Bits, 0x01e39);
122 else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8)
124 // Set TX SYNC power G2G3 loop filter
125 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
126 RF_TXPA_G2, bMask20Bits, 0x04440);
127 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
128 RF_TXPA_G3, bMask20Bits, 0xea4f1);
130 // Change TX AGC gain table
131 for (i = 0; i < 6; i++)
132 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
133 RF_TX_AGC, bMask20Bits, tx_gain_tbl2[i]);
136 PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
137 RF_TXPA_G2, bMask20Bits, 0x01e19);
141 } /* RF_ChangeTxPath */
144 /*-----------------------------------------------------------------------------
145 * Function: PHY_RF6052SetBandwidth()
147 * Overview: This function is called by SetBWModeCallback8190Pci() only
149 * Input: PADAPTER Adapter
150 * WIRELESS_BANDWIDTH_E Bandwidth //20M or 40M
156 * Note: For RF type 0222D
157 *---------------------------------------------------------------------------*/
158 void PHY_RF6052SetBandwidth(struct net_device* dev, HT_CHANNEL_WIDTH Bandwidth) //20M or 40M
161 //struct r8192_priv *priv = ieee80211_priv(dev);
164 //if (priv->card_8192 == NIC_8192SE)
165 #ifdef RTL8192SU //YJ,test,090113
169 case HT_CHANNEL_WIDTH_20:
170 //if (priv->card_8192_version >= VERSION_8192S_BCUT)
171 // rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x58);
173 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x01);
175 case HT_CHANNEL_WIDTH_20_40:
176 //if (priv->card_8192_version >= VERSION_8192S_BCUT)
177 // rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, 0xff, 0x18);
179 rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x00);
182 RT_TRACE(COMP_DBG, "PHY_SetRF6052Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth);
189 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
193 case HT_CHANNEL_WIDTH_20:
194 //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, (BIT10|BIT11), 0x01);
196 case HT_CHANNEL_WIDTH_20_40:
197 //PHY_SetRFReg(Adapter, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, (BIT10|BIT11), 0x00);
200 RT_TRACE(COMP_DBG, "PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
210 /*-----------------------------------------------------------------------------
211 * Function: PHY_RF6052SetCckTxPower
223 * 11/05/2008 MHC Simulate 8192series..
225 *---------------------------------------------------------------------------*/
226 extern void PHY_RF6052SetCckTxPower(struct net_device* dev, u8 powerlevel)
228 struct r8192_priv *priv = ieee80211_priv(dev);
231 if(priv->ieee80211->scanning == 1)
233 else if(priv->bDynamicTxLowPower == true)//cosa 04282008 for cck long range
238 //cosa add for lenovo, to pass the safety spec, don't increase power index for different rates.
239 if(priv->bIgnoreDiffRateTxPowerOffset)
242 if(TxAGC > RF6052_MAX_TX_PWR)
243 TxAGC = RF6052_MAX_TX_PWR;
245 //printk("CCK PWR= %x\n", TxAGC);
246 rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
248 } /* PHY_RF6052SetCckTxPower */
252 /*-----------------------------------------------------------------------------
253 * Function: PHY_RF6052SetOFDMTxPower
255 * Overview: For legacy and HY OFDM, we must read EEPROM TX power index for
256 * different channel and read original value in TX power register area from
257 * 0xe00. We increase offset and original value to be correct tx pwr.
267 * 11/05/2008 MHC Simulate 8192 series method.
268 * 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to
269 * A/B pwr difference or legacy/HT pwr diff.
270 * 2. We concern with path B legacy/HT OFDM difference.
271 * 01/22/2009 MHC Support new EPRO format from SD3.
272 *---------------------------------------------------------------------------*/
274 extern void PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8 powerlevel)
276 struct r8192_priv *priv = ieee80211_priv(dev);
277 u32 writeVal, powerBase0, powerBase1;
279 u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
280 //u8 byte0, byte1, byte2, byte3;
281 u8 Channel = priv->ieee80211->current_network.channel;
283 u8 rfa_lower_bound = 0, rfa_upper_bound = 0 /*, rfa_htpwr, rfa_legacypwr*/;
286 u8 Legacy_pwrdiff=0, HT20_pwrdiff=0, BandEdge_Pwrdiff=0;
287 u8 ofdm_bandedge_chnl_low=0, ofdm_bandedge_chnl_high=0;
290 // We only care about the path A for legacy.
291 if (priv->EEPROMVersion != 2)
292 powerBase0 = powerlevel + (priv->LegacyHTTxPowerDiff & 0xf);
293 else if (priv->EEPROMVersion == 2) // Defined by SD1 Jong
296 // 2009/01/21 MH Support new EEPROM format from SD3 requirement
298 Legacy_pwrdiff = priv->TxPwrLegacyHtDiff[RF90_PATH_A][Channel-1];
299 // For legacy OFDM, tx pwr always > HT OFDM pwr. We do not care Path B
300 // legacy OFDM pwr diff. NO BB register to notify HW.
301 powerBase0 = powerlevel + Legacy_pwrdiff;
302 //RTPRINT(FPHY, PHY_TXPWR, (" [LagacyToHT40 pwr diff = %d]\n", Legacy_pwrdiff));
304 // Band Edge scheme is enabled for FCC mode
305 if (priv->TxPwrbandEdgeFlag == 1/* && pHalData->ChannelPlan == 0*/)
307 ofdm_bandedge_chnl_low = 1;
308 ofdm_bandedge_chnl_high = 11;
309 #if 0//cosa, Todo: check ofdm 40MHz, when lower and duplicate, the bandedge chnl low=3, high=9
310 if (pHalData->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
311 { // Is it the same with the document?
312 if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
313 else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER;
315 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
318 BandEdge_Pwrdiff = 0;
319 if (Channel <= ofdm_bandedge_chnl_low)
320 BandEdge_Pwrdiff = priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][0];
321 else if (Channel >= ofdm_bandedge_chnl_high)
323 BandEdge_Pwrdiff = priv->TxPwrbandEdgeLegacyOfdm[RF90_PATH_A][1];
325 powerBase0 -= BandEdge_Pwrdiff;
326 if (Channel <= ofdm_bandedge_chnl_low || Channel >= ofdm_bandedge_chnl_high)
328 //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM band-edge channel = %d, pwr diff = %d]\n",
329 //Channel, BandEdge_Pwrdiff));
332 //RTPRINT(FPHY, PHY_TXPWR, (" [OFDM power base index = 0x%x]\n", powerBase0));
334 powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
337 if(priv->EEPROMVersion == 2)
339 //Cosa add for new EEPROM content. 02102009
341 //Check HT20 to HT40 diff
342 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
344 // HT 20<->40 pwr diff
345 HT20_pwrdiff = priv->TxPwrHt20Diff[RF90_PATH_A][Channel-1];
347 // Calculate Antenna pwr diff
348 if (HT20_pwrdiff < 8) // 0~+7
349 powerlevel += HT20_pwrdiff;
350 else // index8-15=-8~-1
351 powerlevel -= (16-HT20_pwrdiff);
353 //RTPRINT(FPHY, PHY_TXPWR, (" [HT20 to HT40 pwrdiff = %d]\n", HT20_pwrdiff));
354 //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index = 0x%x]\n", powerlevel));
357 // Band Edge scheme is enabled for FCC mode
358 if (priv->TxPwrbandEdgeFlag == 1/* && pHalData->ChannelPlan == 0*/)
360 BandEdge_Pwrdiff = 0;
361 if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
364 BandEdge_Pwrdiff = priv->TxPwrbandEdgeHt40[RF90_PATH_A][0];
365 else if (Channel >= 9)
366 BandEdge_Pwrdiff = priv->TxPwrbandEdgeHt40[RF90_PATH_A][1];
367 if (Channel <= 3 || Channel >= 9)
369 //RTPRINT(FPHY, PHY_TXPWR, (" [HT40 band-edge channel = %d, pwr diff = %d]\n",
370 //Channel, BandEdge_Pwrdiff));
373 else if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
376 BandEdge_Pwrdiff = priv->TxPwrbandEdgeHt20[RF90_PATH_A][0];
377 else if (Channel >= 11)
378 BandEdge_Pwrdiff = priv->TxPwrbandEdgeHt20[RF90_PATH_A][1];
379 if (Channel <= 1 || Channel >= 11)
381 //RTPRINT(FPHY, PHY_TXPWR, (" [HT20 band-edge channel = %d, pwr diff = %d]\n",
382 //Channel, BandEdge_Pwrdiff));
385 powerlevel -= BandEdge_Pwrdiff;
386 //RTPRINT(FPHY, PHY_TXPWR, (" [MCS power base index = 0x%x]\n", powerlevel));
389 powerBase1 = powerlevel;
390 powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
392 //RTPRINT(FPHY, PHY_TXPWR, (" [Legacy/HT power index= %x/%x]\n", powerBase0, powerBase1));
394 for(index=0; index<6; index++)
397 // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate
399 //cosa add for lenovo, to pass the safety spec, don't increase power index for different rates.
400 if(priv->bIgnoreDiffRateTxPowerOffset)
401 writeVal = ((index<2)?powerBase0:powerBase1);
403 writeVal = priv->MCSTxPowerLevelOriginalOffset[index] + ((index<2)?powerBase0:powerBase1);
405 //RTPRINT(FPHY, PHY_TXPWR, ("Reg 0x%x, Original=%x writeVal=%x\n",
406 //RegOffset[index], priv->MCSTxPowerLevelOriginalOffset[index], writeVal));
409 // If path A and Path B coexist, we must limit Path A tx power.
410 // Protect Path B pwr over or under flow. We need to calculate upper and
411 // lower bound of path A tx power.
413 if (priv->rf_type == RF_2T2R)
415 #if 0//cosa, we have only one AntennaTxPwDiff
419 rf_pwr_diff = pHalData->AntennaTxPwDiff[0];
424 rf_pwr_diff = pHalData->AntTxPwDiffLegacy[0];
427 rf_pwr_diff = priv->AntennaTxPwDiff[0];
428 //RTPRINT(FPHY, PHY_TXPWR, ("2T2R RF-B to RF-A PWR DIFF=%d\n", rf_pwr_diff));
430 if (rf_pwr_diff >= 8) // Diff=-8~-1
431 { // Prevent underflow!!
432 rfa_lower_bound = 0x10-rf_pwr_diff;
433 //RTPRINT(FPHY, PHY_TXPWR, ("rfa_lower_bound= %d\n", rfa_lower_bound));
435 else if (rf_pwr_diff >= 0) // Diff = 0-7
437 rfa_upper_bound = RF6052_MAX_TX_PWR-rf_pwr_diff;
438 //RTPRINT(FPHY, PHY_TXPWR, ("rfa_upper_bound= %d\n", rfa_upper_bound));
442 for (i= 0; i <4; i++)
444 rfa_pwr[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
445 if (rfa_pwr[i] > RF6052_MAX_TX_PWR)
446 rfa_pwr[i] = RF6052_MAX_TX_PWR;
449 // If path A and Path B coexist, we must limit Path A tx power.
450 // Protect Path B pwr over or under flow. We need to calculate upper and
451 // lower bound of path A tx power.
453 if (priv->rf_type == RF_2T2R)
455 if (rf_pwr_diff >= 8) // Diff=-8~-1
456 { // Prevent underflow!!
457 if (rfa_pwr[i] <rfa_lower_bound)
459 //RTPRINT(FPHY, PHY_TXPWR, ("Underflow"));
460 rfa_pwr[i] = rfa_lower_bound;
463 else if (rf_pwr_diff >= 1) // Diff = 0-7
464 { // Prevent overflow
465 if (rfa_pwr[i] > rfa_upper_bound)
467 //RTPRINT(FPHY, PHY_TXPWR, ("Overflow"));
468 rfa_pwr[i] = rfa_upper_bound;
471 //RTPRINT(FPHY, PHY_TXPWR, ("rfa_pwr[%d]=%x\n", i, rfa_pwr[i]));
477 // Add description: PWDB > threshold!!!High power issue!!
478 // We must decrease tx power !! Why is the value ???
480 if(priv->bDynamicTxHighPower == TRUE)
485 writeVal = 0x03030303;
490 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
492 //RTPRINT(FPHY, PHY_TXPWR, ("HighPower=%08x\n", writeVal));
496 writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
497 //RTPRINT(FPHY, PHY_TXPWR, ("NormalPower=%08x\n", writeVal));
501 // Write different rate set tx power index.
503 //if (DCMD_Test_Flag == 0)
504 rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
507 } /* PHY_RF6052SetOFDMTxPower */
509 extern void PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8 powerlevel)
511 struct r8192_priv *priv = ieee80211_priv(dev);
512 u32 writeVal, powerBase0, powerBase1;
514 u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
515 u8 byte0, byte1, byte2, byte3;
516 u8 channel = priv->ieee80211->current_network.channel;
519 powerBase0 = powerlevel + (priv->LegacyHTTxPowerDiff & 0xf);
520 powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
523 powerBase1 = powerlevel;
524 powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
526 //printk("Legacy/HT PWR= %x/%x\n", powerBase0, powerBase1);
528 for(index=0; index<6; index++)
531 // Index 0 & 1= legacy OFDM, 2-5=HT_MCS rate
533 writeVal = priv->MCSTxPowerLevelOriginalOffset[index] + ((index<2)?powerBase0:powerBase1);
535 //printk("Index = %d Original=%x writeVal=%x\n", index, priv->MCSTxPowerLevelOriginalOffset[index], writeVal);
537 byte0 = (u8)(writeVal & 0x7f);
538 byte1 = (u8)((writeVal & 0x7f00)>>8);
539 byte2 = (u8)((writeVal & 0x7f0000)>>16);
540 byte3 = (u8)((writeVal & 0x7f000000)>>24);
542 // Max power index = 0x3F Range = 0-0x3F
543 if(byte0 > RF6052_MAX_TX_PWR)
544 byte0 = RF6052_MAX_TX_PWR;
545 if(byte1 > RF6052_MAX_TX_PWR)
546 byte1 = RF6052_MAX_TX_PWR;
547 if(byte2 > RF6052_MAX_TX_PWR)
548 byte2 = RF6052_MAX_TX_PWR;
549 if(byte3 > RF6052_MAX_TX_PWR)
550 byte3 = RF6052_MAX_TX_PWR;
553 // Add description: PWDB > threshold!!!High power issue!!
554 // We must decrease tx power !! Why is the value ???
556 if(priv->bDynamicTxHighPower == true)
561 writeVal = 0x03030303;
566 writeVal = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
571 writeVal = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
575 // Write different rate set tx power index.
577 rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
580 } /* PHY_RF6052SetOFDMTxPower */
583 RT_STATUS PHY_RF6052_Config(struct net_device* dev)
585 struct r8192_priv *priv = ieee80211_priv(dev);
586 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
587 //RF90_RADIO_PATH_E eRFPath;
588 //BB_REGISTER_DEFINITION_T *pPhyReg;
589 //u32 OrgStoreRFIntSW[RF90_PATH_D+1];
592 // Initialize general global value
594 // TODO: Extend RF_PATH_C and RF_PATH_D in the future
595 if(priv->rf_type == RF_1T1R)
596 priv->NumTotalRFPath = 1;
598 priv->NumTotalRFPath = 2;
603 // switch( priv->bRegHwParaFile )
606 // phy_RF6052_Config_HardCode(dev);
610 rtStatus = phy_RF6052_Config_ParaFile(dev);
615 // phy_RF6052_Config_HardCode(dev);
616 // phy_RF6052_Config_ParaFile(dev);
620 // phy_RF6052_Config_HardCode(dev);
627 void phy_RF6052_Config_HardCode(struct net_device* dev)
630 // Set Default Bandwidth to 20M
631 //Adapter->HalFunc .SetBWModeHandler(Adapter, HT_CHANNEL_WIDTH_20);
633 // TODO: Set Default Channel to channel one for RTL8225
637 RT_STATUS phy_RF6052_Config_ParaFile(struct net_device* dev)
640 //static s1Byte szRadioAFile[] = RTL819X_PHY_RADIO_A;
641 //static s1Byte szRadioBFile[] = RTL819X_PHY_RADIO_B;
642 //static s1Byte szRadioBGMFile[] = RTL819X_PHY_RADIO_B_GM;
644 RT_STATUS rtStatus = RT_STATUS_SUCCESS;
645 struct r8192_priv *priv = ieee80211_priv(dev);
646 BB_REGISTER_DEFINITION_T *pPhyReg;
650 //3//-----------------------------------------------------------------
651 //3// <2> Initialize RF
652 //3//-----------------------------------------------------------------
653 //for(eRFPath = RF90_PATH_A; eRFPath <pHalData->NumTotalRFPath; eRFPath++)
654 for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
657 pPhyReg = &priv->PHYRegDef[eRFPath];
659 /*----Store original RFENV control type----*/
664 u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
668 u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
672 /*----Set RF_ENV enable----*/
673 rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
675 /*----Set RF_ENV output high----*/
676 rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
678 /* Set bit number of Address and Data for RF register */
679 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0); // Set 1 to 4 bits for 8255
680 rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0); // Set 0 to 12 bits for 8255
683 /*----Initialize RF fom connfiguration file----*/
687 #if RTL8190_Download_Firmware_From_Header
688 rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
690 rtStatus = PHY_ConfigRFWithParaFile(Adapter, (char* )&szRadioAFile, (RF90_RADIO_PATH_E)eRFPath);
694 #if RTL8190_Download_Firmware_From_Header
695 rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
697 if(priv->rf_type == RF_2T2R_GREEN)
698 rtStatus = PHY_ConfigRFWithParaFile(Adapter, (ps1Byte)&szRadioBGMFile, (RF90_RADIO_PATH_E)eRFPath);
700 rtStatus = PHY_ConfigRFWithParaFile(Adapter, (char* )&szRadioBFile, (RF90_RADIO_PATH_E)eRFPath);
709 /*----Restore RFENV control type----*/;
714 rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
718 rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
722 if(rtStatus != RT_STATUS_SUCCESS){
723 printk("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
724 goto phy_RF6052_Config_ParaFile_Fail;
729 RT_TRACE(COMP_INIT, "<---phy_RF6052_Config_ParaFile()\n");
732 phy_RF6052_Config_ParaFile_Fail:
738 // ==> RF shadow Operation API Code Section!!!
740 /*-----------------------------------------------------------------------------
741 * Function: PHY_RFShadowRead
743 * PHY_RFShadowCompare
744 * PHY_RFShadowRecorver
745 * PHY_RFShadowCompareAll
746 * PHY_RFShadowRecorverAll
747 * PHY_RFShadowCompareFlagSet
748 * PHY_RFShadowRecorverFlagSet
750 * Overview: When we set RF register, we must write shadow at first.
751 * When we are running, we must compare shadow abd locate error addr.
752 * Decide to recorver or not.
762 * 11/20/2008 MHC Create Version 0.
764 *---------------------------------------------------------------------------*/
765 extern u32 PHY_RFShadowRead(
766 struct net_device * dev,
767 RF90_RADIO_PATH_E eRFPath,
770 return RF_Shadow[eRFPath][Offset].Value;
772 } /* PHY_RFShadowRead */
775 extern void PHY_RFShadowWrite(
776 struct net_device * dev,
781 //RF_Shadow[eRFPath][Offset].Value = (Data & bMask20Bits);
782 RF_Shadow[eRFPath][Offset].Value = (Data & bRFRegOffsetMask);
783 RF_Shadow[eRFPath][Offset].Driver_Write = true;
785 } /* PHY_RFShadowWrite */
788 extern void PHY_RFShadowCompare(
789 struct net_device * dev,
790 RF90_RADIO_PATH_E eRFPath,
795 // Check if we need to check the register
796 if (RF_Shadow[eRFPath][Offset].Compare == true)
798 reg = rtl8192_phy_QueryRFReg(dev, eRFPath, Offset, bRFRegOffsetMask);
799 // Compare shadow and real rf register for 20bits!!
800 if (RF_Shadow[eRFPath][Offset].Value != reg)
802 // Locate error position.
803 RF_Shadow[eRFPath][Offset].ErrorOrNot = true;
804 RT_TRACE(COMP_INIT, "PHY_RFShadowCompare RF-%d Addr%02xErr = %05x", eRFPath, Offset, reg);
808 } /* PHY_RFShadowCompare */
810 extern void PHY_RFShadowRecorver(
811 struct net_device * dev,
812 RF90_RADIO_PATH_E eRFPath,
815 // Check if the address is error
816 if (RF_Shadow[eRFPath][Offset].ErrorOrNot == true)
818 // Check if we need to recorver the register.
819 if (RF_Shadow[eRFPath][Offset].Recorver == true)
821 rtl8192_phy_SetRFReg(dev, eRFPath, Offset, bRFRegOffsetMask, RF_Shadow[eRFPath][Offset].Value);
822 RT_TRACE(COMP_INIT, "PHY_RFShadowRecorver RF-%d Addr%02x=%05x",
823 eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value);
827 } /* PHY_RFShadowRecorver */
830 extern void PHY_RFShadowCompareAll(struct net_device * dev)
835 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
837 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
839 PHY_RFShadowCompare(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
843 } /* PHY_RFShadowCompareAll */
846 extern void PHY_RFShadowRecorverAll(struct net_device * dev)
851 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
853 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
855 PHY_RFShadowRecorver(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
859 } /* PHY_RFShadowRecorverAll */
862 extern void PHY_RFShadowCompareFlagSet(
863 struct net_device * dev,
864 RF90_RADIO_PATH_E eRFPath,
868 // Set True or False!!!
869 RF_Shadow[eRFPath][Offset].Compare = Type;
871 } /* PHY_RFShadowCompareFlagSet */
874 extern void PHY_RFShadowRecorverFlagSet(
875 struct net_device * dev,
876 RF90_RADIO_PATH_E eRFPath,
880 // Set True or False!!!
881 RF_Shadow[eRFPath][Offset].Recorver= Type;
883 } /* PHY_RFShadowRecorverFlagSet */
886 extern void PHY_RFShadowCompareFlagSetAll(struct net_device * dev)
891 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
893 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
895 // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
896 if (Offset != 0x26 && Offset != 0x27)
897 PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, FALSE);
899 PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, TRUE);
903 } /* PHY_RFShadowCompareFlagSetAll */
906 extern void PHY_RFShadowRecorverFlagSetAll(struct net_device * dev)
911 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
913 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
915 // 2008/11/20 MH For S3S4 test, we only check reg 26/27 now!!!!
916 if (Offset != 0x26 && Offset != 0x27)
917 PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, FALSE);
919 PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, TRUE);
923 } /* PHY_RFShadowCompareFlagSetAll */
927 extern void PHY_RFShadowRefresh(struct net_device * dev)
932 for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
934 for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
936 RF_Shadow[eRFPath][Offset].Value = 0;
937 RF_Shadow[eRFPath][Offset].Compare = false;
938 RF_Shadow[eRFPath][Offset].Recorver = false;
939 RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
940 RF_Shadow[eRFPath][Offset].Driver_Write = false;
944 } /* PHY_RFShadowRead */
946 /* End of HalRf6052.c */