Link-local multicast addresses (01:80:c2:00:00:0x) must only be
delivered to the host port (P0) and must not be forwarded out of
the physical slave ports. icssg_fdb_add_del() was programming these
addresses with P1/P2 membership bits set, causing the firmware to
forward them out of slave ports.
Clear P1/P2 membership and set only P0 membership when
is_link_local_ether_addr() returns true.
Fixes: 487f7323f39a ("net: ti: icssg-prueth: Add helper functions to configure FDB")
Signed-off-by: MD Danish Anwar <danishanwar@ti.com>
---
drivers/net/ethernet/ti/icssg/icssg_config.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/net/ethernet/ti/icssg/icssg_config.c b/drivers/net/ethernet/ti/icssg/icssg_config.c
index 3f8237c17d099..04a81402e3f3c 100644
--- a/drivers/net/ethernet/ti/icssg/icssg_config.c
+++ b/drivers/net/ethernet/ti/icssg/icssg_config.c
@@ -732,6 +732,16 @@ int icssg_fdb_add_del(struct prueth_emac *emac, const unsigned char *addr,
u8 fid = vid;
int ret;
+ /* Link-local addresses (01:80:c2:00:00:0x) must only be delivered to
+ * the host port (P0). Clear P1/P2 membership to prevent the firmware
+ * from forwarding them out of the physical slave ports.
+ */
+ if (is_link_local_ether_addr(addr)) {
+ fid_c2 |= ICSSG_FDB_ENTRY_P0_MEMBERSHIP;
+ fid_c2 &= ~(ICSSG_FDB_ENTRY_P1_MEMBERSHIP |
+ ICSSG_FDB_ENTRY_P2_MEMBERSHIP);
+ }
+
icssg_fdb_setup(emac, &fdb_cmd, addr, fid, add ? ICSS_CMD_ADD_FDB : ICSS_CMD_DEL_FDB);
fid_c2 |= ICSSG_FDB_ENTRY_VALID;
base-commit: a225f8c20712713406ae47024b8df42deacddd4a
--
2.34.1