diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 1bd6b3ffca09..4f2eb90aaf07 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -664,6 +664,26 @@ static void rt73usb_config_erp(struct rt2x00_dev *rt2x00dev, | |||
664 | rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg); | 664 | rt73usb_register_write(rt2x00dev, TXRX_CSR4, reg); |
665 | } | 665 | } |
666 | 666 | ||
667 | static void rt73usb_config_lna_gain(struct rt2x00_dev *rt2x00dev, | ||
668 | struct rt2x00lib_conf *libconf) | ||
669 | { | ||
670 | u16 eeprom; | ||
671 | short lna_gain = 0; | ||
672 | |||
673 | if (libconf->band == IEEE80211_BAND_2GHZ) { | ||
674 | if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags)) | ||
675 | lna_gain += 14; | ||
676 | |||
677 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom); | ||
678 | lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1); | ||
679 | } else { | ||
680 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom); | ||
681 | lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1); | ||
682 | } | ||
683 | |||
684 | rt2x00dev->lna_gain = lna_gain; | ||
685 | } | ||
686 | |||
667 | static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, | 687 | static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, |
668 | const int basic_rate_mask) | 688 | const int basic_rate_mask) |
669 | { | 689 | { |
@@ -918,6 +938,9 @@ static void rt73usb_config(struct rt2x00_dev *rt2x00dev, | |||
918 | struct rt2x00lib_conf *libconf, | 938 | struct rt2x00lib_conf *libconf, |
919 | const unsigned int flags) | 939 | const unsigned int flags) |
920 | { | 940 | { |
941 | /* Always recalculate LNA gain before changing configuration */ | ||
942 | rt73usb_config_lna_gain(rt2x00dev, libconf); | ||
943 | |||
921 | if (flags & CONFIG_UPDATE_PHYMODE) | 944 | if (flags & CONFIG_UPDATE_PHYMODE) |
922 | rt73usb_config_phymode(rt2x00dev, libconf->basic_rates); | 945 | rt73usb_config_phymode(rt2x00dev, libconf->basic_rates); |
923 | if (flags & CONFIG_UPDATE_CHANNEL) | 946 | if (flags & CONFIG_UPDATE_CHANNEL) |
@@ -1644,20 +1667,19 @@ static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
1644 | */ | 1667 | */ |
1645 | static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) | 1668 | static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) |
1646 | { | 1669 | { |
1647 | u16 eeprom; | 1670 | u8 offset = rt2x00dev->lna_gain; |
1648 | u8 offset; | ||
1649 | u8 lna; | 1671 | u8 lna; |
1650 | 1672 | ||
1651 | lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA); | 1673 | lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA); |
1652 | switch (lna) { | 1674 | switch (lna) { |
1653 | case 3: | 1675 | case 3: |
1654 | offset = 90; | 1676 | offset += 90; |
1655 | break; | 1677 | break; |
1656 | case 2: | 1678 | case 2: |
1657 | offset = 74; | 1679 | offset += 74; |
1658 | break; | 1680 | break; |
1659 | case 1: | 1681 | case 1: |
1660 | offset = 64; | 1682 | offset += 64; |
1661 | break; | 1683 | break; |
1662 | default: | 1684 | default: |
1663 | return 0; | 1685 | return 0; |
@@ -1673,15 +1695,6 @@ static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) | |||
1673 | else if (lna == 2) | 1695 | else if (lna == 2) |
1674 | offset += 8; | 1696 | offset += 8; |
1675 | } | 1697 | } |
1676 | |||
1677 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom); | ||
1678 | offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1); | ||
1679 | } else { | ||
1680 | if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags)) | ||
1681 | offset += 14; | ||
1682 | |||
1683 | rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom); | ||
1684 | offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1); | ||
1685 | } | 1698 | } |
1686 | 1699 | ||
1687 | return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset; | 1700 | return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset; |