• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: (GPL-2.0 OR MIT)
2 /* Microsemi Ocelot Switch driver
3  *
4  * This contains glue logic between the switchdev driver operations and the
5  * mscc_ocelot_switch_lib.
6  *
7  * Copyright (c) 2017, 2019 Microsemi Corporation
8  * Copyright 2020-2021 NXP
9  */
10 
11 #include <linux/dsa/ocelot.h>
12 #include <linux/if_bridge.h>
13 #include <linux/of_net.h>
14 #include <linux/phy/phy.h>
15 #include <net/pkt_cls.h>
16 #include "ocelot.h"
17 #include "ocelot_police.h"
18 #include "ocelot_vcap.h"
19 #include "ocelot_fdma.h"
20 
21 #define OCELOT_MAC_QUIRKS	OCELOT_QUIRK_QSGMII_PORTS_MUST_BE_UP
22 
23 struct ocelot_dump_ctx {
24 	struct net_device *dev;
25 	struct sk_buff *skb;
26 	struct netlink_callback *cb;
27 	int idx;
28 };
29 
30 static bool ocelot_netdevice_dev_check(const struct net_device *dev);
31 
devlink_port_to_ocelot(struct devlink_port * dlp)32 static struct ocelot *devlink_port_to_ocelot(struct devlink_port *dlp)
33 {
34 	return devlink_priv(dlp->devlink);
35 }
36 
devlink_port_to_port(struct devlink_port * dlp)37 static int devlink_port_to_port(struct devlink_port *dlp)
38 {
39 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
40 
41 	return dlp - ocelot->devlink_ports;
42 }
43 
ocelot_devlink_sb_pool_get(struct devlink * dl,unsigned int sb_index,u16 pool_index,struct devlink_sb_pool_info * pool_info)44 static int ocelot_devlink_sb_pool_get(struct devlink *dl,
45 				      unsigned int sb_index, u16 pool_index,
46 				      struct devlink_sb_pool_info *pool_info)
47 {
48 	struct ocelot *ocelot = devlink_priv(dl);
49 
50 	return ocelot_sb_pool_get(ocelot, sb_index, pool_index, pool_info);
51 }
52 
ocelot_devlink_sb_pool_set(struct devlink * dl,unsigned int sb_index,u16 pool_index,u32 size,enum devlink_sb_threshold_type threshold_type,struct netlink_ext_ack * extack)53 static int ocelot_devlink_sb_pool_set(struct devlink *dl, unsigned int sb_index,
54 				      u16 pool_index, u32 size,
55 				      enum devlink_sb_threshold_type threshold_type,
56 				      struct netlink_ext_ack *extack)
57 {
58 	struct ocelot *ocelot = devlink_priv(dl);
59 
60 	return ocelot_sb_pool_set(ocelot, sb_index, pool_index, size,
61 				  threshold_type, extack);
62 }
63 
ocelot_devlink_sb_port_pool_get(struct devlink_port * dlp,unsigned int sb_index,u16 pool_index,u32 * p_threshold)64 static int ocelot_devlink_sb_port_pool_get(struct devlink_port *dlp,
65 					   unsigned int sb_index, u16 pool_index,
66 					   u32 *p_threshold)
67 {
68 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
69 	int port = devlink_port_to_port(dlp);
70 
71 	return ocelot_sb_port_pool_get(ocelot, port, sb_index, pool_index,
72 				       p_threshold);
73 }
74 
ocelot_devlink_sb_port_pool_set(struct devlink_port * dlp,unsigned int sb_index,u16 pool_index,u32 threshold,struct netlink_ext_ack * extack)75 static int ocelot_devlink_sb_port_pool_set(struct devlink_port *dlp,
76 					   unsigned int sb_index, u16 pool_index,
77 					   u32 threshold,
78 					   struct netlink_ext_ack *extack)
79 {
80 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
81 	int port = devlink_port_to_port(dlp);
82 
83 	return ocelot_sb_port_pool_set(ocelot, port, sb_index, pool_index,
84 				       threshold, extack);
85 }
86 
87 static int
ocelot_devlink_sb_tc_pool_bind_get(struct devlink_port * dlp,unsigned int sb_index,u16 tc_index,enum devlink_sb_pool_type pool_type,u16 * p_pool_index,u32 * p_threshold)88 ocelot_devlink_sb_tc_pool_bind_get(struct devlink_port *dlp,
89 				   unsigned int sb_index, u16 tc_index,
90 				   enum devlink_sb_pool_type pool_type,
91 				   u16 *p_pool_index, u32 *p_threshold)
92 {
93 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
94 	int port = devlink_port_to_port(dlp);
95 
96 	return ocelot_sb_tc_pool_bind_get(ocelot, port, sb_index, tc_index,
97 					  pool_type, p_pool_index,
98 					  p_threshold);
99 }
100 
101 static int
ocelot_devlink_sb_tc_pool_bind_set(struct devlink_port * dlp,unsigned int sb_index,u16 tc_index,enum devlink_sb_pool_type pool_type,u16 pool_index,u32 threshold,struct netlink_ext_ack * extack)102 ocelot_devlink_sb_tc_pool_bind_set(struct devlink_port *dlp,
103 				   unsigned int sb_index, u16 tc_index,
104 				   enum devlink_sb_pool_type pool_type,
105 				   u16 pool_index, u32 threshold,
106 				   struct netlink_ext_ack *extack)
107 {
108 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
109 	int port = devlink_port_to_port(dlp);
110 
111 	return ocelot_sb_tc_pool_bind_set(ocelot, port, sb_index, tc_index,
112 					  pool_type, pool_index, threshold,
113 					  extack);
114 }
115 
ocelot_devlink_sb_occ_snapshot(struct devlink * dl,unsigned int sb_index)116 static int ocelot_devlink_sb_occ_snapshot(struct devlink *dl,
117 					  unsigned int sb_index)
118 {
119 	struct ocelot *ocelot = devlink_priv(dl);
120 
121 	return ocelot_sb_occ_snapshot(ocelot, sb_index);
122 }
123 
ocelot_devlink_sb_occ_max_clear(struct devlink * dl,unsigned int sb_index)124 static int ocelot_devlink_sb_occ_max_clear(struct devlink *dl,
125 					   unsigned int sb_index)
126 {
127 	struct ocelot *ocelot = devlink_priv(dl);
128 
129 	return ocelot_sb_occ_max_clear(ocelot, sb_index);
130 }
131 
ocelot_devlink_sb_occ_port_pool_get(struct devlink_port * dlp,unsigned int sb_index,u16 pool_index,u32 * p_cur,u32 * p_max)132 static int ocelot_devlink_sb_occ_port_pool_get(struct devlink_port *dlp,
133 					       unsigned int sb_index,
134 					       u16 pool_index, u32 *p_cur,
135 					       u32 *p_max)
136 {
137 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
138 	int port = devlink_port_to_port(dlp);
139 
140 	return ocelot_sb_occ_port_pool_get(ocelot, port, sb_index, pool_index,
141 					   p_cur, p_max);
142 }
143 
144 static int
ocelot_devlink_sb_occ_tc_port_bind_get(struct devlink_port * dlp,unsigned int sb_index,u16 tc_index,enum devlink_sb_pool_type pool_type,u32 * p_cur,u32 * p_max)145 ocelot_devlink_sb_occ_tc_port_bind_get(struct devlink_port *dlp,
146 				       unsigned int sb_index, u16 tc_index,
147 				       enum devlink_sb_pool_type pool_type,
148 				       u32 *p_cur, u32 *p_max)
149 {
150 	struct ocelot *ocelot = devlink_port_to_ocelot(dlp);
151 	int port = devlink_port_to_port(dlp);
152 
153 	return ocelot_sb_occ_tc_port_bind_get(ocelot, port, sb_index,
154 					      tc_index, pool_type,
155 					      p_cur, p_max);
156 }
157 
158 const struct devlink_ops ocelot_devlink_ops = {
159 	.sb_pool_get			= ocelot_devlink_sb_pool_get,
160 	.sb_pool_set			= ocelot_devlink_sb_pool_set,
161 	.sb_port_pool_get		= ocelot_devlink_sb_port_pool_get,
162 	.sb_port_pool_set		= ocelot_devlink_sb_port_pool_set,
163 	.sb_tc_pool_bind_get		= ocelot_devlink_sb_tc_pool_bind_get,
164 	.sb_tc_pool_bind_set		= ocelot_devlink_sb_tc_pool_bind_set,
165 	.sb_occ_snapshot		= ocelot_devlink_sb_occ_snapshot,
166 	.sb_occ_max_clear		= ocelot_devlink_sb_occ_max_clear,
167 	.sb_occ_port_pool_get		= ocelot_devlink_sb_occ_port_pool_get,
168 	.sb_occ_tc_port_bind_get	= ocelot_devlink_sb_occ_tc_port_bind_get,
169 };
170 
ocelot_port_devlink_init(struct ocelot * ocelot,int port,enum devlink_port_flavour flavour)171 int ocelot_port_devlink_init(struct ocelot *ocelot, int port,
172 			     enum devlink_port_flavour flavour)
173 {
174 	struct devlink_port *dlp = &ocelot->devlink_ports[port];
175 	int id_len = sizeof(ocelot->base_mac);
176 	struct devlink *dl = ocelot->devlink;
177 	struct devlink_port_attrs attrs = {};
178 
179 	memset(dlp, 0, sizeof(*dlp));
180 	memcpy(attrs.switch_id.id, &ocelot->base_mac, id_len);
181 	attrs.switch_id.id_len = id_len;
182 	attrs.phys.port_number = port;
183 	attrs.flavour = flavour;
184 
185 	devlink_port_attrs_set(dlp, &attrs);
186 
187 	return devlink_port_register(dl, dlp, port);
188 }
189 
ocelot_port_devlink_teardown(struct ocelot * ocelot,int port)190 void ocelot_port_devlink_teardown(struct ocelot *ocelot, int port)
191 {
192 	struct devlink_port *dlp = &ocelot->devlink_ports[port];
193 
194 	devlink_port_unregister(dlp);
195 }
196 
ocelot_get_devlink_port(struct net_device * dev)197 static struct devlink_port *ocelot_get_devlink_port(struct net_device *dev)
198 {
199 	struct ocelot_port_private *priv = netdev_priv(dev);
200 	struct ocelot *ocelot = priv->port.ocelot;
201 	int port = priv->port.index;
202 
203 	return &ocelot->devlink_ports[port];
204 }
205 
ocelot_setup_tc_cls_flower(struct ocelot_port_private * priv,struct flow_cls_offload * f,bool ingress)206 int ocelot_setup_tc_cls_flower(struct ocelot_port_private *priv,
207 			       struct flow_cls_offload *f,
208 			       bool ingress)
209 {
210 	struct ocelot *ocelot = priv->port.ocelot;
211 	int port = priv->port.index;
212 
213 	if (!ingress)
214 		return -EOPNOTSUPP;
215 
216 	switch (f->command) {
217 	case FLOW_CLS_REPLACE:
218 		return ocelot_cls_flower_replace(ocelot, port, f, ingress);
219 	case FLOW_CLS_DESTROY:
220 		return ocelot_cls_flower_destroy(ocelot, port, f, ingress);
221 	case FLOW_CLS_STATS:
222 		return ocelot_cls_flower_stats(ocelot, port, f, ingress);
223 	default:
224 		return -EOPNOTSUPP;
225 	}
226 }
227 
ocelot_setup_tc_cls_matchall_police(struct ocelot_port_private * priv,struct tc_cls_matchall_offload * f,bool ingress,struct netlink_ext_ack * extack)228 static int ocelot_setup_tc_cls_matchall_police(struct ocelot_port_private *priv,
229 					       struct tc_cls_matchall_offload *f,
230 					       bool ingress,
231 					       struct netlink_ext_ack *extack)
232 {
233 	struct flow_action_entry *action = &f->rule->action.entries[0];
234 	struct ocelot *ocelot = priv->port.ocelot;
235 	struct ocelot_policer pol = { 0 };
236 	int port = priv->port.index;
237 	int err;
238 
239 	if (!ingress) {
240 		NL_SET_ERR_MSG_MOD(extack, "Only ingress is supported");
241 		return -EOPNOTSUPP;
242 	}
243 
244 	if (priv->tc.police_id && priv->tc.police_id != f->cookie) {
245 		NL_SET_ERR_MSG_MOD(extack,
246 				   "Only one policer per port is supported");
247 		return -EEXIST;
248 	}
249 
250 	err = ocelot_policer_validate(&f->rule->action, action, extack);
251 	if (err)
252 		return err;
253 
254 	pol.rate = (u32)div_u64(action->police.rate_bytes_ps, 1000) * 8;
255 	pol.burst = action->police.burst;
256 
257 	err = ocelot_port_policer_add(ocelot, port, &pol);
258 	if (err) {
259 		NL_SET_ERR_MSG_MOD(extack, "Could not add policer");
260 		return err;
261 	}
262 
263 	priv->tc.police_id = f->cookie;
264 	priv->tc.offload_cnt++;
265 
266 	return 0;
267 }
268 
ocelot_setup_tc_cls_matchall_mirred(struct ocelot_port_private * priv,struct tc_cls_matchall_offload * f,bool ingress,struct netlink_ext_ack * extack)269 static int ocelot_setup_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
270 					       struct tc_cls_matchall_offload *f,
271 					       bool ingress,
272 					       struct netlink_ext_ack *extack)
273 {
274 	struct flow_action *action = &f->rule->action;
275 	struct ocelot *ocelot = priv->port.ocelot;
276 	struct ocelot_port_private *other_priv;
277 	const struct flow_action_entry *a;
278 	int err;
279 
280 	if (f->common.protocol != htons(ETH_P_ALL))
281 		return -EOPNOTSUPP;
282 
283 	if (!flow_action_basic_hw_stats_check(action, extack))
284 		return -EOPNOTSUPP;
285 
286 	a = &action->entries[0];
287 	if (!a->dev)
288 		return -EINVAL;
289 
290 	if (!ocelot_netdevice_dev_check(a->dev)) {
291 		NL_SET_ERR_MSG_MOD(extack,
292 				   "Destination not an ocelot port");
293 		return -EOPNOTSUPP;
294 	}
295 
296 	other_priv = netdev_priv(a->dev);
297 
298 	err = ocelot_port_mirror_add(ocelot, priv->port.index,
299 				     other_priv->port.index, ingress, extack);
300 	if (err)
301 		return err;
302 
303 	if (ingress)
304 		priv->tc.ingress_mirred_id = f->cookie;
305 	else
306 		priv->tc.egress_mirred_id = f->cookie;
307 	priv->tc.offload_cnt++;
308 
309 	return 0;
310 }
311 
ocelot_del_tc_cls_matchall_police(struct ocelot_port_private * priv,struct netlink_ext_ack * extack)312 static int ocelot_del_tc_cls_matchall_police(struct ocelot_port_private *priv,
313 					     struct netlink_ext_ack *extack)
314 {
315 	struct ocelot *ocelot = priv->port.ocelot;
316 	int port = priv->port.index;
317 	int err;
318 
319 	err = ocelot_port_policer_del(ocelot, port);
320 	if (err) {
321 		NL_SET_ERR_MSG_MOD(extack,
322 				   "Could not delete policer");
323 		return err;
324 	}
325 
326 	priv->tc.police_id = 0;
327 	priv->tc.offload_cnt--;
328 
329 	return 0;
330 }
331 
ocelot_del_tc_cls_matchall_mirred(struct ocelot_port_private * priv,bool ingress,struct netlink_ext_ack * extack)332 static int ocelot_del_tc_cls_matchall_mirred(struct ocelot_port_private *priv,
333 					     bool ingress,
334 					     struct netlink_ext_ack *extack)
335 {
336 	struct ocelot *ocelot = priv->port.ocelot;
337 	int port = priv->port.index;
338 
339 	ocelot_port_mirror_del(ocelot, port, ingress);
340 
341 	if (ingress)
342 		priv->tc.ingress_mirred_id = 0;
343 	else
344 		priv->tc.egress_mirred_id = 0;
345 	priv->tc.offload_cnt--;
346 
347 	return 0;
348 }
349 
ocelot_setup_tc_cls_matchall(struct ocelot_port_private * priv,struct tc_cls_matchall_offload * f,bool ingress)350 static int ocelot_setup_tc_cls_matchall(struct ocelot_port_private *priv,
351 					struct tc_cls_matchall_offload *f,
352 					bool ingress)
353 {
354 	struct netlink_ext_ack *extack = f->common.extack;
355 	struct flow_action_entry *action;
356 
357 	switch (f->command) {
358 	case TC_CLSMATCHALL_REPLACE:
359 		if (!flow_offload_has_one_action(&f->rule->action)) {
360 			NL_SET_ERR_MSG_MOD(extack,
361 					   "Only one action is supported");
362 			return -EOPNOTSUPP;
363 		}
364 
365 		if (priv->tc.block_shared) {
366 			NL_SET_ERR_MSG_MOD(extack,
367 					   "Matchall offloads not supported on shared blocks");
368 			return -EOPNOTSUPP;
369 		}
370 
371 		action = &f->rule->action.entries[0];
372 
373 		switch (action->id) {
374 		case FLOW_ACTION_POLICE:
375 			return ocelot_setup_tc_cls_matchall_police(priv, f,
376 								   ingress,
377 								   extack);
378 			break;
379 		case FLOW_ACTION_MIRRED:
380 			return ocelot_setup_tc_cls_matchall_mirred(priv, f,
381 								   ingress,
382 								   extack);
383 		default:
384 			NL_SET_ERR_MSG_MOD(extack, "Unsupported action");
385 			return -EOPNOTSUPP;
386 		}
387 
388 		break;
389 	case TC_CLSMATCHALL_DESTROY:
390 		action = &f->rule->action.entries[0];
391 
392 		if (f->cookie == priv->tc.police_id)
393 			return ocelot_del_tc_cls_matchall_police(priv, extack);
394 		else if (f->cookie == priv->tc.ingress_mirred_id ||
395 			 f->cookie == priv->tc.egress_mirred_id)
396 			return ocelot_del_tc_cls_matchall_mirred(priv, ingress,
397 								 extack);
398 		else
399 			return -ENOENT;
400 
401 		break;
402 	case TC_CLSMATCHALL_STATS:
403 	default:
404 		return -EOPNOTSUPP;
405 	}
406 }
407 
ocelot_setup_tc_block_cb(enum tc_setup_type type,void * type_data,void * cb_priv,bool ingress)408 static int ocelot_setup_tc_block_cb(enum tc_setup_type type,
409 				    void *type_data,
410 				    void *cb_priv, bool ingress)
411 {
412 	struct ocelot_port_private *priv = cb_priv;
413 
414 	if (!tc_cls_can_offload_and_chain0(priv->dev, type_data))
415 		return -EOPNOTSUPP;
416 
417 	switch (type) {
418 	case TC_SETUP_CLSMATCHALL:
419 		return ocelot_setup_tc_cls_matchall(priv, type_data, ingress);
420 	case TC_SETUP_CLSFLOWER:
421 		return ocelot_setup_tc_cls_flower(priv, type_data, ingress);
422 	default:
423 		return -EOPNOTSUPP;
424 	}
425 }
426 
ocelot_setup_tc_block_cb_ig(enum tc_setup_type type,void * type_data,void * cb_priv)427 static int ocelot_setup_tc_block_cb_ig(enum tc_setup_type type,
428 				       void *type_data,
429 				       void *cb_priv)
430 {
431 	return ocelot_setup_tc_block_cb(type, type_data,
432 					cb_priv, true);
433 }
434 
ocelot_setup_tc_block_cb_eg(enum tc_setup_type type,void * type_data,void * cb_priv)435 static int ocelot_setup_tc_block_cb_eg(enum tc_setup_type type,
436 				       void *type_data,
437 				       void *cb_priv)
438 {
439 	return ocelot_setup_tc_block_cb(type, type_data,
440 					cb_priv, false);
441 }
442 
443 static LIST_HEAD(ocelot_block_cb_list);
444 
ocelot_setup_tc_block(struct ocelot_port_private * priv,struct flow_block_offload * f)445 static int ocelot_setup_tc_block(struct ocelot_port_private *priv,
446 				 struct flow_block_offload *f)
447 {
448 	struct flow_block_cb *block_cb;
449 	flow_setup_cb_t *cb;
450 
451 	if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_INGRESS) {
452 		cb = ocelot_setup_tc_block_cb_ig;
453 		priv->tc.block_shared = f->block_shared;
454 	} else if (f->binder_type == FLOW_BLOCK_BINDER_TYPE_CLSACT_EGRESS) {
455 		cb = ocelot_setup_tc_block_cb_eg;
456 	} else {
457 		return -EOPNOTSUPP;
458 	}
459 
460 	f->driver_block_list = &ocelot_block_cb_list;
461 
462 	switch (f->command) {
463 	case FLOW_BLOCK_BIND:
464 		if (flow_block_cb_is_busy(cb, priv, &ocelot_block_cb_list))
465 			return -EBUSY;
466 
467 		block_cb = flow_block_cb_alloc(cb, priv, priv, NULL);
468 		if (IS_ERR(block_cb))
469 			return PTR_ERR(block_cb);
470 
471 		flow_block_cb_add(block_cb, f);
472 		list_add_tail(&block_cb->driver_list, f->driver_block_list);
473 		return 0;
474 	case FLOW_BLOCK_UNBIND:
475 		block_cb = flow_block_cb_lookup(f->block, cb, priv);
476 		if (!block_cb)
477 			return -ENOENT;
478 
479 		flow_block_cb_remove(block_cb, f);
480 		list_del(&block_cb->driver_list);
481 		return 0;
482 	default:
483 		return -EOPNOTSUPP;
484 	}
485 }
486 
ocelot_setup_tc(struct net_device * dev,enum tc_setup_type type,void * type_data)487 static int ocelot_setup_tc(struct net_device *dev, enum tc_setup_type type,
488 			   void *type_data)
489 {
490 	struct ocelot_port_private *priv = netdev_priv(dev);
491 
492 	switch (type) {
493 	case TC_SETUP_BLOCK:
494 		return ocelot_setup_tc_block(priv, type_data);
495 	default:
496 		return -EOPNOTSUPP;
497 	}
498 	return 0;
499 }
500 
ocelot_vlan_vid_add(struct net_device * dev,u16 vid,bool pvid,bool untagged)501 static int ocelot_vlan_vid_add(struct net_device *dev, u16 vid, bool pvid,
502 			       bool untagged)
503 {
504 	struct ocelot_port_private *priv = netdev_priv(dev);
505 	struct ocelot_port *ocelot_port = &priv->port;
506 	struct ocelot *ocelot = ocelot_port->ocelot;
507 	int port = priv->port.index;
508 	int ret;
509 
510 	ret = ocelot_vlan_add(ocelot, port, vid, pvid, untagged);
511 	if (ret)
512 		return ret;
513 
514 	/* Add the port MAC address to with the right VLAN information */
515 	ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr, vid,
516 			  ENTRYTYPE_LOCKED);
517 
518 	return 0;
519 }
520 
ocelot_vlan_vid_del(struct net_device * dev,u16 vid)521 static int ocelot_vlan_vid_del(struct net_device *dev, u16 vid)
522 {
523 	struct ocelot_port_private *priv = netdev_priv(dev);
524 	struct ocelot *ocelot = priv->port.ocelot;
525 	int port = priv->port.index;
526 	int ret;
527 
528 	/* 8021q removes VID 0 on module unload for all interfaces
529 	 * with VLAN filtering feature. We need to keep it to receive
530 	 * untagged traffic.
531 	 */
532 	if (vid == OCELOT_STANDALONE_PVID)
533 		return 0;
534 
535 	ret = ocelot_vlan_del(ocelot, port, vid);
536 	if (ret)
537 		return ret;
538 
539 	/* Del the port MAC address to with the right VLAN information */
540 	ocelot_mact_forget(ocelot, dev->dev_addr, vid);
541 
542 	return 0;
543 }
544 
ocelot_port_open(struct net_device * dev)545 static int ocelot_port_open(struct net_device *dev)
546 {
547 	struct ocelot_port_private *priv = netdev_priv(dev);
548 
549 	phylink_start(priv->phylink);
550 
551 	return 0;
552 }
553 
ocelot_port_stop(struct net_device * dev)554 static int ocelot_port_stop(struct net_device *dev)
555 {
556 	struct ocelot_port_private *priv = netdev_priv(dev);
557 
558 	phylink_stop(priv->phylink);
559 
560 	return 0;
561 }
562 
ocelot_port_xmit(struct sk_buff * skb,struct net_device * dev)563 static netdev_tx_t ocelot_port_xmit(struct sk_buff *skb, struct net_device *dev)
564 {
565 	struct ocelot_port_private *priv = netdev_priv(dev);
566 	struct ocelot_port *ocelot_port = &priv->port;
567 	struct ocelot *ocelot = ocelot_port->ocelot;
568 	int port = priv->port.index;
569 	u32 rew_op = 0;
570 
571 	if (!static_branch_unlikely(&ocelot_fdma_enabled) &&
572 	    !ocelot_can_inject(ocelot, 0))
573 		return NETDEV_TX_BUSY;
574 
575 	/* Check if timestamping is needed */
576 	if (ocelot->ptp && (skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
577 		struct sk_buff *clone = NULL;
578 
579 		if (ocelot_port_txtstamp_request(ocelot, port, skb, &clone)) {
580 			kfree_skb(skb);
581 			return NETDEV_TX_OK;
582 		}
583 
584 		if (clone)
585 			OCELOT_SKB_CB(skb)->clone = clone;
586 
587 		rew_op = ocelot_ptp_rew_op(skb);
588 	}
589 
590 	if (static_branch_unlikely(&ocelot_fdma_enabled)) {
591 		ocelot_fdma_inject_frame(ocelot, port, rew_op, skb, dev);
592 	} else {
593 		ocelot_port_inject_frame(ocelot, port, 0, rew_op, skb);
594 
595 		consume_skb(skb);
596 	}
597 
598 	return NETDEV_TX_OK;
599 }
600 
601 enum ocelot_action_type {
602 	OCELOT_MACT_LEARN,
603 	OCELOT_MACT_FORGET,
604 };
605 
606 struct ocelot_mact_work_ctx {
607 	struct work_struct work;
608 	struct ocelot *ocelot;
609 	enum ocelot_action_type type;
610 	union {
611 		/* OCELOT_MACT_LEARN */
612 		struct {
613 			unsigned char addr[ETH_ALEN];
614 			u16 vid;
615 			enum macaccess_entry_type entry_type;
616 			int pgid;
617 		} learn;
618 		/* OCELOT_MACT_FORGET */
619 		struct {
620 			unsigned char addr[ETH_ALEN];
621 			u16 vid;
622 		} forget;
623 	};
624 };
625 
626 #define ocelot_work_to_ctx(x) \
627 	container_of((x), struct ocelot_mact_work_ctx, work)
628 
ocelot_mact_work(struct work_struct * work)629 static void ocelot_mact_work(struct work_struct *work)
630 {
631 	struct ocelot_mact_work_ctx *w = ocelot_work_to_ctx(work);
632 	struct ocelot *ocelot = w->ocelot;
633 
634 	switch (w->type) {
635 	case OCELOT_MACT_LEARN:
636 		ocelot_mact_learn(ocelot, w->learn.pgid, w->learn.addr,
637 				  w->learn.vid, w->learn.entry_type);
638 		break;
639 	case OCELOT_MACT_FORGET:
640 		ocelot_mact_forget(ocelot, w->forget.addr, w->forget.vid);
641 		break;
642 	default:
643 		break;
644 	}
645 
646 	kfree(w);
647 }
648 
ocelot_enqueue_mact_action(struct ocelot * ocelot,const struct ocelot_mact_work_ctx * ctx)649 static int ocelot_enqueue_mact_action(struct ocelot *ocelot,
650 				      const struct ocelot_mact_work_ctx *ctx)
651 {
652 	struct ocelot_mact_work_ctx *w = kmemdup(ctx, sizeof(*w), GFP_ATOMIC);
653 
654 	if (!w)
655 		return -ENOMEM;
656 
657 	w->ocelot = ocelot;
658 	INIT_WORK(&w->work, ocelot_mact_work);
659 	queue_work(ocelot->owq, &w->work);
660 
661 	return 0;
662 }
663 
ocelot_mc_unsync(struct net_device * dev,const unsigned char * addr)664 static int ocelot_mc_unsync(struct net_device *dev, const unsigned char *addr)
665 {
666 	struct ocelot_port_private *priv = netdev_priv(dev);
667 	struct ocelot_port *ocelot_port = &priv->port;
668 	struct ocelot *ocelot = ocelot_port->ocelot;
669 	struct ocelot_mact_work_ctx w;
670 
671 	ether_addr_copy(w.forget.addr, addr);
672 	w.forget.vid = OCELOT_STANDALONE_PVID;
673 	w.type = OCELOT_MACT_FORGET;
674 
675 	return ocelot_enqueue_mact_action(ocelot, &w);
676 }
677 
ocelot_mc_sync(struct net_device * dev,const unsigned char * addr)678 static int ocelot_mc_sync(struct net_device *dev, const unsigned char *addr)
679 {
680 	struct ocelot_port_private *priv = netdev_priv(dev);
681 	struct ocelot_port *ocelot_port = &priv->port;
682 	struct ocelot *ocelot = ocelot_port->ocelot;
683 	struct ocelot_mact_work_ctx w;
684 
685 	ether_addr_copy(w.learn.addr, addr);
686 	w.learn.vid = OCELOT_STANDALONE_PVID;
687 	w.learn.pgid = PGID_CPU;
688 	w.learn.entry_type = ENTRYTYPE_LOCKED;
689 	w.type = OCELOT_MACT_LEARN;
690 
691 	return ocelot_enqueue_mact_action(ocelot, &w);
692 }
693 
ocelot_set_rx_mode(struct net_device * dev)694 static void ocelot_set_rx_mode(struct net_device *dev)
695 {
696 	struct ocelot_port_private *priv = netdev_priv(dev);
697 	struct ocelot *ocelot = priv->port.ocelot;
698 	u32 val;
699 	int i;
700 
701 	/* This doesn't handle promiscuous mode because the bridge core is
702 	 * setting IFF_PROMISC on all slave interfaces and all frames would be
703 	 * forwarded to the CPU port.
704 	 */
705 	val = GENMASK(ocelot->num_phys_ports - 1, 0);
706 	for_each_nonreserved_multicast_dest_pgid(ocelot, i)
707 		ocelot_write_rix(ocelot, val, ANA_PGID_PGID, i);
708 
709 	__dev_mc_sync(dev, ocelot_mc_sync, ocelot_mc_unsync);
710 }
711 
ocelot_port_set_mac_address(struct net_device * dev,void * p)712 static int ocelot_port_set_mac_address(struct net_device *dev, void *p)
713 {
714 	struct ocelot_port_private *priv = netdev_priv(dev);
715 	struct ocelot_port *ocelot_port = &priv->port;
716 	struct ocelot *ocelot = ocelot_port->ocelot;
717 	const struct sockaddr *addr = p;
718 
719 	/* Learn the new net device MAC address in the mac table. */
720 	ocelot_mact_learn(ocelot, PGID_CPU, addr->sa_data,
721 			  OCELOT_STANDALONE_PVID, ENTRYTYPE_LOCKED);
722 	/* Then forget the previous one. */
723 	ocelot_mact_forget(ocelot, dev->dev_addr, OCELOT_STANDALONE_PVID);
724 
725 	eth_hw_addr_set(dev, addr->sa_data);
726 	return 0;
727 }
728 
ocelot_get_stats64(struct net_device * dev,struct rtnl_link_stats64 * stats)729 static void ocelot_get_stats64(struct net_device *dev,
730 			       struct rtnl_link_stats64 *stats)
731 {
732 	struct ocelot_port_private *priv = netdev_priv(dev);
733 	struct ocelot *ocelot = priv->port.ocelot;
734 	int port = priv->port.index;
735 
736 	return ocelot_port_get_stats64(ocelot, port, stats);
737 }
738 
ocelot_port_fdb_add(struct ndmsg * ndm,struct nlattr * tb[],struct net_device * dev,const unsigned char * addr,u16 vid,u16 flags,struct netlink_ext_ack * extack)739 static int ocelot_port_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
740 			       struct net_device *dev,
741 			       const unsigned char *addr,
742 			       u16 vid, u16 flags,
743 			       struct netlink_ext_ack *extack)
744 {
745 	struct ocelot_port_private *priv = netdev_priv(dev);
746 	struct ocelot_port *ocelot_port = &priv->port;
747 	struct ocelot *ocelot = ocelot_port->ocelot;
748 	int port = priv->port.index;
749 
750 	return ocelot_fdb_add(ocelot, port, addr, vid, ocelot_port->bridge);
751 }
752 
ocelot_port_fdb_del(struct ndmsg * ndm,struct nlattr * tb[],struct net_device * dev,const unsigned char * addr,u16 vid,struct netlink_ext_ack * extack)753 static int ocelot_port_fdb_del(struct ndmsg *ndm, struct nlattr *tb[],
754 			       struct net_device *dev,
755 			       const unsigned char *addr, u16 vid,
756 			       struct netlink_ext_ack *extack)
757 {
758 	struct ocelot_port_private *priv = netdev_priv(dev);
759 	struct ocelot_port *ocelot_port = &priv->port;
760 	struct ocelot *ocelot = ocelot_port->ocelot;
761 	int port = priv->port.index;
762 
763 	return ocelot_fdb_del(ocelot, port, addr, vid, ocelot_port->bridge);
764 }
765 
ocelot_port_fdb_do_dump(const unsigned char * addr,u16 vid,bool is_static,void * data)766 static int ocelot_port_fdb_do_dump(const unsigned char *addr, u16 vid,
767 				   bool is_static, void *data)
768 {
769 	struct ocelot_dump_ctx *dump = data;
770 	u32 portid = NETLINK_CB(dump->cb->skb).portid;
771 	u32 seq = dump->cb->nlh->nlmsg_seq;
772 	struct nlmsghdr *nlh;
773 	struct ndmsg *ndm;
774 
775 	if (dump->idx < dump->cb->args[2])
776 		goto skip;
777 
778 	nlh = nlmsg_put(dump->skb, portid, seq, RTM_NEWNEIGH,
779 			sizeof(*ndm), NLM_F_MULTI);
780 	if (!nlh)
781 		return -EMSGSIZE;
782 
783 	ndm = nlmsg_data(nlh);
784 	ndm->ndm_family  = AF_BRIDGE;
785 	ndm->ndm_pad1    = 0;
786 	ndm->ndm_pad2    = 0;
787 	ndm->ndm_flags   = NTF_SELF;
788 	ndm->ndm_type    = 0;
789 	ndm->ndm_ifindex = dump->dev->ifindex;
790 	ndm->ndm_state   = is_static ? NUD_NOARP : NUD_REACHABLE;
791 
792 	if (nla_put(dump->skb, NDA_LLADDR, ETH_ALEN, addr))
793 		goto nla_put_failure;
794 
795 	if (vid && nla_put_u16(dump->skb, NDA_VLAN, vid))
796 		goto nla_put_failure;
797 
798 	nlmsg_end(dump->skb, nlh);
799 
800 skip:
801 	dump->idx++;
802 	return 0;
803 
804 nla_put_failure:
805 	nlmsg_cancel(dump->skb, nlh);
806 	return -EMSGSIZE;
807 }
808 
ocelot_port_fdb_dump(struct sk_buff * skb,struct netlink_callback * cb,struct net_device * dev,struct net_device * filter_dev,int * idx)809 static int ocelot_port_fdb_dump(struct sk_buff *skb,
810 				struct netlink_callback *cb,
811 				struct net_device *dev,
812 				struct net_device *filter_dev, int *idx)
813 {
814 	struct ocelot_port_private *priv = netdev_priv(dev);
815 	struct ocelot *ocelot = priv->port.ocelot;
816 	struct ocelot_dump_ctx dump = {
817 		.dev = dev,
818 		.skb = skb,
819 		.cb = cb,
820 		.idx = *idx,
821 	};
822 	int port = priv->port.index;
823 	int ret;
824 
825 	ret = ocelot_fdb_dump(ocelot, port, ocelot_port_fdb_do_dump, &dump);
826 
827 	*idx = dump.idx;
828 
829 	return ret;
830 }
831 
ocelot_vlan_rx_add_vid(struct net_device * dev,__be16 proto,u16 vid)832 static int ocelot_vlan_rx_add_vid(struct net_device *dev, __be16 proto,
833 				  u16 vid)
834 {
835 	return ocelot_vlan_vid_add(dev, vid, false, false);
836 }
837 
ocelot_vlan_rx_kill_vid(struct net_device * dev,__be16 proto,u16 vid)838 static int ocelot_vlan_rx_kill_vid(struct net_device *dev, __be16 proto,
839 				   u16 vid)
840 {
841 	return ocelot_vlan_vid_del(dev, vid);
842 }
843 
ocelot_vlan_mode(struct ocelot * ocelot,int port,netdev_features_t features)844 static void ocelot_vlan_mode(struct ocelot *ocelot, int port,
845 			     netdev_features_t features)
846 {
847 	u32 val;
848 
849 	/* Filtering */
850 	val = ocelot_read(ocelot, ANA_VLANMASK);
851 	if (features & NETIF_F_HW_VLAN_CTAG_FILTER)
852 		val |= BIT(port);
853 	else
854 		val &= ~BIT(port);
855 	ocelot_write(ocelot, val, ANA_VLANMASK);
856 }
857 
ocelot_set_features(struct net_device * dev,netdev_features_t features)858 static int ocelot_set_features(struct net_device *dev,
859 			       netdev_features_t features)
860 {
861 	netdev_features_t changed = dev->features ^ features;
862 	struct ocelot_port_private *priv = netdev_priv(dev);
863 	struct ocelot *ocelot = priv->port.ocelot;
864 	int port = priv->port.index;
865 
866 	if ((dev->features & NETIF_F_HW_TC) > (features & NETIF_F_HW_TC) &&
867 	    priv->tc.offload_cnt) {
868 		netdev_err(dev,
869 			   "Cannot disable HW TC offload while offloads active\n");
870 		return -EBUSY;
871 	}
872 
873 	if (changed & NETIF_F_HW_VLAN_CTAG_FILTER)
874 		ocelot_vlan_mode(ocelot, port, features);
875 
876 	return 0;
877 }
878 
ocelot_ioctl(struct net_device * dev,struct ifreq * ifr,int cmd)879 static int ocelot_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
880 {
881 	struct ocelot_port_private *priv = netdev_priv(dev);
882 	struct ocelot *ocelot = priv->port.ocelot;
883 	int port = priv->port.index;
884 
885 	/* If the attached PHY device isn't capable of timestamping operations,
886 	 * use our own (when possible).
887 	 */
888 	if (!phy_has_hwtstamp(dev->phydev) && ocelot->ptp) {
889 		switch (cmd) {
890 		case SIOCSHWTSTAMP:
891 			return ocelot_hwstamp_set(ocelot, port, ifr);
892 		case SIOCGHWTSTAMP:
893 			return ocelot_hwstamp_get(ocelot, port, ifr);
894 		}
895 	}
896 
897 	return phy_mii_ioctl(dev->phydev, ifr, cmd);
898 }
899 
ocelot_change_mtu(struct net_device * dev,int new_mtu)900 static int ocelot_change_mtu(struct net_device *dev, int new_mtu)
901 {
902 	struct ocelot_port_private *priv = netdev_priv(dev);
903 	struct ocelot_port *ocelot_port = &priv->port;
904 	struct ocelot *ocelot = ocelot_port->ocelot;
905 
906 	ocelot_port_set_maxlen(ocelot, priv->port.index, new_mtu);
907 	WRITE_ONCE(dev->mtu, new_mtu);
908 
909 	return 0;
910 }
911 
912 static const struct net_device_ops ocelot_port_netdev_ops = {
913 	.ndo_open			= ocelot_port_open,
914 	.ndo_stop			= ocelot_port_stop,
915 	.ndo_start_xmit			= ocelot_port_xmit,
916 	.ndo_change_mtu			= ocelot_change_mtu,
917 	.ndo_set_rx_mode		= ocelot_set_rx_mode,
918 	.ndo_set_mac_address		= ocelot_port_set_mac_address,
919 	.ndo_get_stats64		= ocelot_get_stats64,
920 	.ndo_fdb_add			= ocelot_port_fdb_add,
921 	.ndo_fdb_del			= ocelot_port_fdb_del,
922 	.ndo_fdb_dump			= ocelot_port_fdb_dump,
923 	.ndo_vlan_rx_add_vid		= ocelot_vlan_rx_add_vid,
924 	.ndo_vlan_rx_kill_vid		= ocelot_vlan_rx_kill_vid,
925 	.ndo_set_features		= ocelot_set_features,
926 	.ndo_setup_tc			= ocelot_setup_tc,
927 	.ndo_eth_ioctl			= ocelot_ioctl,
928 	.ndo_get_devlink_port		= ocelot_get_devlink_port,
929 };
930 
ocelot_port_to_netdev(struct ocelot * ocelot,int port)931 struct net_device *ocelot_port_to_netdev(struct ocelot *ocelot, int port)
932 {
933 	struct ocelot_port *ocelot_port = ocelot->ports[port];
934 	struct ocelot_port_private *priv;
935 
936 	if (!ocelot_port)
937 		return NULL;
938 
939 	priv = container_of(ocelot_port, struct ocelot_port_private, port);
940 
941 	return priv->dev;
942 }
943 
944 /* Checks if the net_device instance given to us originates from our driver */
ocelot_netdevice_dev_check(const struct net_device * dev)945 static bool ocelot_netdevice_dev_check(const struct net_device *dev)
946 {
947 	return dev->netdev_ops == &ocelot_port_netdev_ops;
948 }
949 
ocelot_netdev_to_port(struct net_device * dev)950 int ocelot_netdev_to_port(struct net_device *dev)
951 {
952 	struct ocelot_port_private *priv;
953 
954 	if (!dev || !ocelot_netdevice_dev_check(dev))
955 		return -EINVAL;
956 
957 	priv = netdev_priv(dev);
958 
959 	return priv->port.index;
960 }
961 
ocelot_port_get_strings(struct net_device * netdev,u32 sset,u8 * data)962 static void ocelot_port_get_strings(struct net_device *netdev, u32 sset,
963 				    u8 *data)
964 {
965 	struct ocelot_port_private *priv = netdev_priv(netdev);
966 	struct ocelot *ocelot = priv->port.ocelot;
967 	int port = priv->port.index;
968 
969 	ocelot_get_strings(ocelot, port, sset, data);
970 }
971 
ocelot_port_get_ethtool_stats(struct net_device * dev,struct ethtool_stats * stats,u64 * data)972 static void ocelot_port_get_ethtool_stats(struct net_device *dev,
973 					  struct ethtool_stats *stats,
974 					  u64 *data)
975 {
976 	struct ocelot_port_private *priv = netdev_priv(dev);
977 	struct ocelot *ocelot = priv->port.ocelot;
978 	int port = priv->port.index;
979 
980 	ocelot_get_ethtool_stats(ocelot, port, data);
981 }
982 
ocelot_port_get_sset_count(struct net_device * dev,int sset)983 static int ocelot_port_get_sset_count(struct net_device *dev, int sset)
984 {
985 	struct ocelot_port_private *priv = netdev_priv(dev);
986 	struct ocelot *ocelot = priv->port.ocelot;
987 	int port = priv->port.index;
988 
989 	return ocelot_get_sset_count(ocelot, port, sset);
990 }
991 
ocelot_port_get_ts_info(struct net_device * dev,struct ethtool_ts_info * info)992 static int ocelot_port_get_ts_info(struct net_device *dev,
993 				   struct ethtool_ts_info *info)
994 {
995 	struct ocelot_port_private *priv = netdev_priv(dev);
996 	struct ocelot *ocelot = priv->port.ocelot;
997 	int port = priv->port.index;
998 
999 	if (!ocelot->ptp)
1000 		return ethtool_op_get_ts_info(dev, info);
1001 
1002 	return ocelot_get_ts_info(ocelot, port, info);
1003 }
1004 
1005 static const struct ethtool_ops ocelot_ethtool_ops = {
1006 	.get_strings		= ocelot_port_get_strings,
1007 	.get_ethtool_stats	= ocelot_port_get_ethtool_stats,
1008 	.get_sset_count		= ocelot_port_get_sset_count,
1009 	.get_link_ksettings	= phy_ethtool_get_link_ksettings,
1010 	.set_link_ksettings	= phy_ethtool_set_link_ksettings,
1011 	.get_ts_info		= ocelot_port_get_ts_info,
1012 };
1013 
ocelot_port_attr_stp_state_set(struct ocelot * ocelot,int port,u8 state)1014 static void ocelot_port_attr_stp_state_set(struct ocelot *ocelot, int port,
1015 					   u8 state)
1016 {
1017 	ocelot_bridge_stp_state_set(ocelot, port, state);
1018 }
1019 
ocelot_port_attr_ageing_set(struct ocelot * ocelot,int port,unsigned long ageing_clock_t)1020 static void ocelot_port_attr_ageing_set(struct ocelot *ocelot, int port,
1021 					unsigned long ageing_clock_t)
1022 {
1023 	unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
1024 	u32 ageing_time = jiffies_to_msecs(ageing_jiffies);
1025 
1026 	ocelot_set_ageing_time(ocelot, ageing_time);
1027 }
1028 
ocelot_port_attr_mc_set(struct ocelot * ocelot,int port,bool mc)1029 static void ocelot_port_attr_mc_set(struct ocelot *ocelot, int port, bool mc)
1030 {
1031 	u32 cpu_fwd_mcast = ANA_PORT_CPU_FWD_CFG_CPU_IGMP_REDIR_ENA |
1032 			    ANA_PORT_CPU_FWD_CFG_CPU_MLD_REDIR_ENA |
1033 			    ANA_PORT_CPU_FWD_CFG_CPU_IPMC_CTRL_COPY_ENA;
1034 	u32 val = 0;
1035 
1036 	if (mc)
1037 		val = cpu_fwd_mcast;
1038 
1039 	ocelot_rmw_gix(ocelot, val, cpu_fwd_mcast,
1040 		       ANA_PORT_CPU_FWD_CFG, port);
1041 }
1042 
ocelot_port_attr_set(struct net_device * dev,const void * ctx,const struct switchdev_attr * attr,struct netlink_ext_ack * extack)1043 static int ocelot_port_attr_set(struct net_device *dev, const void *ctx,
1044 				const struct switchdev_attr *attr,
1045 				struct netlink_ext_ack *extack)
1046 {
1047 	struct ocelot_port_private *priv = netdev_priv(dev);
1048 	struct ocelot *ocelot = priv->port.ocelot;
1049 	int port = priv->port.index;
1050 	int err = 0;
1051 
1052 	if (ctx && ctx != priv)
1053 		return 0;
1054 
1055 	switch (attr->id) {
1056 	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1057 		ocelot_port_attr_stp_state_set(ocelot, port, attr->u.stp_state);
1058 		break;
1059 	case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
1060 		ocelot_port_attr_ageing_set(ocelot, port, attr->u.ageing_time);
1061 		break;
1062 	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
1063 		ocelot_port_vlan_filtering(ocelot, port, attr->u.vlan_filtering,
1064 					   extack);
1065 		break;
1066 	case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
1067 		ocelot_port_attr_mc_set(ocelot, port, !attr->u.mc_disabled);
1068 		break;
1069 	case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
1070 		err = ocelot_port_pre_bridge_flags(ocelot, port,
1071 						   attr->u.brport_flags);
1072 		break;
1073 	case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
1074 		ocelot_port_bridge_flags(ocelot, port, attr->u.brport_flags);
1075 		break;
1076 	default:
1077 		err = -EOPNOTSUPP;
1078 		break;
1079 	}
1080 
1081 	return err;
1082 }
1083 
ocelot_vlan_vid_prepare(struct net_device * dev,u16 vid,bool pvid,bool untagged,struct netlink_ext_ack * extack)1084 static int ocelot_vlan_vid_prepare(struct net_device *dev, u16 vid, bool pvid,
1085 				   bool untagged, struct netlink_ext_ack *extack)
1086 {
1087 	struct ocelot_port_private *priv = netdev_priv(dev);
1088 	struct ocelot_port *ocelot_port = &priv->port;
1089 	struct ocelot *ocelot = ocelot_port->ocelot;
1090 	int port = priv->port.index;
1091 
1092 	return ocelot_vlan_prepare(ocelot, port, vid, pvid, untagged, extack);
1093 }
1094 
ocelot_port_obj_add_vlan(struct net_device * dev,const struct switchdev_obj_port_vlan * vlan,struct netlink_ext_ack * extack)1095 static int ocelot_port_obj_add_vlan(struct net_device *dev,
1096 				    const struct switchdev_obj_port_vlan *vlan,
1097 				    struct netlink_ext_ack *extack)
1098 {
1099 	bool untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1100 	bool pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1101 	int ret;
1102 
1103 	ret = ocelot_vlan_vid_prepare(dev, vlan->vid, pvid, untagged, extack);
1104 	if (ret)
1105 		return ret;
1106 
1107 	return ocelot_vlan_vid_add(dev, vlan->vid, pvid, untagged);
1108 }
1109 
ocelot_port_obj_add_mdb(struct net_device * dev,const struct switchdev_obj_port_mdb * mdb)1110 static int ocelot_port_obj_add_mdb(struct net_device *dev,
1111 				   const struct switchdev_obj_port_mdb *mdb)
1112 {
1113 	struct ocelot_port_private *priv = netdev_priv(dev);
1114 	struct ocelot_port *ocelot_port = &priv->port;
1115 	struct ocelot *ocelot = ocelot_port->ocelot;
1116 	int port = priv->port.index;
1117 
1118 	return ocelot_port_mdb_add(ocelot, port, mdb, ocelot_port->bridge);
1119 }
1120 
ocelot_port_obj_del_mdb(struct net_device * dev,const struct switchdev_obj_port_mdb * mdb)1121 static int ocelot_port_obj_del_mdb(struct net_device *dev,
1122 				   const struct switchdev_obj_port_mdb *mdb)
1123 {
1124 	struct ocelot_port_private *priv = netdev_priv(dev);
1125 	struct ocelot_port *ocelot_port = &priv->port;
1126 	struct ocelot *ocelot = ocelot_port->ocelot;
1127 	int port = priv->port.index;
1128 
1129 	return ocelot_port_mdb_del(ocelot, port, mdb, ocelot_port->bridge);
1130 }
1131 
ocelot_port_obj_mrp_add(struct net_device * dev,const struct switchdev_obj_mrp * mrp)1132 static int ocelot_port_obj_mrp_add(struct net_device *dev,
1133 				   const struct switchdev_obj_mrp *mrp)
1134 {
1135 	struct ocelot_port_private *priv = netdev_priv(dev);
1136 	struct ocelot_port *ocelot_port = &priv->port;
1137 	struct ocelot *ocelot = ocelot_port->ocelot;
1138 	int port = priv->port.index;
1139 
1140 	return ocelot_mrp_add(ocelot, port, mrp);
1141 }
1142 
ocelot_port_obj_mrp_del(struct net_device * dev,const struct switchdev_obj_mrp * mrp)1143 static int ocelot_port_obj_mrp_del(struct net_device *dev,
1144 				   const struct switchdev_obj_mrp *mrp)
1145 {
1146 	struct ocelot_port_private *priv = netdev_priv(dev);
1147 	struct ocelot_port *ocelot_port = &priv->port;
1148 	struct ocelot *ocelot = ocelot_port->ocelot;
1149 	int port = priv->port.index;
1150 
1151 	return ocelot_mrp_del(ocelot, port, mrp);
1152 }
1153 
1154 static int
ocelot_port_obj_mrp_add_ring_role(struct net_device * dev,const struct switchdev_obj_ring_role_mrp * mrp)1155 ocelot_port_obj_mrp_add_ring_role(struct net_device *dev,
1156 				  const struct switchdev_obj_ring_role_mrp *mrp)
1157 {
1158 	struct ocelot_port_private *priv = netdev_priv(dev);
1159 	struct ocelot_port *ocelot_port = &priv->port;
1160 	struct ocelot *ocelot = ocelot_port->ocelot;
1161 	int port = priv->port.index;
1162 
1163 	return ocelot_mrp_add_ring_role(ocelot, port, mrp);
1164 }
1165 
1166 static int
ocelot_port_obj_mrp_del_ring_role(struct net_device * dev,const struct switchdev_obj_ring_role_mrp * mrp)1167 ocelot_port_obj_mrp_del_ring_role(struct net_device *dev,
1168 				  const struct switchdev_obj_ring_role_mrp *mrp)
1169 {
1170 	struct ocelot_port_private *priv = netdev_priv(dev);
1171 	struct ocelot_port *ocelot_port = &priv->port;
1172 	struct ocelot *ocelot = ocelot_port->ocelot;
1173 	int port = priv->port.index;
1174 
1175 	return ocelot_mrp_del_ring_role(ocelot, port, mrp);
1176 }
1177 
ocelot_port_obj_add(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj,struct netlink_ext_ack * extack)1178 static int ocelot_port_obj_add(struct net_device *dev, const void *ctx,
1179 			       const struct switchdev_obj *obj,
1180 			       struct netlink_ext_ack *extack)
1181 {
1182 	struct ocelot_port_private *priv = netdev_priv(dev);
1183 	int ret = 0;
1184 
1185 	if (ctx && ctx != priv)
1186 		return 0;
1187 
1188 	switch (obj->id) {
1189 	case SWITCHDEV_OBJ_ID_PORT_VLAN:
1190 		ret = ocelot_port_obj_add_vlan(dev,
1191 					       SWITCHDEV_OBJ_PORT_VLAN(obj),
1192 					       extack);
1193 		break;
1194 	case SWITCHDEV_OBJ_ID_PORT_MDB:
1195 		ret = ocelot_port_obj_add_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1196 		break;
1197 	case SWITCHDEV_OBJ_ID_MRP:
1198 		ret = ocelot_port_obj_mrp_add(dev, SWITCHDEV_OBJ_MRP(obj));
1199 		break;
1200 	case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1201 		ret = ocelot_port_obj_mrp_add_ring_role(dev,
1202 							SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1203 		break;
1204 	default:
1205 		return -EOPNOTSUPP;
1206 	}
1207 
1208 	return ret;
1209 }
1210 
ocelot_port_obj_del(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj)1211 static int ocelot_port_obj_del(struct net_device *dev, const void *ctx,
1212 			       const struct switchdev_obj *obj)
1213 {
1214 	struct ocelot_port_private *priv = netdev_priv(dev);
1215 	int ret = 0;
1216 
1217 	if (ctx && ctx != priv)
1218 		return 0;
1219 
1220 	switch (obj->id) {
1221 	case SWITCHDEV_OBJ_ID_PORT_VLAN:
1222 		ret = ocelot_vlan_vid_del(dev,
1223 					  SWITCHDEV_OBJ_PORT_VLAN(obj)->vid);
1224 		break;
1225 	case SWITCHDEV_OBJ_ID_PORT_MDB:
1226 		ret = ocelot_port_obj_del_mdb(dev, SWITCHDEV_OBJ_PORT_MDB(obj));
1227 		break;
1228 	case SWITCHDEV_OBJ_ID_MRP:
1229 		ret = ocelot_port_obj_mrp_del(dev, SWITCHDEV_OBJ_MRP(obj));
1230 		break;
1231 	case SWITCHDEV_OBJ_ID_RING_ROLE_MRP:
1232 		ret = ocelot_port_obj_mrp_del_ring_role(dev,
1233 							SWITCHDEV_OBJ_RING_ROLE_MRP(obj));
1234 		break;
1235 	default:
1236 		return -EOPNOTSUPP;
1237 	}
1238 
1239 	return ret;
1240 }
1241 
ocelot_inherit_brport_flags(struct ocelot * ocelot,int port,struct net_device * brport_dev)1242 static void ocelot_inherit_brport_flags(struct ocelot *ocelot, int port,
1243 					struct net_device *brport_dev)
1244 {
1245 	struct switchdev_brport_flags flags = {0};
1246 	int flag;
1247 
1248 	flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1249 
1250 	for_each_set_bit(flag, &flags.mask, 32)
1251 		if (br_port_flag_is_set(brport_dev, BIT(flag)))
1252 			flags.val |= BIT(flag);
1253 
1254 	ocelot_port_bridge_flags(ocelot, port, flags);
1255 }
1256 
ocelot_clear_brport_flags(struct ocelot * ocelot,int port)1257 static void ocelot_clear_brport_flags(struct ocelot *ocelot, int port)
1258 {
1259 	struct switchdev_brport_flags flags;
1260 
1261 	flags.mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
1262 	flags.val = flags.mask & ~BR_LEARNING;
1263 
1264 	ocelot_port_bridge_flags(ocelot, port, flags);
1265 }
1266 
ocelot_switchdev_sync(struct ocelot * ocelot,int port,struct net_device * brport_dev,struct net_device * bridge_dev,struct netlink_ext_ack * extack)1267 static int ocelot_switchdev_sync(struct ocelot *ocelot, int port,
1268 				 struct net_device *brport_dev,
1269 				 struct net_device *bridge_dev,
1270 				 struct netlink_ext_ack *extack)
1271 {
1272 	clock_t ageing_time;
1273 	u8 stp_state;
1274 
1275 	ocelot_inherit_brport_flags(ocelot, port, brport_dev);
1276 
1277 	stp_state = br_port_get_stp_state(brport_dev);
1278 	ocelot_bridge_stp_state_set(ocelot, port, stp_state);
1279 
1280 	ageing_time = br_get_ageing_time(bridge_dev);
1281 	ocelot_port_attr_ageing_set(ocelot, port, ageing_time);
1282 
1283 	return ocelot_port_vlan_filtering(ocelot, port,
1284 					  br_vlan_enabled(bridge_dev),
1285 					  extack);
1286 }
1287 
ocelot_switchdev_unsync(struct ocelot * ocelot,int port)1288 static int ocelot_switchdev_unsync(struct ocelot *ocelot, int port)
1289 {
1290 	int err;
1291 
1292 	err = ocelot_port_vlan_filtering(ocelot, port, false, NULL);
1293 	if (err)
1294 		return err;
1295 
1296 	ocelot_clear_brport_flags(ocelot, port);
1297 
1298 	ocelot_bridge_stp_state_set(ocelot, port, BR_STATE_FORWARDING);
1299 
1300 	return 0;
1301 }
1302 
ocelot_bridge_num_get(struct ocelot * ocelot,const struct net_device * bridge_dev)1303 static int ocelot_bridge_num_get(struct ocelot *ocelot,
1304 				 const struct net_device *bridge_dev)
1305 {
1306 	int bridge_num = ocelot_bridge_num_find(ocelot, bridge_dev);
1307 
1308 	if (bridge_num < 0) {
1309 		/* First port that offloads this bridge */
1310 		bridge_num = find_first_zero_bit(&ocelot->bridges,
1311 						 ocelot->num_phys_ports);
1312 
1313 		set_bit(bridge_num, &ocelot->bridges);
1314 	}
1315 
1316 	return bridge_num;
1317 }
1318 
ocelot_bridge_num_put(struct ocelot * ocelot,const struct net_device * bridge_dev,int bridge_num)1319 static void ocelot_bridge_num_put(struct ocelot *ocelot,
1320 				  const struct net_device *bridge_dev,
1321 				  int bridge_num)
1322 {
1323 	/* Check if the bridge is still in use, otherwise it is time
1324 	 * to clean it up so we can reuse this bridge_num later.
1325 	 */
1326 	if (!ocelot_bridge_num_find(ocelot, bridge_dev))
1327 		clear_bit(bridge_num, &ocelot->bridges);
1328 }
1329 
ocelot_netdevice_bridge_join(struct net_device * dev,struct net_device * brport_dev,struct net_device * bridge,struct netlink_ext_ack * extack)1330 static int ocelot_netdevice_bridge_join(struct net_device *dev,
1331 					struct net_device *brport_dev,
1332 					struct net_device *bridge,
1333 					struct netlink_ext_ack *extack)
1334 {
1335 	struct ocelot_port_private *priv = netdev_priv(dev);
1336 	struct ocelot_port *ocelot_port = &priv->port;
1337 	struct ocelot *ocelot = ocelot_port->ocelot;
1338 	int port = priv->port.index;
1339 	int bridge_num, err;
1340 
1341 	bridge_num = ocelot_bridge_num_get(ocelot, bridge);
1342 
1343 	err = ocelot_port_bridge_join(ocelot, port, bridge, bridge_num,
1344 				      extack);
1345 	if (err)
1346 		goto err_join;
1347 
1348 	err = switchdev_bridge_port_offload(brport_dev, dev, priv,
1349 					    &ocelot_switchdev_nb,
1350 					    &ocelot_switchdev_blocking_nb,
1351 					    false, extack);
1352 	if (err)
1353 		goto err_switchdev_offload;
1354 
1355 	err = ocelot_switchdev_sync(ocelot, port, brport_dev, bridge, extack);
1356 	if (err)
1357 		goto err_switchdev_sync;
1358 
1359 	return 0;
1360 
1361 err_switchdev_sync:
1362 	switchdev_bridge_port_unoffload(brport_dev, priv,
1363 					&ocelot_switchdev_nb,
1364 					&ocelot_switchdev_blocking_nb);
1365 err_switchdev_offload:
1366 	ocelot_port_bridge_leave(ocelot, port, bridge);
1367 err_join:
1368 	ocelot_bridge_num_put(ocelot, bridge, bridge_num);
1369 	return err;
1370 }
1371 
ocelot_netdevice_pre_bridge_leave(struct net_device * dev,struct net_device * brport_dev)1372 static void ocelot_netdevice_pre_bridge_leave(struct net_device *dev,
1373 					      struct net_device *brport_dev)
1374 {
1375 	struct ocelot_port_private *priv = netdev_priv(dev);
1376 
1377 	switchdev_bridge_port_unoffload(brport_dev, priv,
1378 					&ocelot_switchdev_nb,
1379 					&ocelot_switchdev_blocking_nb);
1380 }
1381 
ocelot_netdevice_bridge_leave(struct net_device * dev,struct net_device * brport_dev,struct net_device * bridge)1382 static int ocelot_netdevice_bridge_leave(struct net_device *dev,
1383 					 struct net_device *brport_dev,
1384 					 struct net_device *bridge)
1385 {
1386 	struct ocelot_port_private *priv = netdev_priv(dev);
1387 	struct ocelot_port *ocelot_port = &priv->port;
1388 	struct ocelot *ocelot = ocelot_port->ocelot;
1389 	int bridge_num = ocelot_port->bridge_num;
1390 	int port = priv->port.index;
1391 	int err;
1392 
1393 	err = ocelot_switchdev_unsync(ocelot, port);
1394 	if (err)
1395 		return err;
1396 
1397 	ocelot_port_bridge_leave(ocelot, port, bridge);
1398 	ocelot_bridge_num_put(ocelot, bridge, bridge_num);
1399 
1400 	return 0;
1401 }
1402 
ocelot_netdevice_lag_join(struct net_device * dev,struct net_device * bond,struct netdev_lag_upper_info * info,struct netlink_ext_ack * extack)1403 static int ocelot_netdevice_lag_join(struct net_device *dev,
1404 				     struct net_device *bond,
1405 				     struct netdev_lag_upper_info *info,
1406 				     struct netlink_ext_ack *extack)
1407 {
1408 	struct ocelot_port_private *priv = netdev_priv(dev);
1409 	struct ocelot_port *ocelot_port = &priv->port;
1410 	struct ocelot *ocelot = ocelot_port->ocelot;
1411 	struct net_device *bridge_dev;
1412 	int port = priv->port.index;
1413 	int err;
1414 
1415 	err = ocelot_port_lag_join(ocelot, port, bond, info, extack);
1416 	if (err == -EOPNOTSUPP)
1417 		/* Offloading not supported, fall back to software LAG */
1418 		return 0;
1419 
1420 	bridge_dev = netdev_master_upper_dev_get(bond);
1421 	if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1422 		return 0;
1423 
1424 	err = ocelot_netdevice_bridge_join(dev, bond, bridge_dev, extack);
1425 	if (err)
1426 		goto err_bridge_join;
1427 
1428 	return 0;
1429 
1430 err_bridge_join:
1431 	ocelot_port_lag_leave(ocelot, port, bond);
1432 	return err;
1433 }
1434 
ocelot_netdevice_pre_lag_leave(struct net_device * dev,struct net_device * bond)1435 static void ocelot_netdevice_pre_lag_leave(struct net_device *dev,
1436 					   struct net_device *bond)
1437 {
1438 	struct net_device *bridge_dev;
1439 
1440 	bridge_dev = netdev_master_upper_dev_get(bond);
1441 	if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1442 		return;
1443 
1444 	ocelot_netdevice_pre_bridge_leave(dev, bond);
1445 }
1446 
ocelot_netdevice_lag_leave(struct net_device * dev,struct net_device * bond)1447 static int ocelot_netdevice_lag_leave(struct net_device *dev,
1448 				      struct net_device *bond)
1449 {
1450 	struct ocelot_port_private *priv = netdev_priv(dev);
1451 	struct ocelot_port *ocelot_port = &priv->port;
1452 	struct ocelot *ocelot = ocelot_port->ocelot;
1453 	struct net_device *bridge_dev;
1454 	int port = priv->port.index;
1455 
1456 	ocelot_port_lag_leave(ocelot, port, bond);
1457 
1458 	bridge_dev = netdev_master_upper_dev_get(bond);
1459 	if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
1460 		return 0;
1461 
1462 	return ocelot_netdevice_bridge_leave(dev, bond, bridge_dev);
1463 }
1464 
ocelot_netdevice_changeupper(struct net_device * dev,struct net_device * brport_dev,struct netdev_notifier_changeupper_info * info)1465 static int ocelot_netdevice_changeupper(struct net_device *dev,
1466 					struct net_device *brport_dev,
1467 					struct netdev_notifier_changeupper_info *info)
1468 {
1469 	struct netlink_ext_ack *extack;
1470 	int err = 0;
1471 
1472 	extack = netdev_notifier_info_to_extack(&info->info);
1473 
1474 	if (netif_is_bridge_master(info->upper_dev)) {
1475 		if (info->linking)
1476 			err = ocelot_netdevice_bridge_join(dev, brport_dev,
1477 							   info->upper_dev,
1478 							   extack);
1479 		else
1480 			err = ocelot_netdevice_bridge_leave(dev, brport_dev,
1481 							    info->upper_dev);
1482 	}
1483 	if (netif_is_lag_master(info->upper_dev)) {
1484 		if (info->linking)
1485 			err = ocelot_netdevice_lag_join(dev, info->upper_dev,
1486 							info->upper_info, extack);
1487 		else
1488 			ocelot_netdevice_lag_leave(dev, info->upper_dev);
1489 	}
1490 
1491 	return notifier_from_errno(err);
1492 }
1493 
1494 /* Treat CHANGEUPPER events on an offloaded LAG as individual CHANGEUPPER
1495  * events for the lower physical ports of the LAG.
1496  * If the LAG upper isn't offloaded, ignore its CHANGEUPPER events.
1497  * In case the LAG joined a bridge, notify that we are offloading it and can do
1498  * forwarding in hardware towards it.
1499  */
1500 static int
ocelot_netdevice_lag_changeupper(struct net_device * dev,struct netdev_notifier_changeupper_info * info)1501 ocelot_netdevice_lag_changeupper(struct net_device *dev,
1502 				 struct netdev_notifier_changeupper_info *info)
1503 {
1504 	struct net_device *lower;
1505 	struct list_head *iter;
1506 	int err = NOTIFY_DONE;
1507 
1508 	netdev_for_each_lower_dev(dev, lower, iter) {
1509 		struct ocelot_port_private *priv = netdev_priv(lower);
1510 		struct ocelot_port *ocelot_port = &priv->port;
1511 
1512 		if (ocelot_port->bond != dev)
1513 			return NOTIFY_OK;
1514 
1515 		err = ocelot_netdevice_changeupper(lower, dev, info);
1516 		if (err)
1517 			return notifier_from_errno(err);
1518 	}
1519 
1520 	return NOTIFY_DONE;
1521 }
1522 
1523 static int
ocelot_netdevice_prechangeupper(struct net_device * dev,struct net_device * brport_dev,struct netdev_notifier_changeupper_info * info)1524 ocelot_netdevice_prechangeupper(struct net_device *dev,
1525 				struct net_device *brport_dev,
1526 				struct netdev_notifier_changeupper_info *info)
1527 {
1528 	if (netif_is_bridge_master(info->upper_dev) && !info->linking)
1529 		ocelot_netdevice_pre_bridge_leave(dev, brport_dev);
1530 
1531 	if (netif_is_lag_master(info->upper_dev) && !info->linking)
1532 		ocelot_netdevice_pre_lag_leave(dev, info->upper_dev);
1533 
1534 	return NOTIFY_DONE;
1535 }
1536 
1537 static int
ocelot_netdevice_lag_prechangeupper(struct net_device * dev,struct netdev_notifier_changeupper_info * info)1538 ocelot_netdevice_lag_prechangeupper(struct net_device *dev,
1539 				    struct netdev_notifier_changeupper_info *info)
1540 {
1541 	struct net_device *lower;
1542 	struct list_head *iter;
1543 	int err = NOTIFY_DONE;
1544 
1545 	netdev_for_each_lower_dev(dev, lower, iter) {
1546 		struct ocelot_port_private *priv = netdev_priv(lower);
1547 		struct ocelot_port *ocelot_port = &priv->port;
1548 
1549 		if (ocelot_port->bond != dev)
1550 			return NOTIFY_OK;
1551 
1552 		err = ocelot_netdevice_prechangeupper(dev, lower, info);
1553 		if (err)
1554 			return err;
1555 	}
1556 
1557 	return NOTIFY_DONE;
1558 }
1559 
1560 static int
ocelot_netdevice_changelowerstate(struct net_device * dev,struct netdev_lag_lower_state_info * info)1561 ocelot_netdevice_changelowerstate(struct net_device *dev,
1562 				  struct netdev_lag_lower_state_info *info)
1563 {
1564 	struct ocelot_port_private *priv = netdev_priv(dev);
1565 	bool is_active = info->link_up && info->tx_enabled;
1566 	struct ocelot_port *ocelot_port = &priv->port;
1567 	struct ocelot *ocelot = ocelot_port->ocelot;
1568 	int port = priv->port.index;
1569 
1570 	if (!ocelot_port->bond)
1571 		return NOTIFY_DONE;
1572 
1573 	if (ocelot_port->lag_tx_active == is_active)
1574 		return NOTIFY_DONE;
1575 
1576 	ocelot_port_lag_change(ocelot, port, is_active);
1577 
1578 	return NOTIFY_OK;
1579 }
1580 
ocelot_netdevice_event(struct notifier_block * unused,unsigned long event,void * ptr)1581 static int ocelot_netdevice_event(struct notifier_block *unused,
1582 				  unsigned long event, void *ptr)
1583 {
1584 	struct net_device *dev = netdev_notifier_info_to_dev(ptr);
1585 
1586 	switch (event) {
1587 	case NETDEV_PRECHANGEUPPER: {
1588 		struct netdev_notifier_changeupper_info *info = ptr;
1589 
1590 		if (ocelot_netdevice_dev_check(dev))
1591 			return ocelot_netdevice_prechangeupper(dev, dev, info);
1592 
1593 		if (netif_is_lag_master(dev))
1594 			return ocelot_netdevice_lag_prechangeupper(dev, info);
1595 
1596 		break;
1597 	}
1598 	case NETDEV_CHANGEUPPER: {
1599 		struct netdev_notifier_changeupper_info *info = ptr;
1600 
1601 		if (ocelot_netdevice_dev_check(dev))
1602 			return ocelot_netdevice_changeupper(dev, dev, info);
1603 
1604 		if (netif_is_lag_master(dev))
1605 			return ocelot_netdevice_lag_changeupper(dev, info);
1606 
1607 		break;
1608 	}
1609 	case NETDEV_CHANGELOWERSTATE: {
1610 		struct netdev_notifier_changelowerstate_info *info = ptr;
1611 
1612 		if (!ocelot_netdevice_dev_check(dev))
1613 			break;
1614 
1615 		return ocelot_netdevice_changelowerstate(dev,
1616 							 info->lower_state_info);
1617 	}
1618 	default:
1619 		break;
1620 	}
1621 
1622 	return NOTIFY_DONE;
1623 }
1624 
1625 struct notifier_block ocelot_netdevice_nb __read_mostly = {
1626 	.notifier_call = ocelot_netdevice_event,
1627 };
1628 
ocelot_switchdev_event(struct notifier_block * unused,unsigned long event,void * ptr)1629 static int ocelot_switchdev_event(struct notifier_block *unused,
1630 				  unsigned long event, void *ptr)
1631 {
1632 	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1633 	int err;
1634 
1635 	switch (event) {
1636 	case SWITCHDEV_PORT_ATTR_SET:
1637 		err = switchdev_handle_port_attr_set(dev, ptr,
1638 						     ocelot_netdevice_dev_check,
1639 						     ocelot_port_attr_set);
1640 		return notifier_from_errno(err);
1641 	}
1642 
1643 	return NOTIFY_DONE;
1644 }
1645 
1646 struct notifier_block ocelot_switchdev_nb __read_mostly = {
1647 	.notifier_call = ocelot_switchdev_event,
1648 };
1649 
ocelot_switchdev_blocking_event(struct notifier_block * unused,unsigned long event,void * ptr)1650 static int ocelot_switchdev_blocking_event(struct notifier_block *unused,
1651 					   unsigned long event, void *ptr)
1652 {
1653 	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1654 	int err;
1655 
1656 	switch (event) {
1657 		/* Blocking events. */
1658 	case SWITCHDEV_PORT_OBJ_ADD:
1659 		err = switchdev_handle_port_obj_add(dev, ptr,
1660 						    ocelot_netdevice_dev_check,
1661 						    ocelot_port_obj_add);
1662 		return notifier_from_errno(err);
1663 	case SWITCHDEV_PORT_OBJ_DEL:
1664 		err = switchdev_handle_port_obj_del(dev, ptr,
1665 						    ocelot_netdevice_dev_check,
1666 						    ocelot_port_obj_del);
1667 		return notifier_from_errno(err);
1668 	case SWITCHDEV_PORT_ATTR_SET:
1669 		err = switchdev_handle_port_attr_set(dev, ptr,
1670 						     ocelot_netdevice_dev_check,
1671 						     ocelot_port_attr_set);
1672 		return notifier_from_errno(err);
1673 	}
1674 
1675 	return NOTIFY_DONE;
1676 }
1677 
1678 struct notifier_block ocelot_switchdev_blocking_nb __read_mostly = {
1679 	.notifier_call = ocelot_switchdev_blocking_event,
1680 };
1681 
vsc7514_phylink_mac_config(struct phylink_config * config,unsigned int link_an_mode,const struct phylink_link_state * state)1682 static void vsc7514_phylink_mac_config(struct phylink_config *config,
1683 				       unsigned int link_an_mode,
1684 				       const struct phylink_link_state *state)
1685 {
1686 	struct net_device *ndev = to_net_dev(config->dev);
1687 	struct ocelot_port_private *priv = netdev_priv(ndev);
1688 	struct ocelot_port *ocelot_port = &priv->port;
1689 
1690 	/* Disable HDX fast control */
1691 	ocelot_port_writel(ocelot_port, DEV_PORT_MISC_HDX_FAST_DIS,
1692 			   DEV_PORT_MISC);
1693 
1694 	/* SGMII only for now */
1695 	ocelot_port_writel(ocelot_port, PCS1G_MODE_CFG_SGMII_MODE_ENA,
1696 			   PCS1G_MODE_CFG);
1697 	ocelot_port_writel(ocelot_port, PCS1G_SD_CFG_SD_SEL, PCS1G_SD_CFG);
1698 
1699 	/* Enable PCS */
1700 	ocelot_port_writel(ocelot_port, PCS1G_CFG_PCS_ENA, PCS1G_CFG);
1701 
1702 	/* No aneg on SGMII */
1703 	ocelot_port_writel(ocelot_port, 0, PCS1G_ANEG_CFG);
1704 
1705 	/* No loopback */
1706 	ocelot_port_writel(ocelot_port, 0, PCS1G_LB_CFG);
1707 }
1708 
vsc7514_phylink_mac_link_down(struct phylink_config * config,unsigned int link_an_mode,phy_interface_t interface)1709 static void vsc7514_phylink_mac_link_down(struct phylink_config *config,
1710 					  unsigned int link_an_mode,
1711 					  phy_interface_t interface)
1712 {
1713 	struct net_device *ndev = to_net_dev(config->dev);
1714 	struct ocelot_port_private *priv = netdev_priv(ndev);
1715 	struct ocelot *ocelot = priv->port.ocelot;
1716 	int port = priv->port.index;
1717 
1718 	ocelot_phylink_mac_link_down(ocelot, port, link_an_mode, interface,
1719 				     OCELOT_MAC_QUIRKS);
1720 }
1721 
vsc7514_phylink_mac_link_up(struct phylink_config * config,struct phy_device * phydev,unsigned int link_an_mode,phy_interface_t interface,int speed,int duplex,bool tx_pause,bool rx_pause)1722 static void vsc7514_phylink_mac_link_up(struct phylink_config *config,
1723 					struct phy_device *phydev,
1724 					unsigned int link_an_mode,
1725 					phy_interface_t interface,
1726 					int speed, int duplex,
1727 					bool tx_pause, bool rx_pause)
1728 {
1729 	struct net_device *ndev = to_net_dev(config->dev);
1730 	struct ocelot_port_private *priv = netdev_priv(ndev);
1731 	struct ocelot *ocelot = priv->port.ocelot;
1732 	int port = priv->port.index;
1733 
1734 	ocelot_phylink_mac_link_up(ocelot, port, phydev, link_an_mode,
1735 				   interface, speed, duplex,
1736 				   tx_pause, rx_pause, OCELOT_MAC_QUIRKS);
1737 }
1738 
1739 static const struct phylink_mac_ops ocelot_phylink_ops = {
1740 	.validate		= phylink_generic_validate,
1741 	.mac_config		= vsc7514_phylink_mac_config,
1742 	.mac_link_down		= vsc7514_phylink_mac_link_down,
1743 	.mac_link_up		= vsc7514_phylink_mac_link_up,
1744 };
1745 
ocelot_port_phylink_create(struct ocelot * ocelot,int port,struct device_node * portnp)1746 static int ocelot_port_phylink_create(struct ocelot *ocelot, int port,
1747 				      struct device_node *portnp)
1748 {
1749 	struct ocelot_port *ocelot_port = ocelot->ports[port];
1750 	struct ocelot_port_private *priv;
1751 	struct device *dev = ocelot->dev;
1752 	phy_interface_t phy_mode;
1753 	struct phylink *phylink;
1754 	int err;
1755 
1756 	of_get_phy_mode(portnp, &phy_mode);
1757 	/* DT bindings of internal PHY ports are broken and don't
1758 	 * specify a phy-mode
1759 	 */
1760 	if (phy_mode == PHY_INTERFACE_MODE_NA)
1761 		phy_mode = PHY_INTERFACE_MODE_INTERNAL;
1762 
1763 	if (phy_mode != PHY_INTERFACE_MODE_SGMII &&
1764 	    phy_mode != PHY_INTERFACE_MODE_QSGMII &&
1765 	    phy_mode != PHY_INTERFACE_MODE_INTERNAL) {
1766 		dev_err(dev, "unsupported phy mode %s for port %d\n",
1767 			phy_modes(phy_mode), port);
1768 		return -EINVAL;
1769 	}
1770 
1771 	/* Ensure clock signals and speed are set on all QSGMII links */
1772 	if (phy_mode == PHY_INTERFACE_MODE_QSGMII)
1773 		ocelot_port_rmwl(ocelot_port, 0,
1774 				 DEV_CLOCK_CFG_MAC_TX_RST |
1775 				 DEV_CLOCK_CFG_MAC_RX_RST,
1776 				 DEV_CLOCK_CFG);
1777 
1778 	ocelot_port->phy_mode = phy_mode;
1779 
1780 	if (phy_mode != PHY_INTERFACE_MODE_INTERNAL) {
1781 		struct phy *serdes = of_phy_get(portnp, NULL);
1782 
1783 		if (IS_ERR(serdes)) {
1784 			err = PTR_ERR(serdes);
1785 			dev_err_probe(dev, err,
1786 				      "missing SerDes phys for port %d\n",
1787 				      port);
1788 			return err;
1789 		}
1790 
1791 		err = phy_set_mode_ext(serdes, PHY_MODE_ETHERNET, phy_mode);
1792 		of_phy_put(serdes);
1793 		if (err) {
1794 			dev_err(dev, "Could not SerDes mode on port %d: %pe\n",
1795 				port, ERR_PTR(err));
1796 			return err;
1797 		}
1798 	}
1799 
1800 	priv = container_of(ocelot_port, struct ocelot_port_private, port);
1801 
1802 	priv->phylink_config.dev = &priv->dev->dev;
1803 	priv->phylink_config.type = PHYLINK_NETDEV;
1804 	priv->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |
1805 		MAC_10 | MAC_100 | MAC_1000FD | MAC_2500FD;
1806 
1807 	__set_bit(ocelot_port->phy_mode,
1808 		  priv->phylink_config.supported_interfaces);
1809 
1810 	phylink = phylink_create(&priv->phylink_config,
1811 				 of_fwnode_handle(portnp),
1812 				 phy_mode, &ocelot_phylink_ops);
1813 	if (IS_ERR(phylink)) {
1814 		err = PTR_ERR(phylink);
1815 		dev_err(dev, "Could not create phylink (%pe)\n", phylink);
1816 		return err;
1817 	}
1818 
1819 	priv->phylink = phylink;
1820 
1821 	err = phylink_of_phy_connect(phylink, portnp, 0);
1822 	if (err) {
1823 		dev_err(dev, "Could not connect to PHY: %pe\n", ERR_PTR(err));
1824 		phylink_destroy(phylink);
1825 		priv->phylink = NULL;
1826 		return err;
1827 	}
1828 
1829 	return 0;
1830 }
1831 
ocelot_probe_port(struct ocelot * ocelot,int port,struct regmap * target,struct device_node * portnp)1832 int ocelot_probe_port(struct ocelot *ocelot, int port, struct regmap *target,
1833 		      struct device_node *portnp)
1834 {
1835 	struct ocelot_port_private *priv;
1836 	struct ocelot_port *ocelot_port;
1837 	struct net_device *dev;
1838 	int err;
1839 
1840 	dev = alloc_etherdev(sizeof(struct ocelot_port_private));
1841 	if (!dev)
1842 		return -ENOMEM;
1843 	SET_NETDEV_DEV(dev, ocelot->dev);
1844 	priv = netdev_priv(dev);
1845 	priv->dev = dev;
1846 	ocelot_port = &priv->port;
1847 	ocelot_port->ocelot = ocelot;
1848 	ocelot_port->index = port;
1849 	ocelot_port->target = target;
1850 	ocelot->ports[port] = ocelot_port;
1851 
1852 	dev->netdev_ops = &ocelot_port_netdev_ops;
1853 	dev->ethtool_ops = &ocelot_ethtool_ops;
1854 	dev->max_mtu = OCELOT_JUMBO_MTU;
1855 
1856 	dev->hw_features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_RXFCS |
1857 		NETIF_F_HW_TC;
1858 	dev->features |= NETIF_F_HW_VLAN_CTAG_FILTER | NETIF_F_HW_TC;
1859 
1860 	err = of_get_ethdev_address(portnp, dev);
1861 	if (err)
1862 		eth_hw_addr_gen(dev, ocelot->base_mac, port);
1863 
1864 	ocelot_mact_learn(ocelot, PGID_CPU, dev->dev_addr,
1865 			  OCELOT_STANDALONE_PVID, ENTRYTYPE_LOCKED);
1866 
1867 	ocelot_init_port(ocelot, port);
1868 
1869 	err = ocelot_port_phylink_create(ocelot, port, portnp);
1870 	if (err)
1871 		goto out;
1872 
1873 	if (ocelot->fdma)
1874 		ocelot_fdma_netdev_init(ocelot, dev);
1875 
1876 	err = register_netdev(dev);
1877 	if (err) {
1878 		dev_err(ocelot->dev, "register_netdev failed\n");
1879 		goto out_fdma_deinit;
1880 	}
1881 
1882 	return 0;
1883 
1884 out_fdma_deinit:
1885 	if (ocelot->fdma)
1886 		ocelot_fdma_netdev_deinit(ocelot, dev);
1887 out:
1888 	ocelot->ports[port] = NULL;
1889 	free_netdev(dev);
1890 
1891 	return err;
1892 }
1893 
ocelot_release_port(struct ocelot_port * ocelot_port)1894 void ocelot_release_port(struct ocelot_port *ocelot_port)
1895 {
1896 	struct ocelot_port_private *priv = container_of(ocelot_port,
1897 						struct ocelot_port_private,
1898 						port);
1899 	struct ocelot *ocelot = ocelot_port->ocelot;
1900 	struct ocelot_fdma *fdma = ocelot->fdma;
1901 
1902 	unregister_netdev(priv->dev);
1903 
1904 	if (fdma)
1905 		ocelot_fdma_netdev_deinit(ocelot, priv->dev);
1906 
1907 	if (priv->phylink) {
1908 		rtnl_lock();
1909 		phylink_disconnect_phy(priv->phylink);
1910 		rtnl_unlock();
1911 
1912 		phylink_destroy(priv->phylink);
1913 	}
1914 
1915 	free_netdev(priv->dev);
1916 }
1917