diff options
author | Troy Kisky <troy.kisky@boundarydevices.com> | 2016-05-27 16:30:40 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-05-31 14:57:42 -0400 |
commit | 7fafe803749a0c238feb5d38cb4ddee53eca5aa0 (patch) | |
tree | c68eefd3ef61022c2f23498fd8c5aebf7e424c3d /drivers/net/ethernet | |
parent | 308453aa9156a3b8ee382c0949befb507a32b0c1 (diff) |
net: fec: update dirty_tx even if no skb
If dirty_tx isn't updated, then dma_unmap_single
can be called twice.
This fixes a
[ 58.420980] ------------[ cut here ]------------
[ 58.425667] WARNING: CPU: 0 PID: 377 at /home/schurig/d/mkarm/linux-4.5/lib/dma-debug.c:1096 check_unmap+0x9d0/0xab8()
[ 58.436405] fec 2188000.ethernet: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x0000000000000000] [size=66 bytes]
encountered by Holger
Signed-off-by: Troy Kisky <troy.kisky@boundarydevices.com>
Tested-by: <holgerschurig@gmail.com>
Acked-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet')
-rw-r--r-- | drivers/net/ethernet/freescale/fec_main.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index ca2cccc594fd..3c0255e98535 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c | |||
@@ -1197,10 +1197,8 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id) | |||
1197 | fec16_to_cpu(bdp->cbd_datlen), | 1197 | fec16_to_cpu(bdp->cbd_datlen), |
1198 | DMA_TO_DEVICE); | 1198 | DMA_TO_DEVICE); |
1199 | bdp->cbd_bufaddr = cpu_to_fec32(0); | 1199 | bdp->cbd_bufaddr = cpu_to_fec32(0); |
1200 | if (!skb) { | 1200 | if (!skb) |
1201 | bdp = fec_enet_get_nextdesc(bdp, &txq->bd); | 1201 | goto skb_done; |
1202 | continue; | ||
1203 | } | ||
1204 | 1202 | ||
1205 | /* Check for errors. */ | 1203 | /* Check for errors. */ |
1206 | if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | | 1204 | if (status & (BD_ENET_TX_HB | BD_ENET_TX_LC | |
@@ -1239,7 +1237,7 @@ fec_enet_tx_queue(struct net_device *ndev, u16 queue_id) | |||
1239 | 1237 | ||
1240 | /* Free the sk buffer associated with this last transmit */ | 1238 | /* Free the sk buffer associated with this last transmit */ |
1241 | dev_kfree_skb_any(skb); | 1239 | dev_kfree_skb_any(skb); |
1242 | 1240 | skb_done: | |
1243 | /* Make sure the update to bdp and tx_skbuff are performed | 1241 | /* Make sure the update to bdp and tx_skbuff are performed |
1244 | * before dirty_tx | 1242 | * before dirty_tx |
1245 | */ | 1243 | */ |