diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 32 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 35 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500usb.c | 12 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 9 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00mac.c | 13 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 6 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.h | 40 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 27 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt73usb.c | 15 |
12 files changed, 80 insertions, 116 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index 560b9c73c0b9..705bc2d41dc1 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -1055,11 +1055,11 @@ static void rt2400pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1055 | * TX data initialization | 1055 | * TX data initialization |
1056 | */ | 1056 | */ |
1057 | static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | 1057 | static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, |
1058 | const unsigned int queue) | 1058 | const enum data_queue_qid queue) |
1059 | { | 1059 | { |
1060 | u32 reg; | 1060 | u32 reg; |
1061 | 1061 | ||
1062 | if (queue == RT2X00_BCN_QUEUE_BEACON) { | 1062 | if (queue == QID_BEACON) { |
1063 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); | 1063 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); |
1064 | if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) { | 1064 | if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) { |
1065 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); | 1065 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); |
@@ -1071,12 +1071,9 @@ static void rt2400pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
1071 | } | 1071 | } |
1072 | 1072 | ||
1073 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); | 1073 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); |
1074 | rt2x00_set_field32(®, TXCSR0_KICK_PRIO, | 1074 | rt2x00_set_field32(®, TXCSR0_KICK_PRIO, (queue == QID_AC_BE)); |
1075 | (queue == IEEE80211_TX_QUEUE_DATA0)); | 1075 | rt2x00_set_field32(®, TXCSR0_KICK_TX, (queue == QID_AC_BK)); |
1076 | rt2x00_set_field32(®, TXCSR0_KICK_TX, | 1076 | rt2x00_set_field32(®, TXCSR0_KICK_ATIM, (queue == QID_ATIM)); |
1077 | (queue == IEEE80211_TX_QUEUE_DATA1)); | ||
1078 | rt2x00_set_field32(®, TXCSR0_KICK_ATIM, | ||
1079 | (queue == RT2X00_BCN_QUEUE_ATIM)); | ||
1080 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); | 1077 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); |
1081 | } | 1078 | } |
1082 | 1079 | ||
@@ -1120,7 +1117,7 @@ static void rt2400pci_fill_rxdone(struct queue_entry *entry, | |||
1120 | * Interrupt functions. | 1117 | * Interrupt functions. |
1121 | */ | 1118 | */ |
1122 | static void rt2400pci_txdone(struct rt2x00_dev *rt2x00dev, | 1119 | static void rt2400pci_txdone(struct rt2x00_dev *rt2x00dev, |
1123 | const enum ieee80211_tx_queue queue_idx) | 1120 | const enum data_queue_qid queue_idx) |
1124 | { | 1121 | { |
1125 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, queue_idx); | 1122 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, queue_idx); |
1126 | struct queue_entry_priv_pci_tx *priv_tx; | 1123 | struct queue_entry_priv_pci_tx *priv_tx; |
@@ -1187,19 +1184,19 @@ static irqreturn_t rt2400pci_interrupt(int irq, void *dev_instance) | |||
1187 | * 3 - Atim ring transmit done interrupt. | 1184 | * 3 - Atim ring transmit done interrupt. |
1188 | */ | 1185 | */ |
1189 | if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING)) | 1186 | if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING)) |
1190 | rt2400pci_txdone(rt2x00dev, RT2X00_BCN_QUEUE_ATIM); | 1187 | rt2400pci_txdone(rt2x00dev, QID_ATIM); |
1191 | 1188 | ||
1192 | /* | 1189 | /* |
1193 | * 4 - Priority ring transmit done interrupt. | 1190 | * 4 - Priority ring transmit done interrupt. |
1194 | */ | 1191 | */ |
1195 | if (rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING)) | 1192 | if (rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING)) |
1196 | rt2400pci_txdone(rt2x00dev, IEEE80211_TX_QUEUE_DATA0); | 1193 | rt2400pci_txdone(rt2x00dev, QID_AC_BE); |
1197 | 1194 | ||
1198 | /* | 1195 | /* |
1199 | * 5 - Tx ring transmit done interrupt. | 1196 | * 5 - Tx ring transmit done interrupt. |
1200 | */ | 1197 | */ |
1201 | if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) | 1198 | if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) |
1202 | rt2400pci_txdone(rt2x00dev, IEEE80211_TX_QUEUE_DATA1); | 1199 | rt2400pci_txdone(rt2x00dev, QID_AC_BK); |
1203 | 1200 | ||
1204 | return IRQ_HANDLED; | 1201 | return IRQ_HANDLED; |
1205 | } | 1202 | } |
@@ -1521,20 +1518,13 @@ static int rt2400pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1521 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); | 1518 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); |
1522 | 1519 | ||
1523 | /* | 1520 | /* |
1524 | * mac80211 doesn't provide the control->queue variable | ||
1525 | * for beacons. Set our own queue identification so | ||
1526 | * it can be used during descriptor initialization. | ||
1527 | */ | ||
1528 | control->queue = RT2X00_BCN_QUEUE_BEACON; | ||
1529 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
1530 | |||
1531 | /* | ||
1532 | * Enable beacon generation. | 1521 | * Enable beacon generation. |
1533 | * Write entire beacon with descriptor to register, | 1522 | * Write entire beacon with descriptor to register, |
1534 | * and kick the beacon generator. | 1523 | * and kick the beacon generator. |
1535 | */ | 1524 | */ |
1525 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
1536 | memcpy(priv_tx->data, skb->data, skb->len); | 1526 | memcpy(priv_tx->data, skb->data, skb->len); |
1537 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, control->queue); | 1527 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, QID_BEACON); |
1538 | 1528 | ||
1539 | return 0; | 1529 | return 0; |
1540 | } | 1530 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index a5ed54b69262..0d53c75d55dd 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -317,8 +317,7 @@ static void rt2500pci_config_intf(struct rt2x00_dev *rt2x00dev, | |||
317 | struct rt2x00intf_conf *conf, | 317 | struct rt2x00intf_conf *conf, |
318 | const unsigned int flags) | 318 | const unsigned int flags) |
319 | { | 319 | { |
320 | struct data_queue *queue = | 320 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, QID_BEACON); |
321 | rt2x00queue_get_queue(rt2x00dev, RT2X00_BCN_QUEUE_BEACON); | ||
322 | unsigned int bcn_preload; | 321 | unsigned int bcn_preload; |
323 | u32 reg; | 322 | u32 reg; |
324 | 323 | ||
@@ -1210,11 +1209,11 @@ static void rt2500pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1210 | * TX data initialization | 1209 | * TX data initialization |
1211 | */ | 1210 | */ |
1212 | static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | 1211 | static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, |
1213 | const unsigned int queue) | 1212 | const enum data_queue_qid queue) |
1214 | { | 1213 | { |
1215 | u32 reg; | 1214 | u32 reg; |
1216 | 1215 | ||
1217 | if (queue == RT2X00_BCN_QUEUE_BEACON) { | 1216 | if (queue == QID_BEACON) { |
1218 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); | 1217 | rt2x00pci_register_read(rt2x00dev, CSR14, ®); |
1219 | if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) { | 1218 | if (!rt2x00_get_field32(reg, CSR14_BEACON_GEN)) { |
1220 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); | 1219 | rt2x00_set_field32(®, CSR14_TSF_COUNT, 1); |
@@ -1226,12 +1225,9 @@ static void rt2500pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
1226 | } | 1225 | } |
1227 | 1226 | ||
1228 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); | 1227 | rt2x00pci_register_read(rt2x00dev, TXCSR0, ®); |
1229 | rt2x00_set_field32(®, TXCSR0_KICK_PRIO, | 1228 | rt2x00_set_field32(®, TXCSR0_KICK_PRIO, (queue == QID_AC_BE)); |
1230 | (queue == IEEE80211_TX_QUEUE_DATA0)); | 1229 | rt2x00_set_field32(®, TXCSR0_KICK_TX, (queue == QID_AC_BK)); |
1231 | rt2x00_set_field32(®, TXCSR0_KICK_TX, | 1230 | rt2x00_set_field32(®, TXCSR0_KICK_ATIM, (queue == QID_ATIM)); |
1232 | (queue == IEEE80211_TX_QUEUE_DATA1)); | ||
1233 | rt2x00_set_field32(®, TXCSR0_KICK_ATIM, | ||
1234 | (queue == RT2X00_BCN_QUEUE_ATIM)); | ||
1235 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); | 1231 | rt2x00pci_register_write(rt2x00dev, TXCSR0, reg); |
1236 | } | 1232 | } |
1237 | 1233 | ||
@@ -1276,7 +1272,7 @@ static void rt2500pci_fill_rxdone(struct queue_entry *entry, | |||
1276 | * Interrupt functions. | 1272 | * Interrupt functions. |
1277 | */ | 1273 | */ |
1278 | static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev, | 1274 | static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev, |
1279 | const enum ieee80211_tx_queue queue_idx) | 1275 | const enum data_queue_qid queue_idx) |
1280 | { | 1276 | { |
1281 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, queue_idx); | 1277 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, queue_idx); |
1282 | struct queue_entry_priv_pci_tx *priv_tx; | 1278 | struct queue_entry_priv_pci_tx *priv_tx; |
@@ -1343,19 +1339,19 @@ static irqreturn_t rt2500pci_interrupt(int irq, void *dev_instance) | |||
1343 | * 3 - Atim ring transmit done interrupt. | 1339 | * 3 - Atim ring transmit done interrupt. |
1344 | */ | 1340 | */ |
1345 | if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING)) | 1341 | if (rt2x00_get_field32(reg, CSR7_TXDONE_ATIMRING)) |
1346 | rt2500pci_txdone(rt2x00dev, RT2X00_BCN_QUEUE_ATIM); | 1342 | rt2500pci_txdone(rt2x00dev, QID_ATIM); |
1347 | 1343 | ||
1348 | /* | 1344 | /* |
1349 | * 4 - Priority ring transmit done interrupt. | 1345 | * 4 - Priority ring transmit done interrupt. |
1350 | */ | 1346 | */ |
1351 | if (rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING)) | 1347 | if (rt2x00_get_field32(reg, CSR7_TXDONE_PRIORING)) |
1352 | rt2500pci_txdone(rt2x00dev, IEEE80211_TX_QUEUE_DATA0); | 1348 | rt2500pci_txdone(rt2x00dev, QID_AC_BE); |
1353 | 1349 | ||
1354 | /* | 1350 | /* |
1355 | * 5 - Tx ring transmit done interrupt. | 1351 | * 5 - Tx ring transmit done interrupt. |
1356 | */ | 1352 | */ |
1357 | if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) | 1353 | if (rt2x00_get_field32(reg, CSR7_TXDONE_TXRING)) |
1358 | rt2500pci_txdone(rt2x00dev, IEEE80211_TX_QUEUE_DATA1); | 1354 | rt2500pci_txdone(rt2x00dev, QID_AC_BK); |
1359 | 1355 | ||
1360 | return IRQ_HANDLED; | 1356 | return IRQ_HANDLED; |
1361 | } | 1357 | } |
@@ -1834,20 +1830,13 @@ static int rt2500pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1834 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); | 1830 | rt2x00pci_register_write(rt2x00dev, CSR14, reg); |
1835 | 1831 | ||
1836 | /* | 1832 | /* |
1837 | * mac80211 doesn't provide the control->queue variable | ||
1838 | * for beacons. Set our own queue identification so | ||
1839 | * it can be used during descriptor initialization. | ||
1840 | */ | ||
1841 | control->queue = RT2X00_BCN_QUEUE_BEACON; | ||
1842 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
1843 | |||
1844 | /* | ||
1845 | * Enable beacon generation. | 1833 | * Enable beacon generation. |
1846 | * Write entire beacon with descriptor to register, | 1834 | * Write entire beacon with descriptor to register, |
1847 | * and kick the beacon generator. | 1835 | * and kick the beacon generator. |
1848 | */ | 1836 | */ |
1837 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
1849 | memcpy(priv_tx->data, skb->data, skb->len); | 1838 | memcpy(priv_tx->data, skb->data, skb->len); |
1850 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, control->queue); | 1839 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, QID_BEACON); |
1851 | 1840 | ||
1852 | return 0; | 1841 | return 0; |
1853 | } | 1842 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2500usb.c b/drivers/net/wireless/rt2x00/rt2500usb.c index fdbd0ef2be4b..0dac1f5b5c4a 100644 --- a/drivers/net/wireless/rt2x00/rt2500usb.c +++ b/drivers/net/wireless/rt2x00/rt2500usb.c | |||
@@ -1094,11 +1094,11 @@ static int rt2500usb_get_tx_data_len(struct rt2x00_dev *rt2x00dev, | |||
1094 | * TX data initialization | 1094 | * TX data initialization |
1095 | */ | 1095 | */ |
1096 | static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | 1096 | static void rt2500usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, |
1097 | const unsigned int queue) | 1097 | const enum data_queue_qid queue) |
1098 | { | 1098 | { |
1099 | u16 reg; | 1099 | u16 reg; |
1100 | 1100 | ||
1101 | if (queue != RT2X00_BCN_QUEUE_BEACON) | 1101 | if (queue != QID_BEACON) |
1102 | return; | 1102 | return; |
1103 | 1103 | ||
1104 | rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®); | 1104 | rt2500usb_register_read(rt2x00dev, TXRX_CSR19, ®); |
@@ -1720,12 +1720,6 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw, | |||
1720 | rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0); | 1720 | rt2x00_set_field16(®, TXRX_CSR19_BEACON_GEN, 0); |
1721 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); | 1721 | rt2500usb_register_write(rt2x00dev, TXRX_CSR19, reg); |
1722 | 1722 | ||
1723 | /* | ||
1724 | * mac80211 doesn't provide the control->queue variable | ||
1725 | * for beacons. Set our own queue identification so | ||
1726 | * it can be used during descriptor initialization. | ||
1727 | */ | ||
1728 | control->queue = RT2X00_BCN_QUEUE_BEACON; | ||
1729 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | 1723 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); |
1730 | 1724 | ||
1731 | /* | 1725 | /* |
@@ -1757,7 +1751,7 @@ static int rt2500usb_beacon_update(struct ieee80211_hw *hw, | |||
1757 | /* | 1751 | /* |
1758 | * Enable beacon generation. | 1752 | * Enable beacon generation. |
1759 | */ | 1753 | */ |
1760 | rt2500usb_kick_tx_queue(rt2x00dev, control->queue); | 1754 | rt2500usb_kick_tx_queue(rt2x00dev, QID_BEACON); |
1761 | 1755 | ||
1762 | return 0; | 1756 | return 0; |
1763 | } | 1757 | } |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 7a23b00c6895..d85553f6351e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -548,7 +548,7 @@ struct rt2x00lib_ops { | |||
548 | int (*get_tx_data_len) (struct rt2x00_dev *rt2x00dev, | 548 | int (*get_tx_data_len) (struct rt2x00_dev *rt2x00dev, |
549 | struct sk_buff *skb); | 549 | struct sk_buff *skb); |
550 | void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, | 550 | void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, |
551 | const unsigned int queue); | 551 | const enum data_queue_qid queue); |
552 | 552 | ||
553 | /* | 553 | /* |
554 | * RX control handlers | 554 | * RX control handlers |
@@ -927,13 +927,12 @@ static inline u16 get_duration_res(const unsigned int size, const u8 rate) | |||
927 | } | 927 | } |
928 | 928 | ||
929 | /** | 929 | /** |
930 | * rt2x00queue_get_queue - Convert mac80211 queue index to rt2x00 queue | 930 | * rt2x00queue_get_queue - Convert queue index to queue pointer |
931 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | 931 | * @rt2x00dev: Pointer to &struct rt2x00_dev. |
932 | * @queue: mac80211/rt2x00 queue index | 932 | * @queue: rt2x00 queue index (see &enum data_queue_qid). |
933 | * (see &enum ieee80211_tx_queue and &enum rt2x00_bcn_queue). | ||
934 | */ | 933 | */ |
935 | struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, | 934 | struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, |
936 | const unsigned int queue); | 935 | const enum data_queue_qid queue); |
937 | 936 | ||
938 | /** | 937 | /** |
939 | * rt2x00queue_get_entry - Get queue entry where the given index points to. | 938 | * rt2x00queue_get_entry - Get queue entry where the given index points to. |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 8d8657fb64dd..b1a324dead5f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -687,8 +687,7 @@ void rt2x00lib_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
687 | * Beacons and probe responses require the tsf timestamp | 687 | * Beacons and probe responses require the tsf timestamp |
688 | * to be inserted into the frame. | 688 | * to be inserted into the frame. |
689 | */ | 689 | */ |
690 | if (control->queue == RT2X00_BCN_QUEUE_BEACON || | 690 | if (txdesc.queue == QID_BEACON || is_probe_resp(frame_control)) |
691 | is_probe_resp(frame_control)) | ||
692 | __set_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc.flags); | 691 | __set_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc.flags); |
693 | 692 | ||
694 | /* | 693 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt2x00mac.c b/drivers/net/wireless/rt2x00/rt2x00mac.c index e078e0ad0d06..d4ceab7646e7 100644 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c | |||
@@ -81,6 +81,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
81 | { | 81 | { |
82 | struct rt2x00_dev *rt2x00dev = hw->priv; | 82 | struct rt2x00_dev *rt2x00dev = hw->priv; |
83 | struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data; | 83 | struct ieee80211_hdr *ieee80211hdr = (struct ieee80211_hdr *)skb->data; |
84 | enum data_queue_qid qid = mac80211_queue_to_qid(control->queue); | ||
84 | struct data_queue *queue; | 85 | struct data_queue *queue; |
85 | struct skb_frame_desc *skbdesc; | 86 | struct skb_frame_desc *skbdesc; |
86 | u16 frame_control; | 87 | u16 frame_control; |
@@ -101,14 +102,13 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
101 | */ | 102 | */ |
102 | if (control->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM && | 103 | if (control->flags & IEEE80211_TXCTL_SEND_AFTER_DTIM && |
103 | test_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags)) | 104 | test_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags)) |
104 | queue = rt2x00queue_get_queue(rt2x00dev, RT2X00_BCN_QUEUE_ATIM); | 105 | queue = rt2x00queue_get_queue(rt2x00dev, QID_ATIM); |
105 | else | 106 | else |
106 | queue = rt2x00queue_get_queue(rt2x00dev, control->queue); | 107 | queue = rt2x00queue_get_queue(rt2x00dev, qid); |
107 | if (unlikely(!queue)) { | 108 | if (unlikely(!queue)) { |
108 | ERROR(rt2x00dev, | 109 | ERROR(rt2x00dev, |
109 | "Attempt to send packet over invalid queue %d.\n" | 110 | "Attempt to send packet over invalid queue %d.\n" |
110 | "Please file bug report to %s.\n", | 111 | "Please file bug report to %s.\n", qid, DRV_PROJECT); |
111 | control->queue, DRV_PROJECT); | ||
112 | dev_kfree_skb_any(skb); | 112 | dev_kfree_skb_any(skb); |
113 | return NETDEV_TX_OK; | 113 | return NETDEV_TX_OK; |
114 | } | 114 | } |
@@ -154,7 +154,7 @@ int rt2x00mac_tx(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
154 | ieee80211_stop_queue(rt2x00dev->hw, control->queue); | 154 | ieee80211_stop_queue(rt2x00dev->hw, control->queue); |
155 | 155 | ||
156 | if (rt2x00dev->ops->lib->kick_tx_queue) | 156 | if (rt2x00dev->ops->lib->kick_tx_queue) |
157 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, control->queue); | 157 | rt2x00dev->ops->lib->kick_tx_queue(rt2x00dev, qid); |
158 | 158 | ||
159 | return NETDEV_TX_OK; | 159 | return NETDEV_TX_OK; |
160 | } | 160 | } |
@@ -187,8 +187,7 @@ int rt2x00mac_add_interface(struct ieee80211_hw *hw, | |||
187 | { | 187 | { |
188 | struct rt2x00_dev *rt2x00dev = hw->priv; | 188 | struct rt2x00_dev *rt2x00dev = hw->priv; |
189 | struct rt2x00_intf *intf = vif_to_intf(conf->vif); | 189 | struct rt2x00_intf *intf = vif_to_intf(conf->vif); |
190 | struct data_queue *queue = | 190 | struct data_queue *queue = rt2x00queue_get_queue(rt2x00dev, QID_BEACON); |
191 | rt2x00queue_get_queue(rt2x00dev, RT2X00_BCN_QUEUE_BEACON); | ||
192 | struct queue_entry *entry = NULL; | 191 | struct queue_entry *entry = NULL; |
193 | unsigned int i; | 192 | unsigned int i; |
194 | 193 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index 7867ec64bd2c..9e5d94e44c5c 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -53,7 +53,7 @@ int rt2x00pci_write_tx_data(struct rt2x00_dev *rt2x00dev, | |||
53 | ERROR(rt2x00dev, | 53 | ERROR(rt2x00dev, |
54 | "Arrived at non-free entry in the non-full queue %d.\n" | 54 | "Arrived at non-free entry in the non-full queue %d.\n" |
55 | "Please file bug report to %s.\n", | 55 | "Please file bug report to %s.\n", |
56 | control->queue, DRV_PROJECT); | 56 | entry->queue->qid, DRV_PROJECT); |
57 | return -EINVAL; | 57 | return -EINVAL; |
58 | } | 58 | } |
59 | 59 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 659e9f44c40c..e5b861f8416d 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include "rt2x00lib.h" | 30 | #include "rt2x00lib.h" |
31 | 31 | ||
32 | struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, | 32 | struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, |
33 | const unsigned int queue) | 33 | const enum data_queue_qid queue) |
34 | { | 34 | { |
35 | int atim = test_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); | 35 | int atim = test_bit(DRIVER_REQUIRE_ATIM_QUEUE, &rt2x00dev->flags); |
36 | 36 | ||
@@ -40,9 +40,9 @@ struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, | |||
40 | if (!rt2x00dev->bcn) | 40 | if (!rt2x00dev->bcn) |
41 | return NULL; | 41 | return NULL; |
42 | 42 | ||
43 | if (queue == RT2X00_BCN_QUEUE_BEACON) | 43 | if (queue == QID_BEACON) |
44 | return &rt2x00dev->bcn[0]; | 44 | return &rt2x00dev->bcn[0]; |
45 | else if (queue == RT2X00_BCN_QUEUE_ATIM && atim) | 45 | else if (queue == QID_ATIM && atim) |
46 | return &rt2x00dev->bcn[1]; | 46 | return &rt2x00dev->bcn[1]; |
47 | 47 | ||
48 | return NULL; | 48 | return NULL; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index 7027c9f47d3f..29fe26525550 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h | |||
@@ -54,6 +54,17 @@ | |||
54 | 54 | ||
55 | /** | 55 | /** |
56 | * enum data_queue_qid: Queue identification | 56 | * enum data_queue_qid: Queue identification |
57 | * | ||
58 | * @QID_AC_BE: AC BE queue | ||
59 | * @QID_AC_BK: AC BK queue | ||
60 | * @QID_AC_VI: AC VI queue | ||
61 | * @QID_AC_VO: AC VO queue | ||
62 | * @QID_HCCA: HCCA queue | ||
63 | * @QID_MGMT: MGMT queue (prio queue) | ||
64 | * @QID_RX: RX queue | ||
65 | * @QID_OTHER: None of the above (don't use, only present for completeness) | ||
66 | * @QID_BEACON: Beacon queue (value unspecified, don't send it to device) | ||
67 | * @QID_ATIM: Atim queue (value unspeficied, don't send it to device) | ||
57 | */ | 68 | */ |
58 | enum data_queue_qid { | 69 | enum data_queue_qid { |
59 | QID_AC_BE = 0, | 70 | QID_AC_BE = 0, |
@@ -64,22 +75,25 @@ enum data_queue_qid { | |||
64 | QID_MGMT = 13, | 75 | QID_MGMT = 13, |
65 | QID_RX = 14, | 76 | QID_RX = 14, |
66 | QID_OTHER = 15, | 77 | QID_OTHER = 15, |
78 | QID_BEACON, | ||
79 | QID_ATIM, | ||
67 | }; | 80 | }; |
68 | 81 | ||
69 | /** | 82 | /** |
70 | * enum rt2x00_bcn_queue: Beacon queue index | 83 | * mac80211_queue_to_qid - Convert mac80211 queue to rt2x00 qid |
71 | * | 84 | * @queue: mac80211 queue. |
72 | * Start counting with a high offset, this because this enumeration | ||
73 | * supplements &enum ieee80211_tx_queue and we should prevent value | ||
74 | * conflicts. | ||
75 | * | ||
76 | * @RT2X00_BCN_QUEUE_BEACON: Beacon queue | ||
77 | * @RT2X00_BCN_QUEUE_ATIM: Atim queue (sends frame after beacon) | ||
78 | */ | 85 | */ |
79 | enum rt2x00_bcn_queue { | 86 | static inline enum data_queue_qid mac80211_queue_to_qid(unsigned int queue) |
80 | RT2X00_BCN_QUEUE_BEACON = 100, | 87 | { |
81 | RT2X00_BCN_QUEUE_ATIM = 101, | 88 | /* Regular TX queues are mapped directly */ |
82 | }; | 89 | if (queue < NUM_TX_DATA_QUEUES) |
90 | return queue; | ||
91 | else if (queue == IEEE80211_TX_QUEUE_BEACON) | ||
92 | return QID_BEACON; | ||
93 | else if (queue == IEEE80211_TX_QUEUE_AFTER_BEACON) | ||
94 | return QID_ATIM; | ||
95 | return QID_OTHER; | ||
96 | } | ||
83 | 97 | ||
84 | /** | 98 | /** |
85 | * enum skb_frame_desc_flags: Flags for &struct skb_frame_desc | 99 | * enum skb_frame_desc_flags: Flags for &struct skb_frame_desc |
@@ -105,7 +119,6 @@ enum skb_frame_desc_flags { | |||
105 | * of the scope of the skb->data pointer. | 119 | * of the scope of the skb->data pointer. |
106 | * @data_len: Length of the frame data. | 120 | * @data_len: Length of the frame data. |
107 | * @desc_len: Length of the frame descriptor. | 121 | * @desc_len: Length of the frame descriptor. |
108 | |||
109 | * @entry: The entry to which this sk buffer belongs. | 122 | * @entry: The entry to which this sk buffer belongs. |
110 | */ | 123 | */ |
111 | struct skb_frame_desc { | 124 | struct skb_frame_desc { |
@@ -240,7 +253,6 @@ struct txentry_desc { | |||
240 | * encryption or decryption. The entry should only be touched after | 253 | * encryption or decryption. The entry should only be touched after |
241 | * the device has signaled it is done with it. | 254 | * the device has signaled it is done with it. |
242 | */ | 255 | */ |
243 | |||
244 | enum queue_entry_flags { | 256 | enum queue_entry_flags { |
245 | ENTRY_BCN_ASSIGNED, | 257 | ENTRY_BCN_ASSIGNED, |
246 | ENTRY_OWNER_DEVICE_DATA, | 258 | ENTRY_OWNER_DEVICE_DATA, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 5a331674dcb2..47f96b34087e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -186,7 +186,7 @@ int rt2x00usb_write_tx_data(struct rt2x00_dev *rt2x00dev, | |||
186 | ERROR(rt2x00dev, | 186 | ERROR(rt2x00dev, |
187 | "Arrived at non-free entry in the non-full queue %d.\n" | 187 | "Arrived at non-free entry in the non-full queue %d.\n" |
188 | "Please file bug report to %s.\n", | 188 | "Please file bug report to %s.\n", |
189 | control->queue, DRV_PROJECT); | 189 | entry->queue->qid, DRV_PROJECT); |
190 | return -EINVAL; | 190 | return -EINVAL; |
191 | } | 191 | } |
192 | 192 | ||
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index ae12dcdd3c24..98af4d26583d 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1591,11 +1591,11 @@ static void rt61pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
1591 | * TX data initialization | 1591 | * TX data initialization |
1592 | */ | 1592 | */ |
1593 | static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | 1593 | static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, |
1594 | const unsigned int queue) | 1594 | const enum data_queue_qid queue) |
1595 | { | 1595 | { |
1596 | u32 reg; | 1596 | u32 reg; |
1597 | 1597 | ||
1598 | if (queue == RT2X00_BCN_QUEUE_BEACON) { | 1598 | if (queue == QID_BEACON) { |
1599 | /* | 1599 | /* |
1600 | * For Wi-Fi faily generated beacons between participating | 1600 | * For Wi-Fi faily generated beacons between participating |
1601 | * stations. Set TBTT phase adaptive adjustment step to 8us. | 1601 | * stations. Set TBTT phase adaptive adjustment step to 8us. |
@@ -1613,14 +1613,10 @@ static void rt61pci_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | |||
1613 | } | 1613 | } |
1614 | 1614 | ||
1615 | rt2x00pci_register_read(rt2x00dev, TX_CNTL_CSR, ®); | 1615 | rt2x00pci_register_read(rt2x00dev, TX_CNTL_CSR, ®); |
1616 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC0, | 1616 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC0, (queue == QID_AC_BE)); |
1617 | (queue == IEEE80211_TX_QUEUE_DATA0)); | 1617 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC1, (queue == QID_AC_BK)); |
1618 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC1, | 1618 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC2, (queue == QID_AC_VI)); |
1619 | (queue == IEEE80211_TX_QUEUE_DATA1)); | 1619 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC3, (queue == QID_AC_VO)); |
1620 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC2, | ||
1621 | (queue == IEEE80211_TX_QUEUE_DATA2)); | ||
1622 | rt2x00_set_field32(®, TX_CNTL_CSR_KICK_TX_AC3, | ||
1623 | (queue == IEEE80211_TX_QUEUE_DATA3)); | ||
1624 | rt2x00pci_register_write(rt2x00dev, TX_CNTL_CSR, reg); | 1620 | rt2x00pci_register_write(rt2x00dev, TX_CNTL_CSR, reg); |
1625 | } | 1621 | } |
1626 | 1622 | ||
@@ -2412,21 +2408,14 @@ static int rt61pci_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2412 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg); | 2408 | rt2x00pci_register_write(rt2x00dev, TXRX_CSR9, reg); |
2413 | 2409 | ||
2414 | /* | 2410 | /* |
2415 | * mac80211 doesn't provide the control->queue variable | ||
2416 | * for beacons. Set our own queue identification so | ||
2417 | * it can be used during descriptor initialization. | ||
2418 | */ | ||
2419 | control->queue = RT2X00_BCN_QUEUE_BEACON; | ||
2420 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
2421 | |||
2422 | /* | ||
2423 | * Write entire beacon with descriptor to register, | 2411 | * Write entire beacon with descriptor to register, |
2424 | * and kick the beacon generator. | 2412 | * and kick the beacon generator. |
2425 | */ | 2413 | */ |
2414 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
2426 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); | 2415 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); |
2427 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, | 2416 | rt2x00pci_register_multiwrite(rt2x00dev, beacon_base, |
2428 | skb->data, skb->len); | 2417 | skb->data, skb->len); |
2429 | rt61pci_kick_tx_queue(rt2x00dev, control->queue); | 2418 | rt61pci_kick_tx_queue(rt2x00dev, QID_BEACON); |
2430 | 2419 | ||
2431 | return 0; | 2420 | return 0; |
2432 | } | 2421 | } |
diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c index da19a3a91f4d..a6419c900772 100644 --- a/drivers/net/wireless/rt2x00/rt73usb.c +++ b/drivers/net/wireless/rt2x00/rt73usb.c | |||
@@ -1331,11 +1331,11 @@ static int rt73usb_get_tx_data_len(struct rt2x00_dev *rt2x00dev, | |||
1331 | * TX data initialization | 1331 | * TX data initialization |
1332 | */ | 1332 | */ |
1333 | static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, | 1333 | static void rt73usb_kick_tx_queue(struct rt2x00_dev *rt2x00dev, |
1334 | const unsigned int queue) | 1334 | const enum data_queue_qid queue) |
1335 | { | 1335 | { |
1336 | u32 reg; | 1336 | u32 reg; |
1337 | 1337 | ||
1338 | if (queue != RT2X00_BCN_QUEUE_BEACON) | 1338 | if (queue != QID_BEACON) |
1339 | return; | 1339 | return; |
1340 | 1340 | ||
1341 | /* | 1341 | /* |
@@ -2001,23 +2001,16 @@ static int rt73usb_beacon_update(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
2001 | rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg); | 2001 | rt73usb_register_write(rt2x00dev, TXRX_CSR9, reg); |
2002 | 2002 | ||
2003 | /* | 2003 | /* |
2004 | * mac80211 doesn't provide the control->queue variable | ||
2005 | * for beacons. Set our own queue identification so | ||
2006 | * it can be used during descriptor initialization. | ||
2007 | */ | ||
2008 | control->queue = RT2X00_BCN_QUEUE_BEACON; | ||
2009 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
2010 | |||
2011 | /* | ||
2012 | * Write entire beacon with descriptor to register, | 2004 | * Write entire beacon with descriptor to register, |
2013 | * and kick the beacon generator. | 2005 | * and kick the beacon generator. |
2014 | */ | 2006 | */ |
2007 | rt2x00lib_write_tx_desc(rt2x00dev, skb, control); | ||
2015 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); | 2008 | beacon_base = HW_BEACON_OFFSET(intf->beacon->entry_idx); |
2016 | timeout = REGISTER_TIMEOUT * (skb->len / sizeof(u32)); | 2009 | timeout = REGISTER_TIMEOUT * (skb->len / sizeof(u32)); |
2017 | rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE, | 2010 | rt2x00usb_vendor_request(rt2x00dev, USB_MULTI_WRITE, |
2018 | USB_VENDOR_REQUEST_OUT, beacon_base, 0, | 2011 | USB_VENDOR_REQUEST_OUT, beacon_base, 0, |
2019 | skb->data, skb->len, timeout); | 2012 | skb->data, skb->len, timeout); |
2020 | rt73usb_kick_tx_queue(rt2x00dev, control->queue); | 2013 | rt73usb_kick_tx_queue(rt2x00dev, QID_BEACON); |
2021 | 2014 | ||
2022 | return 0; | 2015 | return 0; |
2023 | } | 2016 | } |