diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00')
27 files changed, 301 insertions, 235 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 4f420a9ec5dc..9ec6691adf0d 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -885,8 +885,7 @@ static void rt2400pci_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
885 | 885 | ||
886 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | 886 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); |
887 | rt2x00_set_field32(®, RXCSR0_DISABLE_RX, | 887 | rt2x00_set_field32(®, RXCSR0_DISABLE_RX, |
888 | (state == STATE_RADIO_RX_OFF) || | 888 | (state == STATE_RADIO_RX_OFF)); |
889 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
890 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | 889 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); |
891 | } | 890 | } |
892 | 891 | ||
@@ -989,9 +988,7 @@ static int rt2400pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
989 | rt2400pci_disable_radio(rt2x00dev); | 988 | rt2400pci_disable_radio(rt2x00dev); |
990 | break; | 989 | break; |
991 | case STATE_RADIO_RX_ON: | 990 | case STATE_RADIO_RX_ON: |
992 | case STATE_RADIO_RX_ON_LINK: | ||
993 | case STATE_RADIO_RX_OFF: | 991 | case STATE_RADIO_RX_OFF: |
994 | case STATE_RADIO_RX_OFF_LINK: | ||
995 | rt2400pci_toggle_rx(rt2x00dev, state); | 992 | rt2400pci_toggle_rx(rt2x00dev, state); |
996 | break; | 993 | break; |
997 | case STATE_RADIO_IRQ_ON: | 994 | case STATE_RADIO_IRQ_ON: |
@@ -1612,6 +1609,7 @@ static const struct ieee80211_ops rt2400pci_mac80211_ops = { | |||
1612 | .get_tsf = rt2400pci_get_tsf, | 1609 | .get_tsf = rt2400pci_get_tsf, |
1613 | .tx_last_beacon = rt2400pci_tx_last_beacon, | 1610 | .tx_last_beacon = rt2400pci_tx_last_beacon, |
1614 | .rfkill_poll = rt2x00mac_rfkill_poll, | 1611 | .rfkill_poll = rt2x00mac_rfkill_poll, |
1612 | .flush = rt2x00mac_flush, | ||
1615 | }; | 1613 | }; |
1616 | 1614 | ||
1617 | static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { | 1615 | static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { |
@@ -1640,28 +1638,28 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { | |||
1640 | }; | 1638 | }; |
1641 | 1639 | ||
1642 | static const struct data_queue_desc rt2400pci_queue_rx = { | 1640 | static const struct data_queue_desc rt2400pci_queue_rx = { |
1643 | .entry_num = RX_ENTRIES, | 1641 | .entry_num = 24, |
1644 | .data_size = DATA_FRAME_SIZE, | 1642 | .data_size = DATA_FRAME_SIZE, |
1645 | .desc_size = RXD_DESC_SIZE, | 1643 | .desc_size = RXD_DESC_SIZE, |
1646 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1644 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1647 | }; | 1645 | }; |
1648 | 1646 | ||
1649 | static const struct data_queue_desc rt2400pci_queue_tx = { | 1647 | static const struct data_queue_desc rt2400pci_queue_tx = { |
1650 | .entry_num = TX_ENTRIES, | 1648 | .entry_num = 24, |
1651 | .data_size = DATA_FRAME_SIZE, | 1649 | .data_size = DATA_FRAME_SIZE, |
1652 | .desc_size = TXD_DESC_SIZE, | 1650 | .desc_size = TXD_DESC_SIZE, |
1653 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1651 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1654 | }; | 1652 | }; |
1655 | 1653 | ||
1656 | static const struct data_queue_desc rt2400pci_queue_bcn = { | 1654 | static const struct data_queue_desc rt2400pci_queue_bcn = { |
1657 | .entry_num = BEACON_ENTRIES, | 1655 | .entry_num = 1, |
1658 | .data_size = MGMT_FRAME_SIZE, | 1656 | .data_size = MGMT_FRAME_SIZE, |
1659 | .desc_size = TXD_DESC_SIZE, | 1657 | .desc_size = TXD_DESC_SIZE, |
1660 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1658 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1661 | }; | 1659 | }; |
1662 | 1660 | ||
1663 | static const struct data_queue_desc rt2400pci_queue_atim = { | 1661 | static const struct data_queue_desc rt2400pci_queue_atim = { |
1664 | .entry_num = ATIM_ENTRIES, | 1662 | .entry_num = 8, |
1665 | .data_size = DATA_FRAME_SIZE, | 1663 | .data_size = DATA_FRAME_SIZE, |
1666 | .desc_size = TXD_DESC_SIZE, | 1664 | .desc_size = TXD_DESC_SIZE, |
1667 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1665 | .priv_size = sizeof(struct queue_entry_priv_pci), |
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.h b/drivers/net/wireless/rt2x00/rt2400pci.h index c048b18f4133..d3a4a68cc439 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.h +++ b/drivers/net/wireless/rt2x00/rt2400pci.h | |||
@@ -809,8 +809,8 @@ | |||
809 | /* | 809 | /* |
810 | * DMA descriptor defines. | 810 | * DMA descriptor defines. |
811 | */ | 811 | */ |
812 | #define TXD_DESC_SIZE ( 8 * sizeof(__le32) ) | 812 | #define TXD_DESC_SIZE (8 * sizeof(__le32)) |
813 | #define RXD_DESC_SIZE ( 8 * sizeof(__le32) ) | 813 | #define RXD_DESC_SIZE (8 * sizeof(__le32)) |
814 | 814 | ||
815 | /* | 815 | /* |
816 | * TX descriptor format for TX, PRIO, ATIM and Beacon Ring. | 816 | * TX descriptor format for TX, PRIO, ATIM and Beacon Ring. |
@@ -948,6 +948,6 @@ | |||
948 | ((__CLAMP_TX(__txpower) - MAX_TXPOWER) + MIN_TXPOWER) | 948 | ((__CLAMP_TX(__txpower) - MAX_TXPOWER) + MIN_TXPOWER) |
949 | 949 | ||
950 | #define TXPOWER_TO_DEV(__txpower) \ | 950 | #define TXPOWER_TO_DEV(__txpower) \ |
951 | MAX_TXPOWER - (__CLAMP_TX(__txpower) - MIN_TXPOWER) | 951 | (MAX_TXPOWER - (__CLAMP_TX(__txpower) - MIN_TXPOWER)) |
952 | 952 | ||
953 | #endif /* RT2400PCI_H */ | 953 | #endif /* RT2400PCI_H */ |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 97feb7aef809..3e7f20346243 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -1040,8 +1040,7 @@ static void rt2500pci_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
1040 | 1040 | ||
1041 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); | 1041 | rt2x00pci_register_read(rt2x00dev, RXCSR0, ®); |
1042 | rt2x00_set_field32(®, RXCSR0_DISABLE_RX, | 1042 | rt2x00_set_field32(®, RXCSR0_DISABLE_RX, |
1043 | (state == STATE_RADIO_RX_OFF) || | 1043 | (state == STATE_RADIO_RX_OFF)); |
1044 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
1045 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); | 1044 | rt2x00pci_register_write(rt2x00dev, RXCSR0, reg); |
1046 | } | 1045 | } |
1047 | 1046 | ||
@@ -1144,9 +1143,7 @@ static int rt2500pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1144 | rt2500pci_disable_radio(rt2x00dev); | 1143 | rt2500pci_disable_radio(rt2x00dev); |
1145 | break; | 1144 | break; |
1146 | case STATE_RADIO_RX_ON: | 1145 | case STATE_RADIO_RX_ON: |
1147 | case STATE_RADIO_RX_ON_LINK: | ||
1148 | case STATE_RADIO_RX_OFF: | 1146 | case STATE_RADIO_RX_OFF: |
1149 | case STATE_RADIO_RX_OFF_LINK: | ||
1150 | rt2500pci_toggle_rx(rt2x00dev, state); | 1147 | rt2500pci_toggle_rx(rt2x00dev, state); |
1151 | break; | 1148 | break; |
1152 | case STATE_RADIO_IRQ_ON: | 1149 | case STATE_RADIO_IRQ_ON: |
@@ -1193,9 +1190,9 @@ static void rt2500pci_write_tx_desc(struct queue_entry *entry, | |||
1193 | 1190 | ||
1194 | rt2x00_desc_read(txd, 2, &word); | 1191 | rt2x00_desc_read(txd, 2, &word); |
1195 | rt2x00_set_field32(&word, TXD_W2_IV_OFFSET, IEEE80211_HEADER); | 1192 | rt2x00_set_field32(&word, TXD_W2_IV_OFFSET, IEEE80211_HEADER); |
1196 | rt2x00_set_field32(&word, TXD_W2_AIFS, txdesc->aifs); | 1193 | rt2x00_set_field32(&word, TXD_W2_AIFS, entry->queue->aifs); |
1197 | rt2x00_set_field32(&word, TXD_W2_CWMIN, txdesc->cw_min); | 1194 | rt2x00_set_field32(&word, TXD_W2_CWMIN, entry->queue->cw_min); |
1198 | rt2x00_set_field32(&word, TXD_W2_CWMAX, txdesc->cw_max); | 1195 | rt2x00_set_field32(&word, TXD_W2_CWMAX, entry->queue->cw_max); |
1199 | rt2x00_desc_write(txd, 2, word); | 1196 | rt2x00_desc_write(txd, 2, word); |
1200 | 1197 | ||
1201 | rt2x00_desc_read(txd, 3, &word); | 1198 | rt2x00_desc_read(txd, 3, &word); |
@@ -1909,6 +1906,7 @@ static const struct ieee80211_ops rt2500pci_mac80211_ops = { | |||
1909 | .get_tsf = rt2500pci_get_tsf, | 1906 | .get_tsf = rt2500pci_get_tsf, |
1910 | .tx_last_beacon = rt2500pci_tx_last_beacon, | 1907 | .tx_last_beacon = rt2500pci_tx_last_beacon, |
1911 | .rfkill_poll = rt2x00mac_rfkill_poll, | 1908 | .rfkill_poll = rt2x00mac_rfkill_poll, |
1909 | .flush = rt2x00mac_flush, | ||
1912 | }; | 1910 | }; |
1913 | 1911 | ||
1914 | static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { | 1912 | static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { |
@@ -1937,28 +1935,28 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { | |||
1937 | }; | 1935 | }; |
1938 | 1936 | ||
1939 | static const struct data_queue_desc rt2500pci_queue_rx = { | 1937 | static const struct data_queue_desc rt2500pci_queue_rx = { |
1940 | .entry_num = RX_ENTRIES, | 1938 | .entry_num = 32, |
1941 | .data_size = DATA_FRAME_SIZE, | 1939 | .data_size = DATA_FRAME_SIZE, |
1942 | .desc_size = RXD_DESC_SIZE, | 1940 | .desc_size = RXD_DESC_SIZE, |
1943 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1941 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1944 | }; | 1942 | }; |
1945 | 1943 | ||
1946 | static const struct data_queue_desc rt2500pci_queue_tx = { | 1944 | static const struct data_queue_desc rt2500pci_queue_tx = { |
1947 | .entry_num = TX_ENTRIES, | 1945 | .entry_num = 32, |
1948 | .data_size = DATA_FRAME_SIZE, | 1946 | .data_size = DATA_FRAME_SIZE, |
1949 | .desc_size = TXD_DESC_SIZE, | 1947 | .desc_size = TXD_DESC_SIZE, |
1950 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1948 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1951 | }; | 1949 | }; |
1952 | 1950 | ||
1953 | static const struct data_queue_desc rt2500pci_queue_bcn = { | 1951 | static const struct data_queue_desc rt2500pci_queue_bcn = { |
1954 | .entry_num = BEACON_ENTRIES, | 1952 | .entry_num = 1, |
1955 | .data_size = MGMT_FRAME_SIZE, | 1953 | .data_size = MGMT_FRAME_SIZE, |
1956 | .desc_size = TXD_DESC_SIZE, | 1954 | .desc_size = TXD_DESC_SIZE, |
1957 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1955 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1958 | }; | 1956 | }; |
1959 | 1957 | ||
1960 | static const struct data_queue_desc rt2500pci_queue_atim = { | 1958 | static const struct data_queue_desc rt2500pci_queue_atim = { |
1961 | .entry_num = ATIM_ENTRIES, | 1959 | .entry_num = 8, |
1962 | .data_size = DATA_FRAME_SIZE, | 1960 | .data_size = DATA_FRAME_SIZE, |
1963 | .desc_size = TXD_DESC_SIZE, | 1961 | .desc_size = TXD_DESC_SIZE, |
1964 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1962 | .priv_size = sizeof(struct queue_entry_priv_pci), |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.h b/drivers/net/wireless/rt2x00/rt2500pci.h index d708031361ac..2aad7ba8a100 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.h +++ b/drivers/net/wireless/rt2x00/rt2500pci.h | |||
@@ -1088,8 +1088,8 @@ | |||
1088 | /* | 1088 | /* |
1089 | * DMA descriptor defines. | 1089 | * DMA descriptor defines. |
1090 | */ | 1090 | */ |
1091 | #define TXD_DESC_SIZE ( 11 * sizeof(__le32) ) | 1091 | #define TXD_DESC_SIZE (11 * sizeof(__le32)) |
1092 | #define RXD_DESC_SIZE ( 11 * sizeof(__le32) ) | 1092 | #define RXD_DESC_SIZE (11 * sizeof(__le32)) |
1093 | 1093 | ||
1094 | /* | 1094 | /* |
1095 | * TX descriptor format for TX, PRIO, ATIM and Beacon Ring. | 1095 | * TX descriptor format for TX, PRIO, ATIM and Beacon Ring. |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index 93e44c7f3a74..8152fec31753 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -39,7 +39,7 @@ | |||
39 | /* | 39 | /* |
40 | * Allow hardware encryption to be disabled. | 40 | * Allow hardware encryption to be disabled. |
41 | */ | 41 | */ |
42 | static int modparam_nohwcrypt = 0; | 42 | static int modparam_nohwcrypt; |
43 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); | 43 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); |
44 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); | 44 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); |
45 | 45 | ||
@@ -938,8 +938,7 @@ static void rt2500usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
938 | 938 | ||
939 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); | 939 | rt2500usb_register_read(rt2x00dev, TXRX_CSR2, ®); |
940 | rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, | 940 | rt2x00_set_field16(®, TXRX_CSR2_DISABLE_RX, |
941 | (state == STATE_RADIO_RX_OFF) || | 941 | (state == STATE_RADIO_RX_OFF)); |
942 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
943 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); | 942 | rt2500usb_register_write(rt2x00dev, TXRX_CSR2, reg); |
944 | } | 943 | } |
945 | 944 | ||
@@ -1019,9 +1018,7 @@ static int rt2500usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1019 | rt2500usb_disable_radio(rt2x00dev); | 1018 | rt2500usb_disable_radio(rt2x00dev); |
1020 | break; | 1019 | break; |
1021 | case STATE_RADIO_RX_ON: | 1020 | case STATE_RADIO_RX_ON: |
1022 | case STATE_RADIO_RX_ON_LINK: | ||
1023 | case STATE_RADIO_RX_OFF: | 1021 | case STATE_RADIO_RX_OFF: |
1024 | case STATE_RADIO_RX_OFF_LINK: | ||
1025 | rt2500usb_toggle_rx(rt2x00dev, state); | 1022 | rt2500usb_toggle_rx(rt2x00dev, state); |
1026 | break; | 1023 | break; |
1027 | case STATE_RADIO_IRQ_ON: | 1024 | case STATE_RADIO_IRQ_ON: |
@@ -1081,9 +1078,9 @@ static void rt2500usb_write_tx_desc(struct queue_entry *entry, | |||
1081 | 1078 | ||
1082 | rt2x00_desc_read(txd, 1, &word); | 1079 | rt2x00_desc_read(txd, 1, &word); |
1083 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); | 1080 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); |
1084 | rt2x00_set_field32(&word, TXD_W1_AIFS, txdesc->aifs); | 1081 | rt2x00_set_field32(&word, TXD_W1_AIFS, entry->queue->aifs); |
1085 | rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min); | 1082 | rt2x00_set_field32(&word, TXD_W1_CWMIN, entry->queue->cw_min); |
1086 | rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max); | 1083 | rt2x00_set_field32(&word, TXD_W1_CWMAX, entry->queue->cw_max); |
1087 | rt2x00_desc_write(txd, 1, word); | 1084 | rt2x00_desc_write(txd, 1, word); |
1088 | 1085 | ||
1089 | rt2x00_desc_read(txd, 2, &word); | 1086 | rt2x00_desc_read(txd, 2, &word); |
@@ -1801,6 +1798,7 @@ static const struct ieee80211_ops rt2500usb_mac80211_ops = { | |||
1801 | .bss_info_changed = rt2x00mac_bss_info_changed, | 1798 | .bss_info_changed = rt2x00mac_bss_info_changed, |
1802 | .conf_tx = rt2x00mac_conf_tx, | 1799 | .conf_tx = rt2x00mac_conf_tx, |
1803 | .rfkill_poll = rt2x00mac_rfkill_poll, | 1800 | .rfkill_poll = rt2x00mac_rfkill_poll, |
1801 | .flush = rt2x00mac_flush, | ||
1804 | }; | 1802 | }; |
1805 | 1803 | ||
1806 | static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | 1804 | static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { |
@@ -1829,28 +1827,28 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { | |||
1829 | }; | 1827 | }; |
1830 | 1828 | ||
1831 | static const struct data_queue_desc rt2500usb_queue_rx = { | 1829 | static const struct data_queue_desc rt2500usb_queue_rx = { |
1832 | .entry_num = RX_ENTRIES, | 1830 | .entry_num = 32, |
1833 | .data_size = DATA_FRAME_SIZE, | 1831 | .data_size = DATA_FRAME_SIZE, |
1834 | .desc_size = RXD_DESC_SIZE, | 1832 | .desc_size = RXD_DESC_SIZE, |
1835 | .priv_size = sizeof(struct queue_entry_priv_usb), | 1833 | .priv_size = sizeof(struct queue_entry_priv_usb), |
1836 | }; | 1834 | }; |
1837 | 1835 | ||
1838 | static const struct data_queue_desc rt2500usb_queue_tx = { | 1836 | static const struct data_queue_desc rt2500usb_queue_tx = { |
1839 | .entry_num = TX_ENTRIES, | 1837 | .entry_num = 32, |
1840 | .data_size = DATA_FRAME_SIZE, | 1838 | .data_size = DATA_FRAME_SIZE, |
1841 | .desc_size = TXD_DESC_SIZE, | 1839 | .desc_size = TXD_DESC_SIZE, |
1842 | .priv_size = sizeof(struct queue_entry_priv_usb), | 1840 | .priv_size = sizeof(struct queue_entry_priv_usb), |
1843 | }; | 1841 | }; |
1844 | 1842 | ||
1845 | static const struct data_queue_desc rt2500usb_queue_bcn = { | 1843 | static const struct data_queue_desc rt2500usb_queue_bcn = { |
1846 | .entry_num = BEACON_ENTRIES, | 1844 | .entry_num = 1, |
1847 | .data_size = MGMT_FRAME_SIZE, | 1845 | .data_size = MGMT_FRAME_SIZE, |
1848 | .desc_size = TXD_DESC_SIZE, | 1846 | .desc_size = TXD_DESC_SIZE, |
1849 | .priv_size = sizeof(struct queue_entry_priv_usb_bcn), | 1847 | .priv_size = sizeof(struct queue_entry_priv_usb_bcn), |
1850 | }; | 1848 | }; |
1851 | 1849 | ||
1852 | static const struct data_queue_desc rt2500usb_queue_atim = { | 1850 | static const struct data_queue_desc rt2500usb_queue_atim = { |
1853 | .entry_num = ATIM_ENTRIES, | 1851 | .entry_num = 8, |
1854 | .data_size = DATA_FRAME_SIZE, | 1852 | .data_size = DATA_FRAME_SIZE, |
1855 | .desc_size = TXD_DESC_SIZE, | 1853 | .desc_size = TXD_DESC_SIZE, |
1856 | .priv_size = sizeof(struct queue_entry_priv_usb), | 1854 | .priv_size = sizeof(struct queue_entry_priv_usb), |
diff --git a/drivers/net/wireless/rt2x00/rt2800.h b/drivers/net/wireless/rt2x00/rt2800.h index eb8b6cab9925..002224c9bb62 100644 --- a/drivers/net/wireless/rt2x00/rt2800.h +++ b/drivers/net/wireless/rt2x00/rt2800.h | |||
@@ -412,10 +412,22 @@ | |||
412 | #define BCN_OFFSET1_BCN7 FIELD32(0xff000000) | 412 | #define BCN_OFFSET1_BCN7 FIELD32(0xff000000) |
413 | 413 | ||
414 | /* | 414 | /* |
415 | * PBF registers | 415 | * TXRXQ_PCNT: PBF register |
416 | * Most are for debug. Driver doesn't touch PBF register. | 416 | * PCNT_TX0Q: Page count for TX hardware queue 0 |
417 | * PCNT_TX1Q: Page count for TX hardware queue 1 | ||
418 | * PCNT_TX2Q: Page count for TX hardware queue 2 | ||
419 | * PCNT_RX0Q: Page count for RX hardware queue | ||
417 | */ | 420 | */ |
418 | #define TXRXQ_PCNT 0x0438 | 421 | #define TXRXQ_PCNT 0x0438 |
422 | #define TXRXQ_PCNT_TX0Q FIELD32(0x000000ff) | ||
423 | #define TXRXQ_PCNT_TX1Q FIELD32(0x0000ff00) | ||
424 | #define TXRXQ_PCNT_TX2Q FIELD32(0x00ff0000) | ||
425 | #define TXRXQ_PCNT_RX0Q FIELD32(0xff000000) | ||
426 | |||
427 | /* | ||
428 | * PBF register | ||
429 | * Debug. Driver doesn't touch PBF register. | ||
430 | */ | ||
419 | #define PBF_DBG 0x043c | 431 | #define PBF_DBG 0x043c |
420 | 432 | ||
421 | /* | 433 | /* |
@@ -960,8 +972,31 @@ | |||
960 | 972 | ||
961 | /* | 973 | /* |
962 | * TXOP_CTRL_CFG: | 974 | * TXOP_CTRL_CFG: |
975 | * TIMEOUT_TRUN_EN: Enable/Disable TXOP timeout truncation | ||
976 | * AC_TRUN_EN: Enable/Disable truncation for AC change | ||
977 | * TXRATEGRP_TRUN_EN: Enable/Disable truncation for TX rate group change | ||
978 | * USER_MODE_TRUN_EN: Enable/Disable truncation for user TXOP mode | ||
979 | * MIMO_PS_TRUN_EN: Enable/Disable truncation for MIMO PS RTS/CTS | ||
980 | * RESERVED_TRUN_EN: Reserved | ||
981 | * LSIG_TXOP_EN: Enable/Disable L-SIG TXOP protection | ||
982 | * EXT_CCA_EN: Enable/Disable extension channel CCA reference (Defer 40Mhz | ||
983 | * transmissions if extension CCA is clear). | ||
984 | * EXT_CCA_DLY: Extension CCA signal delay time (unit: us) | ||
985 | * EXT_CWMIN: CwMin for extension channel backoff | ||
986 | * 0: Disabled | ||
987 | * | ||
963 | */ | 988 | */ |
964 | #define TXOP_CTRL_CFG 0x1340 | 989 | #define TXOP_CTRL_CFG 0x1340 |
990 | #define TXOP_CTRL_CFG_TIMEOUT_TRUN_EN FIELD32(0x00000001) | ||
991 | #define TXOP_CTRL_CFG_AC_TRUN_EN FIELD32(0x00000002) | ||
992 | #define TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN FIELD32(0x00000004) | ||
993 | #define TXOP_CTRL_CFG_USER_MODE_TRUN_EN FIELD32(0x00000008) | ||
994 | #define TXOP_CTRL_CFG_MIMO_PS_TRUN_EN FIELD32(0x00000010) | ||
995 | #define TXOP_CTRL_CFG_RESERVED_TRUN_EN FIELD32(0x00000020) | ||
996 | #define TXOP_CTRL_CFG_LSIG_TXOP_EN FIELD32(0x00000040) | ||
997 | #define TXOP_CTRL_CFG_EXT_CCA_EN FIELD32(0x00000080) | ||
998 | #define TXOP_CTRL_CFG_EXT_CCA_DLY FIELD32(0x0000ff00) | ||
999 | #define TXOP_CTRL_CFG_EXT_CWMIN FIELD32(0x000f0000) | ||
965 | 1000 | ||
966 | /* | 1001 | /* |
967 | * TX_RTS_CFG: | 1002 | * TX_RTS_CFG: |
@@ -1485,17 +1520,17 @@ | |||
1485 | #define SHARED_KEY_MODE_BASE 0x7000 | 1520 | #define SHARED_KEY_MODE_BASE 0x7000 |
1486 | 1521 | ||
1487 | #define MAC_WCID_ENTRY(__idx) \ | 1522 | #define MAC_WCID_ENTRY(__idx) \ |
1488 | ( MAC_WCID_BASE + ((__idx) * sizeof(struct mac_wcid_entry)) ) | 1523 | (MAC_WCID_BASE + ((__idx) * sizeof(struct mac_wcid_entry))) |
1489 | #define PAIRWISE_KEY_ENTRY(__idx) \ | 1524 | #define PAIRWISE_KEY_ENTRY(__idx) \ |
1490 | ( PAIRWISE_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry)) ) | 1525 | (PAIRWISE_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) |
1491 | #define MAC_IVEIV_ENTRY(__idx) \ | 1526 | #define MAC_IVEIV_ENTRY(__idx) \ |
1492 | ( MAC_IVEIV_TABLE_BASE + ((__idx) * sizeof(struct mac_iveiv_entry)) ) | 1527 | (MAC_IVEIV_TABLE_BASE + ((__idx) * sizeof(struct mac_iveiv_entry))) |
1493 | #define MAC_WCID_ATTR_ENTRY(__idx) \ | 1528 | #define MAC_WCID_ATTR_ENTRY(__idx) \ |
1494 | ( MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32)) ) | 1529 | (MAC_WCID_ATTRIBUTE_BASE + ((__idx) * sizeof(u32))) |
1495 | #define SHARED_KEY_ENTRY(__idx) \ | 1530 | #define SHARED_KEY_ENTRY(__idx) \ |
1496 | ( SHARED_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry)) ) | 1531 | (SHARED_KEY_TABLE_BASE + ((__idx) * sizeof(struct hw_key_entry))) |
1497 | #define SHARED_KEY_MODE_ENTRY(__idx) \ | 1532 | #define SHARED_KEY_MODE_ENTRY(__idx) \ |
1498 | ( SHARED_KEY_MODE_BASE + ((__idx) * sizeof(u32)) ) | 1533 | (SHARED_KEY_MODE_BASE + ((__idx) * sizeof(u32))) |
1499 | 1534 | ||
1500 | struct mac_wcid_entry { | 1535 | struct mac_wcid_entry { |
1501 | u8 mac[6]; | 1536 | u8 mac[6]; |
@@ -1635,9 +1670,9 @@ struct mac_iveiv_entry { | |||
1635 | #define HW_BEACON_BASE7 0x5bc0 | 1670 | #define HW_BEACON_BASE7 0x5bc0 |
1636 | 1671 | ||
1637 | #define HW_BEACON_OFFSET(__index) \ | 1672 | #define HW_BEACON_OFFSET(__index) \ |
1638 | ( ((__index) < 4) ? ( HW_BEACON_BASE0 + (__index * 0x0200) ) : \ | 1673 | (((__index) < 4) ? (HW_BEACON_BASE0 + (__index * 0x0200)) : \ |
1639 | (((__index) < 6) ? ( HW_BEACON_BASE4 + ((__index - 4) * 0x0200) ) : \ | 1674 | (((__index) < 6) ? (HW_BEACON_BASE4 + ((__index - 4) * 0x0200)) : \ |
1640 | (HW_BEACON_BASE6 - ((__index - 6) * 0x0200))) ) | 1675 | (HW_BEACON_BASE6 - ((__index - 6) * 0x0200)))) |
1641 | 1676 | ||
1642 | /* | 1677 | /* |
1643 | * BBP registers. | 1678 | * BBP registers. |
@@ -1987,8 +2022,8 @@ struct mac_iveiv_entry { | |||
1987 | /* | 2022 | /* |
1988 | * DMA descriptor defines. | 2023 | * DMA descriptor defines. |
1989 | */ | 2024 | */ |
1990 | #define TXWI_DESC_SIZE ( 4 * sizeof(__le32) ) | 2025 | #define TXWI_DESC_SIZE (4 * sizeof(__le32)) |
1991 | #define RXWI_DESC_SIZE ( 4 * sizeof(__le32) ) | 2026 | #define RXWI_DESC_SIZE (4 * sizeof(__le32)) |
1992 | 2027 | ||
1993 | /* | 2028 | /* |
1994 | * TX WI structure | 2029 | * TX WI structure |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 5f00e00789d8..b5d2ebab6ea8 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
@@ -277,13 +277,17 @@ int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev) | |||
277 | unsigned int i; | 277 | unsigned int i; |
278 | u32 reg; | 278 | u32 reg; |
279 | 279 | ||
280 | /* | ||
281 | * Some devices are really slow to respond here. Wait a whole second | ||
282 | * before timing out. | ||
283 | */ | ||
280 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { | 284 | for (i = 0; i < REGISTER_BUSY_COUNT; i++) { |
281 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); | 285 | rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, ®); |
282 | if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && | 286 | if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) && |
283 | !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) | 287 | !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY)) |
284 | return 0; | 288 | return 0; |
285 | 289 | ||
286 | msleep(1); | 290 | msleep(10); |
287 | } | 291 | } |
288 | 292 | ||
289 | ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n"); | 293 | ERROR(rt2x00dev, "WPDMA TX/RX busy, aborting.\n"); |
@@ -483,7 +487,7 @@ void rt2800_write_tx_data(struct queue_entry *entry, | |||
483 | txdesc->key_idx : 0xff); | 487 | txdesc->key_idx : 0xff); |
484 | rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, | 488 | rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT, |
485 | txdesc->length); | 489 | txdesc->length); |
486 | rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE, txdesc->qid); | 490 | rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE, entry->queue->qid); |
487 | rt2x00_set_field32(&word, TXWI_W1_PACKETID_ENTRY, (entry->entry_idx % 3) + 1); | 491 | rt2x00_set_field32(&word, TXWI_W1_PACKETID_ENTRY, (entry->entry_idx % 3) + 1); |
488 | rt2x00_desc_write(txwi, 1, word); | 492 | rt2x00_desc_write(txwi, 1, word); |
489 | 493 | ||
@@ -727,7 +731,7 @@ void rt2800_txdone(struct rt2x00_dev *rt2x00dev) | |||
727 | * that the TX_STA_FIFO stack has a size of 16. We stick to our | 731 | * that the TX_STA_FIFO stack has a size of 16. We stick to our |
728 | * tx ring size for now. | 732 | * tx ring size for now. |
729 | */ | 733 | */ |
730 | for (i = 0; i < TX_ENTRIES; i++) { | 734 | for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { |
731 | rt2800_register_read(rt2x00dev, TX_STA_FIFO, ®); | 735 | rt2800_register_read(rt2x00dev, TX_STA_FIFO, ®); |
732 | if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID)) | 736 | if (!rt2x00_get_field32(reg, TX_STA_FIFO_VALID)) |
733 | break; | 737 | break; |
@@ -824,7 +828,7 @@ void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc) | |||
824 | } | 828 | } |
825 | EXPORT_SYMBOL_GPL(rt2800_write_beacon); | 829 | EXPORT_SYMBOL_GPL(rt2800_write_beacon); |
826 | 830 | ||
827 | static void inline rt2800_clear_beacon(struct rt2x00_dev *rt2x00dev, | 831 | static inline void rt2800_clear_beacon(struct rt2x00_dev *rt2x00dev, |
828 | unsigned int beacon_base) | 832 | unsigned int beacon_base) |
829 | { | 833 | { |
830 | int i; | 834 | int i; |
@@ -1144,6 +1148,7 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf, | |||
1144 | struct rt2x00intf_conf *conf, const unsigned int flags) | 1148 | struct rt2x00intf_conf *conf, const unsigned int flags) |
1145 | { | 1149 | { |
1146 | u32 reg; | 1150 | u32 reg; |
1151 | bool update_bssid = false; | ||
1147 | 1152 | ||
1148 | if (flags & CONFIG_UPDATE_TYPE) { | 1153 | if (flags & CONFIG_UPDATE_TYPE) { |
1149 | /* | 1154 | /* |
@@ -1173,6 +1178,16 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf, | |||
1173 | } | 1178 | } |
1174 | 1179 | ||
1175 | if (flags & CONFIG_UPDATE_MAC) { | 1180 | if (flags & CONFIG_UPDATE_MAC) { |
1181 | if (flags & CONFIG_UPDATE_TYPE && | ||
1182 | conf->sync == TSF_SYNC_AP_NONE) { | ||
1183 | /* | ||
1184 | * The BSSID register has to be set to our own mac | ||
1185 | * address in AP mode. | ||
1186 | */ | ||
1187 | memcpy(conf->bssid, conf->mac, sizeof(conf->mac)); | ||
1188 | update_bssid = true; | ||
1189 | } | ||
1190 | |||
1176 | if (!is_zero_ether_addr((const u8 *)conf->mac)) { | 1191 | if (!is_zero_ether_addr((const u8 *)conf->mac)) { |
1177 | reg = le32_to_cpu(conf->mac[1]); | 1192 | reg = le32_to_cpu(conf->mac[1]); |
1178 | rt2x00_set_field32(®, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff); | 1193 | rt2x00_set_field32(®, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff); |
@@ -1183,7 +1198,7 @@ void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf, | |||
1183 | conf->mac, sizeof(conf->mac)); | 1198 | conf->mac, sizeof(conf->mac)); |
1184 | } | 1199 | } |
1185 | 1200 | ||
1186 | if (flags & CONFIG_UPDATE_BSSID) { | 1201 | if ((flags & CONFIG_UPDATE_BSSID) || update_bssid) { |
1187 | if (!is_zero_ether_addr((const u8 *)conf->bssid)) { | 1202 | if (!is_zero_ether_addr((const u8 *)conf->bssid)) { |
1188 | reg = le32_to_cpu(conf->bssid[1]); | 1203 | reg = le32_to_cpu(conf->bssid[1]); |
1189 | rt2x00_set_field32(®, MAC_BSSID_DW1_BSS_ID_MASK, 3); | 1204 | rt2x00_set_field32(®, MAC_BSSID_DW1_BSS_ID_MASK, 3); |
@@ -2097,7 +2112,23 @@ static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev) | |||
2097 | rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); | 2112 | rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg); |
2098 | } | 2113 | } |
2099 | 2114 | ||
2100 | rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, 0x0000583f); | 2115 | /* |
2116 | * The legacy driver also sets TXOP_CTRL_CFG_RESERVED_TRUN_EN to 1 | ||
2117 | * although it is reserved. | ||
2118 | */ | ||
2119 | rt2800_register_read(rt2x00dev, TXOP_CTRL_CFG, ®); | ||
2120 | rt2x00_set_field32(®, TXOP_CTRL_CFG_TIMEOUT_TRUN_EN, 1); | ||
2121 | rt2x00_set_field32(®, TXOP_CTRL_CFG_AC_TRUN_EN, 1); | ||
2122 | rt2x00_set_field32(®, TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN, 1); | ||
2123 | rt2x00_set_field32(®, TXOP_CTRL_CFG_USER_MODE_TRUN_EN, 1); | ||
2124 | rt2x00_set_field32(®, TXOP_CTRL_CFG_MIMO_PS_TRUN_EN, 1); | ||
2125 | rt2x00_set_field32(®, TXOP_CTRL_CFG_RESERVED_TRUN_EN, 1); | ||
2126 | rt2x00_set_field32(®, TXOP_CTRL_CFG_LSIG_TXOP_EN, 0); | ||
2127 | rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CCA_EN, 0); | ||
2128 | rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CCA_DLY, 88); | ||
2129 | rt2x00_set_field32(®, TXOP_CTRL_CFG_EXT_CWMIN, 0); | ||
2130 | rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, reg); | ||
2131 | |||
2101 | rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, 0x00000002); | 2132 | rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, 0x00000002); |
2102 | 2133 | ||
2103 | rt2800_register_read(rt2x00dev, TX_RTS_CFG, ®); | 2134 | rt2800_register_read(rt2x00dev, TX_RTS_CFG, ®); |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index b26739535986..5f3a018c088d 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -328,8 +328,7 @@ static void rt2800pci_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
328 | 328 | ||
329 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); | 329 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); |
330 | rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, | 330 | rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, |
331 | (state == STATE_RADIO_RX_ON) || | 331 | (state == STATE_RADIO_RX_ON)); |
332 | (state == STATE_RADIO_RX_ON_LINK)); | ||
333 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | 332 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); |
334 | } | 333 | } |
335 | 334 | ||
@@ -442,7 +441,7 @@ static int rt2800pci_set_state(struct rt2x00_dev *rt2x00dev, | |||
442 | * if the device is booting and wasn't asleep it will return | 441 | * if the device is booting and wasn't asleep it will return |
443 | * failure when attempting to wakeup. | 442 | * failure when attempting to wakeup. |
444 | */ | 443 | */ |
445 | rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 2); | 444 | rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2); |
446 | 445 | ||
447 | if (state == STATE_AWAKE) { | 446 | if (state == STATE_AWAKE) { |
448 | rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0); | 447 | rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, TOKEN_WAKUP, 0, 0); |
@@ -477,9 +476,7 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
477 | rt2800pci_set_state(rt2x00dev, STATE_SLEEP); | 476 | rt2800pci_set_state(rt2x00dev, STATE_SLEEP); |
478 | break; | 477 | break; |
479 | case STATE_RADIO_RX_ON: | 478 | case STATE_RADIO_RX_ON: |
480 | case STATE_RADIO_RX_ON_LINK: | ||
481 | case STATE_RADIO_RX_OFF: | 479 | case STATE_RADIO_RX_OFF: |
482 | case STATE_RADIO_RX_OFF_LINK: | ||
483 | rt2800pci_toggle_rx(rt2x00dev, state); | 480 | rt2800pci_toggle_rx(rt2x00dev, state); |
484 | break; | 481 | break; |
485 | case STATE_RADIO_IRQ_ON: | 482 | case STATE_RADIO_IRQ_ON: |
@@ -777,7 +774,7 @@ static void rt2800pci_txstatus_interrupt(struct rt2x00_dev *rt2x00dev) | |||
777 | * Since we have only one producer and one consumer we don't | 774 | * Since we have only one producer and one consumer we don't |
778 | * need to lock the kfifo. | 775 | * need to lock the kfifo. |
779 | */ | 776 | */ |
780 | for (i = 0; i < TX_ENTRIES; i++) { | 777 | for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { |
781 | rt2800_register_read(rt2x00dev, TX_STA_FIFO, &status); | 778 | rt2800_register_read(rt2x00dev, TX_STA_FIFO, &status); |
782 | 779 | ||
783 | if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) | 780 | if (!rt2x00_get_field32(status, TX_STA_FIFO_VALID)) |
@@ -943,6 +940,7 @@ static const struct ieee80211_ops rt2800pci_mac80211_ops = { | |||
943 | .get_tsf = rt2800_get_tsf, | 940 | .get_tsf = rt2800_get_tsf, |
944 | .rfkill_poll = rt2x00mac_rfkill_poll, | 941 | .rfkill_poll = rt2x00mac_rfkill_poll, |
945 | .ampdu_action = rt2800_ampdu_action, | 942 | .ampdu_action = rt2800_ampdu_action, |
943 | .flush = rt2x00mac_flush, | ||
946 | }; | 944 | }; |
947 | 945 | ||
948 | static const struct rt2800_ops rt2800pci_rt2800_ops = { | 946 | static const struct rt2800_ops rt2800pci_rt2800_ops = { |
@@ -991,21 +989,21 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = { | |||
991 | }; | 989 | }; |
992 | 990 | ||
993 | static const struct data_queue_desc rt2800pci_queue_rx = { | 991 | static const struct data_queue_desc rt2800pci_queue_rx = { |
994 | .entry_num = RX_ENTRIES, | 992 | .entry_num = 128, |
995 | .data_size = AGGREGATION_SIZE, | 993 | .data_size = AGGREGATION_SIZE, |
996 | .desc_size = RXD_DESC_SIZE, | 994 | .desc_size = RXD_DESC_SIZE, |
997 | .priv_size = sizeof(struct queue_entry_priv_pci), | 995 | .priv_size = sizeof(struct queue_entry_priv_pci), |
998 | }; | 996 | }; |
999 | 997 | ||
1000 | static const struct data_queue_desc rt2800pci_queue_tx = { | 998 | static const struct data_queue_desc rt2800pci_queue_tx = { |
1001 | .entry_num = TX_ENTRIES, | 999 | .entry_num = 64, |
1002 | .data_size = AGGREGATION_SIZE, | 1000 | .data_size = AGGREGATION_SIZE, |
1003 | .desc_size = TXD_DESC_SIZE, | 1001 | .desc_size = TXD_DESC_SIZE, |
1004 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1002 | .priv_size = sizeof(struct queue_entry_priv_pci), |
1005 | }; | 1003 | }; |
1006 | 1004 | ||
1007 | static const struct data_queue_desc rt2800pci_queue_bcn = { | 1005 | static const struct data_queue_desc rt2800pci_queue_bcn = { |
1008 | .entry_num = 8 * BEACON_ENTRIES, | 1006 | .entry_num = 8, |
1009 | .data_size = 0, /* No DMA required for beacons */ | 1007 | .data_size = 0, /* No DMA required for beacons */ |
1010 | .desc_size = TXWI_DESC_SIZE, | 1008 | .desc_size = TXWI_DESC_SIZE, |
1011 | .priv_size = sizeof(struct queue_entry_priv_pci), | 1009 | .priv_size = sizeof(struct queue_entry_priv_pci), |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.h b/drivers/net/wireless/rt2x00/rt2800pci.h index 5a8dda9b5b5a..70e050d904c8 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.h +++ b/drivers/net/wireless/rt2x00/rt2800pci.h | |||
@@ -38,10 +38,10 @@ | |||
38 | * Queue register offset macros | 38 | * Queue register offset macros |
39 | */ | 39 | */ |
40 | #define TX_QUEUE_REG_OFFSET 0x10 | 40 | #define TX_QUEUE_REG_OFFSET 0x10 |
41 | #define TX_BASE_PTR(__x) TX_BASE_PTR0 + ((__x) * TX_QUEUE_REG_OFFSET) | 41 | #define TX_BASE_PTR(__x) (TX_BASE_PTR0 + ((__x) * TX_QUEUE_REG_OFFSET)) |
42 | #define TX_MAX_CNT(__x) TX_MAX_CNT0 + ((__x) * TX_QUEUE_REG_OFFSET) | 42 | #define TX_MAX_CNT(__x) (TX_MAX_CNT0 + ((__x) * TX_QUEUE_REG_OFFSET)) |
43 | #define TX_CTX_IDX(__x) TX_CTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET) | 43 | #define TX_CTX_IDX(__x) (TX_CTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET)) |
44 | #define TX_DTX_IDX(__x) TX_DTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET) | 44 | #define TX_DTX_IDX(__x) (TX_DTX_IDX0 + ((__x) * TX_QUEUE_REG_OFFSET)) |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * 8051 firmware image. | 47 | * 8051 firmware image. |
@@ -52,8 +52,8 @@ | |||
52 | /* | 52 | /* |
53 | * DMA descriptor defines. | 53 | * DMA descriptor defines. |
54 | */ | 54 | */ |
55 | #define TXD_DESC_SIZE ( 4 * sizeof(__le32) ) | 55 | #define TXD_DESC_SIZE (4 * sizeof(__le32)) |
56 | #define RXD_DESC_SIZE ( 4 * sizeof(__le32) ) | 56 | #define RXD_DESC_SIZE (4 * sizeof(__le32)) |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * TX descriptor format for TX, PRIO and Beacon Ring. | 59 | * TX descriptor format for TX, PRIO and Beacon Ring. |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 3dff56ec195a..389ecba8e891 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -45,7 +45,7 @@ | |||
45 | /* | 45 | /* |
46 | * Allow hardware encryption to be disabled. | 46 | * Allow hardware encryption to be disabled. |
47 | */ | 47 | */ |
48 | static int modparam_nohwcrypt = 0; | 48 | static int modparam_nohwcrypt; |
49 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); | 49 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); |
50 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); | 50 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); |
51 | 51 | ||
@@ -114,8 +114,7 @@ static void rt2800usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
114 | 114 | ||
115 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); | 115 | rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, ®); |
116 | rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, | 116 | rt2x00_set_field32(®, MAC_SYS_CTRL_ENABLE_RX, |
117 | (state == STATE_RADIO_RX_ON) || | 117 | (state == STATE_RADIO_RX_ON)); |
118 | (state == STATE_RADIO_RX_ON_LINK)); | ||
119 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); | 118 | rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg); |
120 | } | 119 | } |
121 | 120 | ||
@@ -165,7 +164,8 @@ static int rt2800usb_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
165 | * this limit so reduce the number to prevent errors. | 164 | * this limit so reduce the number to prevent errors. |
166 | */ | 165 | */ |
167 | rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_LIMIT, | 166 | rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_AGG_LIMIT, |
168 | ((RX_ENTRIES * DATA_FRAME_SIZE) / 1024) - 3); | 167 | ((rt2x00dev->ops->rx->entry_num * DATA_FRAME_SIZE) |
168 | / 1024) - 3); | ||
169 | rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_EN, 1); | 169 | rt2x00_set_field32(®, USB_DMA_CFG_RX_BULK_EN, 1); |
170 | rt2x00_set_field32(®, USB_DMA_CFG_TX_BULK_EN, 1); | 170 | rt2x00_set_field32(®, USB_DMA_CFG_TX_BULK_EN, 1); |
171 | rt2800_register_write(rt2x00dev, USB_DMA_CFG, reg); | 171 | rt2800_register_write(rt2x00dev, USB_DMA_CFG, reg); |
@@ -183,9 +183,9 @@ static int rt2800usb_set_state(struct rt2x00_dev *rt2x00dev, | |||
183 | enum dev_state state) | 183 | enum dev_state state) |
184 | { | 184 | { |
185 | if (state == STATE_AWAKE) | 185 | if (state == STATE_AWAKE) |
186 | rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 0); | 186 | rt2800_mcu_request(rt2x00dev, MCU_WAKEUP, 0xff, 0, 2); |
187 | else | 187 | else |
188 | rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0, 2); | 188 | rt2800_mcu_request(rt2x00dev, MCU_SLEEP, 0xff, 0xff, 2); |
189 | 189 | ||
190 | return 0; | 190 | return 0; |
191 | } | 191 | } |
@@ -215,9 +215,7 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
215 | rt2800usb_set_state(rt2x00dev, STATE_SLEEP); | 215 | rt2800usb_set_state(rt2x00dev, STATE_SLEEP); |
216 | break; | 216 | break; |
217 | case STATE_RADIO_RX_ON: | 217 | case STATE_RADIO_RX_ON: |
218 | case STATE_RADIO_RX_ON_LINK: | ||
219 | case STATE_RADIO_RX_OFF: | 218 | case STATE_RADIO_RX_OFF: |
220 | case STATE_RADIO_RX_OFF_LINK: | ||
221 | rt2800usb_toggle_rx(rt2x00dev, state); | 219 | rt2800usb_toggle_rx(rt2x00dev, state); |
222 | break; | 220 | break; |
223 | case STATE_RADIO_IRQ_ON: | 221 | case STATE_RADIO_IRQ_ON: |
@@ -245,6 +243,49 @@ static int rt2800usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
245 | } | 243 | } |
246 | 244 | ||
247 | /* | 245 | /* |
246 | * Watchdog handlers | ||
247 | */ | ||
248 | static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev) | ||
249 | { | ||
250 | unsigned int i; | ||
251 | u32 reg; | ||
252 | |||
253 | rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®); | ||
254 | if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) { | ||
255 | WARNING(rt2x00dev, "TX HW queue 0 timed out," | ||
256 | " invoke forced kick"); | ||
257 | |||
258 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40012); | ||
259 | |||
260 | for (i = 0; i < 10; i++) { | ||
261 | udelay(10); | ||
262 | if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX0Q)) | ||
263 | break; | ||
264 | } | ||
265 | |||
266 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); | ||
267 | } | ||
268 | |||
269 | rt2800_register_read(rt2x00dev, TXRXQ_PCNT, ®); | ||
270 | if (rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) { | ||
271 | WARNING(rt2x00dev, "TX HW queue 1 timed out," | ||
272 | " invoke forced kick"); | ||
273 | |||
274 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf4000a); | ||
275 | |||
276 | for (i = 0; i < 10; i++) { | ||
277 | udelay(10); | ||
278 | if (!rt2x00_get_field32(reg, TXRXQ_PCNT_TX1Q)) | ||
279 | break; | ||
280 | } | ||
281 | |||
282 | rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006); | ||
283 | } | ||
284 | |||
285 | rt2x00usb_watchdog(rt2x00dev); | ||
286 | } | ||
287 | |||
288 | /* | ||
248 | * TX descriptor initialization | 289 | * TX descriptor initialization |
249 | */ | 290 | */ |
250 | static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) | 291 | static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) |
@@ -507,6 +548,7 @@ static const struct ieee80211_ops rt2800usb_mac80211_ops = { | |||
507 | .get_tsf = rt2800_get_tsf, | 548 | .get_tsf = rt2800_get_tsf, |
508 | .rfkill_poll = rt2x00mac_rfkill_poll, | 549 | .rfkill_poll = rt2x00mac_rfkill_poll, |
509 | .ampdu_action = rt2800_ampdu_action, | 550 | .ampdu_action = rt2800_ampdu_action, |
551 | .flush = rt2x00mac_flush, | ||
510 | }; | 552 | }; |
511 | 553 | ||
512 | static const struct rt2800_ops rt2800usb_rt2800_ops = { | 554 | static const struct rt2800_ops rt2800usb_rt2800_ops = { |
@@ -535,7 +577,7 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { | |||
535 | .link_stats = rt2800_link_stats, | 577 | .link_stats = rt2800_link_stats, |
536 | .reset_tuner = rt2800_reset_tuner, | 578 | .reset_tuner = rt2800_reset_tuner, |
537 | .link_tuner = rt2800_link_tuner, | 579 | .link_tuner = rt2800_link_tuner, |
538 | .watchdog = rt2x00usb_watchdog, | 580 | .watchdog = rt2800usb_watchdog, |
539 | .write_tx_desc = rt2800usb_write_tx_desc, | 581 | .write_tx_desc = rt2800usb_write_tx_desc, |
540 | .write_tx_data = rt2800_write_tx_data, | 582 | .write_tx_data = rt2800_write_tx_data, |
541 | .write_beacon = rt2800_write_beacon, | 583 | .write_beacon = rt2800_write_beacon, |
@@ -553,21 +595,21 @@ static const struct rt2x00lib_ops rt2800usb_rt2x00_ops = { | |||
553 | }; | 595 | }; |
554 | 596 | ||
555 | static const struct data_queue_desc rt2800usb_queue_rx = { | 597 | static const struct data_queue_desc rt2800usb_queue_rx = { |
556 | .entry_num = RX_ENTRIES, | 598 | .entry_num = 128, |
557 | .data_size = AGGREGATION_SIZE, | 599 | .data_size = AGGREGATION_SIZE, |
558 | .desc_size = RXINFO_DESC_SIZE + RXWI_DESC_SIZE, | 600 | .desc_size = RXINFO_DESC_SIZE + RXWI_DESC_SIZE, |
559 | .priv_size = sizeof(struct queue_entry_priv_usb), | 601 | .priv_size = sizeof(struct queue_entry_priv_usb), |
560 | }; | 602 | }; |
561 | 603 | ||
562 | static const struct data_queue_desc rt2800usb_queue_tx = { | 604 | static const struct data_queue_desc rt2800usb_queue_tx = { |
563 | .entry_num = TX_ENTRIES, | 605 | .entry_num = 64, |
564 | .data_size = AGGREGATION_SIZE, | 606 | .data_size = AGGREGATION_SIZE, |
565 | .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, | 607 | .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, |
566 | .priv_size = sizeof(struct queue_entry_priv_usb), | 608 | .priv_size = sizeof(struct queue_entry_priv_usb), |
567 | }; | 609 | }; |
568 | 610 | ||
569 | static const struct data_queue_desc rt2800usb_queue_bcn = { | 611 | static const struct data_queue_desc rt2800usb_queue_bcn = { |
570 | .entry_num = 8 * BEACON_ENTRIES, | 612 | .entry_num = 8, |
571 | .data_size = MGMT_FRAME_SIZE, | 613 | .data_size = MGMT_FRAME_SIZE, |
572 | .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, | 614 | .desc_size = TXINFO_DESC_SIZE + TXWI_DESC_SIZE, |
573 | .priv_size = sizeof(struct queue_entry_priv_usb), | 615 | .priv_size = sizeof(struct queue_entry_priv_usb), |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.h b/drivers/net/wireless/rt2x00/rt2800usb.h index 0722badccf86..671ea3592610 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.h +++ b/drivers/net/wireless/rt2x00/rt2800usb.h | |||
@@ -40,8 +40,8 @@ | |||
40 | /* | 40 | /* |
41 | * DMA descriptor defines. | 41 | * DMA descriptor defines. |
42 | */ | 42 | */ |
43 | #define TXINFO_DESC_SIZE ( 1 * sizeof(__le32) ) | 43 | #define TXINFO_DESC_SIZE (1 * sizeof(__le32)) |
44 | #define RXINFO_DESC_SIZE ( 1 * sizeof(__le32) ) | 44 | #define RXINFO_DESC_SIZE (1 * sizeof(__le32)) |
45 | 45 | ||
46 | /* | 46 | /* |
47 | * TX Info structure | 47 | * TX Info structure |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 94fe589acfaa..42bd3a96f23b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -1133,6 +1133,7 @@ void rt2x00mac_bss_info_changed(struct ieee80211_hw *hw, | |||
1133 | int rt2x00mac_conf_tx(struct ieee80211_hw *hw, u16 queue, | 1133 | int rt2x00mac_conf_tx(struct ieee80211_hw *hw, u16 queue, |
1134 | const struct ieee80211_tx_queue_params *params); | 1134 | const struct ieee80211_tx_queue_params *params); |
1135 | void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw); | 1135 | void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw); |
1136 | void rt2x00mac_flush(struct ieee80211_hw *hw, bool drop); | ||
1136 | 1137 | ||
1137 | /* | 1138 | /* |
1138 | * Driver allocation handlers. | 1139 | * Driver allocation handlers. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00config.c b/drivers/net/wireless/rt2x00/rt2x00config.c index 54ffb5aeb34e..a238e908c854 100644 --- a/drivers/net/wireless/rt2x00/rt2x00config.c +++ b/drivers/net/wireless/rt2x00/rt2x00config.c | |||
@@ -133,7 +133,7 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
133 | */ | 133 | */ |
134 | if (!(ant->flags & ANTENNA_RX_DIVERSITY)) | 134 | if (!(ant->flags & ANTENNA_RX_DIVERSITY)) |
135 | config.rx = rt2x00lib_config_antenna_check(config.rx, def->rx); | 135 | config.rx = rt2x00lib_config_antenna_check(config.rx, def->rx); |
136 | else if(config.rx == ANTENNA_SW_DIVERSITY) | 136 | else if (config.rx == ANTENNA_SW_DIVERSITY) |
137 | config.rx = active->rx; | 137 | config.rx = active->rx; |
138 | 138 | ||
139 | if (!(ant->flags & ANTENNA_TX_DIVERSITY)) | 139 | if (!(ant->flags & ANTENNA_TX_DIVERSITY)) |
@@ -146,7 +146,8 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
146 | * else the changes will be ignored by the device. | 146 | * else the changes will be ignored by the device. |
147 | */ | 147 | */ |
148 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | 148 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
149 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK); | 149 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, |
150 | STATE_RADIO_RX_OFF); | ||
150 | 151 | ||
151 | /* | 152 | /* |
152 | * Write new antenna setup to device and reset the link tuner. | 153 | * Write new antenna setup to device and reset the link tuner. |
@@ -160,7 +161,8 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
160 | memcpy(active, &config, sizeof(config)); | 161 | memcpy(active, &config, sizeof(config)); |
161 | 162 | ||
162 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | 163 | if (test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) |
163 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK); | 164 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, |
165 | STATE_RADIO_RX_ON); | ||
164 | } | 166 | } |
165 | 167 | ||
166 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, | 168 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00debug.c b/drivers/net/wireless/rt2x00/rt2x00debug.c index fcdb6b0dc40f..64dfb1f6823e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00debug.c +++ b/drivers/net/wireless/rt2x00/rt2x00debug.c | |||
@@ -162,11 +162,11 @@ void rt2x00debug_dump_frame(struct rt2x00_dev *rt2x00dev, | |||
162 | struct timeval timestamp; | 162 | struct timeval timestamp; |
163 | u32 data_len; | 163 | u32 data_len; |
164 | 164 | ||
165 | do_gettimeofday(×tamp); | 165 | if (likely(!test_bit(FRAME_DUMP_FILE_OPEN, &intf->frame_dump_flags))) |
166 | |||
167 | if (!test_bit(FRAME_DUMP_FILE_OPEN, &intf->frame_dump_flags)) | ||
168 | return; | 166 | return; |
169 | 167 | ||
168 | do_gettimeofday(×tamp); | ||
169 | |||
170 | if (skb_queue_len(&intf->frame_dump_skbqueue) > 20) { | 170 | if (skb_queue_len(&intf->frame_dump_skbqueue) > 20) { |
171 | DEBUG(rt2x00dev, "txrx dump queue length exceeded.\n"); | 171 | DEBUG(rt2x00dev, "txrx dump queue length exceeded.\n"); |
172 | return; | 172 | return; |
@@ -342,7 +342,7 @@ static ssize_t rt2x00debug_read_queue_stats(struct file *file, | |||
342 | sprintf(data, "qid\tcount\tlimit\tlength\tindex\tdma done\tdone\n"); | 342 | sprintf(data, "qid\tcount\tlimit\tlength\tindex\tdma done\tdone\n"); |
343 | 343 | ||
344 | queue_for_each(intf->rt2x00dev, queue) { | 344 | queue_for_each(intf->rt2x00dev, queue) { |
345 | spin_lock_irqsave(&queue->lock, irqflags); | 345 | spin_lock_irqsave(&queue->index_lock, irqflags); |
346 | 346 | ||
347 | temp += sprintf(temp, "%d\t%d\t%d\t%d\t%d\t%d\t%d\n", queue->qid, | 347 | temp += sprintf(temp, "%d\t%d\t%d\t%d\t%d\t%d\t%d\n", queue->qid, |
348 | queue->count, queue->limit, queue->length, | 348 | queue->count, queue->limit, queue->length, |
@@ -350,7 +350,7 @@ static ssize_t rt2x00debug_read_queue_stats(struct file *file, | |||
350 | queue->index[Q_INDEX_DMA_DONE], | 350 | queue->index[Q_INDEX_DMA_DONE], |
351 | queue->index[Q_INDEX_DONE]); | 351 | queue->index[Q_INDEX_DONE]); |
352 | 352 | ||
353 | spin_unlock_irqrestore(&queue->lock, irqflags); | 353 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
354 | } | 354 | } |
355 | 355 | ||
356 | size = strlen(data); | 356 | size = strlen(data); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 5ba79b935f09..3afa2a3ebee4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -68,7 +68,8 @@ int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev) | |||
68 | /* | 68 | /* |
69 | * Enable RX. | 69 | * Enable RX. |
70 | */ | 70 | */ |
71 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON); | 71 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_RX_ON); |
72 | rt2x00link_start_tuner(rt2x00dev); | ||
72 | 73 | ||
73 | /* | 74 | /* |
74 | * Start watchdog monitoring. | 75 | * Start watchdog monitoring. |
@@ -102,7 +103,8 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
102 | /* | 103 | /* |
103 | * Disable RX. | 104 | * Disable RX. |
104 | */ | 105 | */ |
105 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF); | 106 | rt2x00link_stop_tuner(rt2x00dev); |
107 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_RX_OFF); | ||
106 | 108 | ||
107 | /* | 109 | /* |
108 | * Disable radio. | 110 | * Disable radio. |
@@ -113,23 +115,6 @@ void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev) | |||
113 | rt2x00leds_led_radio(rt2x00dev, false); | 115 | rt2x00leds_led_radio(rt2x00dev, false); |
114 | } | 116 | } |
115 | 117 | ||
116 | void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state) | ||
117 | { | ||
118 | /* | ||
119 | * When we are disabling the RX, we should also stop the link tuner. | ||
120 | */ | ||
121 | if (state == STATE_RADIO_RX_OFF) | ||
122 | rt2x00link_stop_tuner(rt2x00dev); | ||
123 | |||
124 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, state); | ||
125 | |||
126 | /* | ||
127 | * When we are enabling the RX, we should also start the link tuner. | ||
128 | */ | ||
129 | if (state == STATE_RADIO_RX_ON) | ||
130 | rt2x00link_start_tuner(rt2x00dev); | ||
131 | } | ||
132 | |||
133 | static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, | 118 | static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, |
134 | struct ieee80211_vif *vif) | 119 | struct ieee80211_vif *vif) |
135 | { | 120 | { |
@@ -483,6 +468,10 @@ void rt2x00lib_rxdone(struct queue_entry *entry) | |||
483 | unsigned int header_length; | 468 | unsigned int header_length; |
484 | int rate_idx; | 469 | int rate_idx; |
485 | 470 | ||
471 | if (!test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) || | ||
472 | !test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
473 | goto submit_entry; | ||
474 | |||
486 | if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) | 475 | if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags)) |
487 | goto submit_entry; | 476 | goto submit_entry; |
488 | 477 | ||
@@ -567,9 +556,13 @@ void rt2x00lib_rxdone(struct queue_entry *entry) | |||
567 | entry->skb = skb; | 556 | entry->skb = skb; |
568 | 557 | ||
569 | submit_entry: | 558 | submit_entry: |
570 | rt2x00dev->ops->lib->clear_entry(entry); | 559 | entry->flags = 0; |
571 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
572 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | 560 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); |
561 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && | ||
562 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) { | ||
563 | rt2x00dev->ops->lib->clear_entry(entry); | ||
564 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
565 | } | ||
573 | } | 566 | } |
574 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); | 567 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); |
575 | 568 | ||
@@ -678,7 +671,7 @@ static void rt2x00lib_rate(struct ieee80211_rate *entry, | |||
678 | { | 671 | { |
679 | entry->flags = 0; | 672 | entry->flags = 0; |
680 | entry->bitrate = rate->bitrate; | 673 | entry->bitrate = rate->bitrate; |
681 | entry->hw_value =index; | 674 | entry->hw_value = index; |
682 | entry->hw_value_short = index; | 675 | entry->hw_value_short = index; |
683 | 676 | ||
684 | if (rate->flags & DEV_RATE_SHORT_PREAMBLE) | 677 | if (rate->flags & DEV_RATE_SHORT_PREAMBLE) |
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index 619da23b7b56..2cf68f82674b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -57,7 +57,7 @@ static inline const struct rt2x00_rate *rt2x00_get_rate(const u16 hw_value) | |||
57 | } | 57 | } |
58 | 58 | ||
59 | #define RATE_MCS(__mode, __mcs) \ | 59 | #define RATE_MCS(__mode, __mcs) \ |
60 | ( (((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff) ) | 60 | ((((__mode) & 0x00ff) << 8) | ((__mcs) & 0x00ff)) |
61 | 61 | ||
62 | static inline int rt2x00_get_rate_mcs(const u16 mcs_value) | 62 | static inline int rt2x00_get_rate_mcs(const u16 mcs_value) |
63 | { | 63 | { |
@@ -69,7 +69,6 @@ static inline int rt2x00_get_rate_mcs(const u16 mcs_value) | |||
69 | */ | 69 | */ |
70 | int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev); | 70 | int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev); |
71 | void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev); | 71 | void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev); |
72 | void rt2x00lib_toggle_rx(struct rt2x00_dev *rt2x00dev, enum dev_state state); | ||
73 | 72 | ||
74 | /* | 73 | /* |
75 | * Initialization handlers. | 74 | * Initialization handlers. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00link.c b/drivers/net/wireless/rt2x00/rt2x00link.c index b971d8798ebf..bfda60eaf4ef 100644 --- a/drivers/net/wireless/rt2x00/rt2x00link.c +++ b/drivers/net/wireless/rt2x00/rt2x00link.c | |||
@@ -67,7 +67,7 @@ | |||
67 | (__avg).avg_weight ? \ | 67 | (__avg).avg_weight ? \ |
68 | ((((__avg).avg_weight * ((AVG_SAMPLES) - 1)) + \ | 68 | ((((__avg).avg_weight * ((AVG_SAMPLES) - 1)) + \ |
69 | ((__val) * (AVG_FACTOR))) / \ | 69 | ((__val) * (AVG_FACTOR))) / \ |
70 | (AVG_SAMPLES) ) : \ | 70 | (AVG_SAMPLES)) : \ |
71 | ((__val) * (AVG_FACTOR)); \ | 71 | ((__val) * (AVG_FACTOR)); \ |
72 | __new.avg = __new.avg_weight / (AVG_FACTOR); \ | 72 | __new.avg = __new.avg_weight / (AVG_FACTOR); \ |
73 | __new; \ | 73 | __new; \ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index c3c206a97d54..829bf4be9bc3 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -283,14 +283,8 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, | |||
283 | * invalid behavior in the device. | 283 | * invalid behavior in the device. |
284 | */ | 284 | */ |
285 | memcpy(&intf->mac, vif->addr, ETH_ALEN); | 285 | memcpy(&intf->mac, vif->addr, ETH_ALEN); |
286 | if (vif->type == NL80211_IFTYPE_AP) { | 286 | rt2x00lib_config_intf(rt2x00dev, intf, vif->type, |
287 | memcpy(&intf->bssid, vif->addr, ETH_ALEN); | 287 | intf->mac, NULL); |
288 | rt2x00lib_config_intf(rt2x00dev, intf, vif->type, | ||
289 | intf->mac, intf->bssid); | ||
290 | } else { | ||
291 | rt2x00lib_config_intf(rt2x00dev, intf, vif->type, | ||
292 | intf->mac, NULL); | ||
293 | } | ||
294 | 288 | ||
295 | /* | 289 | /* |
296 | * Some filters depend on the current working mode. We can force | 290 | * Some filters depend on the current working mode. We can force |
@@ -358,7 +352,7 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed) | |||
358 | * if for any reason the link tuner must be reset, this will be | 352 | * if for any reason the link tuner must be reset, this will be |
359 | * handled by rt2x00lib_config(). | 353 | * handled by rt2x00lib_config(). |
360 | */ | 354 | */ |
361 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_OFF_LINK); | 355 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_RX_OFF); |
362 | 356 | ||
363 | /* | 357 | /* |
364 | * When we've just turned on the radio, we want to reprogram | 358 | * When we've just turned on the radio, we want to reprogram |
@@ -376,7 +370,7 @@ int rt2x00mac_config(struct ieee80211_hw *hw, u32 changed) | |||
376 | rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant); | 370 | rt2x00lib_config_antenna(rt2x00dev, rt2x00dev->default_ant); |
377 | 371 | ||
378 | /* Turn RX back on */ | 372 | /* Turn RX back on */ |
379 | rt2x00lib_toggle_rx(rt2x00dev, STATE_RADIO_RX_ON_LINK); | 373 | rt2x00dev->ops->lib->set_device_state(rt2x00dev, STATE_RADIO_RX_ON); |
380 | 374 | ||
381 | return 0; | 375 | return 0; |
382 | } | 376 | } |
@@ -719,3 +713,41 @@ void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw) | |||
719 | wiphy_rfkill_set_hw_state(hw->wiphy, !active); | 713 | wiphy_rfkill_set_hw_state(hw->wiphy, !active); |
720 | } | 714 | } |
721 | EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll); | 715 | EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll); |
716 | |||
717 | void rt2x00mac_flush(struct ieee80211_hw *hw, bool drop) | ||
718 | { | ||
719 | struct rt2x00_dev *rt2x00dev = hw->priv; | ||
720 | struct data_queue *queue; | ||
721 | unsigned int i = 0; | ||
722 | |||
723 | ieee80211_stop_queues(hw); | ||
724 | |||
725 | /* | ||
726 | * Run over all queues to kick them, this will force | ||
727 | * any pending frames to be transmitted. | ||
728 | */ | ||
729 | tx_queue_for_each(rt2x00dev, queue) { | ||
730 | rt2x00dev->ops->lib->kick_tx_queue(queue); | ||
731 | } | ||
732 | |||
733 | /** | ||
734 | * All queues have been kicked, now wait for each queue | ||
735 | * to become empty. With a bit of luck, we only have to wait | ||
736 | * for the first queue to become empty, because while waiting | ||
737 | * for the that queue, the other queues will have transmitted | ||
738 | * all their frames as well (since they were already kicked). | ||
739 | */ | ||
740 | tx_queue_for_each(rt2x00dev, queue) { | ||
741 | for (i = 0; i < 10; i++) { | ||
742 | if (rt2x00queue_empty(queue)) | ||
743 | break; | ||
744 | msleep(100); | ||
745 | } | ||
746 | |||
747 | if (!rt2x00queue_empty(queue)) | ||
748 | WARNING(rt2x00dev, "Failed to flush queue %d", queue->qid); | ||
749 | } | ||
750 | |||
751 | ieee80211_wake_queues(hw); | ||
752 | } | ||
753 | EXPORT_SYMBOL_GPL(rt2x00mac_flush); | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 2449d785cf8d..868ca19b13ea 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -105,7 +105,7 @@ static int rt2x00pci_alloc_queue_dma(struct rt2x00_dev *rt2x00dev, | |||
105 | */ | 105 | */ |
106 | addr = dma_alloc_coherent(rt2x00dev->dev, | 106 | addr = dma_alloc_coherent(rt2x00dev->dev, |
107 | queue->limit * queue->desc_size, | 107 | queue->limit * queue->desc_size, |
108 | &dma, GFP_KERNEL | GFP_DMA); | 108 | &dma, GFP_KERNEL); |
109 | if (!addr) | 109 | if (!addr) |
110 | return -ENOMEM; | 110 | return -ENOMEM; |
111 | 111 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index e360d287defb..dc543174dfad 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -311,14 +311,6 @@ static void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | |||
311 | memset(txdesc, 0, sizeof(*txdesc)); | 311 | memset(txdesc, 0, sizeof(*txdesc)); |
312 | 312 | ||
313 | /* | 313 | /* |
314 | * Initialize information from queue | ||
315 | */ | ||
316 | txdesc->qid = entry->queue->qid; | ||
317 | txdesc->cw_min = entry->queue->cw_min; | ||
318 | txdesc->cw_max = entry->queue->cw_max; | ||
319 | txdesc->aifs = entry->queue->aifs; | ||
320 | |||
321 | /* | ||
322 | * Header and frame information. | 314 | * Header and frame information. |
323 | */ | 315 | */ |
324 | txdesc->length = entry->skb->len; | 316 | txdesc->length = entry->skb->len; |
@@ -460,12 +452,9 @@ static void rt2x00queue_write_tx_descriptor(struct queue_entry *entry, | |||
460 | rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry->skb); | 452 | rt2x00debug_dump_frame(queue->rt2x00dev, DUMP_FRAME_TX, entry->skb); |
461 | } | 453 | } |
462 | 454 | ||
463 | static void rt2x00queue_kick_tx_queue(struct queue_entry *entry, | 455 | static void rt2x00queue_kick_tx_queue(struct data_queue *queue, |
464 | struct txentry_desc *txdesc) | 456 | struct txentry_desc *txdesc) |
465 | { | 457 | { |
466 | struct data_queue *queue = entry->queue; | ||
467 | struct rt2x00_dev *rt2x00dev = queue->rt2x00dev; | ||
468 | |||
469 | /* | 458 | /* |
470 | * Check if we need to kick the queue, there are however a few rules | 459 | * Check if we need to kick the queue, there are however a few rules |
471 | * 1) Don't kick unless this is the last in frame in a burst. | 460 | * 1) Don't kick unless this is the last in frame in a burst. |
@@ -477,7 +466,7 @@ static void rt2x00queue_kick_tx_queue(struct queue_entry *entry, | |||
477 | */ | 466 | */ |
478 | if (rt2x00queue_threshold(queue) || | 467 | if (rt2x00queue_threshold(queue) || |
479 | !test_bit(ENTRY_TXD_BURST, &txdesc->flags)) | 468 | !test_bit(ENTRY_TXD_BURST, &txdesc->flags)) |
480 | rt2x00dev->ops->lib->kick_tx_queue(queue); | 469 | queue->rt2x00dev->ops->lib->kick_tx_queue(queue); |
481 | } | 470 | } |
482 | 471 | ||
483 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | 472 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, |
@@ -567,7 +556,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
567 | 556 | ||
568 | rt2x00queue_index_inc(queue, Q_INDEX); | 557 | rt2x00queue_index_inc(queue, Q_INDEX); |
569 | rt2x00queue_write_tx_descriptor(entry, &txdesc); | 558 | rt2x00queue_write_tx_descriptor(entry, &txdesc); |
570 | rt2x00queue_kick_tx_queue(entry, &txdesc); | 559 | rt2x00queue_kick_tx_queue(queue, &txdesc); |
571 | 560 | ||
572 | return 0; | 561 | return 0; |
573 | } | 562 | } |
@@ -649,10 +638,10 @@ void rt2x00queue_for_each_entry(struct data_queue *queue, | |||
649 | * it should not be kicked during this run, since it | 638 | * it should not be kicked during this run, since it |
650 | * is part of another TX operation. | 639 | * is part of another TX operation. |
651 | */ | 640 | */ |
652 | spin_lock_irqsave(&queue->lock, irqflags); | 641 | spin_lock_irqsave(&queue->index_lock, irqflags); |
653 | index_start = queue->index[start]; | 642 | index_start = queue->index[start]; |
654 | index_end = queue->index[end]; | 643 | index_end = queue->index[end]; |
655 | spin_unlock_irqrestore(&queue->lock, irqflags); | 644 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
656 | 645 | ||
657 | /* | 646 | /* |
658 | * Start from the TX done pointer, this guarentees that we will | 647 | * Start from the TX done pointer, this guarentees that we will |
@@ -706,11 +695,11 @@ struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue, | |||
706 | return NULL; | 695 | return NULL; |
707 | } | 696 | } |
708 | 697 | ||
709 | spin_lock_irqsave(&queue->lock, irqflags); | 698 | spin_lock_irqsave(&queue->index_lock, irqflags); |
710 | 699 | ||
711 | entry = &queue->entries[queue->index[index]]; | 700 | entry = &queue->entries[queue->index[index]]; |
712 | 701 | ||
713 | spin_unlock_irqrestore(&queue->lock, irqflags); | 702 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
714 | 703 | ||
715 | return entry; | 704 | return entry; |
716 | } | 705 | } |
@@ -726,7 +715,7 @@ void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index) | |||
726 | return; | 715 | return; |
727 | } | 716 | } |
728 | 717 | ||
729 | spin_lock_irqsave(&queue->lock, irqflags); | 718 | spin_lock_irqsave(&queue->index_lock, irqflags); |
730 | 719 | ||
731 | queue->index[index]++; | 720 | queue->index[index]++; |
732 | if (queue->index[index] >= queue->limit) | 721 | if (queue->index[index] >= queue->limit) |
@@ -741,7 +730,7 @@ void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index) | |||
741 | queue->count++; | 730 | queue->count++; |
742 | } | 731 | } |
743 | 732 | ||
744 | spin_unlock_irqrestore(&queue->lock, irqflags); | 733 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
745 | } | 734 | } |
746 | 735 | ||
747 | static void rt2x00queue_reset(struct data_queue *queue) | 736 | static void rt2x00queue_reset(struct data_queue *queue) |
@@ -749,7 +738,7 @@ static void rt2x00queue_reset(struct data_queue *queue) | |||
749 | unsigned long irqflags; | 738 | unsigned long irqflags; |
750 | unsigned int i; | 739 | unsigned int i; |
751 | 740 | ||
752 | spin_lock_irqsave(&queue->lock, irqflags); | 741 | spin_lock_irqsave(&queue->index_lock, irqflags); |
753 | 742 | ||
754 | queue->count = 0; | 743 | queue->count = 0; |
755 | queue->length = 0; | 744 | queue->length = 0; |
@@ -759,7 +748,7 @@ static void rt2x00queue_reset(struct data_queue *queue) | |||
759 | queue->last_action[i] = jiffies; | 748 | queue->last_action[i] = jiffies; |
760 | } | 749 | } |
761 | 750 | ||
762 | spin_unlock_irqrestore(&queue->lock, irqflags); | 751 | spin_unlock_irqrestore(&queue->index_lock, irqflags); |
763 | } | 752 | } |
764 | 753 | ||
765 | void rt2x00queue_stop_queues(struct rt2x00_dev *rt2x00dev) | 754 | void rt2x00queue_stop_queues(struct rt2x00_dev *rt2x00dev) |
@@ -809,8 +798,8 @@ static int rt2x00queue_alloc_entries(struct data_queue *queue, | |||
809 | return -ENOMEM; | 798 | return -ENOMEM; |
810 | 799 | ||
811 | #define QUEUE_ENTRY_PRIV_OFFSET(__base, __index, __limit, __esize, __psize) \ | 800 | #define QUEUE_ENTRY_PRIV_OFFSET(__base, __index, __limit, __esize, __psize) \ |
812 | ( ((char *)(__base)) + ((__limit) * (__esize)) + \ | 801 | (((char *)(__base)) + ((__limit) * (__esize)) + \ |
813 | ((__index) * (__psize)) ) | 802 | ((__index) * (__psize))) |
814 | 803 | ||
815 | for (i = 0; i < queue->limit; i++) { | 804 | for (i = 0; i < queue->limit; i++) { |
816 | entries[i].flags = 0; | 805 | entries[i].flags = 0; |
@@ -911,7 +900,7 @@ void rt2x00queue_uninitialize(struct rt2x00_dev *rt2x00dev) | |||
911 | static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev, | 900 | static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev, |
912 | struct data_queue *queue, enum data_queue_qid qid) | 901 | struct data_queue *queue, enum data_queue_qid qid) |
913 | { | 902 | { |
914 | spin_lock_init(&queue->lock); | 903 | spin_lock_init(&queue->index_lock); |
915 | 904 | ||
916 | queue->rt2x00dev = rt2x00dev; | 905 | queue->rt2x00dev = rt2x00dev; |
917 | queue->qid = qid; | 906 | queue->qid = qid; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index d81d85f34866..29b051ac6401 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h | |||
@@ -43,22 +43,6 @@ | |||
43 | #define AGGREGATION_SIZE 3840 | 43 | #define AGGREGATION_SIZE 3840 |
44 | 44 | ||
45 | /** | 45 | /** |
46 | * DOC: Number of entries per queue | ||
47 | * | ||
48 | * Under normal load without fragmentation, 12 entries are sufficient | ||
49 | * without the queue being filled up to the maximum. When using fragmentation | ||
50 | * and the queue threshold code, we need to add some additional margins to | ||
51 | * make sure the queue will never (or only under extreme load) fill up | ||
52 | * completely. | ||
53 | * Since we don't use preallocated DMA, having a large number of queue entries | ||
54 | * will have minimal impact on the memory requirements for the queue. | ||
55 | */ | ||
56 | #define RX_ENTRIES 24 | ||
57 | #define TX_ENTRIES 24 | ||
58 | #define BEACON_ENTRIES 1 | ||
59 | #define ATIM_ENTRIES 8 | ||
60 | |||
61 | /** | ||
62 | * enum data_queue_qid: Queue identification | 46 | * enum data_queue_qid: Queue identification |
63 | * | 47 | * |
64 | * @QID_AC_BE: AC BE queue | 48 | * @QID_AC_BE: AC BE queue |
@@ -296,7 +280,6 @@ enum txentry_desc_flags { | |||
296 | * Summary of information for the frame descriptor before sending a TX frame. | 280 | * Summary of information for the frame descriptor before sending a TX frame. |
297 | * | 281 | * |
298 | * @flags: Descriptor flags (See &enum queue_entry_flags). | 282 | * @flags: Descriptor flags (See &enum queue_entry_flags). |
299 | * @qid: Queue identification (See &enum data_queue_qid). | ||
300 | * @length: Length of the entire frame. | 283 | * @length: Length of the entire frame. |
301 | * @header_length: Length of 802.11 header. | 284 | * @header_length: Length of 802.11 header. |
302 | * @length_high: PLCP length high word. | 285 | * @length_high: PLCP length high word. |
@@ -309,11 +292,8 @@ enum txentry_desc_flags { | |||
309 | * @rate_mode: Rate mode (See @enum rate_modulation). | 292 | * @rate_mode: Rate mode (See @enum rate_modulation). |
310 | * @mpdu_density: MDPU density. | 293 | * @mpdu_density: MDPU density. |
311 | * @retry_limit: Max number of retries. | 294 | * @retry_limit: Max number of retries. |
312 | * @aifs: AIFS value. | ||
313 | * @ifs: IFS value. | 295 | * @ifs: IFS value. |
314 | * @txop: IFS value for 11n capable chips. | 296 | * @txop: IFS value for 11n capable chips. |
315 | * @cw_min: cwmin value. | ||
316 | * @cw_max: cwmax value. | ||
317 | * @cipher: Cipher type used for encryption. | 297 | * @cipher: Cipher type used for encryption. |
318 | * @key_idx: Key index used for encryption. | 298 | * @key_idx: Key index used for encryption. |
319 | * @iv_offset: Position where IV should be inserted by hardware. | 299 | * @iv_offset: Position where IV should be inserted by hardware. |
@@ -322,8 +302,6 @@ enum txentry_desc_flags { | |||
322 | struct txentry_desc { | 302 | struct txentry_desc { |
323 | unsigned long flags; | 303 | unsigned long flags; |
324 | 304 | ||
325 | enum data_queue_qid qid; | ||
326 | |||
327 | u16 length; | 305 | u16 length; |
328 | u16 header_length; | 306 | u16 header_length; |
329 | 307 | ||
@@ -339,11 +317,8 @@ struct txentry_desc { | |||
339 | u16 mpdu_density; | 317 | u16 mpdu_density; |
340 | 318 | ||
341 | short retry_limit; | 319 | short retry_limit; |
342 | short aifs; | ||
343 | short ifs; | 320 | short ifs; |
344 | short txop; | 321 | short txop; |
345 | short cw_min; | ||
346 | short cw_max; | ||
347 | 322 | ||
348 | enum cipher cipher; | 323 | enum cipher cipher; |
349 | u16 key_idx; | 324 | u16 key_idx; |
@@ -423,7 +398,7 @@ enum queue_index { | |||
423 | * @entries: Base address of the &struct queue_entry which are | 398 | * @entries: Base address of the &struct queue_entry which are |
424 | * part of this queue. | 399 | * part of this queue. |
425 | * @qid: The queue identification, see &enum data_queue_qid. | 400 | * @qid: The queue identification, see &enum data_queue_qid. |
426 | * @lock: Spinlock to protect index handling. Whenever @index, @index_done or | 401 | * @index_lock: Spinlock to protect index handling. Whenever @index, @index_done or |
427 | * @index_crypt needs to be changed this lock should be grabbed to prevent | 402 | * @index_crypt needs to be changed this lock should be grabbed to prevent |
428 | * index corruption due to concurrency. | 403 | * index corruption due to concurrency. |
429 | * @count: Number of frames handled in the queue. | 404 | * @count: Number of frames handled in the queue. |
@@ -447,7 +422,7 @@ struct data_queue { | |||
447 | 422 | ||
448 | enum data_queue_qid qid; | 423 | enum data_queue_qid qid; |
449 | 424 | ||
450 | spinlock_t lock; | 425 | spinlock_t index_lock; |
451 | unsigned int count; | 426 | unsigned int count; |
452 | unsigned short limit; | 427 | unsigned short limit; |
453 | unsigned short threshold; | 428 | unsigned short threshold; |
@@ -618,10 +593,10 @@ static inline int rt2x00queue_threshold(struct data_queue *queue) | |||
618 | } | 593 | } |
619 | 594 | ||
620 | /** | 595 | /** |
621 | * rt2x00queue_timeout - Check if a timeout occured for STATUS reorts | 596 | * rt2x00queue_status_timeout - Check if a timeout occured for STATUS reports |
622 | * @queue: Queue to check. | 597 | * @queue: Queue to check. |
623 | */ | 598 | */ |
624 | static inline int rt2x00queue_timeout(struct data_queue *queue) | 599 | static inline int rt2x00queue_status_timeout(struct data_queue *queue) |
625 | { | 600 | { |
626 | return time_after(queue->last_action[Q_INDEX_DMA_DONE], | 601 | return time_after(queue->last_action[Q_INDEX_DMA_DONE], |
627 | queue->last_action[Q_INDEX_DONE] + (HZ / 10)); | 602 | queue->last_action[Q_INDEX_DONE] + (HZ / 10)); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00reg.h b/drivers/net/wireless/rt2x00/rt2x00reg.h index cef94621cef7..ed71be95136d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00reg.h +++ b/drivers/net/wireless/rt2x00/rt2x00reg.h | |||
@@ -85,8 +85,6 @@ enum dev_state { | |||
85 | STATE_RADIO_OFF, | 85 | STATE_RADIO_OFF, |
86 | STATE_RADIO_RX_ON, | 86 | STATE_RADIO_RX_ON, |
87 | STATE_RADIO_RX_OFF, | 87 | STATE_RADIO_RX_OFF, |
88 | STATE_RADIO_RX_ON_LINK, | ||
89 | STATE_RADIO_RX_OFF_LINK, | ||
90 | STATE_RADIO_IRQ_ON, | 88 | STATE_RADIO_IRQ_ON, |
91 | STATE_RADIO_IRQ_OFF, | 89 | STATE_RADIO_IRQ_OFF, |
92 | STATE_RADIO_IRQ_ON_ISR, | 90 | STATE_RADIO_IRQ_ON_ISR, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index b3317df7a7d4..9ac14598e2a0 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -226,9 +226,7 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb) | |||
226 | * Schedule the delayed work for reading the TX status | 226 | * Schedule the delayed work for reading the TX status |
227 | * from the device. | 227 | * from the device. |
228 | */ | 228 | */ |
229 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && | 229 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->txdone_work); |
230 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
231 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->txdone_work); | ||
232 | } | 230 | } |
233 | 231 | ||
234 | static void rt2x00usb_kick_tx_entry(struct queue_entry *entry) | 232 | static void rt2x00usb_kick_tx_entry(struct queue_entry *entry) |
@@ -323,21 +321,6 @@ static void rt2x00usb_watchdog_tx_dma(struct data_queue *queue) | |||
323 | rt2x00dev->txdone_work.func(&rt2x00dev->txdone_work); | 321 | rt2x00dev->txdone_work.func(&rt2x00dev->txdone_work); |
324 | 322 | ||
325 | /* | 323 | /* |
326 | * Security measure: if the driver did override the | ||
327 | * txdone_work function, and the hardware did arrive | ||
328 | * in a state which causes it to malfunction, it is | ||
329 | * possible that the driver couldn't handle the txdone | ||
330 | * event correctly. So after giving the driver the | ||
331 | * chance to cleanup, we now force a cleanup of any | ||
332 | * leftovers. | ||
333 | */ | ||
334 | if (!rt2x00queue_empty(queue)) { | ||
335 | WARNING(queue->rt2x00dev, "TX queue %d DMA timed out," | ||
336 | " status handling failed, invoke hard reset", queue->qid); | ||
337 | rt2x00usb_work_txdone(&rt2x00dev->txdone_work); | ||
338 | } | ||
339 | |||
340 | /* | ||
341 | * The queue has been reset, and mac80211 is allowed to use the | 324 | * The queue has been reset, and mac80211 is allowed to use the |
342 | * queue again. | 325 | * queue again. |
343 | */ | 326 | */ |
@@ -361,7 +344,7 @@ void rt2x00usb_watchdog(struct rt2x00_dev *rt2x00dev) | |||
361 | if (!rt2x00queue_empty(queue)) { | 344 | if (!rt2x00queue_empty(queue)) { |
362 | if (rt2x00queue_dma_timeout(queue)) | 345 | if (rt2x00queue_dma_timeout(queue)) |
363 | rt2x00usb_watchdog_tx_dma(queue); | 346 | rt2x00usb_watchdog_tx_dma(queue); |
364 | if (rt2x00queue_timeout(queue)) | 347 | if (rt2x00queue_status_timeout(queue)) |
365 | rt2x00usb_watchdog_tx_status(queue); | 348 | rt2x00usb_watchdog_tx_status(queue); |
366 | } | 349 | } |
367 | } | 350 | } |
@@ -424,9 +407,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
424 | * Schedule the delayed work for reading the RX status | 407 | * Schedule the delayed work for reading the RX status |
425 | * from the device. | 408 | * from the device. |
426 | */ | 409 | */ |
427 | if (test_bit(DEVICE_STATE_PRESENT, &rt2x00dev->flags) && | 410 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->rxdone_work); |
428 | test_bit(DEVICE_STATE_ENABLED_RADIO, &rt2x00dev->flags)) | ||
429 | ieee80211_queue_work(rt2x00dev->hw, &rt2x00dev->rxdone_work); | ||
430 | } | 411 | } |
431 | 412 | ||
432 | /* | 413 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index af548c87f108..6b09b01f634f 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1623,8 +1623,7 @@ static void rt61pci_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
1623 | 1623 | ||
1624 | rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®); | 1624 | rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, ®); |
1625 | rt2x00_set_field32(®, TXRX_CSR0_DISABLE_RX, | 1625 | rt2x00_set_field32(®, TXRX_CSR0_DISABLE_RX, |
1626 | (state == STATE_RADIO_RX_OFF) || | 1626 | (state == STATE_RADIO_RX_OFF)); |
1627 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
1628 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); | 1627 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR0, reg); |
1629 | } | 1628 | } |
1630 | 1629 | ||
@@ -1745,9 +1744,7 @@ static int rt61pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1745 | rt61pci_disable_radio(rt2x00dev); | 1744 | rt61pci_disable_radio(rt2x00dev); |
1746 | break; | 1745 | break; |
1747 | case STATE_RADIO_RX_ON: | 1746 | case STATE_RADIO_RX_ON: |
1748 | case STATE_RADIO_RX_ON_LINK: | ||
1749 | case STATE_RADIO_RX_OFF: | 1747 | case STATE_RADIO_RX_OFF: |
1750 | case STATE_RADIO_RX_OFF_LINK: | ||
1751 | rt61pci_toggle_rx(rt2x00dev, state); | 1748 | rt61pci_toggle_rx(rt2x00dev, state); |
1752 | break; | 1749 | break; |
1753 | case STATE_RADIO_IRQ_ON: | 1750 | case STATE_RADIO_IRQ_ON: |
@@ -1789,10 +1786,10 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry, | |||
1789 | * Start writing the descriptor words. | 1786 | * Start writing the descriptor words. |
1790 | */ | 1787 | */ |
1791 | rt2x00_desc_read(txd, 1, &word); | 1788 | rt2x00_desc_read(txd, 1, &word); |
1792 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->qid); | 1789 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, entry->queue->qid); |
1793 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); | 1790 | rt2x00_set_field32(&word, TXD_W1_AIFSN, entry->queue->aifs); |
1794 | rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min); | 1791 | rt2x00_set_field32(&word, TXD_W1_CWMIN, entry->queue->cw_min); |
1795 | rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max); | 1792 | rt2x00_set_field32(&word, TXD_W1_CWMAX, entry->queue->cw_max); |
1796 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); | 1793 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); |
1797 | rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, | 1794 | rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, |
1798 | test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags)); | 1795 | test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags)); |
@@ -1820,7 +1817,7 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry, | |||
1820 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); | 1817 | rt2x00_set_field32(&word, TXD_W5_WAITING_DMA_DONE_INT, 1); |
1821 | rt2x00_desc_write(txd, 5, word); | 1818 | rt2x00_desc_write(txd, 5, word); |
1822 | 1819 | ||
1823 | if (txdesc->qid != QID_BEACON) { | 1820 | if (entry->queue->qid != QID_BEACON) { |
1824 | rt2x00_desc_read(txd, 6, &word); | 1821 | rt2x00_desc_read(txd, 6, &word); |
1825 | rt2x00_set_field32(&word, TXD_W6_BUFFER_PHYSICAL_ADDRESS, | 1822 | rt2x00_set_field32(&word, TXD_W6_BUFFER_PHYSICAL_ADDRESS, |
1826 | skbdesc->skb_dma); | 1823 | skbdesc->skb_dma); |
@@ -1866,8 +1863,8 @@ static void rt61pci_write_tx_desc(struct queue_entry *entry, | |||
1866 | * Register descriptor details in skb frame descriptor. | 1863 | * Register descriptor details in skb frame descriptor. |
1867 | */ | 1864 | */ |
1868 | skbdesc->desc = txd; | 1865 | skbdesc->desc = txd; |
1869 | skbdesc->desc_len = | 1866 | skbdesc->desc_len = (entry->queue->qid == QID_BEACON) ? TXINFO_SIZE : |
1870 | (txdesc->qid == QID_BEACON) ? TXINFO_SIZE : TXD_DESC_SIZE; | 1867 | TXD_DESC_SIZE; |
1871 | } | 1868 | } |
1872 | 1869 | ||
1873 | /* | 1870 | /* |
@@ -2078,7 +2075,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) | |||
2078 | * that the TX_STA_FIFO stack has a size of 16. We stick to our | 2075 | * that the TX_STA_FIFO stack has a size of 16. We stick to our |
2079 | * tx ring size for now. | 2076 | * tx ring size for now. |
2080 | */ | 2077 | */ |
2081 | for (i = 0; i < TX_ENTRIES; i++) { | 2078 | for (i = 0; i < rt2x00dev->ops->tx->entry_num; i++) { |
2082 | rt2x00pci_register_read(rt2x00dev, STA_CSR4, ®); | 2079 | rt2x00pci_register_read(rt2x00dev, STA_CSR4, ®); |
2083 | if (!rt2x00_get_field32(reg, STA_CSR4_VALID)) | 2080 | if (!rt2x00_get_field32(reg, STA_CSR4_VALID)) |
2084 | break; | 2081 | break; |
@@ -2824,6 +2821,7 @@ static const struct ieee80211_ops rt61pci_mac80211_ops = { | |||
2824 | .conf_tx = rt61pci_conf_tx, | 2821 | .conf_tx = rt61pci_conf_tx, |
2825 | .get_tsf = rt61pci_get_tsf, | 2822 | .get_tsf = rt61pci_get_tsf, |
2826 | .rfkill_poll = rt2x00mac_rfkill_poll, | 2823 | .rfkill_poll = rt2x00mac_rfkill_poll, |
2824 | .flush = rt2x00mac_flush, | ||
2827 | }; | 2825 | }; |
2828 | 2826 | ||
2829 | static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { | 2827 | static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { |
@@ -2857,21 +2855,21 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { | |||
2857 | }; | 2855 | }; |
2858 | 2856 | ||
2859 | static const struct data_queue_desc rt61pci_queue_rx = { | 2857 | static const struct data_queue_desc rt61pci_queue_rx = { |
2860 | .entry_num = RX_ENTRIES, | 2858 | .entry_num = 32, |
2861 | .data_size = DATA_FRAME_SIZE, | 2859 | .data_size = DATA_FRAME_SIZE, |
2862 | .desc_size = RXD_DESC_SIZE, | 2860 | .desc_size = RXD_DESC_SIZE, |
2863 | .priv_size = sizeof(struct queue_entry_priv_pci), | 2861 | .priv_size = sizeof(struct queue_entry_priv_pci), |
2864 | }; | 2862 | }; |
2865 | 2863 | ||
2866 | static const struct data_queue_desc rt61pci_queue_tx = { | 2864 | static const struct data_queue_desc rt61pci_queue_tx = { |
2867 | .entry_num = TX_ENTRIES, | 2865 | .entry_num = 32, |
2868 | .data_size = DATA_FRAME_SIZE, | 2866 | .data_size = DATA_FRAME_SIZE, |
2869 | .desc_size = TXD_DESC_SIZE, | 2867 | .desc_size = TXD_DESC_SIZE, |
2870 | .priv_size = sizeof(struct queue_entry_priv_pci), | 2868 | .priv_size = sizeof(struct queue_entry_priv_pci), |
2871 | }; | 2869 | }; |
2872 | 2870 | ||
2873 | static const struct data_queue_desc rt61pci_queue_bcn = { | 2871 | static const struct data_queue_desc rt61pci_queue_bcn = { |
2874 | .entry_num = 4 * BEACON_ENTRIES, | 2872 | .entry_num = 4, |
2875 | .data_size = 0, /* No DMA required for beacons */ | 2873 | .data_size = 0, /* No DMA required for beacons */ |
2876 | .desc_size = TXINFO_SIZE, | 2874 | .desc_size = TXINFO_SIZE, |
2877 | .priv_size = sizeof(struct queue_entry_priv_pci), | 2875 | .priv_size = sizeof(struct queue_entry_priv_pci), |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.h b/drivers/net/wireless/rt2x00/rt61pci.h index e2e728ab0b2e..afc803b7959f 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.h +++ b/drivers/net/wireless/rt2x00/rt61pci.h | |||
@@ -412,7 +412,7 @@ struct hw_pairwise_ta_entry { | |||
412 | * DROP_VERSION_ERROR: Drop version error frame. | 412 | * DROP_VERSION_ERROR: Drop version error frame. |
413 | * DROP_MULTICAST: Drop multicast frames. | 413 | * DROP_MULTICAST: Drop multicast frames. |
414 | * DROP_BORADCAST: Drop broadcast frames. | 414 | * DROP_BORADCAST: Drop broadcast frames. |
415 | * ROP_ACK_CTS: Drop received ACK and CTS. | 415 | * DROP_ACK_CTS: Drop received ACK and CTS. |
416 | */ | 416 | */ |
417 | #define TXRX_CSR0 0x3040 | 417 | #define TXRX_CSR0 0x3040 |
418 | #define TXRX_CSR0_RX_ACK_TIMEOUT FIELD32(0x000001ff) | 418 | #define TXRX_CSR0_RX_ACK_TIMEOUT FIELD32(0x000001ff) |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index 9be8089317e4..6f04552f5819 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -40,7 +40,7 @@ | |||
40 | /* | 40 | /* |
41 | * Allow hardware encryption to be disabled. | 41 | * Allow hardware encryption to be disabled. |
42 | */ | 42 | */ |
43 | static int modparam_nohwcrypt = 0; | 43 | static int modparam_nohwcrypt; |
44 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); | 44 | module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); |
45 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); | 45 | MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); |
46 | 46 | ||
@@ -1331,8 +1331,7 @@ static void rt73usb_toggle_rx(struct rt2x00_dev *rt2x00dev, | |||
1331 | 1331 | ||
1332 | rt2x00usb_register_read(rt2x00dev, TXRX_CSR0, ®); | 1332 | rt2x00usb_register_read(rt2x00dev, TXRX_CSR0, ®); |
1333 | rt2x00_set_field32(®, TXRX_CSR0_DISABLE_RX, | 1333 | rt2x00_set_field32(®, TXRX_CSR0_DISABLE_RX, |
1334 | (state == STATE_RADIO_RX_OFF) || | 1334 | (state == STATE_RADIO_RX_OFF)); |
1335 | (state == STATE_RADIO_RX_OFF_LINK)); | ||
1336 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR0, reg); | 1335 | rt2x00usb_register_write(rt2x00dev, TXRX_CSR0, reg); |
1337 | } | 1336 | } |
1338 | 1337 | ||
@@ -1403,9 +1402,7 @@ static int rt73usb_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
1403 | rt73usb_disable_radio(rt2x00dev); | 1402 | rt73usb_disable_radio(rt2x00dev); |
1404 | break; | 1403 | break; |
1405 | case STATE_RADIO_RX_ON: | 1404 | case STATE_RADIO_RX_ON: |
1406 | case STATE_RADIO_RX_ON_LINK: | ||
1407 | case STATE_RADIO_RX_OFF: | 1405 | case STATE_RADIO_RX_OFF: |
1408 | case STATE_RADIO_RX_OFF_LINK: | ||
1409 | rt73usb_toggle_rx(rt2x00dev, state); | 1406 | rt73usb_toggle_rx(rt2x00dev, state); |
1410 | break; | 1407 | break; |
1411 | case STATE_RADIO_IRQ_ON: | 1408 | case STATE_RADIO_IRQ_ON: |
@@ -1472,10 +1469,10 @@ static void rt73usb_write_tx_desc(struct queue_entry *entry, | |||
1472 | rt2x00_desc_write(txd, 0, word); | 1469 | rt2x00_desc_write(txd, 0, word); |
1473 | 1470 | ||
1474 | rt2x00_desc_read(txd, 1, &word); | 1471 | rt2x00_desc_read(txd, 1, &word); |
1475 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, txdesc->qid); | 1472 | rt2x00_set_field32(&word, TXD_W1_HOST_Q_ID, entry->queue->qid); |
1476 | rt2x00_set_field32(&word, TXD_W1_AIFSN, txdesc->aifs); | 1473 | rt2x00_set_field32(&word, TXD_W1_AIFSN, entry->queue->aifs); |
1477 | rt2x00_set_field32(&word, TXD_W1_CWMIN, txdesc->cw_min); | 1474 | rt2x00_set_field32(&word, TXD_W1_CWMIN, entry->queue->cw_min); |
1478 | rt2x00_set_field32(&word, TXD_W1_CWMAX, txdesc->cw_max); | 1475 | rt2x00_set_field32(&word, TXD_W1_CWMAX, entry->queue->cw_max); |
1479 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); | 1476 | rt2x00_set_field32(&word, TXD_W1_IV_OFFSET, txdesc->iv_offset); |
1480 | rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, | 1477 | rt2x00_set_field32(&word, TXD_W1_HW_SEQUENCE, |
1481 | test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags)); | 1478 | test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags)); |
@@ -2264,6 +2261,7 @@ static const struct ieee80211_ops rt73usb_mac80211_ops = { | |||
2264 | .conf_tx = rt73usb_conf_tx, | 2261 | .conf_tx = rt73usb_conf_tx, |
2265 | .get_tsf = rt73usb_get_tsf, | 2262 | .get_tsf = rt73usb_get_tsf, |
2266 | .rfkill_poll = rt2x00mac_rfkill_poll, | 2263 | .rfkill_poll = rt2x00mac_rfkill_poll, |
2264 | .flush = rt2x00mac_flush, | ||
2267 | }; | 2265 | }; |
2268 | 2266 | ||
2269 | static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | 2267 | static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { |
@@ -2296,21 +2294,21 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { | |||
2296 | }; | 2294 | }; |
2297 | 2295 | ||
2298 | static const struct data_queue_desc rt73usb_queue_rx = { | 2296 | static const struct data_queue_desc rt73usb_queue_rx = { |
2299 | .entry_num = RX_ENTRIES, | 2297 | .entry_num = 32, |
2300 | .data_size = DATA_FRAME_SIZE, | 2298 | .data_size = DATA_FRAME_SIZE, |
2301 | .desc_size = RXD_DESC_SIZE, | 2299 | .desc_size = RXD_DESC_SIZE, |
2302 | .priv_size = sizeof(struct queue_entry_priv_usb), | 2300 | .priv_size = sizeof(struct queue_entry_priv_usb), |
2303 | }; | 2301 | }; |
2304 | 2302 | ||
2305 | static const struct data_queue_desc rt73usb_queue_tx = { | 2303 | static const struct data_queue_desc rt73usb_queue_tx = { |
2306 | .entry_num = TX_ENTRIES, | 2304 | .entry_num = 32, |
2307 | .data_size = DATA_FRAME_SIZE, | 2305 | .data_size = DATA_FRAME_SIZE, |
2308 | .desc_size = TXD_DESC_SIZE, | 2306 | .desc_size = TXD_DESC_SIZE, |
2309 | .priv_size = sizeof(struct queue_entry_priv_usb), | 2307 | .priv_size = sizeof(struct queue_entry_priv_usb), |
2310 | }; | 2308 | }; |
2311 | 2309 | ||
2312 | static const struct data_queue_desc rt73usb_queue_bcn = { | 2310 | static const struct data_queue_desc rt73usb_queue_bcn = { |
2313 | .entry_num = 4 * BEACON_ENTRIES, | 2311 | .entry_num = 4, |
2314 | .data_size = MGMT_FRAME_SIZE, | 2312 | .data_size = MGMT_FRAME_SIZE, |
2315 | .desc_size = TXINFO_SIZE, | 2313 | .desc_size = TXINFO_SIZE, |
2316 | .priv_size = sizeof(struct queue_entry_priv_usb), | 2314 | .priv_size = sizeof(struct queue_entry_priv_usb), |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.h b/drivers/net/wireless/rt2x00/rt73usb.h index 44d5b2bebd39..1315ce5c992f 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.h +++ b/drivers/net/wireless/rt2x00/rt73usb.h | |||
@@ -322,7 +322,7 @@ struct hw_pairwise_ta_entry { | |||
322 | * DROP_VERSION_ERROR: Drop version error frame. | 322 | * DROP_VERSION_ERROR: Drop version error frame. |
323 | * DROP_MULTICAST: Drop multicast frames. | 323 | * DROP_MULTICAST: Drop multicast frames. |
324 | * DROP_BORADCAST: Drop broadcast frames. | 324 | * DROP_BORADCAST: Drop broadcast frames. |
325 | * ROP_ACK_CTS: Drop received ACK and CTS. | 325 | * DROP_ACK_CTS: Drop received ACK and CTS. |
326 | */ | 326 | */ |
327 | #define TXRX_CSR0 0x3040 | 327 | #define TXRX_CSR0 0x3040 |
328 | #define TXRX_CSR0_RX_ACK_TIMEOUT FIELD32(0x000001ff) | 328 | #define TXRX_CSR0_RX_ACK_TIMEOUT FIELD32(0x000001ff) |