[PATCH 07/11] sungem: fix DMA sync_single length error

Stephen Hemminger
2010-01-20T21:22:56Z

[-- Attachment #1: sungem.patch --]
[-- Type: text/plain, Size: 947 bytes --]

The DMA api requires that the full mapping be sync'd when
copying frame. First found by Jarek on sky2.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>

--- a/drivers/net/sungem.c 2010-01-20 11:43:58.779387706 -0800
+++ b/drivers/net/sungem.c 2010-01-20 11:52:50.398529616 -0800
@@ -847,9 +847,13 @@ static int gem_rx(struct gem *gp, int wo

skb_reserve(copy_skb, 2);
skb_put(copy_skb, len);
- pci_dma_sync_single_for_cpu(gp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
+ pci_dma_sync_single_for_cpu(gp->pdev, dma_addr,
+ RX_BUF_ALLOC_SIZE(gp),
+ PCI_DMA_FROMDEVICE);
skb_copy_from_linear_data(skb, copy_skb->data, len);
- pci_dma_sync_single_for_device(gp->pdev, dma_addr, len, PCI_DMA_FROMDEVICE);
+ pci_dma_sync_single_for_device(gp->pdev, dma_addr,
+ RX_BUF_ALLOC_SIZE(gp),
+ PCI_DMA_FROMDEVICE);

/* We'll reuse the original ring buffer. */
skb = copy_skb;

--