diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800.h | 13 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2800lib.c | 34 |
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 | ||
3885 | int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev) | 3888 | int 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); |