Disable frames injection in mvneta_xdp_xmit routine during hw
re-configuration in order to avoid hardware hangs

Fixes: b0a43db9087a ("net: mvneta: add XDP_TX support")
Signed-off-by: Lorenzo Bianconi <lore...@kernel.org>
---
 drivers/net/ethernet/marvell/mvneta.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/net/ethernet/marvell/mvneta.c 
b/drivers/net/ethernet/marvell/mvneta.c
index 4cc9abd61c43..946925bbcb2d 100644
--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -452,11 +452,17 @@ struct mvneta_pcpu_port {
        u32                     cause_rx_tx;
 };
 
+enum {
+       __MVNETA_DOWN,
+};
+
 struct mvneta_port {
        u8 id;
        struct mvneta_pcpu_port __percpu        *ports;
        struct mvneta_pcpu_stats __percpu       *stats;
 
+       unsigned long state;
+
        int pkt_size;
        void __iomem *base;
        struct mvneta_rx_queue *rxqs;
@@ -2113,6 +2119,9 @@ mvneta_xdp_xmit(struct net_device *dev, int num_frame,
        struct netdev_queue *nq;
        u32 ret;
 
+       if (unlikely(test_bit(__MVNETA_DOWN, &pp->state)))
+               return -ENETDOWN;
+
        if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK))
                return -EINVAL;
 
@@ -3568,12 +3577,16 @@ static void mvneta_start_dev(struct mvneta_port *pp)
 
        phylink_start(pp->phylink);
        netif_tx_start_all_queues(pp->dev);
+
+       clear_bit(__MVNETA_DOWN, &pp->state);
 }
 
 static void mvneta_stop_dev(struct mvneta_port *pp)
 {
        unsigned int cpu;
 
+       set_bit(__MVNETA_DOWN, &pp->state);
+
        phylink_stop(pp->phylink);
 
        if (!pp->neta_armada3700) {
-- 
2.26.2

Reply via email to