diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-01-08 08:55:23 -0500 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2012-02-09 10:37:52 -0500 |
commit | 22f0bf96de1506081a8b18ad3e0d04d5add70a4a (patch) | |
tree | a134b18946ff85a076bb7420945231ebeed62952 /drivers/net | |
parent | 15877e9c8a12ced38ac31d8bf4f93f3634fbea3f (diff) |
NET: sa11x0-ir: handle DMA mapping errors properly
Handle DMA mapping errors in the rx skb allocation and tx paths.
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/irda/sa1100_ir.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c index 751f2a9f283b..84fecce078f6 100644 --- a/drivers/net/irda/sa1100_ir.c +++ b/drivers/net/irda/sa1100_ir.c | |||
@@ -82,7 +82,6 @@ static int sa1100_irda_rx_alloc(struct sa1100_irda *si) | |||
82 | return 0; | 82 | return 0; |
83 | 83 | ||
84 | si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC); | 84 | si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC); |
85 | |||
86 | if (!si->rxskb) { | 85 | if (!si->rxskb) { |
87 | printk(KERN_ERR "sa1100_ir: out of memory for RX SKB\n"); | 86 | printk(KERN_ERR "sa1100_ir: out of memory for RX SKB\n"); |
88 | return -ENOMEM; | 87 | return -ENOMEM; |
@@ -97,6 +96,11 @@ static int sa1100_irda_rx_alloc(struct sa1100_irda *si) | |||
97 | si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data, | 96 | si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data, |
98 | HPSIR_MAX_RXLEN, | 97 | HPSIR_MAX_RXLEN, |
99 | DMA_FROM_DEVICE); | 98 | DMA_FROM_DEVICE); |
99 | if (dma_mapping_error(si->dev, si->rxbuf_dma)) { | ||
100 | dev_kfree_skb_any(si->rxskb); | ||
101 | return -ENOMEM; | ||
102 | } | ||
103 | |||
100 | return 0; | 104 | return 0; |
101 | } | 105 | } |
102 | 106 | ||
@@ -518,7 +522,8 @@ static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev | |||
518 | netif_rx(skb); | 522 | netif_rx(skb); |
519 | } else { | 523 | } else { |
520 | /* | 524 | /* |
521 | * Remap the buffer. | 525 | * Remap the buffer - it was previously mapped, and we |
526 | * hope that this succeeds. | ||
522 | */ | 527 | */ |
523 | si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data, | 528 | si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data, |
524 | HPSIR_MAX_RXLEN, | 529 | HPSIR_MAX_RXLEN, |
@@ -701,6 +706,13 @@ static int sa1100_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev) | |||
701 | si->txskb = skb; | 706 | si->txskb = skb; |
702 | si->txbuf_dma = dma_map_single(si->dev, skb->data, | 707 | si->txbuf_dma = dma_map_single(si->dev, skb->data, |
703 | skb->len, DMA_TO_DEVICE); | 708 | skb->len, DMA_TO_DEVICE); |
709 | if (dma_mapping_error(si->dev, si->txbuf_dma)) { | ||
710 | si->txskb = NULL; | ||
711 | netif_wake_queue(dev); | ||
712 | dev->stats.tx_dropped++; | ||
713 | dev_kfree_skb(skb); | ||
714 | return NETDEV_TX_OK; | ||
715 | } | ||
704 | 716 | ||
705 | sa1100_start_dma(si->txdma, si->txbuf_dma, skb->len); | 717 | sa1100_start_dma(si->txdma, si->txbuf_dma, skb->len); |
706 | 718 | ||