]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: dsa: tag_rtl8_4: set KEEP flag
authorLuiz Angelo Daros de Luca <luizluca@gmail.com>
Wed, 8 Apr 2026 20:31:02 +0000 (17:31 -0300)
committerJakub Kicinski <kuba@kernel.org>
Sun, 12 Apr 2026 16:03:55 +0000 (09:03 -0700)
KEEP=1 is needed because we should respect the format of the packet as
the kernel sends it to us. Unless tx forward offloading is used, the
kernel is giving us the packet exactly as it should leave the specified
port on the wire. Until now this was not needed because the ports were
always functioning in a standalone mode in a VLAN-unaware way, so the
switch would not tag or untag frames anyway. But arguably it should have
been KEEP=1 all along.

Co-developed-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: Alvin Šipraga <alsi@bang-olufsen.dk>
Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
Reviewed-by: Linus Walleij <linusw@kernel.org>
Link: https://patch.msgid.link/20260408-realtek_fixes-v1-2-915ff1404d56@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/dsa/tag_rtl8_4.c

index b7ed39c5419fdb92e376316f209e5d4085b036bb..852c6b88079a13c8d93c9ccb7e0904f52b1c920c 100644 (file)
@@ -99,6 +99,7 @@
 #define   RTL8_4_REASON_TRAP           80
 
 #define RTL8_4_LEARN_DIS               BIT(5)
+#define RTL8_4_KEEP                    BIT(7)
 
 #define RTL8_4_TX                      GENMASK(3, 0)
 #define RTL8_4_RX                      GENMASK(10, 0)
@@ -114,8 +115,9 @@ static void rtl8_4_write_tag(struct sk_buff *skb, struct net_device *dev,
        /* Set Protocol; zero REASON */
        tag16[1] = htons(FIELD_PREP(RTL8_4_PROTOCOL, RTL8_4_PROTOCOL_RTL8365MB));
 
-       /* Zero EFID_EN, EFID, PRI_EN, PRI, VSEL, VIDX, KEEP; set LEARN_DIS */
-       tag16[2] = htons(FIELD_PREP(RTL8_4_LEARN_DIS, 1));
+       /* Zero EFID_EN, EFID, PRI_EN, PRI, VSEL, VIDX; set KEEP, LEARN_DIS */
+       tag16[2] = htons(FIELD_PREP(RTL8_4_LEARN_DIS, 1) |
+                        FIELD_PREP(RTL8_4_KEEP, 1));
 
        /* Zero ALLOW; set RX (CPU->switch) forwarding port mask */
        tag16[3] = htons(FIELD_PREP(RTL8_4_RX, dsa_xmit_port_mask(skb, dev)));