aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h13
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c34
2 files changed, 40 insertions, 7 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h
index c6648b02bf81..06acabd02984 100644
--- a/drivers/net/wireless/rt2x00/rt2800.h
+++ b/drivers/net/wireless/rt2x00/rt2800.h
@@ -1849,6 +1849,11 @@ struct mac_iveiv_entry {
1849#define RFCSR15_TX_LO2_EN FIELD8(0x08) 1849#define RFCSR15_TX_LO2_EN FIELD8(0x08)
1850 1850
1851/* 1851/*
1852 * RFCSR 16:
1853 */
1854#define RFCSR16_TXMIXER_GAIN FIELD8(0x07)
1855
1856/*
1852 * RFCSR 17: 1857 * RFCSR 17:
1853 */ 1858 */
1854#define RFCSR17_TXMIXER_GAIN FIELD8(0x07) 1859#define RFCSR17_TXMIXER_GAIN FIELD8(0x07)
@@ -2111,6 +2116,12 @@ struct mac_iveiv_entry {
2111#define EEPROM_RSSI_A2_LNA_A2 FIELD16(0xff00) 2116#define EEPROM_RSSI_A2_LNA_A2 FIELD16(0xff00)
2112 2117
2113/* 2118/*
2119 * EEPROM TXMIXER GAIN A offset (note overlaps with EEPROM RSSI A2).
2120 */
2121#define EEPROM_TXMIXER_GAIN_A 0x0026
2122#define EEPROM_TXMIXER_GAIN_A_VAL FIELD16(0x0007)
2123
2124/*
2114 * EEPROM EIRP Maximum TX power values(unit: dbm) 2125 * EEPROM EIRP Maximum TX power values(unit: dbm)
2115 */ 2126 */
2116#define EEPROM_EIRP_MAX_TX_POWER 0x0027 2127#define EEPROM_EIRP_MAX_TX_POWER 0x0027
@@ -2448,6 +2459,8 @@ struct rt2800_drv_data {
2448 u8 calibration_bw40; 2459 u8 calibration_bw40;
2449 u8 bbp25; 2460 u8 bbp25;
2450 u8 bbp26; 2461 u8 bbp26;
2462 u8 txmixer_gain_24g;
2463 u8 txmixer_gain_5g;
2451}; 2464};
2452 2465
2453#endif /* RT2800_H */ 2466#endif /* RT2800_H */
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c
index 395453c41e23..52728be65271 100644
--- a/drivers/net/wireless/rt2x00/rt2800lib.c
+++ b/drivers/net/wireless/rt2x00/rt2800lib.c
@@ -1856,7 +1856,10 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
1856 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1); 1856 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
1857 rt2800_rfcsr_write(rt2x00dev, 11, 0xb9); 1857 rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
1858 rt2800_rfcsr_write(rt2x00dev, 15, 0x53); 1858 rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
1859 rt2800_rfcsr_write(rt2x00dev, 16, 0x4c); 1859 rfcsr = 0x4c;
1860 rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
1861 drv_data->txmixer_gain_24g);
1862 rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
1860 rt2800_rfcsr_write(rt2x00dev, 17, 0x23); 1863 rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
1861 rt2800_rfcsr_write(rt2x00dev, 19, 0x93); 1864 rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
1862 rt2800_rfcsr_write(rt2x00dev, 20, 0xb3); 1865 rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
@@ -1875,7 +1878,10 @@ static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
1875 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1); 1878 rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
1876 rt2800_rfcsr_write(rt2x00dev, 11, 0x00); 1879 rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
1877 rt2800_rfcsr_write(rt2x00dev, 15, 0x43); 1880 rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
1878 rt2800_rfcsr_write(rt2x00dev, 16, 0x7a); 1881 rfcsr = 0x7a;
1882 rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
1883 drv_data->txmixer_gain_5g);
1884 rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
1879 rt2800_rfcsr_write(rt2x00dev, 17, 0x23); 1885 rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
1880 if (rf->channel <= 64) { 1886 if (rf->channel <= 64) {
1881 rt2800_rfcsr_write(rt2x00dev, 19, 0xb7); 1887 rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
@@ -3672,11 +3678,8 @@ static int rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
3672 &rt2x00dev->cap_flags)) 3678 &rt2x00dev->cap_flags))
3673 rt2x00_set_field8(&rfcsr, RFCSR17_R, 1); 3679 rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
3674 } 3680 }
3675 rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &eeprom); 3681 rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
3676 if (rt2x00_get_field16(eeprom, EEPROM_TXMIXER_GAIN_BG_VAL) >= 1) 3682 drv_data->txmixer_gain_24g);
3677 rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
3678 rt2x00_get_field16(eeprom,
3679 EEPROM_TXMIXER_GAIN_BG_VAL));
3680 rt2800_rfcsr_write(rt2x00dev, 17, rfcsr); 3683 rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
3681 } 3684 }
3682 3685
@@ -3884,6 +3887,7 @@ EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
3884 3887
3885int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev) 3888int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
3886{ 3889{
3890 struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
3887 u16 word; 3891 u16 word;
3888 u8 *mac; 3892 u8 *mac;
3889 u8 default_lna_gain; 3893 u8 default_lna_gain;
@@ -3967,6 +3971,14 @@ int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
3967 rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0); 3971 rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
3968 rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word); 3972 rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
3969 3973
3974 rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG, &word);
3975 if ((word & 0x00ff) != 0x00ff) {
3976 drv_data->txmixer_gain_24g =
3977 rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
3978 } else {
3979 drv_data->txmixer_gain_24g = 0;
3980 }
3981
3970 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word); 3982 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2, &word);
3971 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10) 3983 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
3972 rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0); 3984 rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
@@ -3976,6 +3988,14 @@ int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
3976 default_lna_gain); 3988 default_lna_gain);
3977 rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word); 3989 rt2x00_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
3978 3990
3991 rt2x00_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A, &word);
3992 if ((word & 0x00ff) != 0x00ff) {
3993 drv_data->txmixer_gain_5g =
3994 rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
3995 } else {
3996 drv_data->txmixer_gain_5g = 0;
3997 }
3998
3979 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word); 3999 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_A, &word);
3980 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10) 4000 if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
3981 rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0); 4001 rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);