aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/irda
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2012-01-08 08:55:23 -0500
committerRussell King <rmk+kernel@arm.linux.org.uk>2012-02-09 10:37:52 -0500
commit22f0bf96de1506081a8b18ad3e0d04d5add70a4a (patch)
treea134b18946ff85a076bb7420945231ebeed62952 /drivers/net/irda
parent15877e9c8a12ced38ac31d8bf4f93f3634fbea3f (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/irda')
-rw-r--r--drivers/net/irda/sa1100_ir.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/net/irda/sa1100_ir.c b/drivers/net/irda/sa1100_ir.c
index 751f2a9f283..84fecce078f 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