Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 22f0bf96 authored by Russell King's avatar Russell King
Browse files

NET: sa11x0-ir: handle DMA mapping errors properly



Handle DMA mapping errors in the rx skb allocation and tx paths.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 15877e9c
Loading
Loading
Loading
Loading
+14 −2
Original line number Original line Diff line number Diff line
@@ -82,7 +82,6 @@ static int sa1100_irda_rx_alloc(struct sa1100_irda *si)
		return 0;
		return 0;


	si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC);
	si->rxskb = alloc_skb(HPSIR_MAX_RXLEN + 1, GFP_ATOMIC);

	if (!si->rxskb) {
	if (!si->rxskb) {
		printk(KERN_ERR "sa1100_ir: out of memory for RX SKB\n");
		printk(KERN_ERR "sa1100_ir: out of memory for RX SKB\n");
		return -ENOMEM;
		return -ENOMEM;
@@ -97,6 +96,11 @@ static int sa1100_irda_rx_alloc(struct sa1100_irda *si)
	si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data,
	si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data,
					HPSIR_MAX_RXLEN,
					HPSIR_MAX_RXLEN,
					DMA_FROM_DEVICE);
					DMA_FROM_DEVICE);
	if (dma_mapping_error(si->dev, si->rxbuf_dma)) {
		dev_kfree_skb_any(si->rxskb);
		return -ENOMEM;
	}

	return 0;
	return 0;
}
}


@@ -518,7 +522,8 @@ static void sa1100_irda_fir_error(struct sa1100_irda *si, struct net_device *dev
		netif_rx(skb);
		netif_rx(skb);
	} else {
	} else {
		/*
		/*
		 * Remap the buffer.
		 * Remap the buffer - it was previously mapped, and we
		 * hope that this succeeds.
		 */
		 */
		si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data,
		si->rxbuf_dma = dma_map_single(si->dev, si->rxskb->data,
						HPSIR_MAX_RXLEN,
						HPSIR_MAX_RXLEN,
@@ -701,6 +706,13 @@ static int sa1100_irda_hard_xmit(struct sk_buff *skb, struct net_device *dev)
		si->txskb = skb;
		si->txskb = skb;
		si->txbuf_dma = dma_map_single(si->dev, skb->data,
		si->txbuf_dma = dma_map_single(si->dev, skb->data,
					 skb->len, DMA_TO_DEVICE);
					 skb->len, DMA_TO_DEVICE);
		if (dma_mapping_error(si->dev, si->txbuf_dma)) {
			si->txskb = NULL;
			netif_wake_queue(dev);
			dev->stats.tx_dropped++;
			dev_kfree_skb(skb);
			return NETDEV_TX_OK;
		}


		sa1100_start_dma(si->txdma, si->txbuf_dma, skb->len);
		sa1100_start_dma(si->txdma, si->txbuf_dma, skb->len);