b03bb622d326fab1cd53061c8d2a7be3d6a95cc5
[openwrt/openwrt.git] / target / linux / generic / pending-6.1 / 711-01-net-dsa-qca8k-implement-lag_fdb_add-del-ops.patch
1 From 3b4329230db8750bea7a56ef07f07cbbf5fc6c5a Mon Sep 17 00:00:00 2001
2 From: Christian Marangi <ansuelsmth@gmail.com>
3 Date: Tue, 4 Jul 2023 22:50:12 +0200
4 Subject: [PATCH 19/20] net: dsa: qca8k: implement lag_fdb_add/del ops
5
6 Implement lag_fdb_add/del ops to correctly support using LAG interface.
7 Qca8k switch supports declaring fdb entry for link aggregation by simply
8 setting the DES_PORT bits to all the LAG member.
9
10 Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
11 ---
12 drivers/net/dsa/qca/qca8k-8xxx.c | 2 ++
13 drivers/net/dsa/qca/qca8k-common.c | 48 ++++++++++++++++++++++++++++++
14 drivers/net/dsa/qca/qca8k.h | 6 ++++
15 3 files changed, 56 insertions(+)
16
17 --- a/drivers/net/dsa/qca/qca8k-8xxx.c
18 +++ b/drivers/net/dsa/qca/qca8k-8xxx.c
19 @@ -2004,6 +2004,8 @@ static const struct dsa_switch_ops qca8k
20 .port_fdb_add = qca8k_port_fdb_add,
21 .port_fdb_del = qca8k_port_fdb_del,
22 .port_fdb_dump = qca8k_port_fdb_dump,
23 + .lag_fdb_add = qca8k_lag_fdb_add,
24 + .lag_fdb_del = qca8k_lag_fdb_del,
25 .port_mdb_add = qca8k_port_mdb_add,
26 .port_mdb_del = qca8k_port_mdb_del,
27 .port_mirror_add = qca8k_port_mirror_add,
28 --- a/drivers/net/dsa/qca/qca8k-common.c
29 +++ b/drivers/net/dsa/qca/qca8k-common.c
30 @@ -1215,6 +1215,42 @@ int qca8k_port_lag_leave(struct dsa_swit
31 return qca8k_lag_refresh_portmap(ds, port, lag, true);
32 }
33
34 +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
35 + const unsigned char *addr, u16 vid,
36 + struct dsa_db db)
37 +{
38 + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
39 + struct dsa_port *dp;
40 + u16 port_mask = 0;
41 +
42 + /* Set the vid to the port vlan id if no vid is set */
43 + if (!vid)
44 + vid = QCA8K_PORT_VID_DEF;
45 +
46 + dsa_lag_foreach_port(dp, ds->dst, &lag)
47 + port_mask |= BIT(dp->index);
48 +
49 + return qca8k_port_fdb_insert(priv, addr, port_mask, vid);
50 +}
51 +
52 +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
53 + const unsigned char *addr, u16 vid,
54 + struct dsa_db db)
55 +{
56 + struct qca8k_priv *priv = (struct qca8k_priv *)ds->priv;
57 + struct dsa_port *dp;
58 + u16 port_mask = 0;
59 +
60 + /* Set the vid to the port vlan id if no vid is set */
61 + if (!vid)
62 + vid = QCA8K_PORT_VID_DEF;
63 +
64 + dsa_lag_foreach_port(dp, ds->dst, &lag)
65 + port_mask |= BIT(dp->index);
66 +
67 + return qca8k_fdb_del(priv, addr, port_mask, vid);
68 +}
69 +
70 int qca8k_read_switch_id(struct qca8k_priv *priv)
71 {
72 u32 val;
73 --- a/drivers/net/dsa/qca/qca8k.h
74 +++ b/drivers/net/dsa/qca/qca8k.h
75 @@ -590,5 +590,11 @@ int qca8k_port_lag_join(struct dsa_switc
76 struct netlink_ext_ack *extack);
77 int qca8k_port_lag_leave(struct dsa_switch *ds, int port,
78 struct dsa_lag lag);
79 +int qca8k_lag_fdb_add(struct dsa_switch *ds, struct dsa_lag lag,
80 + const unsigned char *addr, u16 vid,
81 + struct dsa_db db);
82 +int qca8k_lag_fdb_del(struct dsa_switch *ds, struct dsa_lag lag,
83 + const unsigned char *addr, u16 vid,
84 + struct dsa_db db);
85
86 #endif /* __QCA8K_H */