From: Lorenzo Bianconi lorenzo@kernel.org
[ 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 | 13 +++++++++++++ 1 file changed, 13 insertions(+)
--- a/drivers/net/ethernet/marvell/mvneta.c +++ b/drivers/net/ethernet/marvell/mvneta.c @@ -418,11 +418,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; @@ -2066,6 +2072,9 @@ mvneta_xdp_xmit(struct net_device *dev, int i, drops = 0; u32 ret;
+ if (unlikely(test_bit(__MVNETA_DOWN, &pp->state))) + return -ENETDOWN; + if (unlikely(flags & ~XDP_XMIT_FLAGS_MASK)) return -EINVAL;
@@ -3489,12 +3498,16 @@ static void mvneta_start_dev(struct mvne
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) {