diff options
Diffstat (limited to 'drivers/net/wireless/rt2x00/rt2x00queue.c')
-rw-r--r-- | drivers/net/wireless/rt2x00/rt2x00queue.c | 26 |
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 | ||
100 | void rt2x00queue_map_txskb(struct queue_entry *entry) | 106 | int 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 | } |
109 | EXPORT_SYMBOL_GPL(rt2x00queue_map_txskb); | 120 | EXPORT_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 | } |