2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
31 Specific funcitons and variables for RT30xx.
35 -------- ---------- ----------------------------------------------
42 #ifndef RTMP_RF_RW_SUPPORT
43 #error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
44 #endif // RTMP_RF_RW_SUPPORT //
46 #include "../rt_config.h"
50 // RF register initialization set
52 REG_PAIR RFRegTableOverRT3390
[] = {
61 {RF_R08
, 0x00}, // Read only
89 UCHAR NUM_RF_REG_PARMS_OVER_RT3390
=(sizeof(RFRegTableOverRT3390
) / sizeof(REG_PAIR
));
93 // Antenna divesity use GPIO3 and EESK pin for control
94 // Antenna and EEPROM access are both using EESK pin,
95 // Therefor we should avoid accessing EESK at the same time
96 // Then restore antenna after EEPROM access
97 // The original name of this function is AsicSetRxAnt(), now change to
101 IN PRTMP_ADAPTER pAd
,
107 if ((pAd
->EepromAccess
) ||
108 (RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_RESET_IN_PROGRESS
)) ||
109 (RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_HALT_IN_PROGRESS
)) ||
110 (RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_RADIO_OFF
)) ||
111 (RTMP_TEST_FLAG(pAd
, fRTMP_ADAPTER_NIC_NOT_EXIST
)))
116 // the antenna selection is through firmware and MAC register(GPIO3)
120 RTMP_IO_READ32(pAd
, E2PROM_CSR
, &x
);
122 RTMP_IO_WRITE32(pAd
, E2PROM_CSR
, x
);
124 RTMP_IO_READ32(pAd
, GPIO_CTRL_CFG
, &Value
);
126 RTMP_IO_WRITE32(pAd
, GPIO_CTRL_CFG
, Value
);
127 DBGPRINT_RAW(RT_DEBUG_TRACE
, ("AsicSetRxAnt, switch to main antenna\n"));
132 RTMP_IO_READ32(pAd
, E2PROM_CSR
, &x
);
134 RTMP_IO_WRITE32(pAd
, E2PROM_CSR
, x
);
136 RTMP_IO_READ32(pAd
, GPIO_CTRL_CFG
, &Value
);
139 RTMP_IO_WRITE32(pAd
, GPIO_CTRL_CFG
, Value
);
140 DBGPRINT_RAW(RT_DEBUG_TRACE
, ("AsicSetRxAnt, switch to aux antenna\n"));
146 ========================================================================
149 For RF filter calibration purpose
152 pAd Pointer to our adapter
159 ========================================================================
161 VOID
RTMPFilterCalibration(
162 IN PRTMP_ADAPTER pAd
)
164 UCHAR R55x
= 0, value
, FilterTarget
= 0x1E, BBPValue
=0;
165 UINT loop
= 0, count
= 0, loopcnt
= 0, ReTry
= 0;
166 UCHAR RF_R24_Value
= 0;
168 // Give bbp filter initial value
169 pAd
->Mlme
.CaliBW20RfR24
= 0x1F;
170 pAd
->Mlme
.CaliBW40RfR24
= 0x2F; //Bit[5] must be 1 for BW 40
174 if (loop
== 1) //BandWidth = 40 MHz
176 // Write 0x27 to RF_R24 to program filter
178 RT30xxWriteRFRegister(pAd
, RF_R24
, RF_R24_Value
);
179 if (IS_RT3090(pAd
) || IS_RT3572(pAd
)|| IS_RT3390(pAd
))
184 // when calibrate BW40, BBP mask must set to BW40.
185 RTMP_BBP_IO_READ8_BY_REG_ID(pAd
, BBP_R4
, &BBPValue
);
188 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R4
, BBPValue
);
191 RT30xxReadRFRegister(pAd
, RF_R31
, &value
);
193 RT30xxWriteRFRegister(pAd
, RF_R31
, value
);
195 else //BandWidth = 20 MHz
197 // Write 0x07 to RF_R24 to program filter
199 RT30xxWriteRFRegister(pAd
, RF_R24
, RF_R24_Value
);
200 if (IS_RT3090(pAd
) || IS_RT3572(pAd
)|| IS_RT3390(pAd
))
206 RT30xxReadRFRegister(pAd
, RF_R31
, &value
);
208 RT30xxWriteRFRegister(pAd
, RF_R31
, value
);
211 // Write 0x01 to RF_R22 to enable baseband loopback mode
212 RT30xxReadRFRegister(pAd
, RF_R22
, &value
);
214 RT30xxWriteRFRegister(pAd
, RF_R22
, value
);
216 // Write 0x00 to BBP_R24 to set power & frequency of passband test tone
217 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R24
, 0);
221 // Write 0x90 to BBP_R25 to transmit test tone
222 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R25
, 0x90);
225 // Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
226 RTMP_BBP_IO_READ8_BY_REG_ID(pAd
, BBP_R55
, &value
);
229 } while ((ReTry
++ < 100) && (R55x
== 0));
231 // Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
232 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R24
, 0x06);
236 // Write 0x90 to BBP_R25 to transmit test tone
237 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R25
, 0x90);
239 //We need to wait for calibration
241 RTMP_BBP_IO_READ8_BY_REG_ID(pAd
, BBP_R55
, &value
);
243 if ((R55x
- value
) < FilterTarget
)
247 else if ((R55x
- value
) == FilterTarget
)
257 // prevent infinite loop cause driver hang.
260 DBGPRINT(RT_DEBUG_ERROR
, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt
));
264 // Write RF_R24 to program filter
265 RT30xxWriteRFRegister(pAd
, RF_R24
, RF_R24_Value
);
270 RF_R24_Value
= RF_R24_Value
- ((count
) ? (1) : (0));
273 // Store for future usage
279 pAd
->Mlme
.CaliBW20RfR24
= (UCHAR
)RF_R24_Value
;
284 pAd
->Mlme
.CaliBW40RfR24
= (UCHAR
)RF_R24_Value
;
291 RT30xxWriteRFRegister(pAd
, RF_R24
, RF_R24_Value
);
298 // Set back to initial state
300 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R24
, 0);
302 RT30xxReadRFRegister(pAd
, RF_R22
, &value
);
304 RT30xxWriteRFRegister(pAd
, RF_R22
, value
);
306 // set BBP back to BW20
307 RTMP_BBP_IO_READ8_BY_REG_ID(pAd
, BBP_R4
, &BBPValue
);
309 RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd
, BBP_R4
, BBPValue
);
311 DBGPRINT(RT_DEBUG_TRACE
, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd
->Mlme
.CaliBW20RfR24
, pAd
->Mlme
.CaliBW40RfR24
));
315 // add by johnli, RF power sequence setup
317 ==========================================================================
320 Load RF normal operation-mode setup
322 ==========================================================================
324 VOID
RT33xxLoadRFNormalModeSetup(
325 IN PRTMP_ADAPTER pAd
)
329 // RX0_PD & TX0_PD, RF R1 register Bit 2 & Bit 3 to 0 and RF_BLOCK_en,RX1_PD & TX1_PD, Bit0, Bit 4 & Bit5 to 1
330 RT30xxReadRFRegister(pAd
, RF_R01
, &RFValue
);
331 RFValue
= (RFValue
& (~0x0C)) | 0x31;
332 RT30xxWriteRFRegister(pAd
, RF_R01
, RFValue
);
334 // TX_LO2_en, RF R15 register Bit 3 to 0
335 RT30xxReadRFRegister(pAd
, RF_R15
, &RFValue
);
337 RT30xxWriteRFRegister(pAd
, RF_R15
, RFValue
);
339 /* move to NICInitRT30xxRFRegisters
340 // TX_LO1_en, RF R17 register Bit 3 to 0
341 RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
343 // to fix rx long range issue
344 if (((pAd->MACVersion & 0xffff) >= 0x0211) && (pAd->NicConfig2.field.ExternalLNAForG == 0))
348 // set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
349 if (pAd->TxMixerGain24G >= 2)
351 RFValue &= (~0x7); // clean bit [2:0]
352 RFValue |= pAd->TxMixerGain24G;
354 RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
357 // RX_LO1_en, RF R20 register Bit 3 to 0
358 RT30xxReadRFRegister(pAd
, RF_R20
, &RFValue
);
360 RT30xxWriteRFRegister(pAd
, RF_R20
, RFValue
);
362 // RX_LO2_en, RF R21 register Bit 3 to 0
363 RT30xxReadRFRegister(pAd
, RF_R21
, &RFValue
);
365 RT30xxWriteRFRegister(pAd
, RF_R21
, RFValue
);
367 /* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/
368 // LDORF_VC, RF R27 register Bit 2 to 0
369 RT30xxReadRFRegister(pAd
, RF_R27
, &RFValue
);
370 // TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
371 // Raising RF voltage is no longer needed for RT3070(F)
372 if (IS_RT3090(pAd
)) // RT309x and RT3071/72
374 if ((pAd
->MACVersion
& 0xffff) < 0x0211)
375 RFValue
= (RFValue
& (~0x77)) | 0x3;
377 RFValue
= (RFValue
& (~0x77));
378 RT30xxWriteRFRegister(pAd
, RF_R27
, RFValue
);
384 ==========================================================================
387 Load RF sleep-mode setup
389 ==========================================================================
391 VOID
RT33xxLoadRFSleepModeSetup(
392 IN PRTMP_ADAPTER pAd
)
399 // RF_BLOCK_en. RF R1 register Bit 0 to 0
400 RT30xxReadRFRegister(pAd
, RF_R01
, &RFValue
);
402 RT30xxWriteRFRegister(pAd
, RF_R01
, RFValue
);
404 // VCO_IC, RF R7 register Bit 4 & Bit 5 to 0
405 RT30xxReadRFRegister(pAd
, RF_R07
, &RFValue
);
407 RT30xxWriteRFRegister(pAd
, RF_R07
, RFValue
);
409 // Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 0
410 RT30xxReadRFRegister(pAd
, RF_R09
, &RFValue
);
412 RT30xxWriteRFRegister(pAd
, RF_R09
, RFValue
);
414 // RX_CTB_en, RF R21 register Bit 7 to 0
415 RT30xxReadRFRegister(pAd
, RF_R21
, &RFValue
);
417 RT30xxWriteRFRegister(pAd
, RF_R21
, RFValue
);
420 if (IS_RT3090(pAd
) || // IS_RT3090 including RT309x and RT3071/72
423 (IS_RT3070(pAd
) && ((pAd
->MACVersion
& 0xffff) < 0x0201)))
426 RT30xxReadRFRegister(pAd
, RF_R27
, &RFValue
);
428 RT30xxWriteRFRegister(pAd
, RF_R27
, RFValue
);
431 RTMP_IO_READ32(pAd
, LDO_CFG0
, &MACValue
);
432 MACValue
|= 0x1D000000;
433 RTMP_IO_WRITE32(pAd
, LDO_CFG0
, MACValue
);
438 ==========================================================================
441 Reverse RF sleep-mode setup
443 ==========================================================================
445 VOID
RT33xxReverseRFSleepModeSetup(
446 IN PRTMP_ADAPTER pAd
)
452 // RF_BLOCK_en, RF R1 register Bit 0 to 1
453 RT30xxReadRFRegister(pAd
, RF_R01
, &RFValue
);
455 RT30xxWriteRFRegister(pAd
, RF_R01
, RFValue
);
457 // VCO_IC, RF R7 register Bit 4 & Bit 5 to 1
458 RT30xxReadRFRegister(pAd
, RF_R07
, &RFValue
);
460 RT30xxWriteRFRegister(pAd
, RF_R07
, RFValue
);
462 // Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 1
463 RT30xxReadRFRegister(pAd
, RF_R09
, &RFValue
);
465 RT30xxWriteRFRegister(pAd
, RF_R09
, RFValue
);
467 // RX_CTB_en, RF R21 register Bit 7 to 1
468 RT30xxReadRFRegister(pAd
, RF_R21
, &RFValue
);
470 RT30xxWriteRFRegister(pAd
, RF_R21
, RFValue
);
473 if (IS_RT3090(pAd
) || // IS_RT3090 including RT309x and RT3071/72
476 (IS_RT3070(pAd
) && ((pAd
->MACVersion
& 0xffff) < 0x0201)))
479 RT30xxReadRFRegister(pAd
, RF_R27
, &RFValue
);
480 if ((pAd
->MACVersion
& 0xffff) < 0x0211)
481 RFValue
= (RFValue
& (~0x77)) | 0x3;
483 RFValue
= (RFValue
& (~0x77));
484 RT30xxWriteRFRegister(pAd
, RF_R27
, RFValue
);
487 // RT3071 version E has fixed this issue
488 if ((pAd
->NicConfig2
.field
.DACTestBit
== 1) && ((pAd
->MACVersion
& 0xffff) < 0x0211))
490 // patch tx EVM issue temporarily
491 RTMP_IO_READ32(pAd
, LDO_CFG0
, &MACValue
);
492 MACValue
= ((MACValue
& 0xE0FFFFFF) | 0x0D000000);
493 RTMP_IO_WRITE32(pAd
, LDO_CFG0
, MACValue
);
497 RTMP_IO_READ32(pAd
, LDO_CFG0
, &MACValue
);
498 MACValue
= ((MACValue
& 0xE0FFFFFF) | 0x01000000);
499 RTMP_IO_WRITE32(pAd
, LDO_CFG0
, MACValue
);
504 RT30xxWriteRFRegister(pAd
, RF_R08
, 0x80);
508 VOID
RT33xxHaltAction(
509 IN PRTMP_ADAPTER pAd
)
511 UINT32 TxPinCfg
= 0x00050F0F;
514 // Turn off LNA_PE or TRSW_POL
516 if (IS_RT3070(pAd
) || IS_RT3071(pAd
) || IS_RT3390(pAd
)||IS_RT3572(pAd
))
518 //KH? Both support 3390 usb and PCI
519 if ((IS_RT3071(pAd
) || IS_RT3572(pAd
)||IS_RT3390(pAd
))
520 #ifdef RTMP_EFUSE_SUPPORT
522 #endif // RTMP_EFUSE_SUPPORT //
525 TxPinCfg
&= 0xFFFBF0F0; // bit18 off
529 TxPinCfg
&= 0xFFFFF0F0;
532 RTMP_IO_WRITE32(pAd
, TX_PIN_CFG
, TxPinCfg
);