1 From a2fe37b69d4fe369c284d50927193fed81c238a0 Mon Sep 17 00:00:00 2001
2 From: Fabio Estevam <fabio.estevam@freescale.com>
3 Date: Fri, 13 Mar 2015 14:07:54 -0300
4 Subject: [PATCH] Revert "net: fec: fix the warning found by dma debug"
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
9 This reverts commit 2b995f63987013bacde99168218f9c7b252bdcf1.
11 Панов Андрей reported the following regression:
13 "Commit 2b995f63987013bacde99168218f9c7b252bdcf1 in 4.0.0-rc3 introduces a
14 nasty bug in transmit, corrupting packets.
18 $ dd if=/dev/zero of=zeros bs=1M count=20
20 8f4e33f3dc3e414ff94e5fb6905cba8c *zeros
22 This checksum is correct.
24 Copy file "zeros" to another host with NFS, and it gets corrupted, checksum is
26 File should be big, small amounts of transmit isn't affected.
28 I use an i.MX6 Quad board.
30 If this commit is reverted, all works fine."
32 Reported-by: Панов Андрей <rockford@yandex.ru>
33 Signed-off-by: Fabio Estevam <fabio.estevam@freescale.com>
34 Signed-off-by: David S. Miller <davem@davemloft.net>
36 drivers/net/ethernet/freescale/fec_main.c | 34 ++++++++++---------------------
37 1 file changed, 11 insertions(+), 23 deletions(-)
39 diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
40 index 787db50..78e1ce0 100644
41 --- a/drivers/net/ethernet/freescale/fec_main.c
42 +++ b/drivers/net/ethernet/freescale/fec_main.c
43 @@ -1189,13 +1189,12 @@ static void
44 fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
46 struct fec_enet_private *fep;
47 - struct bufdesc *bdp, *bdp_t;
48 + struct bufdesc *bdp;
49 unsigned short status;
51 struct fec_enet_priv_tx_q *txq;
52 struct netdev_queue *nq;
57 fep = netdev_priv(ndev);
58 @@ -1216,29 +1215,18 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id)
59 if (bdp == txq->cur_tx)
64 - index = fec_enet_get_bd_index(txq->tx_bd_base, bdp_t, fep);
65 - skb = txq->tx_skbuff[index];
67 - bdp_t = fec_enet_get_nextdesc(bdp_t, fep, queue_id);
68 - index = fec_enet_get_bd_index(txq->tx_bd_base, bdp_t, fep);
69 - skb = txq->tx_skbuff[index];
72 - if (skb_shinfo(skb)->nr_frags &&
73 - (status = bdp_t->cbd_sc) & BD_ENET_TX_READY)
75 + index = fec_enet_get_bd_index(txq->tx_bd_base, bdp, fep);
77 - for (i = 0; i < bdnum; i++) {
78 - if (!IS_TSO_HEADER(txq, bdp->cbd_bufaddr))
79 - dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr,
80 - bdp->cbd_datlen, DMA_TO_DEVICE);
81 - bdp->cbd_bufaddr = 0;
83 - bdp = fec_enet_get_nextdesc(bdp, fep, queue_id);
85 + skb = txq->tx_skbuff[index];
86 txq->tx_skbuff[index] = NULL;
87 + if (!IS_TSO_HEADER(txq, bdp->cbd_bufaddr))
88 + dma_unmap_single(&fep->pdev->dev, bdp->cbd_bufaddr,
89 + bdp->cbd_datlen, DMA_TO_DEVICE);
90 + bdp->cbd_bufaddr = 0;
92 + bdp = fec_enet_get_nextdesc(bdp, fep, queue_id);
96 /* Check for errors. */
97 if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC |