net: mvneta: do not redirect frames during reconfiguration
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 8 Jun 2020 22:02:39 +0000 (00:02 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Jun 2020 21:29:15 +0000 (14:29 -0700)
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 <lorenzo@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvneta.c

index 4cc9abd..946925b 100644 (file)
@@ -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) {