aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGabor Juhos <juhosg@openwrt.org>2013-07-08 10:08:24 -0400
committerJohn W. Linville <linville@tuxdriver.com>2013-07-22 16:54:32 -0400
commitfc739cfe0f305647677edbf99a76d9ece96e3795 (patch)
tree4f321a971a6a685ad0bb8220d82880bc82482674
parent97aa03f15e83174df74aa468eea127c5cee480f0 (diff)
rt2x00: rt2800lib: fix default TX power values for RT3593
The TX power values in the EEPROM are using a different format for the RT3593 chip. The default TX power value uses bits 0..4 only. Bits 5..8 contains value for fine grained power control. Additionally, the lower and upper limits of the TX power values are the same for both bands. Improve the rt2800_txpower_to_dev function, in order to compute the correct default power values for the RT3593 chip as well. Signed-off-by: Gabor Juhos <juhosg@openwrt.org> Acked-by: Stanislaw Gruszka <stf_xl@wp.pl> Acked-by: Gertjan van Wingerde <gwingerde@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h7
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c7
2 files changed, 14 insertions, 0 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index d3e8f6d3531a..69749ba599bc 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -2603,6 +2603,10 @@ enum rt2800_eeprom_word {
2603#define EEPROM_TXPOWER_A_1 FIELD16(0x00ff) 2603#define EEPROM_TXPOWER_A_1 FIELD16(0x00ff)
2604#define EEPROM_TXPOWER_A_2 FIELD16(0xff00) 2604#define EEPROM_TXPOWER_A_2 FIELD16(0xff00)
2605 2605
2606/* EEPROM_TXPOWER_{A,G} fields for RT3593 */
2607#define EEPROM_TXPOWER_ALC FIELD8(0x1f)
2608#define EEPROM_TXPOWER_FINE_CTRL FIELD8(0xe0)
2609
2606/* 2610/*
2607 * EEPROM temperature compensation boundaries 802.11A 2611 * EEPROM temperature compensation boundaries 802.11A
2608 * MINUS4: If the actual TSSI is below this boundary, tx power needs to be 2612 * MINUS4: If the actual TSSI is below this boundary, tx power needs to be
@@ -2884,6 +2888,9 @@ enum rt2800_eeprom_word {
2884#define MAX_A_TXPOWER 15 2888#define MAX_A_TXPOWER 15
2885#define DEFAULT_TXPOWER 5 2889#define DEFAULT_TXPOWER 5
2886 2890
2891#define MIN_A_TXPOWER_3593 0
2892#define MAX_A_TXPOWER_3593 31
2893
2887#define TXPOWER_G_FROM_DEV(__txpower) \ 2894#define TXPOWER_G_FROM_DEV(__txpower) \
2888 ((__txpower) > MAX_G_TXPOWER) ? DEFAULT_TXPOWER : (__txpower) 2895 ((__txpower) > MAX_G_TXPOWER) ? DEFAULT_TXPOWER : (__txpower)
2889 2896
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 1738a9d232c3..b11f0b06cc6d 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -2728,8 +2728,15 @@ static char rt2800_txpower_to_dev(struct rt2x00_dev *rt2x00dev,
2728 unsigned int channel, 2728 unsigned int channel,
2729 char txpower) 2729 char txpower)
2730{ 2730{
2731 if (rt2x00_rt(rt2x00dev, RT3593))
2732 txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
2733
2731 if (channel <= 14) 2734 if (channel <= 14)
2732 return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER); 2735 return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
2736
2737 if (rt2x00_rt(rt2x00dev, RT3593))
2738 return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
2739 MAX_A_TXPOWER_3593);
2733 else 2740 else
2734 return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER); 2741 return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
2735} 2742}