<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 44efc78d0e464ce70b45b165c005f8bedc17952e Mon Sep 17 00:00:00 2001
From: Lorenzo Bianconi &lt;lorenzo@kernel.org&gt;
Date: Wed, 29 Jan 2020 12:50:53 +0100
Subject: [PATCH] net: mvneta: fix XDP support if sw bm is used as fallback

In order to fix XDP support if sw buffer management is used as fallback
for hw bm devices, define MVNETA_SKB_HEADROOM as maximum between
XDP_PACKET_HEADROOM and NET_SKB_PAD and let the hw aligns the IP header
to 4-byte boundary.
Fix rx_offset_correction initialization if mvneta_bm_port_init fails in
mvneta_resume routine

Fixes: 0db51da7a8e9 ("net: mvneta: add basic XDP support")
Tested-by: Sven Auhagen &lt;sven.auhagen@voleatech.de&gt;
Signed-off-by: Lorenzo Bianconi &lt;lorenzo@kernel.org&gt;
Signed-off-by: David S. Miller &lt;davem@davemloft.net&gt;
---
 drivers/net/ethernet/marvell/mvneta.c | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

--- a/drivers/net/ethernet/marvell/mvneta.c
+++ b/drivers/net/ethernet/marvell/mvneta.c
@@ -326,8 +326,7 @@
 	      ETH_HLEN + ETH_FCS_LEN,			     \
 	      cache_line_size())
 
-#define MVNETA_SKB_HEADROOM	(max(XDP_PACKET_HEADROOM, NET_SKB_PAD) + \
-				 NET_IP_ALIGN)
+#define MVNETA_SKB_HEADROOM	max(XDP_PACKET_HEADROOM, NET_SKB_PAD)
 #define MVNETA_SKB_PAD	(SKB_DATA_ALIGN(sizeof(struct skb_shared_info) + \
 			 MVNETA_SKB_HEADROOM))
 #define MVNETA_SKB_SIZE(len)	(SKB_DATA_ALIGN(len) + MVNETA_SKB_PAD)
@@ -1174,6 +1173,7 @@ bm_mtu_err:
 	mvneta_bm_pool_destroy(pp-&gt;bm_priv, pp-&gt;pool_short, 1 &lt;&lt; pp-&gt;id);
 
 	pp-&gt;bm_priv = NULL;
+	pp-&gt;rx_offset_correction = MVNETA_SKB_HEADROOM;
 	mvreg_write(pp, MVNETA_ACC_MODE, MVNETA_ACC_MODE_EXT1);
 	netdev_info(pp-&gt;dev, "fail to update MTU, fall back to software BM\n");
 }
@@ -4991,7 +4991,6 @@ static int mvneta_probe(struct platform_
 	SET_NETDEV_DEV(dev, &amp;pdev-&gt;dev);
 
 	pp-&gt;id = global_port_id++;
-	pp-&gt;rx_offset_correction = MVNETA_SKB_HEADROOM;
 
 	/* Obtain access to BM resources if enabled and already initialized */
 	bm_node = of_parse_phandle(dn, "buffer-manager", 0);
@@ -5016,6 +5015,10 @@ static int mvneta_probe(struct platform_
 	}
 	of_node_put(bm_node);
 
+	/* sw buffer management */
+	if (!pp-&gt;bm_priv)
+		pp-&gt;rx_offset_correction = MVNETA_SKB_HEADROOM;
+
 	err = mvneta_init(&amp;pdev-&gt;dev, pp);
 	if (err &lt; 0)
 		goto err_netdev;
@@ -5173,6 +5176,7 @@ static int mvneta_resume(struct device *
 		err = mvneta_bm_port_init(pdev, pp);
 		if (err &lt; 0) {
 			dev_info(&amp;pdev-&gt;dev, "use SW buffer management\n");
+			pp-&gt;rx_offset_correction = MVNETA_SKB_HEADROOM;
 			pp-&gt;bm_priv = NULL;
 		}
 	}
</pre></body></html>