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 f35d85a71bbc..e26ec9d817cf 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
@@ -545,8 +556,9 @@ static int rt2x00queue_write_tx_data(struct queue_entry *entry,
545 /* 556 /*
546 * Map the skb to DMA. 557 * Map the skb to DMA.
547 */ 558 */
548 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags)) 559 if (test_bit(REQUIRE_DMA, &rt2x00dev->cap_flags) &&
549 rt2x00queue_map_txskb(entry); 560 rt2x00queue_map_txskb(entry))
561 return -ENOMEM;
550 562
551 return 0; 563 return 0;
552} 564}