aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt73usb.c
diff options
context:
space:
mode:
authorIvo van Doorn <ivdoorn@gmail.com>2008-08-06 10:22:17 -0400
committerJohn W. Linville <linville@tuxdriver.com>2008-08-22 16:29:59 -0400
commitba2ab47129eee76f6f0ef52b4beae30a12cee7f6 (patch)
treeaded96a0180e0e09122f1400a307f8d3d525feb0 /drivers/net/wireless/rt2x00/rt73usb.c
parent48c2fc59aa415ba92be0ad3a7e741c46883e3944 (diff)
rt2x00: Move lna_gain calculation to config() callback
We can optimize lna calculation in IRQ context by calculating most of the value during the config() callback when most of the value is actually influenced. This will be required later by rt2800pci and rt2800usb as well, since they need the lna_gain value during config(). Signed-off-by: Ivo van Doorn <IvDoorn@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
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;