aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rt2x00/rt2x00queue.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
-rw-r--r--drivers/net/wireless/rt2x00/rt2x00queue.c15
1 files changed, 11 insertions, 4 deletions
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}
80EXPORT_SYMBOL_GPL(rt2x00queue_alloc_rxskb);
81 80
82void rt2x00queue_map_txskb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) 81void 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}
108EXPORT_SYMBOL_GPL(rt2x00queue_unmap_skb);
109 107
110void rt2x00queue_free_skb(struct rt2x00_dev *rt2x00dev, struct sk_buff *skb) 108void 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}
126EXPORT_SYMBOL_GPL(rt2x00queue_free_skb);
127 124
128void rt2x00queue_create_tx_descriptor(struct queue_entry *entry, 125void 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}
392EXPORT_SYMBOL_GPL(rt2x00queue_index_inc);
393 400
394static void rt2x00queue_reset(struct data_queue *queue) 401static void rt2x00queue_reset(struct data_queue *queue)
395{ 402{