From: Fugang Duan <fugang.d...@nxp.com> Sent: Friday, December 22, 2017 5:12 PM >The enet IP only support 32 bit, it will use swiotlb buffer to do dma mapping >when xmit buffer DMA memory address is bigger than 4G in i.MX platform. >After stress suspend/resume test, it will print out: > >log: >[12826.352864] fec 5b040000.ethernet: swiotlb buffer is full (sz: 191 bytes) >[12826.359676] DMA: Out of SW-IOMMU space for 191 bytes at device >5b040000.ethernet [12826.367110] fec 5b040000.ethernet eth0: Tx DMA >memory map failed > >The issue is that the ready xmit buffers that are dma mapped but DMA still >don't copy them into fifo, once MAC restart, these DMA buffers are not >unmapped. >So it should check the dma mapping buffer and unmap them. > >Signed-off-by: Fugang Duan <fugang.d...@nxp.com> >--- Hi David,
The patch pass two days long time suspend/resume test. Pls apply it to net tree and stable tree. Thanks. > drivers/net/ethernet/freescale/fec_main.c | 6 ++++++ > 1 file changed, 6 insertions(+) > >diff --git a/drivers/net/ethernet/freescale/fec_main.c >b/drivers/net/ethernet/freescale/fec_main.c >index 2d1b065..e17d10b 100644 >--- a/drivers/net/ethernet/freescale/fec_main.c >+++ b/drivers/net/ethernet/freescale/fec_main.c >@@ -818,6 +818,12 @@ static void fec_enet_bd_init(struct net_device *dev) > for (i = 0; i < txq->bd.ring_size; i++) { > /* Initialize the BD for every fragment in the page. */ > bdp->cbd_sc = cpu_to_fec16(0); >+ if (bdp->cbd_bufaddr && >+ !IS_TSO_HEADER(txq, fec32_to_cpu(bdp- >>cbd_bufaddr))) >+ dma_unmap_single(&fep->pdev->dev, >+ fec32_to_cpu(bdp- >>cbd_bufaddr), >+ fec16_to_cpu(bdp- >>cbd_datlen), >+ DMA_TO_DEVICE); > if (txq->tx_skbuff[i]) { > dev_kfree_skb_any(txq->tx_skbuff[i]); > txq->tx_skbuff[i] = NULL; >-- >1.9.1