net: ethernet: mtk_eth_soc: fix tx vlan tag for llc packets
authorFelix Fietkau <nbd@nbd.name>
Sun, 31 Aug 2025 18:20:07 +0000 (20:20 +0200)
committerJakub Kicinski <kuba@kernel.org>
Tue, 2 Sep 2025 23:27:30 +0000 (16:27 -0700)
When sending llc packets with vlan tx offload, the hardware fails to
actually add the tag. Deal with this by fixing it up in software.

Fixes: 656e705243fd ("net-next: mediatek: add support for MT7623 ethernet")
Reported-by: Thibaut VARENE <hacks@slashdirt.org>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20250831182007.51619-1-nbd@nbd.name
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mediatek/mtk_eth_soc.c

index 5a5fcde76dc0e776e6bb279fe528e90fb9e14321..e68997a29191b2a8ce0868873dcfe95c79e10e56 100644 (file)
@@ -1761,6 +1761,13 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
        bool gso = false;
        int tx_num;
 
+       if (skb_vlan_tag_present(skb) &&
+           !eth_proto_is_802_3(eth_hdr(skb)->h_proto)) {
+               skb = __vlan_hwaccel_push_inside(skb);
+               if (!skb)
+                       goto dropped;
+       }
+
        /* normally we can rely on the stack not calling this more than once,
         * however we have 2 queues running on the same ring so we need to lock
         * the ring access
@@ -1806,8 +1813,9 @@ static netdev_tx_t mtk_start_xmit(struct sk_buff *skb, struct net_device *dev)
 
 drop:
        spin_unlock(&eth->page_lock);
-       stats->tx_dropped++;
        dev_kfree_skb_any(skb);
+dropped:
+       stats->tx_dropped++;
        return NETDEV_TX_OK;
 }