aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00')
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.c14
-rw-r--r--drivers/net/wireless/rt2x00/rt2400pci.h6
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.c20
-rw-r--r--drivers/net/wireless/rt2x00/rt2500pci.h4
-rw-r--r--drivers/net/wireless/rt2x00/rt2500usb.c22
-rw-r--r--drivers/net/wireless/rt2x00/rt2800.h61
-rw-r--r--drivers/net/wireless/rt2x00/rt2800lib.c43
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.c16
-rw-r--r--drivers/net/wireless/rt2x00/rt2800pci.h12
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.c66
-rw-r--r--drivers/net/wireless/rt2x00/rt2800usb.h4
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00.h1
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00config.c8
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00debug.c10
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00dev.c37
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00lib.h3
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00link.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00mac.c52
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00pci.c2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c39
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.h33
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00reg.h2
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00usb.c25
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.c28
-rw-r--r--drivers/net/wireless/rt2x00/rt61pci.h2
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.c22
-rw-r--r--drivers/net/wireless/rt2x00/rt73usb.h2
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, &reg); 886 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
887 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX, 887 rt2x00_set_field32(&reg, 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
1617static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = { 1615static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
@@ -1640,28 +1638,28 @@ static const struct rt2x00lib_ops rt2400pci_rt2x00_ops = {
1640}; 1638};
1641 1639
1642static const struct data_queue_desc rt2400pci_queue_rx = { 1640static 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
1649static const struct data_queue_desc rt2400pci_queue_tx = { 1647static 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
1656static const struct data_queue_desc rt2400pci_queue_bcn = { 1654static 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
1663static const struct data_queue_desc rt2400pci_queue_atim = { 1661static 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, &reg); 1041 rt2x00pci_register_read(rt2x00dev, RXCSR0, &reg);
1042 rt2x00_set_field32(&reg, RXCSR0_DISABLE_RX, 1042 rt2x00_set_field32(&reg, 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
1914static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = { 1912static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
@@ -1937,28 +1935,28 @@ static const struct rt2x00lib_ops rt2500pci_rt2x00_ops = {
1937}; 1935};
1938 1936
1939static const struct data_queue_desc rt2500pci_queue_rx = { 1937static 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
1946static const struct data_queue_desc rt2500pci_queue_tx = { 1944static 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
1953static const struct data_queue_desc rt2500pci_queue_bcn = { 1951static 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
1960static const struct data_queue_desc rt2500pci_queue_atim = { 1958static 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 */
42static int modparam_nohwcrypt = 0; 42static int modparam_nohwcrypt;
43module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); 43module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
44MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); 44MODULE_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, &reg); 939 rt2500usb_register_read(rt2x00dev, TXRX_CSR2, &reg);
940 rt2x00_set_field16(&reg, TXRX_CSR2_DISABLE_RX, 940 rt2x00_set_field16(&reg, 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
1806static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = { 1804static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
@@ -1829,28 +1827,28 @@ static const struct rt2x00lib_ops rt2500usb_rt2x00_ops = {
1829}; 1827};
1830 1828
1831static const struct data_queue_desc rt2500usb_queue_rx = { 1829static 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
1838static const struct data_queue_desc rt2500usb_queue_tx = { 1836static 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
1845static const struct data_queue_desc rt2500usb_queue_bcn = { 1843static 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
1852static const struct data_queue_desc rt2500usb_queue_atim = { 1850static 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
1500struct mac_wcid_entry { 1535struct 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, &reg); 285 rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG, &reg);
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, &reg); 735 rt2800_register_read(rt2x00dev, TX_STA_FIFO, &reg);
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}
825EXPORT_SYMBOL_GPL(rt2800_write_beacon); 829EXPORT_SYMBOL_GPL(rt2800_write_beacon);
826 830
827static void inline rt2800_clear_beacon(struct rt2x00_dev *rt2x00dev, 831static 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(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff); 1193 rt2x00_set_field32(&reg, 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(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3); 1204 rt2x00_set_field32(&reg, 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, &reg);
2120 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TIMEOUT_TRUN_EN, 1);
2121 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_AC_TRUN_EN, 1);
2122 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN, 1);
2123 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_USER_MODE_TRUN_EN, 1);
2124 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_MIMO_PS_TRUN_EN, 1);
2125 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_RESERVED_TRUN_EN, 1);
2126 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_LSIG_TXOP_EN, 0);
2127 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_EN, 0);
2128 rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_DLY, 88);
2129 rt2x00_set_field32(&reg, 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, &reg); 2134 rt2800_register_read(rt2x00dev, TX_RTS_CFG, &reg);
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, &reg); 329 rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
330 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 330 rt2x00_set_field32(&reg, 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
948static const struct rt2800_ops rt2800pci_rt2800_ops = { 946static const struct rt2800_ops rt2800pci_rt2800_ops = {
@@ -991,21 +989,21 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = {
991}; 989};
992 990
993static const struct data_queue_desc rt2800pci_queue_rx = { 991static 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
1000static const struct data_queue_desc rt2800pci_queue_tx = { 998static 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
1007static const struct data_queue_desc rt2800pci_queue_bcn = { 1005static 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 */
48static int modparam_nohwcrypt = 0; 48static int modparam_nohwcrypt;
49module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); 49module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
50MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); 50MODULE_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, &reg); 115 rt2800_register_read(rt2x00dev, MAC_SYS_CTRL, &reg);
116 rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 116 rt2x00_set_field32(&reg, 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(&reg, USB_DMA_CFG_RX_BULK_AGG_LIMIT, 166 rt2x00_set_field32(&reg, 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(&reg, USB_DMA_CFG_RX_BULK_EN, 1); 169 rt2x00_set_field32(&reg, USB_DMA_CFG_RX_BULK_EN, 1);
170 rt2x00_set_field32(&reg, USB_DMA_CFG_TX_BULK_EN, 1); 170 rt2x00_set_field32(&reg, 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 */
248static void rt2800usb_watchdog(struct rt2x00_dev *rt2x00dev)
249{
250 unsigned int i;
251 u32 reg;
252
253 rt2800_register_read(rt2x00dev, TXRXQ_PCNT, &reg);
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, &reg);
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 */
250static __le32 *rt2800usb_get_txwi(struct queue_entry *entry) 291static __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
512static const struct rt2800_ops rt2800usb_rt2800_ops = { 554static 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
555static const struct data_queue_desc rt2800usb_queue_rx = { 597static 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
562static const struct data_queue_desc rt2800usb_queue_tx = { 604static 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
569static const struct data_queue_desc rt2800usb_queue_bcn = { 611static 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,
1133int rt2x00mac_conf_tx(struct ieee80211_hw *hw, u16 queue, 1133int 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);
1135void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw); 1135void rt2x00mac_rfkill_poll(struct ieee80211_hw *hw);
1136void 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
166void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, 168void 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(&timestamp); 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(&timestamp);
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
116void 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
133static void rt2x00lib_intf_scheduled_iter(void *data, u8 *mac, 118static 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
569submit_entry: 558submit_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}
574EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); 567EXPORT_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
62static inline int rt2x00_get_rate_mcs(const u16 mcs_value) 62static 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 */
70int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev); 70int rt2x00lib_enable_radio(struct rt2x00_dev *rt2x00dev);
71void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev); 71void rt2x00lib_disable_radio(struct rt2x00_dev *rt2x00dev);
72void 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}
721EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll); 715EXPORT_SYMBOL_GPL(rt2x00mac_rfkill_poll);
716
717void 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}
753EXPORT_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
463static void rt2x00queue_kick_tx_queue(struct queue_entry *entry, 455static 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
483int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, 472int 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
747static void rt2x00queue_reset(struct data_queue *queue) 736static 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
765void rt2x00queue_stop_queues(struct rt2x00_dev *rt2x00dev) 754void 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)
911static void rt2x00queue_init(struct rt2x00_dev *rt2x00dev, 900static 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 {
322struct txentry_desc { 302struct 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 */
624static inline int rt2x00queue_timeout(struct data_queue *queue) 599static 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
234static void rt2x00usb_kick_tx_entry(struct queue_entry *entry) 232static 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, &reg); 1624 rt2x00pci_register_read(rt2x00dev, TXRX_CSR0, &reg);
1625 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 1625 rt2x00_set_field32(&reg, 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, &reg); 2079 rt2x00pci_register_read(rt2x00dev, STA_CSR4, &reg);
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
2829static const struct rt2x00lib_ops rt61pci_rt2x00_ops = { 2827static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
@@ -2857,21 +2855,21 @@ static const struct rt2x00lib_ops rt61pci_rt2x00_ops = {
2857}; 2855};
2858 2856
2859static const struct data_queue_desc rt61pci_queue_rx = { 2857static 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
2866static const struct data_queue_desc rt61pci_queue_tx = { 2864static 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
2873static const struct data_queue_desc rt61pci_queue_bcn = { 2871static 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 */
43static int modparam_nohwcrypt = 0; 43static int modparam_nohwcrypt;
44module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO); 44module_param_named(nohwcrypt, modparam_nohwcrypt, bool, S_IRUGO);
45MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption."); 45MODULE_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, &reg); 1332 rt2x00usb_register_read(rt2x00dev, TXRX_CSR0, &reg);
1333 rt2x00_set_field32(&reg, TXRX_CSR0_DISABLE_RX, 1333 rt2x00_set_field32(&reg, 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
2269static const struct rt2x00lib_ops rt73usb_rt2x00_ops = { 2267static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
@@ -2296,21 +2294,21 @@ static const struct rt2x00lib_ops rt73usb_rt2x00_ops = {
2296}; 2294};
2297 2295
2298static const struct data_queue_desc rt73usb_queue_rx = { 2296static 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
2305static const struct data_queue_desc rt73usb_queue_tx = { 2303static 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
2312static const struct data_queue_desc rt73usb_queue_bcn = { 2310static 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)