diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 5 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 48 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 41 |
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 | |||
642 | static 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 | |||
641 | static void rt61pci_config_phymode(struct rt2x00_dev *rt2x00dev, | 665 | static 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 | */ |
1884 | static int rt61pci_agc_to_rssi(struct rt2x00_dev *rt2x00dev, int rxd_w1) | 1911 | static 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 | ||
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; |