aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2800lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800lib.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c88
1 files changed, 88 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index f1df929e97a..6104a14e4ff 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2497,6 +2497,80 @@ void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
2497} 2497}
2498EXPORT_SYMBOL_GPL(rt2800_gain_calibration); 2498EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
2499 2499
2500void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
2501{
2502 u32 tx_pin;
2503 u8 rfcsr;
2504
2505 /*
2506 * A voltage-controlled oscillator(VCO) is an electronic oscillator
2507 * designed to be controlled in oscillation frequency by a voltage
2508 * input. Maybe the temperature will affect the frequency of
2509 * oscillation to be shifted. The VCO calibration will be called
2510 * periodically to adjust the frequency to be precision.
2511 */
2512
2513 rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
2514 tx_pin &= TX_PIN_CFG_PA_PE_DISABLE;
2515 rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
2516
2517 switch (rt2x00dev->chip.rf) {
2518 case RF2020:
2519 case RF3020:
2520 case RF3021:
2521 case RF3022:
2522 case RF3320:
2523 case RF3052:
2524 rt2800_rfcsr_read(rt2x00dev, 7, &rfcsr);
2525 rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
2526 rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2527 break;
2528 case RF5370:
2529 case RF5372:
2530 case RF5390:
2531 rt2800_rfcsr_read(rt2x00dev, 3, &rfcsr);
2532 rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
2533 rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2534 break;
2535 default:
2536 return;
2537 }
2538
2539 mdelay(1);
2540
2541 rt2800_register_read(rt2x00dev, TX_PIN_CFG, &tx_pin);
2542 if (rt2x00dev->rf_channel <= 14) {
2543 switch (rt2x00dev->default_ant.tx_chain_num) {
2544 case 3:
2545 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1);
2546 /* fall through */
2547 case 2:
2548 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
2549 /* fall through */
2550 case 1:
2551 default:
2552 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
2553 break;
2554 }
2555 } else {
2556 switch (rt2x00dev->default_ant.tx_chain_num) {
2557 case 3:
2558 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1);
2559 /* fall through */
2560 case 2:
2561 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
2562 /* fall through */
2563 case 1:
2564 default:
2565 rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
2566 break;
2567 }
2568 }
2569 rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
2570
2571}
2572EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
2573
2500static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev, 2574static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev,
2501 struct rt2x00lib_conf *libconf) 2575 struct rt2x00lib_conf *libconf)
2502{ 2576{
@@ -4451,6 +4525,20 @@ int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
4451 } 4525 }
4452 } 4526 }
4453 4527
4528 switch (rt2x00dev->chip.rf) {
4529 case RF2020:
4530 case RF3020:
4531 case RF3021:
4532 case RF3022:
4533 case RF3320:
4534 case RF3052:
4535 case RF5370:
4536 case RF5372:
4537 case RF5390:
4538 __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
4539 break;
4540 }
4541
4454 return 0; 4542 return 0;
4455} 4543}
4456EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode); 4544EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode);