aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
diff options
context:
space:
mode:
authorAlexander Sverdlin <alexander.sverdlin@nokia.com>2020-05-29 14:17:10 +0200
committerDavid S. Miller <davem@davemloft.net>2020-06-01 11:45:20 -0700
commit0c34bb598c510e070160029f34efeeb217000f8d (patch)
tree3c8e9ee992e7873cce8fe19c86fede79d03a30da /drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
parentMerge branch 'fix-indirect-flow_block-infrastructure' (diff)
downloadlinux-dev-0c34bb598c510e070160029f34efeeb217000f8d.tar.xz
linux-dev-0c34bb598c510e070160029f34efeeb217000f8d.zip
net: octeon: mgmt: Repair filling of RX ring
The removal of mips_swiotlb_ops exposed a problem in octeon_mgmt Ethernet driver. mips_swiotlb_ops had an mb() after most of the operations and the removal of the ops had broken the receive functionality of the driver. My code inspection has shown no other places except octeon_mgmt_rx_fill_ring() where an explicit barrier would be obviously missing. The latter function however has to make sure that "ringing the bell" doesn't happen before RX ring entry is really written. The patch has been successfully tested on Octeon II. Fixes: a999933db9ed ("MIPS: remove mips_swiotlb_ops") Cc: stable@vger.kernel.org Signed-off-by: Alexander Sverdlin <alexander.sverdlin@nokia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/cavium/octeon/octeon_mgmt.c')
-rw-r--r--drivers/net/ethernet/cavium/octeon/octeon_mgmt.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
index 9d868403d86c..cbaa1924afbe 100644
--- a/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
+++ b/drivers/net/ethernet/cavium/octeon/octeon_mgmt.c
@@ -234,6 +234,11 @@ static void octeon_mgmt_rx_fill_ring(struct net_device *netdev)
/* Put it in the ring. */
p->rx_ring[p->rx_next_fill] = re.d64;
+ /* Make sure there is no reorder of filling the ring and ringing
+ * the bell
+ */
+ wmb();
+
dma_sync_single_for_device(p->dev, p->rx_ring_handle,
ring_size_to_bytes(OCTEON_MGMT_RX_RING_SIZE),
DMA_BIDIRECTIONAL);