diff options
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2400pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2500pci.c | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00.h | 34 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00dev.c | 29 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00lib.h | 51 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.c | 49 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00pci.h | 9 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 15 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.h | 2 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00usb.c | 42 | ||||
-rw-r--r-- | drivers/net/wireless/rt2x00/rt61pci.c | 4 |
11 files changed, 102 insertions, 137 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2400pci.c b/drivers/net/wireless/rt2x00/rt2400pci.c index de2dd336f23d..b3dffcfed835 100644 --- a/drivers/net/wireless/rt2x00/rt2400pci.c +++ b/drivers/net/wireless/rt2x00/rt2400pci.c | |||
@@ -1154,7 +1154,7 @@ static void rt2400pci_txdone(struct rt2x00_dev *rt2x00dev, | |||
1154 | } | 1154 | } |
1155 | txdesc.retry = rt2x00_get_field32(word, TXD_W0_RETRY_COUNT); | 1155 | txdesc.retry = rt2x00_get_field32(word, TXD_W0_RETRY_COUNT); |
1156 | 1156 | ||
1157 | rt2x00pci_txdone(rt2x00dev, entry, &txdesc); | 1157 | rt2x00lib_txdone(entry, &txdesc); |
1158 | } | 1158 | } |
1159 | } | 1159 | } |
1160 | 1160 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2500pci.c b/drivers/net/wireless/rt2x00/rt2500pci.c index 5077b62dcc5a..0423c251c78e 100644 --- a/drivers/net/wireless/rt2x00/rt2500pci.c +++ b/drivers/net/wireless/rt2x00/rt2500pci.c | |||
@@ -1312,7 +1312,7 @@ static void rt2500pci_txdone(struct rt2x00_dev *rt2x00dev, | |||
1312 | } | 1312 | } |
1313 | txdesc.retry = rt2x00_get_field32(word, TXD_W0_RETRY_COUNT); | 1313 | txdesc.retry = rt2x00_get_field32(word, TXD_W0_RETRY_COUNT); |
1314 | 1314 | ||
1315 | rt2x00pci_txdone(rt2x00dev, entry, &txdesc); | 1315 | rt2x00lib_txdone(entry, &txdesc); |
1316 | } | 1316 | } |
1317 | } | 1317 | } |
1318 | 1318 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 28c9026bb568..94b7c9bd09e5 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -900,14 +900,6 @@ static inline u16 get_duration_res(const unsigned int size, const u8 rate) | |||
900 | } | 900 | } |
901 | 901 | ||
902 | /** | 902 | /** |
903 | * rt2x00queue_alloc_rxskb - allocate a skb for RX purposes. | ||
904 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
905 | * @queue: The queue for which the skb will be applicable. | ||
906 | */ | ||
907 | struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev, | ||
908 | struct queue_entry *entry); | ||
909 | |||
910 | /** | ||
911 | * rt2x00queue_map_txskb - Map a skb into DMA for TX purposes. | 903 | * rt2x00queue_map_txskb - Map a skb into DMA for TX purposes. |
912 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | 904 | * @rt2x00dev: Pointer to &struct rt2x00_dev. |
913 | * @skb: The skb to map. | 905 | * @skb: The skb to map. |
@@ -915,20 +907,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev, | |||
915 | void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | 907 | void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); |
916 | 908 | ||
917 | /** | 909 | /** |
918 | * rt2x00queue_unmap_skb - Unmap a skb from DMA. | ||
919 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
920 | * @skb: The skb to unmap. | ||
921 | */ | ||
922 | void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | ||
923 | |||
924 | /** | ||
925 | * rt2x00queue_free_skb - free a skb | ||
926 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
927 | * @skb: The skb to free. | ||
928 | */ | ||
929 | void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | ||
930 | |||
931 | /** | ||
932 | * rt2x00queue_create_tx_descriptor - Create TX descriptor from mac80211 input | 910 | * rt2x00queue_create_tx_descriptor - Create TX descriptor from mac80211 input |
933 | * @entry: The entry which will be used to transfer the TX frame. | 911 | * @entry: The entry which will be used to transfer the TX frame. |
934 | * @txdesc: rt2x00 TX descriptor which will be initialized by this function. | 912 | * @txdesc: rt2x00 TX descriptor which will be initialized by this function. |
@@ -977,18 +955,6 @@ struct data_queue *rt2x00queue_get_queue(struct rt2x00_dev *rt2x00dev, | |||
977 | struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue, | 955 | struct queue_entry *rt2x00queue_get_entry(struct data_queue *queue, |
978 | enum queue_index index); | 956 | enum queue_index index); |
979 | 957 | ||
980 | /** | ||
981 | * rt2x00queue_index_inc - Index incrementation function | ||
982 | * @queue: Queue (&struct data_queue) to perform the action on. | ||
983 | * @index: Index type (&enum queue_index) to perform the action on. | ||
984 | * | ||
985 | * This function will increase the requested index on the queue, | ||
986 | * it will grab the appropriate locks and handle queue overflow events by | ||
987 | * resetting the index to the start of the queue. | ||
988 | */ | ||
989 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); | ||
990 | |||
991 | |||
992 | /* | 958 | /* |
993 | * Interrupt context handlers. | 959 | * Interrupt context handlers. |
994 | */ | 960 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index 99b14ba99d97..2a63a7b911b4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -504,6 +504,12 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
504 | { | 504 | { |
505 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 505 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
506 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); | 506 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(entry->skb); |
507 | enum data_queue_qid qid = skb_get_queue_mapping(entry->skb); | ||
508 | |||
509 | /* | ||
510 | * Unmap the skb. | ||
511 | */ | ||
512 | rt2x00queue_unmap_skb(rt2x00dev, entry->skb); | ||
507 | 513 | ||
508 | /* | 514 | /* |
509 | * Send frame to debugfs immediately, after this call is completed | 515 | * Send frame to debugfs immediately, after this call is completed |
@@ -552,7 +558,25 @@ void rt2x00lib_txdone(struct queue_entry *entry, | |||
552 | ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb); | 558 | ieee80211_tx_status_irqsafe(rt2x00dev->hw, entry->skb); |
553 | else | 559 | else |
554 | dev_kfree_skb_irq(entry->skb); | 560 | dev_kfree_skb_irq(entry->skb); |
561 | |||
562 | /* | ||
563 | * Make this entry available for reuse. | ||
564 | */ | ||
555 | entry->skb = NULL; | 565 | entry->skb = NULL; |
566 | entry->flags = 0; | ||
567 | |||
568 | rt2x00dev->ops->lib->init_txentry(rt2x00dev, entry); | ||
569 | |||
570 | __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | ||
571 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | ||
572 | |||
573 | /* | ||
574 | * If the data queue was below the threshold before the txdone | ||
575 | * handler we must make sure the packet queue in the mac80211 stack | ||
576 | * is reenabled when the txdone handler has finished. | ||
577 | */ | ||
578 | if (!rt2x00queue_threshold(entry->queue)) | ||
579 | ieee80211_wake_queue(rt2x00dev->hw, qid); | ||
556 | } | 580 | } |
557 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); | 581 | EXPORT_SYMBOL_GPL(rt2x00lib_txdone); |
558 | 582 | ||
@@ -657,6 +681,11 @@ void rt2x00lib_rxdone(struct rt2x00_dev *rt2x00dev, | |||
657 | * Replace the skb with the freshly allocated one. | 681 | * Replace the skb with the freshly allocated one. |
658 | */ | 682 | */ |
659 | entry->skb = skb; | 683 | entry->skb = skb; |
684 | entry->flags = 0; | ||
685 | |||
686 | rt2x00dev->ops->lib->init_rxentry(rt2x00dev, entry); | ||
687 | |||
688 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
660 | } | 689 | } |
661 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); | 690 | EXPORT_SYMBOL_GPL(rt2x00lib_rxdone); |
662 | 691 | ||
diff --git a/drivers/net/wireless/rt2x00/rt2x00lib.h b/drivers/net/wireless/rt2x00/rt2x00lib.h index 558f45bf27e3..1d1f0749375e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h | |||
@@ -98,10 +98,57 @@ void rt2x00lib_config_antenna(struct rt2x00_dev *rt2x00dev, | |||
98 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, | 98 | void rt2x00lib_config(struct rt2x00_dev *rt2x00dev, |
99 | struct ieee80211_conf *conf, const int force_config); | 99 | struct ieee80211_conf *conf, const int force_config); |
100 | 100 | ||
101 | /* | 101 | /** |
102 | * Queue handlers. | 102 | * DOC: Queue handlers |
103 | */ | ||
104 | |||
105 | /** | ||
106 | * rt2x00queue_alloc_rxskb - allocate a skb for RX purposes. | ||
107 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
108 | * @queue: The queue for which the skb will be applicable. | ||
109 | */ | ||
110 | struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev, | ||
111 | struct queue_entry *entry); | ||
112 | |||
113 | /** | ||
114 | * rt2x00queue_unmap_skb - Unmap a skb from DMA. | ||
115 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
116 | * @skb: The skb to unmap. | ||
117 | */ | ||
118 | void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | ||
119 | |||
120 | /** | ||
121 | * rt2x00queue_free_skb - free a skb | ||
122 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
123 | * @skb: The skb to free. | ||
124 | */ | ||
125 | void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | ||
126 | |||
127 | /** | ||
128 | * rt2x00queue_free_skb - free a skb | ||
129 | * @rt2x00dev: Pointer to &struct rt2x00_dev. | ||
130 | * @skb: The skb to free. | ||
131 | */ | ||
132 | void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb); | ||
133 | |||
134 | /** | ||
135 | * rt2x00queue_write_tx_frame - Write TX frame to hardware | ||
136 | * @queue: Queue over which the frame should be send | ||
137 | * @skb: The skb to send | ||
103 | */ | 138 | */ |
104 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb); | 139 | int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb); |
140 | |||
141 | /** | ||
142 | * rt2x00queue_index_inc - Index incrementation function | ||
143 | * @queue: Queue (&struct data_queue) to perform the action on. | ||
144 | * @index: Index type (&enum queue_index) to perform the action on. | ||
145 | * | ||
146 | * This function will increase the requested index on the queue, | ||
147 | * it will grab the appropriate locks and handle queue overflow events by | ||
148 | * resetting the index to the start of the queue. | ||
149 | */ | ||
150 | void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index); | ||
151 | |||
105 | void rt2x00queue_init_rx(struct rt2x00_dev *rt2x00dev); | 152 | void rt2x00queue_init_rx(struct rt2x00_dev *rt2x00dev); |
106 | void rt2x00queue_init_tx(struct rt2x00_dev *rt2x00dev); | 153 | void rt2x00queue_init_tx(struct rt2x00_dev *rt2x00dev); |
107 | int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev); | 154 | int rt2x00queue_initialize(struct rt2x00_dev *rt2x00dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index f9d0d76f8706..adf2876ed8ab 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -60,12 +60,8 @@ int rt2x00pci_write_tx_data(struct queue_entry *entry) | |||
60 | * Fill in skb descriptor | 60 | * Fill in skb descriptor |
61 | */ | 61 | */ |
62 | skbdesc = get_skb_frame_desc(entry->skb); | 62 | skbdesc = get_skb_frame_desc(entry->skb); |
63 | memset(skbdesc, 0, sizeof(*skbdesc)); | ||
64 | skbdesc->desc = entry_priv->desc; | 63 | skbdesc->desc = entry_priv->desc; |
65 | skbdesc->desc_len = entry->queue->desc_size; | 64 | skbdesc->desc_len = entry->queue->desc_size; |
66 | skbdesc->entry = entry; | ||
67 | |||
68 | rt2x00queue_map_txskb(entry->queue->rt2x00dev, entry->skb); | ||
69 | 65 | ||
70 | return 0; | 66 | return 0; |
71 | } | 67 | } |
@@ -101,55 +97,10 @@ void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev) | |||
101 | * Send the frame to rt2x00lib for further processing. | 97 | * Send the frame to rt2x00lib for further processing. |
102 | */ | 98 | */ |
103 | rt2x00lib_rxdone(rt2x00dev, entry); | 99 | rt2x00lib_rxdone(rt2x00dev, entry); |
104 | |||
105 | /* | ||
106 | * Reset the RXD for this entry. | ||
107 | */ | ||
108 | rt2x00dev->ops->lib->init_rxentry(rt2x00dev, entry); | ||
109 | |||
110 | rt2x00queue_index_inc(queue, Q_INDEX); | ||
111 | } | 100 | } |
112 | } | 101 | } |
113 | EXPORT_SYMBOL_GPL(rt2x00pci_rxdone); | 102 | EXPORT_SYMBOL_GPL(rt2x00pci_rxdone); |
114 | 103 | ||
115 | void rt2x00pci_txdone(struct rt2x00_dev *rt2x00dev, struct queue_entry *entry, | ||
116 | struct txdone_entry_desc *txdesc) | ||
117 | { | ||
118 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | ||
119 | enum data_queue_qid qid = skb_get_queue_mapping(entry->skb); | ||
120 | u32 word; | ||
121 | |||
122 | /* | ||
123 | * Unmap the skb. | ||
124 | */ | ||
125 | rt2x00queue_unmap_skb(rt2x00dev, entry->skb); | ||
126 | |||
127 | rt2x00lib_txdone(entry, txdesc); | ||
128 | |||
129 | /* | ||
130 | * Make this entry available for reuse. | ||
131 | */ | ||
132 | entry->flags = 0; | ||
133 | |||
134 | rt2x00_desc_read(entry_priv->desc, 0, &word); | ||
135 | rt2x00_set_field32(&word, TXD_ENTRY_OWNER_NIC, 0); | ||
136 | rt2x00_set_field32(&word, TXD_ENTRY_VALID, 0); | ||
137 | rt2x00_desc_write(entry_priv->desc, 0, word); | ||
138 | |||
139 | __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | ||
140 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | ||
141 | |||
142 | /* | ||
143 | * If the data queue was below the threshold before the txdone | ||
144 | * handler we must make sure the packet queue in the mac80211 stack | ||
145 | * is reenabled when the txdone handler has finished. | ||
146 | */ | ||
147 | if (!rt2x00queue_threshold(entry->queue)) | ||
148 | ieee80211_wake_queue(rt2x00dev->hw, qid); | ||
149 | |||
150 | } | ||
151 | EXPORT_SYMBOL_GPL(rt2x00pci_txdone); | ||
152 | |||
153 | /* | 104 | /* |
154 | * Device initialization handlers. | 105 | * Device initialization handlers. |
155 | */ | 106 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.h b/drivers/net/wireless/rt2x00/rt2x00pci.h index 7e5708dca731..50c6df4f81db 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.h +++ b/drivers/net/wireless/rt2x00/rt2x00pci.h | |||
@@ -115,15 +115,6 @@ struct queue_entry_priv_pci { | |||
115 | */ | 115 | */ |
116 | void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev); | 116 | void rt2x00pci_rxdone(struct rt2x00_dev *rt2x00dev); |
117 | 117 | ||
118 | /** | ||
119 | * rt2x00pci_txdone - Handle TX done events | ||
120 | * @rt2x00dev: Device pointer, see &struct rt2x00_dev. | ||
121 | * @entry: Entry which has completed the transmission of a frame. | ||
122 | * @desc: TX done descriptor | ||
123 | */ | ||
124 | void rt2x00pci_txdone(struct rt2x00_dev *rt2x00dev, struct queue_entry *entry, | ||
125 | struct txdone_entry_desc *desc); | ||
126 | |||
127 | /* | 118 | /* |
128 | * Device initialization handlers. | 119 | * Device initialization handlers. |
129 | */ | 120 | */ |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index 29d2b9128533..49d3bb84ab6b 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -77,7 +77,6 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct rt2x00_dev *rt2x00dev, | |||
77 | 77 | ||
78 | return skb; | 78 | return skb; |
79 | } | 79 | } |
80 | EXPORT_SYMBOL_GPL(rt2x00queue_alloc_rxskb); | ||
81 | 80 | ||
82 | void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | 81 | void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) |
83 | { | 82 | { |
@@ -105,7 +104,6 @@ void rt2x00queue_unmap_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | |||
105 | skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX; | 104 | skbdesc->flags &= ~SKBDESC_DMA_MAPPED_TX; |
106 | } | 105 | } |
107 | } | 106 | } |
108 | EXPORT_SYMBOL_GPL(rt2x00queue_unmap_skb); | ||
109 | 107 | ||
110 | void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | 108 | void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) |
111 | { | 109 | { |
@@ -123,7 +121,6 @@ void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) | |||
123 | 121 | ||
124 | dev_kfree_skb_any(skb); | 122 | dev_kfree_skb_any(skb); |
125 | } | 123 | } |
126 | EXPORT_SYMBOL_GPL(rt2x00queue_free_skb); | ||
127 | 124 | ||
128 | void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, | 125 | void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, |
129 | struct txentry_desc *txdesc) | 126 | struct txentry_desc *txdesc) |
@@ -289,6 +286,7 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
289 | { | 286 | { |
290 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); | 287 | struct queue_entry *entry = rt2x00queue_get_entry(queue, Q_INDEX); |
291 | struct txentry_desc txdesc; | 288 | struct txentry_desc txdesc; |
289 | struct skb_frame_desc *skbdesc; | ||
292 | 290 | ||
293 | if (unlikely(rt2x00queue_full(queue))) | 291 | if (unlikely(rt2x00queue_full(queue))) |
294 | return -EINVAL; | 292 | return -EINVAL; |
@@ -309,11 +307,21 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb) | |||
309 | entry->skb = skb; | 307 | entry->skb = skb; |
310 | rt2x00queue_create_tx_descriptor(entry, &txdesc); | 308 | rt2x00queue_create_tx_descriptor(entry, &txdesc); |
311 | 309 | ||
310 | /* | ||
311 | * skb->cb array is now ours and we are free to use it. | ||
312 | */ | ||
313 | skbdesc = get_skb_frame_desc(entry->skb); | ||
314 | memset(skbdesc, 0, sizeof(*skbdesc)); | ||
315 | skbdesc->entry = entry; | ||
316 | |||
312 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) { | 317 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) { |
313 | __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 318 | __clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
314 | return -EIO; | 319 | return -EIO; |
315 | } | 320 | } |
316 | 321 | ||
322 | if (test_bit(DRIVER_REQUIRE_DMA, &queue->rt2x00dev->flags)) | ||
323 | rt2x00queue_map_txskb(queue->rt2x00dev, skb); | ||
324 | |||
317 | __set_bit(ENTRY_DATA_PENDING, &entry->flags); | 325 | __set_bit(ENTRY_DATA_PENDING, &entry->flags); |
318 | 326 | ||
319 | rt2x00queue_index_inc(queue, Q_INDEX); | 327 | rt2x00queue_index_inc(queue, Q_INDEX); |
@@ -389,7 +397,6 @@ void rt2x00queue_index_inc(struct data_queue *queue, enum queue_index index) | |||
389 | 397 | ||
390 | spin_unlock_irqrestore(&queue->lock, irqflags); | 398 | spin_unlock_irqrestore(&queue->lock, irqflags); |
391 | } | 399 | } |
392 | EXPORT_SYMBOL_GPL(rt2x00queue_index_inc); | ||
393 | 400 | ||
394 | static void rt2x00queue_reset(struct data_queue *queue) | 401 | static void rt2x00queue_reset(struct data_queue *queue) |
395 | { | 402 | { |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.h b/drivers/net/wireless/rt2x00/rt2x00queue.h index 192b6e789a7f..14ce8d4e1397 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.h +++ b/drivers/net/wireless/rt2x00/rt2x00queue.h | |||
@@ -82,6 +82,8 @@ enum data_queue_qid { | |||
82 | /** | 82 | /** |
83 | * enum skb_frame_desc_flags: Flags for &struct skb_frame_desc | 83 | * enum skb_frame_desc_flags: Flags for &struct skb_frame_desc |
84 | * | 84 | * |
85 | * @SKBDESC_DMA_MAPPED_RX: &skb_dma field has been mapped for RX | ||
86 | * @SKBDESC_DMA_MAPPED_TX: &skb_dma field has been mapped for TX | ||
85 | */ | 87 | */ |
86 | enum skb_frame_desc_flags { | 88 | enum skb_frame_desc_flags { |
87 | SKBDESC_DMA_MAPPED_RX = (1 << 0), | 89 | SKBDESC_DMA_MAPPED_RX = (1 << 0), |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index 552f0e94f800..b94c461fbaf9 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -131,10 +131,9 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb) | |||
131 | struct queue_entry *entry = (struct queue_entry *)urb->context; | 131 | struct queue_entry *entry = (struct queue_entry *)urb->context; |
132 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 132 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
133 | struct txdone_entry_desc txdesc; | 133 | struct txdone_entry_desc txdesc; |
134 | enum data_queue_qid qid = skb_get_queue_mapping(entry->skb); | ||
135 | 134 | ||
136 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || | 135 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || |
137 | !__test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) | 136 | !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
138 | return; | 137 | return; |
139 | 138 | ||
140 | /* | 139 | /* |
@@ -158,20 +157,6 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb) | |||
158 | txdesc.retry = 0; | 157 | txdesc.retry = 0; |
159 | 158 | ||
160 | rt2x00lib_txdone(entry, &txdesc); | 159 | rt2x00lib_txdone(entry, &txdesc); |
161 | |||
162 | /* | ||
163 | * Make this entry available for reuse. | ||
164 | */ | ||
165 | entry->flags = 0; | ||
166 | rt2x00queue_index_inc(entry->queue, Q_INDEX_DONE); | ||
167 | |||
168 | /* | ||
169 | * If the data queue was below the threshold before the txdone | ||
170 | * handler we must make sure the packet queue in the mac80211 stack | ||
171 | * is reenabled when the txdone handler has finished. | ||
172 | */ | ||
173 | if (!rt2x00queue_threshold(entry->queue)) | ||
174 | ieee80211_wake_queue(rt2x00dev->hw, qid); | ||
175 | } | 160 | } |
176 | 161 | ||
177 | int rt2x00usb_write_tx_data(struct queue_entry *entry) | 162 | int rt2x00usb_write_tx_data(struct queue_entry *entry) |
@@ -193,10 +178,8 @@ int rt2x00usb_write_tx_data(struct queue_entry *entry) | |||
193 | * Fill in skb descriptor | 178 | * Fill in skb descriptor |
194 | */ | 179 | */ |
195 | skbdesc = get_skb_frame_desc(entry->skb); | 180 | skbdesc = get_skb_frame_desc(entry->skb); |
196 | memset(skbdesc, 0, sizeof(*skbdesc)); | ||
197 | skbdesc->desc = entry->skb->data; | 181 | skbdesc->desc = entry->skb->data; |
198 | skbdesc->desc_len = entry->queue->desc_size; | 182 | skbdesc->desc_len = entry->queue->desc_size; |
199 | skbdesc->entry = entry; | ||
200 | 183 | ||
201 | /* | 184 | /* |
202 | * USB devices cannot blindly pass the skb->len as the | 185 | * USB devices cannot blindly pass the skb->len as the |
@@ -270,7 +253,7 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
270 | u8 rxd[32]; | 253 | u8 rxd[32]; |
271 | 254 | ||
272 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || | 255 | if (!test_bit(DEVICE_ENABLED_RADIO, &rt2x00dev->flags) || |
273 | !test_and_clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) | 256 | !test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags)) |
274 | return; | 257 | return; |
275 | 258 | ||
276 | /* | 259 | /* |
@@ -278,8 +261,11 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
278 | * to be actually valid, or if the urb is signaling | 261 | * to be actually valid, or if the urb is signaling |
279 | * a problem. | 262 | * a problem. |
280 | */ | 263 | */ |
281 | if (urb->actual_length < entry->queue->desc_size || urb->status) | 264 | if (urb->actual_length < entry->queue->desc_size || urb->status) { |
282 | goto skip_entry; | 265 | __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
266 | usb_submit_urb(urb, GFP_ATOMIC); | ||
267 | return; | ||
268 | } | ||
283 | 269 | ||
284 | /* | 270 | /* |
285 | * Fill in desc fields of the skb descriptor | 271 | * Fill in desc fields of the skb descriptor |
@@ -291,20 +277,6 @@ static void rt2x00usb_interrupt_rxdone(struct urb *urb) | |||
291 | * Send the frame to rt2x00lib for further processing. | 277 | * Send the frame to rt2x00lib for further processing. |
292 | */ | 278 | */ |
293 | rt2x00lib_rxdone(rt2x00dev, entry); | 279 | rt2x00lib_rxdone(rt2x00dev, entry); |
294 | |||
295 | /* | ||
296 | * Reinitialize the urb. | ||
297 | */ | ||
298 | urb->transfer_buffer = entry->skb->data; | ||
299 | urb->transfer_buffer_length = entry->skb->len; | ||
300 | |||
301 | skip_entry: | ||
302 | if (test_bit(DEVICE_ENABLED_RADIO, &entry->queue->rt2x00dev->flags)) { | ||
303 | __set_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | ||
304 | usb_submit_urb(urb, GFP_ATOMIC); | ||
305 | } | ||
306 | |||
307 | rt2x00queue_index_inc(entry->queue, Q_INDEX); | ||
308 | } | 280 | } |
309 | 281 | ||
310 | /* | 282 | /* |
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index c9f6d4844139..bbf1048f6400 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1767,7 +1767,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) | |||
1767 | __set_bit(TXDONE_UNKNOWN, &txdesc.flags); | 1767 | __set_bit(TXDONE_UNKNOWN, &txdesc.flags); |
1768 | txdesc.retry = 0; | 1768 | txdesc.retry = 0; |
1769 | 1769 | ||
1770 | rt2x00pci_txdone(rt2x00dev, entry_done, &txdesc); | 1770 | rt2x00lib_txdone(entry_done, &txdesc); |
1771 | entry_done = rt2x00queue_get_entry(queue, Q_INDEX_DONE); | 1771 | entry_done = rt2x00queue_get_entry(queue, Q_INDEX_DONE); |
1772 | } | 1772 | } |
1773 | 1773 | ||
@@ -1787,7 +1787,7 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) | |||
1787 | } | 1787 | } |
1788 | txdesc.retry = rt2x00_get_field32(reg, STA_CSR4_RETRY_COUNT); | 1788 | txdesc.retry = rt2x00_get_field32(reg, STA_CSR4_RETRY_COUNT); |
1789 | 1789 | ||
1790 | rt2x00pci_txdone(rt2x00dev, entry, &txdesc); | 1790 | rt2x00lib_txdone(entry, &txdesc); |
1791 | } | 1791 | } |
1792 | } | 1792 | } |
1793 | 1793 | ||