aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStanislaw Gruszka <stf_xl@wp.pl>2013-03-16 14:19:52 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-03-18 16:38:35 -0400
commit415e3f2f7bf8bff1a22446c22a7e384c6f429d2a (patch)
tree8c97f0fcecb915277ad9dfdd396dc658cdef9291
parent939ec51dc7d055bb2cb8977a4c026d9dc85438dd (diff)
rt2800: 5592: iq calibration for 5GHz
Based on: RT5592_IQCalibration() DPO_RT5572_LinuxSTA_2.6.1.3_20121022/cips/rt5592.c Signed-off-by: Stanislaw Gruszka <stf_xl@wp.pl> Tested-by: Wanlong Gao <gaowanlong@cn.fujitsu.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c70
1 files changed, 60 insertions, 10 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 9b1f293b4833..f08a0424fe4d 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2468,31 +2468,80 @@ static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
2468 } 2468 }
2469} 2469}
2470 2470
2471
2472static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel) 2471static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel)
2473{ 2472{
2474 u8 cal; 2473 u8 cal;
2475 2474
2476 /* TODO */ 2475 /* TX0 IQ Gain */
2477 if (WARN_ON_ONCE(channel > 14))
2478 return;
2479
2480 rt2800_bbp_write(rt2x00dev, 158, 0x2c); 2476 rt2800_bbp_write(rt2x00dev, 158, 0x2c);
2481 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX0_2G); 2477 if (channel <= 14)
2478 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX0_2G);
2479 else if (channel >= 36 && channel <= 64)
2480 cal = rt2x00_eeprom_byte(rt2x00dev,
2481 EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G);
2482 else if (channel >= 100 && channel <= 138)
2483 cal = rt2x00_eeprom_byte(rt2x00dev,
2484 EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G);
2485 else if (channel >= 140 && channel <= 165)
2486 cal = rt2x00_eeprom_byte(rt2x00dev,
2487 EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G);
2488 else
2489 cal = 0;
2482 rt2800_bbp_write(rt2x00dev, 159, cal); 2490 rt2800_bbp_write(rt2x00dev, 159, cal);
2483 2491
2492 /* TX0 IQ Phase */
2484 rt2800_bbp_write(rt2x00dev, 158, 0x2d); 2493 rt2800_bbp_write(rt2x00dev, 158, 0x2d);
2485 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX0_2G); 2494 if (channel <= 14)
2495 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX0_2G);
2496 else if (channel >= 36 && channel <= 64)
2497 cal = rt2x00_eeprom_byte(rt2x00dev,
2498 EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G);
2499 else if (channel >= 100 && channel <= 138)
2500 cal = rt2x00_eeprom_byte(rt2x00dev,
2501 EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G);
2502 else if (channel >= 140 && channel <= 165)
2503 cal = rt2x00_eeprom_byte(rt2x00dev,
2504 EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G);
2505 else
2506 cal = 0;
2486 rt2800_bbp_write(rt2x00dev, 159, cal); 2507 rt2800_bbp_write(rt2x00dev, 159, cal);
2487 2508
2509 /* TX1 IQ Gain */
2488 rt2800_bbp_write(rt2x00dev, 158, 0x4a); 2510 rt2800_bbp_write(rt2x00dev, 158, 0x4a);
2489 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX1_2G); 2511 if (channel <= 14)
2512 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX1_2G);
2513 else if (channel >= 36 && channel <= 64)
2514 cal = rt2x00_eeprom_byte(rt2x00dev,
2515 EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G);
2516 else if (channel >= 100 && channel <= 138)
2517 cal = rt2x00_eeprom_byte(rt2x00dev,
2518 EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G);
2519 else if (channel >= 140 && channel <= 165)
2520 cal = rt2x00_eeprom_byte(rt2x00dev,
2521 EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G);
2522 else
2523 cal = 0;
2490 rt2800_bbp_write(rt2x00dev, 159, cal); 2524 rt2800_bbp_write(rt2x00dev, 159, cal);
2491 2525
2526 /* TX1 IQ Phase */
2492 rt2800_bbp_write(rt2x00dev, 158, 0x4b); 2527 rt2800_bbp_write(rt2x00dev, 158, 0x4b);
2493 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX1_2G); 2528 if (channel <= 14)
2529 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX1_2G);
2530 else if (channel >= 36 && channel <= 64)
2531 cal = rt2x00_eeprom_byte(rt2x00dev,
2532 EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G);
2533 else if (channel >= 100 && channel <= 138)
2534 cal = rt2x00_eeprom_byte(rt2x00dev,
2535 EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G);
2536 else if (channel >= 140 && channel <= 165)
2537 cal = rt2x00_eeprom_byte(rt2x00dev,
2538 EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G);
2539 else
2540 cal = 0;
2494 rt2800_bbp_write(rt2x00dev, 159, cal); 2541 rt2800_bbp_write(rt2x00dev, 159, cal);
2495 2542
2543 /* FIXME: possible RX0, RX1 callibration ? */
2544
2496 /* RF IQ compensation control */ 2545 /* RF IQ compensation control */
2497 rt2800_bbp_write(rt2x00dev, 158, 0x04); 2546 rt2800_bbp_write(rt2x00dev, 158, 0x04);
2498 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_COMPENSATION_CONTROL); 2547 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_COMPENSATION_CONTROL);
@@ -2500,7 +2549,8 @@ static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel)
2500 2549
2501 /* RF IQ imbalance compensation control */ 2550 /* RF IQ imbalance compensation control */
2502 rt2800_bbp_write(rt2x00dev, 158, 0x03); 2551 rt2800_bbp_write(rt2x00dev, 158, 0x03);
2503 cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL); 2552 cal = rt2x00_eeprom_byte(rt2x00dev,
2553 EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL);
2504 rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0); 2554 rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
2505} 2555}
2506 2556