]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: renesas: rswitch: fix forwarding offload statemachine
authorMichael Dege <michael.dege@renesas.com>
Fri, 6 Feb 2026 13:41:53 +0000 (14:41 +0100)
committerPaolo Abeni <pabeni@redhat.com>
Wed, 11 Feb 2026 08:04:05 +0000 (09:04 +0100)
A change of the port state of one port, caused the state of another
port to change. This behvior was unintended.

Fixes: b7502b1043de ("net: renesas: rswitch: add offloading for L2 switching")
Signed-off-by: Michael Dege <michael.dege@renesas.com>
Link: https://patch.msgid.link/20260206-fix-offloading-statemachine-v3-1-07bfba07d03e@renesas.com
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/renesas/rswitch_l2.c

index 4a69ec77d69c600530189f3f5e86da165022bc4e..9433cd8adced978432cacc12c5f2fa300437afbe 100644 (file)
@@ -1,7 +1,7 @@
 // SPDX-License-Identifier: GPL-2.0
 /* Renesas Ethernet Switch device driver
  *
- * Copyright (C) 2025 Renesas Electronics Corporation
+ * Copyright (C) 2025 - 2026 Renesas Electronics Corporation
  */
 
 #include <linux/err.h>
@@ -60,6 +60,7 @@ static void rswitch_update_l2_hw_learning(struct rswitch_private *priv)
 static void rswitch_update_l2_hw_forwarding(struct rswitch_private *priv)
 {
        struct rswitch_device *rdev;
+       bool new_forwarding_offload;
        unsigned int fwd_mask;
 
        /* calculate fwd_mask with zeroes in bits corresponding to ports that
@@ -73,8 +74,9 @@ static void rswitch_update_l2_hw_forwarding(struct rswitch_private *priv)
        }
 
        rswitch_for_all_ports(priv, rdev) {
-               if ((rdev_for_l2_offload(rdev) && rdev->forwarding_requested) ||
-                   rdev->forwarding_offloaded) {
+               new_forwarding_offload = (rdev_for_l2_offload(rdev) && rdev->forwarding_requested);
+
+               if (new_forwarding_offload || rdev->forwarding_offloaded) {
                        /* Update allowed offload destinations even for ports
                         * with L2 offload enabled earlier.
                         *
@@ -84,13 +86,10 @@ static void rswitch_update_l2_hw_forwarding(struct rswitch_private *priv)
                                  priv->addr + FWPC2(rdev->port));
                }
 
-               if (rdev_for_l2_offload(rdev) &&
-                   rdev->forwarding_requested &&
-                   !rdev->forwarding_offloaded) {
+               if (new_forwarding_offload && !rdev->forwarding_offloaded)
                        rswitch_change_l2_hw_offloading(rdev, true, false);
-               } else if (rdev->forwarding_offloaded) {
+               else if (!new_forwarding_offload && rdev->forwarding_offloaded)
                        rswitch_change_l2_hw_offloading(rdev, false, false);
-               }
        }
 }