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"
24
/*---------------------------Define Local Constant---------------------------*/
25
typedef struct RF_Shadow_Compare_Map {
32
/*---------------------------Define Local Constant---------------------------*/
35
/*------------------------Define global variable-----------------------------*/
36
/*------------------------Define global variable-----------------------------*/
41
/*---------------------Define local function prototype-----------------------*/
42
void phy_RF6052_Config_HardCode(struct net_device* dev);
44
bool phy_RF6052_Config_ParaFile(struct net_device* dev);
45
/*---------------------Define local function prototype-----------------------*/
47
/*------------------------Define function prototype--------------------------*/
48
extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate);
50
/*------------------------Define function prototype--------------------------*/
52
/*------------------------Define local variable------------------------------*/
53
static RF_SHADOW_T RF_Shadow[RF6052_MAX_PATH][RF6052_MAX_REG];
54
/*------------------------Define local variable------------------------------*/
56
/*------------------------Define function prototype--------------------------*/
57
extern void RF_ChangeTxPath(struct net_device* dev, u16 DataRate)
60
static u1Byte RF_Path_Type = 2;
61
static u4Byte tx_gain_tbl1[6]
62
= {0x17f50, 0x11f40, 0x0cf30, 0x08720, 0x04310, 0x00100};
63
static u4Byte tx_gain_tbl2[6]
64
= {0x15ea0, 0x10e90, 0x0c680, 0x08250, 0x04040, 0x00030};
67
if (RF_Path_Type == 2 && (DataRate&0xF) <= 0x7)
69
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
70
RF_TXPA_G2, bMask20Bits, 0x0f000);
71
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
72
RF_TXPA_G3, bMask20Bits, 0xeacf1);
74
for (i = 0; i < 6; i++)
75
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
76
RF_TX_AGC, bMask20Bits, tx_gain_tbl1[i]);
78
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
79
RF_TXPA_G2, bMask20Bits, 0x01e39);
81
else if (RF_Path_Type == 1 && (DataRate&0xF) >= 0x8)
83
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
84
RF_TXPA_G2, bMask20Bits, 0x04440);
85
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
86
RF_TXPA_G3, bMask20Bits, 0xea4f1);
88
for (i = 0; i < 6; i++)
89
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
90
RF_TX_AGC, bMask20Bits, tx_gain_tbl2[i]);
92
PHY_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,
93
RF_TXPA_G2, bMask20Bits, 0x01e19);
97
} /* RF_ChangeTxPath */
100
void PHY_RF6052SetBandwidth(struct net_device* dev, HT_CHANNEL_WIDTH Bandwidth)
103
struct r8192_priv *priv = rtllib_priv(dev);
106
if (IS_HARDWARE_TYPE_8192SE(dev))
108
#if (RTL92SE_FPGA_VERIFY == 0)
111
case HT_CHANNEL_WIDTH_20:
113
priv->RfRegChnlVal[0] = ((priv->RfRegChnlVal[0] & 0xfffff3ff) | 0x0400);
114
rtl8192_phy_SetRFReg(dev, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, priv->RfRegChnlVal[0]);
116
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x01);
119
case HT_CHANNEL_WIDTH_20_40:
121
priv->RfRegChnlVal[0] = ((priv->RfRegChnlVal[0] & 0xfffff3ff));
122
rtl8192_phy_SetRFReg(dev, RF90_PATH_A, RF_CHNLBW, bRFRegOffsetMask, priv->RfRegChnlVal[0]);
124
rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A, RF_CHNLBW, BIT10|BIT11, 0x00);
128
RT_TRACE(COMP_DBG, "PHY_SetRF6052Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth);
135
for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
139
case HT_CHANNEL_WIDTH_20:
141
case HT_CHANNEL_WIDTH_20_40:
144
RT_TRACE(COMP_DBG, "PHY_SetRF8225Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
153
extern void PHY_RF6052SetCckTxPower(struct net_device* dev, u8 powerlevel)
155
struct r8192_priv *priv = rtllib_priv(dev);
157
bool dontIncCCKOrTurboScanOff=false;
159
if (((priv->eeprom_version >= 2) && (priv->TxPwrSafetyFlag == 1)) ||
160
((priv->eeprom_version >= 2) && (priv->EEPROMRegulatory != 0))) {
161
dontIncCCKOrTurboScanOff = true;
164
if(rtllib_act_scanning(priv->rtllib,true) == true){
167
if(dontIncCCKOrTurboScanOff )
172
if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
174
else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
178
if(TxAGC > RF6052_MAX_TX_PWR)
179
TxAGC = RF6052_MAX_TX_PWR;
181
rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
183
} /* PHY_RF6052SetCckTxPower */
187
extern void PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8 powerlevel, u8 Channel)
189
struct r8192_priv *priv = rtllib_priv(dev);
190
u32 writeVal, powerBase0, powerBase1;
192
u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
194
u8 rfa_lower_bound = 0, rfa_upper_bound = 0;
196
u8 rf_pwr_diff = 0, chnlGroup = 0;
197
u8 Legacy_pwrdiff=0, HT20_pwrdiff=0;
199
if (priv->eeprom_version < 2)
200
powerBase0 = powerlevel + (priv->LegacyHTTxPowerDiff & 0xf);
201
else if (priv->eeprom_version >= 2)
203
Legacy_pwrdiff = priv->TxPwrLegacyHtDiff[RF90_PATH_A][Channel-1];
204
powerBase0 = powerlevel + Legacy_pwrdiff;
205
RT_TRACE(COMP_POWER, " [LagacyToHT40 pwr diff = %d]\n", Legacy_pwrdiff);
206
RT_TRACE(COMP_POWER, " [OFDM power base index = 0x%x]\n", powerBase0);
208
powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
210
if(priv->eeprom_version >= 2)
213
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
215
HT20_pwrdiff = priv->TxPwrHt20Diff[RF90_PATH_A][Channel-1];
217
if (HT20_pwrdiff < 8)
218
powerlevel += HT20_pwrdiff;
220
powerlevel -= (16-HT20_pwrdiff);
222
RT_TRACE(COMP_POWER, " [HT20 to HT40 pwrdiff = %d]\n", HT20_pwrdiff);
223
RT_TRACE(COMP_POWER, " [MCS power base index = 0x%x]\n", powerlevel);
226
powerBase1 = powerlevel;
227
powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
229
RT_TRACE(COMP_POWER, " [Legacy/HT power index= %x/%x]\n", powerBase0, powerBase1);
231
for(index=0; index<6; index++)
234
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
236
writeVal = ((index<2)?powerBase0:powerBase1);
240
if(priv->pwrGroupCnt == 0)
242
if(priv->pwrGroupCnt >= 3)
246
else if(Channel >= 4 && Channel <= 9)
248
else if(Channel >= 10)
250
if(priv->pwrGroupCnt == 4)
255
writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
256
((index<2)?powerBase0:powerBase1);
258
RT_TRACE(COMP_POWER, "Reg 0x%x, chnlGroup = %d, Original=%x writeVal=%x\n",
259
RegOffset[index], chnlGroup, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index],
262
if (priv->rf_type == RF_2T2R)
264
rf_pwr_diff = priv->AntennaTxPwDiff[0];
265
RT_TRACE(COMP_POWER, "2T2R RF-B to RF-A PWR DIFF=%d\n", rf_pwr_diff);
267
if (rf_pwr_diff >= 8)
269
rfa_lower_bound = 0x10-rf_pwr_diff;
270
RT_TRACE(COMP_POWER, "rfa_lower_bound= %d\n", rfa_lower_bound);
272
else if (rf_pwr_diff >= 0)
274
rfa_upper_bound = RF6052_MAX_TX_PWR-rf_pwr_diff;
275
RT_TRACE(COMP_POWER, "rfa_upper_bound= %d\n", rfa_upper_bound);
279
for (i= 0; i <4; i++)
281
rfa_pwr[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
282
if (rfa_pwr[i] > RF6052_MAX_TX_PWR)
283
rfa_pwr[i] = RF6052_MAX_TX_PWR;
285
if (priv->rf_type == RF_2T2R)
287
if (rf_pwr_diff >= 8)
289
if (rfa_pwr[i] <rfa_lower_bound)
291
RT_TRACE(COMP_POWER, "Underflow");
292
rfa_pwr[i] = rfa_lower_bound;
295
else if (rf_pwr_diff >= 1)
297
if (rfa_pwr[i] > rfa_upper_bound)
299
RT_TRACE(COMP_POWER, "Overflow");
300
rfa_pwr[i] = rfa_upper_bound;
303
RT_TRACE(COMP_POWER, "rfa_pwr[%d]=%x\n", i, rfa_pwr[i]);
309
writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
310
RT_TRACE(COMP_POWER, "WritePower=%08x\n", writeVal);
312
if(priv->bDynamicTxHighPower == true)
316
writeVal = 0x03030303;
320
writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
322
RT_TRACE(COMP_POWER, "HighPower=%08x\n", writeVal);
326
writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
327
RT_TRACE(COMP_POWER, "NormalPower=%08x\n", writeVal);
330
rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
333
} /* PHY_RF6052SetOFDMTxPower */
337
struct net_device* dev,
345
struct r8192_priv *priv = rtllib_priv(dev);
346
u32 powerBase0, powerBase1;
347
u8 Legacy_pwrdiff=0, HT20_pwrdiff=0;
351
powerlevel[i] = pPowerLevel[i];
352
if (priv->eeprom_version < 2)
353
powerBase0 = powerlevel[0] + (priv->LegacyHTTxPowerDiff & 0xf);
354
else if (priv->eeprom_version >= 2)
356
Legacy_pwrdiff = priv->TxPwrLegacyHtDiff[RF90_PATH_A][Channel-1];
357
powerBase0 = powerlevel[0] + Legacy_pwrdiff;
359
powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
360
*OfdmBase = powerBase0;
361
RT_TRACE(COMP_POWER, " [OFDM power base index = 0x%x]\n", powerBase0);
363
if(priv->eeprom_version >= 2)
365
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
369
HT20_pwrdiff = priv->TxPwrHt20Diff[i][Channel-1];
370
if (HT20_pwrdiff < 8)
371
powerlevel[i] += HT20_pwrdiff;
373
powerlevel[i] -= (16-HT20_pwrdiff);
377
powerBase1 = powerlevel[0];
378
powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
379
*MCSBase = powerBase1;
381
RT_TRACE(COMP_POWER, " [MCS power base index = 0x%x]\n", powerBase1);
383
pFinalPowerIndex[0] = powerlevel[0];
384
pFinalPowerIndex[1] = powerlevel[1];
385
switch(priv->EEPROMRegulatory)
388
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
390
pFinalPowerIndex[0] += priv->PwrGroupHT40[RF90_PATH_A][Channel-1];
391
pFinalPowerIndex[1] += priv->PwrGroupHT40[RF90_PATH_B][Channel-1];
395
pFinalPowerIndex[0] += priv->PwrGroupHT20[RF90_PATH_A][Channel-1];
396
pFinalPowerIndex[1] += priv->PwrGroupHT20[RF90_PATH_B][Channel-1];
402
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
404
RT_TRACE(COMP_POWER, "40MHz finalPowerIndex (A / B) = 0x%x / 0x%x\n",
405
pFinalPowerIndex[0], pFinalPowerIndex[1]);
409
RT_TRACE(COMP_POWER, "20MHz finalPowerIndex (A / B) = 0x%x / 0x%x\n",
410
pFinalPowerIndex[0], pFinalPowerIndex[1]);
414
void getTxPowerWriteValByRegulatory(
415
struct net_device* dev,
423
struct r8192_priv *priv = rtllib_priv(dev);
424
u8 i, chnlGroup, pwr_diff_limit[4];
425
u32 writeVal, customer_limit;
427
switch(priv->EEPROMRegulatory)
431
RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
432
chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
433
writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
434
((index<2)?powerBase0:powerBase1);
435
RT_TRACE(COMP_POWER,"RTK better performance, writeVal = 0x%x\n", writeVal);
438
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
440
writeVal = ((index<2)?powerBase0:powerBase1);
441
RT_TRACE(COMP_POWER,"Realtek regulatory, 40MHz, writeVal = 0x%x\n", writeVal);
445
if(priv->pwrGroupCnt == 1)
447
if(priv->pwrGroupCnt >= 3)
451
else if(Channel >= 4 && Channel <= 8)
455
if(priv->pwrGroupCnt == 4)
458
RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
459
chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
460
writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
461
((index<2)?powerBase0:powerBase1);
462
RT_TRACE(COMP_POWER,"Realtek regulatory, 20MHz, writeVal = 0x%x\n", writeVal);
466
writeVal = ((index<2)?powerBase0:powerBase1);
467
RT_TRACE(COMP_POWER,"Better regulatory, writeVal = 0x%x\n", writeVal);
471
RT_TRACE(COMP_POWER,"MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
472
chnlGroup, index, priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]);
474
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
476
RT_TRACE(COMP_POWER,"customer's limit, 40MHz = 0x%x\n",
477
priv->PwrGroupHT40[RF90_PATH_A][Channel-1]);
481
RT_TRACE(COMP_POWER,"customer's limit, 20MHz = 0x%x\n",
482
priv->PwrGroupHT20[RF90_PATH_A][Channel-1]);
486
pwr_diff_limit[i] = (u8)((priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index]&(0x7f<<(i*8)))>>(i*8));
487
if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
489
if(pwr_diff_limit[i] > priv->PwrGroupHT40[RF90_PATH_A][Channel-1])
491
pwr_diff_limit[i] = priv->PwrGroupHT40[RF90_PATH_A][Channel-1];
496
if(pwr_diff_limit[i] > priv->PwrGroupHT20[RF90_PATH_A][Channel-1])
498
pwr_diff_limit[i] = priv->PwrGroupHT20[RF90_PATH_A][Channel-1];
502
customer_limit = (pwr_diff_limit[3]<<24) | (pwr_diff_limit[2]<<16) |
503
(pwr_diff_limit[1]<<8) | (pwr_diff_limit[0]);
504
RT_TRACE(COMP_POWER,"Customer's limit = 0x%x\n", customer_limit);
506
writeVal = customer_limit + ((index<2)?powerBase0:powerBase1);
507
RT_TRACE(COMP_POWER,"Customer, writeVal = 0x%x\n", writeVal);
511
writeVal = priv->MCSTxPowerLevelOriginalOffset[chnlGroup][index] +
512
((index<2)?powerBase0:powerBase1);
513
RT_TRACE(COMP_POWER,"RTK better performance, writeVal = 0x%x\n", writeVal);
517
if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level1)
518
writeVal = 0x10101010;
519
else if(priv->DynamicTxHighPowerLvl == TxHighPwrLevel_Level2)
522
*pOutWriteVal = writeVal;
527
struct net_device* dev,
531
struct r8192_priv *priv = rtllib_priv(dev);
535
if (priv->rf_type == RF_2T2R)
537
ant_pwr_diff = pFinalPowerIndex[1] - pFinalPowerIndex[0];
541
if(ant_pwr_diff < -8)
543
RT_TRACE(COMP_POWER,"Antenna Diff from RF-B to RF-A = %d (0x%x)\n",
544
ant_pwr_diff, ant_pwr_diff&0xf);
547
priv->AntennaTxPwDiff[2] = 0;
548
priv->AntennaTxPwDiff[1] = 0;
549
priv->AntennaTxPwDiff[0] = (u8)(ant_pwr_diff);
551
u4RegValue = (priv->AntennaTxPwDiff[2]<<8 |
552
priv->AntennaTxPwDiff[1]<<4 |
553
priv->AntennaTxPwDiff[0] );
555
rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
556
(bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
558
RT_TRACE(COMP_POWER,"Write BCD-Diff(0x%x) = 0x%x\n",
559
rFPGA0_TxGainStage, u4RegValue);
562
void writeOFDMPowerReg(
563
struct net_device* dev,
568
struct r8192_priv *priv = rtllib_priv(dev);
569
u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
571
u8 rfa_lower_bound = 0, rfa_upper_bound = 0, rf_pwr_diff = 0;
573
if (priv->rf_type == RF_2T2R)
575
rf_pwr_diff = priv->AntennaTxPwDiff[0];
577
if (rf_pwr_diff >= 8)
579
rfa_lower_bound = 0x10-rf_pwr_diff;
580
RT_TRACE(COMP_POWER,"rfa_lower_bound= %d\n", rfa_lower_bound);
584
rfa_upper_bound = RF6052_MAX_TX_PWR-rf_pwr_diff;
585
RT_TRACE(COMP_POWER,"rfa_upper_bound= %d\n", rfa_upper_bound);
591
rfa_pwr[i] = (u8)((writeVal & (0x7f<<(i*8)))>>(i*8));
592
if (rfa_pwr[i] > RF6052_MAX_TX_PWR)
593
rfa_pwr[i] = RF6052_MAX_TX_PWR;
595
if (priv->rf_type == RF_2T2R)
597
if (rf_pwr_diff >= 8)
599
if (rfa_pwr[i] <rfa_lower_bound)
601
RT_TRACE(COMP_POWER,"Underflow");
602
rfa_pwr[i] = rfa_lower_bound;
605
else if (rf_pwr_diff >= 1)
607
if (rfa_pwr[i] > rfa_upper_bound)
609
RT_TRACE(COMP_POWER,"Overflow");
610
rfa_pwr[i] = rfa_upper_bound;
613
RT_TRACE(COMP_POWER,"rfa_pwr[%d]=%x\n", i, rfa_pwr[i]);
618
writeVal = (rfa_pwr[3]<<24) | (rfa_pwr[2]<<16) |(rfa_pwr[1]<<8) |rfa_pwr[0];
620
rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
621
RT_TRACE(COMP_POWER,"Set 0x%x = %08x\n",RegOffset[index], writeVal);
624
/*-----------------------------------------------------------------------------
625
* Function: PHY_RF6052SetOFDMTxPower
627
* Overview: For legacy and HY OFDM, we must read EEPROM TX power index for
628
* different channel and read original value in TX power register area from
629
* 0xe00. We increase offset and original value to be correct tx pwr.
639
* 11/05/2008 MHC Simulate 8192 series method.
640
* 01/06/2009 MHC 1. Prevent Path B tx power overflow or underflow dure to
641
* A/B pwr difference or legacy/HT pwr diff.
642
* 2. We concern with path B legacy/HT OFDM difference.
643
* 01/22/2009 MHC Support new EPRO format from SD3.
645
*---------------------------------------------------------------------------*/
647
PHY_RF6052SetOFDMTxPower(struct net_device* dev, u8* pPowerLevel, u8 Channel)
649
u32 writeVal, powerBase0, powerBase1;
651
u8 finalPowerIndex[4];
653
getPowerBase(dev, pPowerLevel, Channel, &powerBase0, &powerBase1, &finalPowerIndex[0]);
654
setAntennaDiff(dev, &finalPowerIndex[0] );
656
for(index=0; index<6; index++)
658
getTxPowerWriteValByRegulatory(dev, Channel, index,
659
powerBase0, powerBase1, &writeVal);
661
writeOFDMPowerReg(dev, index, writeVal);
665
bool PHY_RF6052_Config(struct net_device* dev)
667
struct r8192_priv *priv = rtllib_priv(dev);
668
bool rtStatus = true;
669
u8 bRegHwParaFile = 1;
671
if(priv->rf_type == RF_1T1R)
672
priv->NumTotalRFPath = 1;
674
priv->NumTotalRFPath = 2;
676
switch(bRegHwParaFile)
679
phy_RF6052_Config_HardCode(dev);
683
rtStatus = phy_RF6052_Config_ParaFile(dev);
687
phy_RF6052_Config_HardCode(dev);
688
phy_RF6052_Config_ParaFile(dev);
692
phy_RF6052_Config_HardCode(dev);
699
void phy_RF6052_Config_HardCode(struct net_device* dev)
706
bool phy_RF6052_Config_ParaFile(struct net_device* dev)
710
bool rtStatus = true;
711
struct r8192_priv *priv = rtllib_priv(dev);
712
BB_REGISTER_DEFINITION_T *pPhyReg;
715
for(eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
718
pPhyReg = &priv->PHYRegDef[eRFPath];
724
u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
728
u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
732
rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
734
rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
736
rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);
737
rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);
743
#if RTL8190_Download_Firmware_From_Header
744
rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
746
rtStatus = PHY_ConfigRFWithParaFile(dev, (char* )&szRadioAFile, (RF90_RADIO_PATH_E)eRFPath);
750
#if RTL8190_Download_Firmware_From_Header
751
rtStatus= rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
753
if(priv->rf_type == RF_2T2R_GREEN)
754
rtStatus = PHY_ConfigRFWithParaFile(dev, (char *)&szRadioBGMFile, (RF90_RADIO_PATH_E)eRFPath);
756
rtStatus = PHY_ConfigRFWithParaFile(dev, (char* )&szRadioBFile, (RF90_RADIO_PATH_E)eRFPath);
769
rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
773
rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
777
if(rtStatus != true){
778
printk("phy_RF6052_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
779
goto phy_RF6052_Config_ParaFile_Fail;
784
RT_TRACE(COMP_INIT, "<---phy_RF6052_Config_ParaFile()\n");
787
phy_RF6052_Config_ParaFile_Fail:
792
extern u32 PHY_RFShadowRead(
793
struct net_device * dev,
794
RF90_RADIO_PATH_E eRFPath,
797
return RF_Shadow[eRFPath][Offset].Value;
799
} /* PHY_RFShadowRead */
802
extern void PHY_RFShadowWrite(
803
struct net_device * dev,
804
RF90_RADIO_PATH_E eRFPath,
808
RF_Shadow[eRFPath][Offset].Value = (Data & bMask20Bits);
809
RF_Shadow[eRFPath][Offset].Driver_Write = true;
811
} /* PHY_RFShadowWrite */
814
extern bool PHY_RFShadowCompare(
815
struct net_device * dev,
816
RF90_RADIO_PATH_E eRFPath,
821
if (RF_Shadow[eRFPath][Offset].Compare == true)
823
reg = rtl8192_phy_QueryRFReg(dev, eRFPath, Offset, bMask20Bits);
824
if (RF_Shadow[eRFPath][Offset].Value != reg)
826
RF_Shadow[eRFPath][Offset].ErrorOrNot = true;
827
RT_TRACE(COMP_INIT, "PHY_RFShadowCompare RF-%d Addr%02xErr = %05x", eRFPath, Offset, reg);
831
RT_TRACE(COMP_INIT, "PHY_RFShadowCompare RF-%d Addr%02x Err = %05x return false\n", eRFPath, Offset, reg);
832
RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
834
return RF_Shadow[eRFPath][Offset].ErrorOrNot;
837
} /* PHY_RFShadowCompare */
839
extern void PHY_RFShadowRecorver(
840
struct net_device * dev,
841
RF90_RADIO_PATH_E eRFPath,
844
if (RF_Shadow[eRFPath][Offset].ErrorOrNot == true)
846
if (RF_Shadow[eRFPath][Offset].Recorver == true)
848
rtl8192_phy_SetRFReg(dev, eRFPath, Offset, bMask20Bits, RF_Shadow[eRFPath][Offset].Value);
849
RT_TRACE(COMP_INIT, "PHY_RFShadowRecorver RF-%d Addr%02x=%05x",
850
eRFPath, Offset, RF_Shadow[eRFPath][Offset].Value);
854
} /* PHY_RFShadowRecorver */
857
extern void PHY_RFShadowCompareAll(struct net_device * dev)
862
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
864
for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
866
PHY_RFShadowCompare(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
870
} /* PHY_RFShadowCompareAll */
873
extern void PHY_RFShadowRecorverAll(struct net_device * dev)
878
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
880
for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
882
PHY_RFShadowRecorver(dev, (RF90_RADIO_PATH_E)eRFPath, Offset);
886
} /* PHY_RFShadowRecorverAll */
889
extern void PHY_RFShadowCompareFlagSet(
890
struct net_device * dev,
891
RF90_RADIO_PATH_E eRFPath,
895
RF_Shadow[eRFPath][Offset].Compare = Type;
897
} /* PHY_RFShadowCompareFlagSet */
900
extern void PHY_RFShadowRecorverFlagSet(
901
struct net_device * dev,
902
RF90_RADIO_PATH_E eRFPath,
906
RF_Shadow[eRFPath][Offset].Recorver= Type;
908
} /* PHY_RFShadowRecorverFlagSet */
911
extern void PHY_RFShadowCompareFlagSetAll(struct net_device * dev)
916
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
918
for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
920
if (Offset != 0x26 && Offset != 0x27)
921
PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, false);
923
PHY_RFShadowCompareFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, true);
927
} /* PHY_RFShadowCompareFlagSetAll */
930
extern void PHY_RFShadowRecorverFlagSetAll(struct net_device * dev)
935
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
937
for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
939
if (Offset != 0x26 && Offset != 0x27)
940
PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, false);
942
PHY_RFShadowRecorverFlagSet(dev, (RF90_RADIO_PATH_E)eRFPath, Offset, true);
946
} /* PHY_RFShadowCompareFlagSetAll */
950
extern void PHY_RFShadowRefresh(struct net_device * dev)
955
for (eRFPath = 0; eRFPath < RF6052_MAX_PATH; eRFPath++)
957
for (Offset = 0; Offset <= RF6052_MAX_REG; Offset++)
959
RF_Shadow[eRFPath][Offset].Value = 0;
960
RF_Shadow[eRFPath][Offset].Compare = false;
961
RF_Shadow[eRFPath][Offset].Recorver = false;
962
RF_Shadow[eRFPath][Offset].ErrorOrNot = false;
963
RF_Shadow[eRFPath][Offset].Driver_Write = false;
967
} /* PHY_RFShadowRead */
969
/* End of HalRf6052.c */