]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net: mvneta: fix XDP support if sw bm is used as fallback
authorLorenzo Bianconi <lorenzo@kernel.org>
Wed, 29 Jan 2020 11:50:53 +0000 (12:50 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 29 Jan 2020 12:57:59 +0000 (13:57 +0100)
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 <sven.auhagen@voleatech.de>
Signed-off-by: Lorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/marvell/mvneta.c

index 2dfbfdff45a8f9756a22eb7a744f2f6db70b71bc..037e054b01a2ebaa4c1def121a809f9da90910ee 100644 (file)
              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)
@@ -1167,6 +1166,7 @@ bm_mtu_err:
        mvneta_bm_pool_destroy(pp->bm_priv, pp->pool_short, 1 << pp->id);
 
        pp->bm_priv = NULL;
+       pp->rx_offset_correction = MVNETA_SKB_HEADROOM;
        mvreg_write(pp, MVNETA_ACC_MODE, MVNETA_ACC_MODE_EXT1);
        netdev_info(pp->dev, "fail to update MTU, fall back to software BM\n");
 }
@@ -4948,7 +4948,6 @@ static int mvneta_probe(struct platform_device *pdev)
        SET_NETDEV_DEV(dev, &pdev->dev);
 
        pp->id = global_port_id++;
-       pp->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);
@@ -4973,6 +4972,10 @@ static int mvneta_probe(struct platform_device *pdev)
        }
        of_node_put(bm_node);
 
+       /* sw buffer management */
+       if (!pp->bm_priv)
+               pp->rx_offset_correction = MVNETA_SKB_HEADROOM;
+
        err = mvneta_init(&pdev->dev, pp);
        if (err < 0)
                goto err_netdev;
@@ -5130,6 +5133,7 @@ static int mvneta_resume(struct device *device)
                err = mvneta_bm_port_init(pdev, pp);
                if (err < 0) {
                        dev_info(&pdev->dev, "use SW buffer management\n");
+                       pp->rx_offset_correction = MVNETA_SKB_HEADROOM;
                        pp->bm_priv = NULL;
                }
        }