aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt73usb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt73usb.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c41
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
667static 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
667static void rt73usb_config_phymode(struct rt2x00_dev *rt2x00dev, 687static 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 */
1645static int rt73usb_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) 1668static 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;