From 3b4329230db8750bea7a56ef07f07cbbf5fc6c5a Mon Sep 17 00:00:00 2001 From: Christian Marangi Date: Tue, 4 Jul 2023 22:50:12 +0200 Subject: [PATCH 19/20] net: dsa: qca8k: implement lag_fdb_add/del ops Implement lag_fdb_add/del ops to correctly support using LAG interface. Qca8k switch supports declaring fdb entry for link aggregation by simply setting the DES_PORT bits to all the LAG member. Signed-off-by: Christian Marangi --- drivers/net/dsa/qca/qca8k-8xxx.c | 2 ++ drivers/net/dsa/qca/qca8k-common.c | 48 ++++++++++++++++++++++++++++++ drivers/net/dsa/qca/qca8k.h | 6 ++++ 3 files changed, 56 insertions(+) --- a/drivers/net/dsa/qca/qca8k-8xxx.c +++ b/drivers/net/dsa/qca/qca8k-8xxx.c @@ -2015,6 +2015,8 @@ static const struct dsa_switch_ops qca8k .port_fdb_add = qca8k_port_fdb_add, .port_fdb_del = qca8k_port_fdb_del, .port_fdb_dump = qca8k_port_fdb_dump, + .lag_fdb_add = qca8k_lag_fdb_add, + .lag_fdb_del = qca8k_lag_fdb_del, .port_mdb_add = qca8k_port_mdb_add, .port_mdb_del = qca8k_port_mdb_del, .port_mirror_add = qca8k_port_mirror_add, --- a/drivers/net/dsa/qca/qca8k-common.c +++ b/drivers/net/dsa/qca/qca8k-common.c @@ -1215,6 +1215,42 @@ int qca8k_port_lag_leave(struct dsa_swit return qca8k_lag_refresh_portmap(ds, port, lag, true); } +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag, + const unsigned char *addr, u16 vid, + struct dsa_db db) +{ + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; + struct dsa_port *dp; + u16 port_mask = 0; + + /* Set the vid to the port vlan id if no vid is set */ + if (!vid) + vid = QCA8K_PORT_VID_DEF; + + dsa_lag_foreach_port(dp, ds->dst, &lag) + port_mask |= BIT(dp->index); + + return qca8k_port_fdb_insert(priv, addr, port_mask, vid); +} + +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag, + const unsigned char *addr, u16 vid, + struct dsa_db db) +{ + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv; + struct dsa_port *dp; + u16 port_mask = 0; + + /* Set the vid to the port vlan id if no vid is set */ + if (!vid) + vid = QCA8K_PORT_VID_DEF; + + dsa_lag_foreach_port(dp, ds->dst, &lag) + port_mask |= BIT(dp->index); + + return qca8k_fdb_del(priv, addr, port_mask, vid); +} + int qca8k_read_switch_id(struct qca8k_priv *priv) { u32 val; --- a/drivers/net/dsa/qca/qca8k.h +++ b/drivers/net/dsa/qca/qca8k.h @@ -590,5 +590,11 @@ int qca8k_port_lag_join(struct dsa_switc struct netlink_ext_ack *extack); int qca8k_port_lag_leave(struct dsa_switch *ds, int port, struct dsa_lag lag); +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag, + const unsigned char *addr, u16 vid, + struct dsa_db db); +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag, + const unsigned char *addr, u16 vid, + struct dsa_db db); #endif /* __QCA8K_H */