ath25: switch default kernel to 5.15
[openwrt/staging/ldir.git] / target / linux / realtek / patches-5.10 / 708-brflood-api.patch
1 From afa3ab54c03d5126b14651f367b38165fab5b3cc Mon Sep 17 00:00:00 2001
2 From: Birger Koblitz <git@birger-koblitz.de>
3 Date: Tue, 18 Jan 2022 17:18:43 +0100
4 Subject: net: brflood API
5
6 Adds the DSA API for bridge configuration (flooding, L2 learning,
7 and aging) offload as found in Linux 5.12 so that we can implement
8 it in our drivver.
9
10 Submitted-by: Sebastian Gottschall <s.gottschall@dd-wrt.com>
11 Submitted-by: Birger Koblitz <git@birger-koblitz.de>
12 ---
13 include/net/dsa.h | 6 +++++++--
14 net/dsa/dsa_priv.h | 6 +++---
15 net/dsa/port.c | 28 ++++++++----
16 net/dsa/slave.c | 6 +++---
17 4 file changed, 29 insertions(+), 13 deletions(-)
18
19 --- a/include/net/dsa.h
20 +++ b/include/net/dsa.h
21 @@ -552,8 +552,14 @@ struct dsa_switch_ops {
22 void (*port_stp_state_set)(struct dsa_switch *ds, int port,
23 u8 state);
24 void (*port_fast_age)(struct dsa_switch *ds, int port);
25 - int (*port_egress_floods)(struct dsa_switch *ds, int port,
26 - bool unicast, bool multicast);
27 + int (*port_pre_bridge_flags)(struct dsa_switch *ds, int port,
28 + unsigned long flags,
29 + struct netlink_ext_ack *extack);
30 + int (*port_bridge_flags)(struct dsa_switch *ds, int port,
31 + unsigned long flags,
32 + struct netlink_ext_ack *extack);
33 + int (*port_set_mrouter)(struct dsa_switch *ds, int port, bool mrouter,
34 + struct netlink_ext_ack *extack);
35
36 /*
37 * VLAN support
38 --- a/net/dsa/dsa_priv.h
39 +++ b/net/dsa/dsa_priv.h
40 @@ -167,11 +167,11 @@ int dsa_port_mdb_add(const struct dsa_po
41 int dsa_port_mdb_del(const struct dsa_port *dp,
42 const struct switchdev_obj_port_mdb *mdb);
43 int dsa_port_pre_bridge_flags(const struct dsa_port *dp, unsigned long flags,
44 - struct switchdev_trans *trans);
45 + struct switchdev_trans *trans, struct netlink_ext_ack *extack);
46 int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,
47 - struct switchdev_trans *trans);
48 + struct switchdev_trans *trans, struct netlink_ext_ack *extack);
49 int dsa_port_mrouter(struct dsa_port *dp, bool mrouter,
50 - struct switchdev_trans *trans);
51 + struct switchdev_trans *trans, struct netlink_ext_ack *extack);
52 int dsa_port_vlan_add(struct dsa_port *dp,
53 const struct switchdev_obj_port_vlan *vlan,
54 struct switchdev_trans *trans);
55 --- a/net/dsa/port.c
56 +++ b/net/dsa/port.c
57 @@ -145,7 +145,7 @@ int dsa_port_bridge_join(struct dsa_port
58 int err;
59
60 /* Set the flooding mode before joining the port in the switch */
61 - err = dsa_port_bridge_flags(dp, BR_FLOOD | BR_MCAST_FLOOD, NULL);
62 + err = dsa_port_bridge_flags(dp, BR_FLOOD | BR_MCAST_FLOOD, NULL, NULL);
63 if (err)
64 return err;
65
66 @@ -158,7 +158,7 @@ int dsa_port_bridge_join(struct dsa_port
67
68 /* The bridging is rolled back on error */
69 if (err) {
70 - dsa_port_bridge_flags(dp, 0, NULL);
71 + dsa_port_bridge_flags(dp, 0, NULL, NULL);
72 dp->bridge_dev = NULL;
73 }
74
75 @@ -185,7 +185,7 @@ void dsa_port_bridge_leave(struct dsa_po
76 pr_err("DSA: failed to notify DSA_NOTIFIER_BRIDGE_LEAVE\n");
77
78 /* Port is leaving the bridge, disable flooding */
79 - dsa_port_bridge_flags(dp, 0, NULL);
80 + dsa_port_bridge_flags(dp, 0, NULL, NULL);
81
82 /* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
83 * so allow it to be in BR_STATE_FORWARDING to be kept functional
84 @@ -333,44 +333,44 @@ int dsa_port_ageing_time(struct dsa_port
85 }
86
87 int dsa_port_pre_bridge_flags(const struct dsa_port *dp, unsigned long flags,
88 - struct switchdev_trans *trans)
89 + struct switchdev_trans *trans, struct netlink_ext_ack *extack)
90 {
91 struct dsa_switch *ds = dp->ds;
92
93 - if (!ds->ops->port_egress_floods ||
94 - (flags & ~(BR_FLOOD | BR_MCAST_FLOOD)))
95 + if (!ds->ops->port_pre_bridge_flags)
96 return -EINVAL;
97
98 - return 0;
99 + return ds->ops->port_pre_bridge_flags(ds, dp->index, flags, extack);
100 }
101
102 int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,
103 - struct switchdev_trans *trans)
104 + struct switchdev_trans *trans, struct netlink_ext_ack *extack)
105 {
106 struct dsa_switch *ds = dp->ds;
107 - int port = dp->index;
108 - int err = 0;
109
110 if (switchdev_trans_ph_prepare(trans))
111 return 0;
112
113 - if (ds->ops->port_egress_floods)
114 - err = ds->ops->port_egress_floods(ds, port, flags & BR_FLOOD,
115 - flags & BR_MCAST_FLOOD);
116 + if (!ds->ops->port_bridge_flags)
117 + return -EINVAL;
118 +
119 + return ds->ops->port_bridge_flags(ds, dp->index, flags, extack);
120
121 - return err;
122 }
123
124 int dsa_port_mrouter(struct dsa_port *dp, bool mrouter,
125 - struct switchdev_trans *trans)
126 + struct switchdev_trans *trans,
127 + struct netlink_ext_ack *extack)
128 {
129 struct dsa_switch *ds = dp->ds;
130 - int port = dp->index;
131
132 if (switchdev_trans_ph_prepare(trans))
133 - return ds->ops->port_egress_floods ? 0 : -EOPNOTSUPP;
134 + return ds->ops->port_set_mrouter ? 0 : -EOPNOTSUPP;
135 +
136 + if (!ds->ops->port_set_mrouter)
137 + return -EOPNOTSUPP;
138
139 - return ds->ops->port_egress_floods(ds, port, true, mrouter);
140 + return ds->ops->port_set_mrouter(ds, dp->index, mrouter, extack);
141 }
142
143 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
144 --- a/net/dsa/slave.c
145 +++ b/net/dsa/slave.c
146 @@ -290,13 +290,13 @@ static int dsa_slave_port_attr_set(struc
147 break;
148 case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
149 ret = dsa_port_pre_bridge_flags(dp, attr->u.brport_flags,
150 - trans);
151 + trans, NULL);
152 break;
153 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
154 - ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans);
155 + ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans, NULL);
156 break;
157 case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER:
158 - ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans);
159 + ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans, NULL);
160 break;
161 default:
162 ret = -EOPNOTSUPP;