aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h5
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c48
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c41
3 files changed, 63 insertions, 31 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h
index ced0a5251766..3fa3d5b006a6 100644
--- a/drivers/net/wireless/rt2x00/rt2x00.h
+++ b/drivers/net/wireless/rt2x00/rt2x00.h
@@ -804,6 +804,11 @@ struct rt2x00_dev {
804 u32 *rf; 804 u32 *rf;
805 805
806 /* 806 /*
807 * LNA gain
808 */
809 short lna_gain;
810
811 /*
807 * USB Max frame size (for rt2500usb & rt73usb). 812 * USB Max frame size (for rt2500usb & rt73usb).
808 */ 813 */
809 u16 usb_maxpacket; 814 u16 usb_maxpacket;
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c
index 87012f88461f..0fcc45636834 100644
--- a/drivers/net/wireless/rt2x00/rt61pci.c
+++ b/drivers/net/wireless/rt2x00/rt61pci.c
@@ -638,6 +638,30 @@ static void rt61pci_config_erp(struct rt2x00_dev *rt2x00dev,
638 rt2x00pci_register_write(rt2x00dev, TXRX_CSR4, reg); 638 rt2x00pci_register_write(rt2x00dev, TXRX_CSR4, reg);
639} 639}
640 640
641
642static void rt61pci_config_lna_gain(struct rt2x00_dev *rt2x00dev,
643 struct rt2x00lib_conf *libconf)
644{
645 u16 eeprom;
646 short lna_gain = 0;
647
648 if (libconf->band == IEEE80211_BAND_2GHZ) {
649 if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
650 lna_gain += 14;
651
652 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
653 lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
654 } else {
655 if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
656 lna_gain += 14;
657
658 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
659 lna_gain -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
660 }
661
662 rt2x00dev->lna_gain = lna_gain;
663}
664
641static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev, 665static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev,
642 const int basic_rate_mask) 666 const int basic_rate_mask)
643{ 667{
@@ -956,6 +980,9 @@ static void rt61pci_config(struct rt2x00_dev *rt2x00dev,
956 struct rt2x00lib_conf *libconf, 980 struct rt2x00lib_conf *libconf,
957 const unsigned int flags) 981 const unsigned int flags)
958{ 982{
983 /* Always recalculate LNA gain before changing configuration */
984 rt61pci_config_lna_gain(rt2x00dev, libconf);
985
959 if (flags & CONFIG_UPDATE_PHYMODE) 986 if (flags & CONFIG_UPDATE_PHYMODE)
960 rt61pci_config_phymode(rt2x00dev, libconf->basic_rates); 987 rt61pci_config_phymode(rt2x00dev, libconf->basic_rates);
961 if (flags & CONFIG_UPDATE_CHANNEL) 988 if (flags & CONFIG_UPDATE_CHANNEL)
@@ -1883,40 +1910,27 @@ static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev,
1883 */ 1910 */
1884static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) 1911static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1)
1885{ 1912{
1886 u16 eeprom; 1913 u8 offset = rt2x00dev->lna_gain;
1887 u8 offset;
1888 u8 lna; 1914 u8 lna;
1889 1915
1890 lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA); 1916 lna = rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_LNA);
1891 switch (lna) { 1917 switch (lna) {
1892 case 3: 1918 case 3:
1893 offset = 90; 1919 offset += 90;
1894 break; 1920 break;
1895 case 2: 1921 case 2:
1896 offset = 74; 1922 offset += 74;
1897 break; 1923 break;
1898 case 1: 1924 case 1:
1899 offset = 64; 1925 offset += 64;
1900 break; 1926 break;
1901 default: 1927 default:
1902 return 0; 1928 return 0;
1903 } 1929 }
1904 1930
1905 if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) { 1931 if (rt2x00dev->rx_status.band == IEEE80211_BAND_5GHZ) {
1906 if (test_bit(CONFIG_EXTERNAL_LNA_A, &rt2x00dev->flags))
1907 offset += 14;
1908
1909 if (lna == 3 || lna == 2) 1932 if (lna == 3 || lna == 2)
1910 offset += 10; 1933 offset += 10;
1911
1912 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_A, &eeprom);
1913 offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_A_1);
1914 } else {
1915 if (test_bit(CONFIG_EXTERNAL_LNA_BG, &rt2x00dev->flags))
1916 offset += 14;
1917
1918 rt2x00_eeprom_read(rt2x00dev, EEPROM_RSSI_OFFSET_BG, &eeprom);
1919 offset -= rt2x00_get_field16(eeprom, EEPROM_RSSI_OFFSET_BG_1);
1920 } 1934 }
1921 1935
1922 return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset; 1936 return rt2x00_get_field32(rxd_w1, RXD_W1_RSSI_AGC) * 2 - offset;
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;