mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
net: renesas: rswitch: fix forwarding offload statemachine
A change of the port state of one port, caused the state of another
port to change. This behvior was unintended.
Fixes: b7502b1043 ("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>
This commit is contained in:
parent
cdb1634de3
commit
e9a5073a98
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user