diff options
author | Fugang Duan <B38611@freescale.com> | 2011-12-21 18:32:11 +0800 |
---|---|---|
committer | Jason Liu <r64343@freescale.com> | 2012-01-09 21:12:46 +0800 |
commit | 0ac65a0cbb15018b66df7ee3db6d6c9b52f338b6 (patch) | |
tree | 11f78f3a590563dffb1376edac1d3fc662315ab2 /drivers/net/fec.c | |
parent | 9dc5cfd1be31a9e4fc00ef0b4c907ec117a9ab81 (diff) |
ENGR00170784 - FEC : dma skb buffer map is not used rightly.
Enable "CONFIG_DMA_API_DEBUG" in kernel, and system print:
DMA-API: device driver tries to free DMA memory it has not
allocated [device address=0x0000000046688020]...[<80222494>]
(debug_dma_unmap_page+0x8c/0x98) from [<802a36a0>]
(fec_enet_interrupt+0x430/0x5ac)
Correct the usage of "dma_map_single" function.
Signed-off-by: Fugang Duan <B38611@freescale.com>
Diffstat (limited to 'drivers/net/fec.c')
-rwxr-xr-x | drivers/net/fec.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index b56a623875d2..c3cb63799c73 100755 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c @@ -401,7 +401,8 @@ fec_enet_tx(struct net_device *ndev) if (bdp == fep->cur_tx && fep->tx_full == 0) break; - dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr, + if (bdp->cbd_bufaddr) + dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr, FEC_ENET_TX_FRSIZE, DMA_TO_DEVICE); bdp->cbd_bufaddr = 0; @@ -542,7 +543,8 @@ fec_enet_rx(struct net_device *ndev) ndev->stats.rx_bytes += pkt_len; data = (__u8*)__va(bdp->cbd_bufaddr); - dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr, + if (bdp->cbd_bufaddr) + dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr, FEC_ENET_TX_FRSIZE, DMA_FROM_DEVICE); if (id_entry->driver_data & FEC_QUIRK_SWAP_FRAME) @@ -1089,7 +1091,6 @@ fec_enet_open(struct net_device *ndev) /* I should reset the ring buffers here, but I don't yet know * a simple way to do that. */ - if (!clk_get_usecount(fep->clk)) clk_enable(fep->clk); ret = fec_enet_alloc_buffers(ndev); @@ -1290,6 +1291,7 @@ static int fec_enet_init(struct net_device *ndev) /* Initialize the BD for every fragment in the page. */ bdp->cbd_sc = 0; + bdp->cbd_bufaddr = 0; bdp++; } |