realtek: fix standalone ports in presence of static fdb entries
The registers L2_PORT_STATIC_MV_ACT seem to specify the action to take when the source address of a packet exists as a static fdb entry on another port. By default the configured action is to drop such packets. For standalone ports, this behaviour is undesired, as all traffic should be forwarded to the CPU. So change the action to forward on standalone ports. A situation where this issue can occur is when a non-offloaded bond interface is part of a bridge. In that case, the CPU port will have fdb entries for devices connected to the bond interface, which are managed by the assisted learning feature. For now, this is only implemented for RTL838x/RTL839x, as the available set of registers differs for the other devices. Signed-off-by: Jan Hoffmann <jan@3e8.eu>
This commit is contained in:
committed by
Sander Vanheule
parent
4c0a1667f3
commit
5d34fc92ec
@@ -188,6 +188,14 @@ static int rtl83xx_setup(struct dsa_switch *ds)
|
||||
}
|
||||
priv->r->traffic_set(priv->cpu_port, BIT_ULL(priv->cpu_port));
|
||||
|
||||
/* For standalone ports, forward packets even if a static fdb
|
||||
* entry for the source address exists on another port.
|
||||
*/
|
||||
if (priv->r->set_static_move_action) {
|
||||
for (int i = 0; i <= priv->cpu_port; i++)
|
||||
priv->r->set_static_move_action(i, true);
|
||||
}
|
||||
|
||||
if (priv->family_id == RTL8380_FAMILY_ID)
|
||||
rtl838x_print_matrix();
|
||||
else
|
||||
@@ -1202,6 +1210,10 @@ static int rtl83xx_port_bridge_join(struct dsa_switch *ds, int port,
|
||||
priv->r->traffic_set(port, v);
|
||||
}
|
||||
priv->ports[port].pm |= port_bitmap;
|
||||
|
||||
if (priv->r->set_static_move_action)
|
||||
priv->r->set_static_move_action(port, false);
|
||||
|
||||
mutex_unlock(&priv->reg_mutex);
|
||||
|
||||
return 0;
|
||||
@@ -1242,6 +1254,9 @@ static void rtl83xx_port_bridge_leave(struct dsa_switch *ds, int port,
|
||||
}
|
||||
priv->ports[port].pm &= ~port_bitmap;
|
||||
|
||||
if (priv->r->set_static_move_action)
|
||||
priv->r->set_static_move_action(port, true);
|
||||
|
||||
mutex_unlock(&priv->reg_mutex);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user