Commit cb415d30 authored by Paolo Galtieri's avatar Paolo Galtieri Committed by Jeff Garzik

[PATCH] mv643xx_eth: Fix dma_map/dma_unmap relations

If you do a dma_map_single you must do dma_unmap_single and if you do
a dma_map_page you must do a dma_unmap_page.
Signed-off-by: default avatarPaolo Galtieri <pgaltieri@mvista.com>
Signed-off-by: default avatarDale Farnsworth <dale@farnsworth.org>

 mv643xx_eth.c |   51 +++++++++++++++++++++------------------------------
 1 file changed, 21 insertions(+), 30 deletions(-)
Signed-off-by: default avatarJeff Garzik <jgarzik@pobox.com>
parent 78a5e534
...@@ -353,27 +353,19 @@ static int mv643xx_eth_free_tx_queue(struct net_device *dev, ...@@ -353,27 +353,19 @@ static int mv643xx_eth_free_tx_queue(struct net_device *dev,
stats->tx_errors++; stats->tx_errors++;
} }
/* if (pkt_info.cmd_sts & ETH_TX_FIRST_DESC)
* If return_info is different than 0, release the skb. dma_unmap_single(NULL, pkt_info.buf_ptr,
* The case where return_info is not 0 is only in case
* when transmitted a scatter/gather packet, where only
* last skb releases the whole chain.
*/
if (pkt_info.return_info) {
if (skb_shinfo(pkt_info.return_info)->nr_frags)
dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, pkt_info.byte_cnt,
DMA_TO_DEVICE); DMA_TO_DEVICE);
else else
dma_unmap_single(NULL, pkt_info.buf_ptr, dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, pkt_info.byte_cnt,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (pkt_info.return_info) {
dev_kfree_skb_irq(pkt_info.return_info); dev_kfree_skb_irq(pkt_info.return_info);
released = 0; released = 0;
} else }
dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, DMA_TO_DEVICE);
} }
spin_unlock(&mp->lock); spin_unlock(&mp->lock);
...@@ -1024,20 +1016,17 @@ static void mv643xx_tx(struct net_device *dev) ...@@ -1024,20 +1016,17 @@ static void mv643xx_tx(struct net_device *dev)
struct pkt_info pkt_info; struct pkt_info pkt_info;
while (eth_tx_return_desc(mp, &pkt_info) == ETH_OK) { while (eth_tx_return_desc(mp, &pkt_info) == ETH_OK) {
if (pkt_info.return_info) { if (pkt_info.cmd_sts & ETH_TX_FIRST_DESC)
if (skb_shinfo(pkt_info.return_info)->nr_frags) dma_unmap_single(NULL, pkt_info.buf_ptr,
dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, pkt_info.byte_cnt,
DMA_TO_DEVICE); DMA_TO_DEVICE);
else else
dma_unmap_single(NULL, pkt_info.buf_ptr, dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, pkt_info.byte_cnt,
DMA_TO_DEVICE); DMA_TO_DEVICE);
if (pkt_info.return_info)
dev_kfree_skb_irq(pkt_info.return_info); dev_kfree_skb_irq(pkt_info.return_info);
} else
dma_unmap_page(NULL, pkt_info.buf_ptr,
pkt_info.byte_cnt, DMA_TO_DEVICE);
} }
if (netif_queue_stopped(dev) && if (netif_queue_stopped(dev) &&
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment