]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: mvneta: do not redirect frames during reconfiguration
authorLorenzo Bianconi <lorenzo@kernel.org>
Mon, 8 Jun 2020 22:02:39 +0000 (00:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Jun 2020 14:42:57 +0000 (16:42 +0200)
[ Upstream commit 62a502cc91f97e3ffd312d9b42e8d01a137c63ff ]

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/marvell/mvneta.c

index 51889770958d841f93c130e045fc10eca45c6cbc..43b44a1e8f69e6293e7cff677851ac7423212f6c 100644 (file)
@@ -451,11 +451,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;
@@ -2112,6 +2118,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;
 
@@ -3562,12 +3571,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) {