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.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c
index 9503e6954b89..4d91795dc6a2 100644
--- a/drivers/net/wireless/rt2x00/rt2x00queue.c
+++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
@@ -87,24 +87,35 @@ struct sk_buff *rt2x00queue_alloc_rxskb(struct queue_entry *entry, gfp_t gfp)
87 skbdesc->entry = entry; 87 skbdesc->entry = entry;
88 88
89 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags)) { 89 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags)) {
90 skbdesc->skb_dma = dma_map_single(rt2x00dev->dev, 90 dma_addr_t skb_dma;
91 skb->data, 91
92 skb->len, 92 skb_dma = dma_map_single(rt2x00dev->dev, skb->data, skb->len,
93 DMA_FROM_DEVICE); 93 DMA_FROM_DEVICE);
94 if (unlikely(dma_mapping_error(rt2x00dev->dev, skb_dma))) {
95 dev_kfree_skb_any(skb);
96 return NULL;
97 }
98
99 skbdesc->skb_dma = skb_dma;
94 skbdesc->flags |= SKBDESC_DMA_MAPPED_RX; 100 skbdesc->flags |= SKBDESC_DMA_MAPPED_RX;
95 } 101 }
96 102
97 return skb; 103 return skb;
98} 104}
99 105
100void rt2x00queue_map_txskb(struct queue_entry *entry) 106int rt2x00queue_map_txskb(struct queue_entry *entry)
101{ 107{
102 struct device *dev = entry->queue->rt2x00dev->dev; 108 struct device *dev = entry->queue->rt2x00dev->dev;
103 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb); 109 struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
104 110
105 skbdesc->skb_dma = 111 skbdesc->skb_dma =
106 dma_map_single(dev, entry->skb->data, entry->skb->len, DMA_TO_DEVICE); 112 dma_map_single(dev, entry->skb->data, entry->skb->len, DMA_TO_DEVICE);
113
114 if (unlikely(dma_mapping_error(dev, skbdesc->skb_dma)))
115 return -ENOMEM;
116
107 skbdesc->flags |= SKBDESC_DMA_MAPPED_TX; 117 skbdesc->flags |= SKBDESC_DMA_MAPPED_TX;
118 return 0;
108} 119}
109EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb); 120EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb);
110 121
@@ -542,8 +553,9 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,
542 /* 553 /*
543 * Map the skb to DMA. 554 * Map the skb to DMA.
544 */ 555 */
545 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags)) 556 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags) &&
546 rt2x00queue_map_txskb(entry); 557 rt2x00queue_map_txskb(entry))
558 return -ENOMEM;
547 559
548 return 0; 560 return 0;
549} 561}