1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- From 3b4329230db8750bea7a56ef07f07cbbf5fc6c5a Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- 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 <[email protected]>
- ---
- 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 */
|