| From 947ac10e214e73a838c293505ddb7560aa418616 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Fri, 6 Feb 2026 14:41:53 +0100 |
| Subject: net: renesas: rswitch: fix forwarding offload statemachine |
| |
| From: Michael Dege <michael.dege@renesas.com> |
| |
| [ Upstream commit e9a5073a98d940837cbb95e71eed1f28f48e7b30 ] |
| |
| 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> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/renesas/rswitch_l2.c | 15 +++++++-------- |
| 1 file changed, 7 insertions(+), 8 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/renesas/rswitch_l2.c b/drivers/net/ethernet/renesas/rswitch_l2.c |
| index 4a69ec77d69c6..9433cd8adced9 100644 |
| --- a/drivers/net/ethernet/renesas/rswitch_l2.c |
| +++ b/drivers/net/ethernet/renesas/rswitch_l2.c |
| @@ -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); |
| - } |
| } |
| } |
| |
| -- |
| 2.51.0 |
| |