diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2800lib.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 88 |
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 | } |
2498 | EXPORT_SYMBOL_GPL(rt2800_gain_calibration); | 2498 | EXPORT_SYMBOL_GPL(rt2800_gain_calibration); |
2499 | 2499 | ||
2500 | void 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 | } | ||
2572 | EXPORT_SYMBOL_GPL(rt2800_vco_calibration); | ||
2573 | |||
2500 | static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev, | 2574 | static 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 | } |
4456 | EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode); | 4544 | EXPORT_SYMBOL_GPL(rt2800_probe_hw_mode); |