summaryrefslogtreecommitdiffstats
path: root/drivers/net/thunderbolt.c
diff options
context:
space:
mode:
authorMika Westerberg <mika.westerberg@linux.intel.com>2017-11-09 11:46:28 +0100
committerDavid S. Miller <davem@davemloft.net>2017-11-11 11:20:45 +0100
commit86dabda426ac33f4782854ef71f0c9adafd24134 (patch)
treea6817b43e719f5a98ba7dde137df8d0a89e903f8 /drivers/net/thunderbolt.c
parentsock: Remove the global prot_inuse counter. (diff)
downloadlinux-86dabda426ac33f4782854ef71f0c9adafd24134.tar.xz
linux-86dabda426ac33f4782854ef71f0c9adafd24134.zip
net: thunderbolt: Clear finished Tx frame bus address in tbnet_tx_callback()
When Thunderbolt network interface is disabled or when the cable is unplugged the driver releases all allocated buffers by calling tbnet_free_buffers() for each ring. This function then calls dma_unmap_page() for each buffer it finds where bus address is non-zero. Now, we only clear this bus address when the Tx buffer is sent to the hardware so it is possible that the function finds an entry that has already been unmapped. Enabling DMA-API debugging catches this as well: thunderbolt 0000:06:00.0: DMA-API: device driver tries to free DMA memory it has not allocated [device address=0x0000000068321000] [size=4096 bytes] Fix this by clearing the bus address of a Tx frame right after we have unmapped the buffer. Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/thunderbolt.c')
-rw-r--r--drivers/net/thunderbolt.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/net/thunderbolt.c b/drivers/net/thunderbolt.c
index 435854688a7a..228d4aa6d9ae 100644
--- a/drivers/net/thunderbolt.c
+++ b/drivers/net/thunderbolt.c
@@ -536,6 +536,7 @@ static void tbnet_tx_callback(struct tb_ring *ring, struct ring_frame *frame,
dma_unmap_page(dma_dev, tf->frame.buffer_phy, tbnet_frame_size(tf),
DMA_TO_DEVICE);
+ tf->frame.buffer_phy = 0;
/* Return buffer to the ring */
net->tx_ring.prod++;