[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260205070951.3170631-3-c-vankar@ti.com>
Date: Thu, 5 Feb 2026 12:39:51 +0530
From: Chintan Vankar <c-vankar@...com>
To: Thomas Gleixner <tglx@...nel.org>, Ingo Molnar <mingo@...nel.org>,
"Vignesh Raghavendra" <vigneshr@...com>, Vadim Fedorenko
<vadim.fedorenko@...ux.dev>, Matthias Schiffer
<matthias.schiffer@...tq-group.com>, Nishanth Menon <nm@...com>, Chintan
Vankar <c-vankar@...com>, Michael Walle <mwalle@...nel.org>, Simon Horman
<horms@...nel.org>, Roger Quadros <rogerq@...nel.org>, Siddharth Vadapalli
<s-vadapalli@...com>, Paolo Abeni <pabeni@...hat.com>, Jakub Kicinski
<kuba@...nel.org>, Eric Dumazet <edumazet@...gle.com>, "David S. Miller"
<davem@...emloft.net>, Andrew Lunn <andrew+netdev@...n.ch>
CC: <linux-omap@...r.kernel.org>, <linux-kernel@...r.kernel.org>,
<netdev@...r.kernel.org>
Subject: [PATCH net 2/2] net: ethernet: ti: cpsw_ale: Update multicast entry handling in ALE Table
The current implementation of multicast entry flushing marks all multicast
entries as free whenever any interface adds, deletes, or modifies
multicast entry. It then re-adds the entries, which disrupts existing
multicast connection for other interfaces associated with that entry.
Update multicast flushing API to handle above case by clearing out a bit
in port_mask for that specific interface.
Signed-off-by: Chintan Vankar <c-vankar@...com>
---
drivers/net/ethernet/ti/cpsw_ale.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
index fbe35af615a6..9632ad3741de 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -455,14 +455,13 @@ static void cpsw_ale_flush_mcast(struct cpsw_ale *ale, u32 *ale_entry,
ale->port_mask_bits);
if ((mask & port_mask) == 0)
return; /* ports dont intersect, not interested */
- mask &= ~port_mask;
+ mask &= (~port_mask | ALE_PORT_HOST);
- /* free if only remaining port is host port */
- if (mask)
+ if (mask == 0x0 || mask == ALE_PORT_HOST)
+ cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
+ else
cpsw_ale_set_port_mask(ale_entry, mask,
ale->port_mask_bits);
- else
- cpsw_ale_set_entry_type(ale_entry, ALE_TYPE_FREE);
}
int cpsw_ale_flush_multicast(struct cpsw_ale *ale, int port_mask, int vid)
--
2.34.1
Powered by blists - more mailing lists