xref: /linux/net/dsa/port.c (revision d3eed0e57d5d1bcbf1bd60f83a4adfe7d7b8dd9c)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Handling of a single switch port
4  *
5  * Copyright (c) 2017 Savoir-faire Linux Inc.
6  *	Vivien Didelot <vivien.didelot@savoirfairelinux.com>
7  */
8 
9 #include <linux/if_bridge.h>
10 #include <linux/notifier.h>
11 #include <linux/of_mdio.h>
12 #include <linux/of_net.h>
13 
14 #include "dsa_priv.h"
15 
16 /**
17  * dsa_port_notify - Notify the switching fabric of changes to a port
18  * @dp: port on which change occurred
19  * @e: event, must be of type DSA_NOTIFIER_*
20  * @v: event-specific value.
21  *
22  * Notify all switches in the DSA tree that this port's switch belongs to,
23  * including this switch itself, of an event. Allows the other switches to
24  * reconfigure themselves for cross-chip operations. Can also be used to
25  * reconfigure ports without net_devices (CPU ports, DSA links) whenever
26  * a user port's state changes.
27  */
28 static int dsa_port_notify(const struct dsa_port *dp, unsigned long e, void *v)
29 {
30 	return dsa_tree_notify(dp->ds->dst, e, v);
31 }
32 
33 static void dsa_port_notify_bridge_fdb_flush(const struct dsa_port *dp)
34 {
35 	struct net_device *brport_dev = dsa_port_to_bridge_port(dp);
36 	struct switchdev_notifier_fdb_info info = {
37 		/* flush all VLANs */
38 		.vid = 0,
39 	};
40 
41 	/* When the port becomes standalone it has already left the bridge.
42 	 * Don't notify the bridge in that case.
43 	 */
44 	if (!brport_dev)
45 		return;
46 
47 	call_switchdev_notifiers(SWITCHDEV_FDB_FLUSH_TO_BRIDGE,
48 				 brport_dev, &info.info, NULL);
49 }
50 
51 static void dsa_port_fast_age(const struct dsa_port *dp)
52 {
53 	struct dsa_switch *ds = dp->ds;
54 
55 	if (!ds->ops->port_fast_age)
56 		return;
57 
58 	ds->ops->port_fast_age(ds, dp->index);
59 
60 	dsa_port_notify_bridge_fdb_flush(dp);
61 }
62 
63 static bool dsa_port_can_configure_learning(struct dsa_port *dp)
64 {
65 	struct switchdev_brport_flags flags = {
66 		.mask = BR_LEARNING,
67 	};
68 	struct dsa_switch *ds = dp->ds;
69 	int err;
70 
71 	if (!ds->ops->port_bridge_flags || !ds->ops->port_pre_bridge_flags)
72 		return false;
73 
74 	err = ds->ops->port_pre_bridge_flags(ds, dp->index, flags, NULL);
75 	return !err;
76 }
77 
78 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)
79 {
80 	struct dsa_switch *ds = dp->ds;
81 	int port = dp->index;
82 
83 	if (!ds->ops->port_stp_state_set)
84 		return -EOPNOTSUPP;
85 
86 	ds->ops->port_stp_state_set(ds, port, state);
87 
88 	if (!dsa_port_can_configure_learning(dp) ||
89 	    (do_fast_age && dp->learning)) {
90 		/* Fast age FDB entries or flush appropriate forwarding database
91 		 * for the given port, if we are moving it from Learning or
92 		 * Forwarding state, to Disabled or Blocking or Listening state.
93 		 * Ports that were standalone before the STP state change don't
94 		 * need to fast age the FDB, since address learning is off in
95 		 * standalone mode.
96 		 */
97 
98 		if ((dp->stp_state == BR_STATE_LEARNING ||
99 		     dp->stp_state == BR_STATE_FORWARDING) &&
100 		    (state == BR_STATE_DISABLED ||
101 		     state == BR_STATE_BLOCKING ||
102 		     state == BR_STATE_LISTENING))
103 			dsa_port_fast_age(dp);
104 	}
105 
106 	dp->stp_state = state;
107 
108 	return 0;
109 }
110 
111 static void dsa_port_set_state_now(struct dsa_port *dp, u8 state,
112 				   bool do_fast_age)
113 {
114 	int err;
115 
116 	err = dsa_port_set_state(dp, state, do_fast_age);
117 	if (err)
118 		pr_err("DSA: failed to set STP state %u (%d)\n", state, err);
119 }
120 
121 int dsa_port_enable_rt(struct dsa_port *dp, struct phy_device *phy)
122 {
123 	struct dsa_switch *ds = dp->ds;
124 	int port = dp->index;
125 	int err;
126 
127 	if (ds->ops->port_enable) {
128 		err = ds->ops->port_enable(ds, port, phy);
129 		if (err)
130 			return err;
131 	}
132 
133 	if (!dp->bridge)
134 		dsa_port_set_state_now(dp, BR_STATE_FORWARDING, false);
135 
136 	if (dp->pl)
137 		phylink_start(dp->pl);
138 
139 	return 0;
140 }
141 
142 int dsa_port_enable(struct dsa_port *dp, struct phy_device *phy)
143 {
144 	int err;
145 
146 	rtnl_lock();
147 	err = dsa_port_enable_rt(dp, phy);
148 	rtnl_unlock();
149 
150 	return err;
151 }
152 
153 void dsa_port_disable_rt(struct dsa_port *dp)
154 {
155 	struct dsa_switch *ds = dp->ds;
156 	int port = dp->index;
157 
158 	if (dp->pl)
159 		phylink_stop(dp->pl);
160 
161 	if (!dp->bridge)
162 		dsa_port_set_state_now(dp, BR_STATE_DISABLED, false);
163 
164 	if (ds->ops->port_disable)
165 		ds->ops->port_disable(ds, port);
166 }
167 
168 void dsa_port_disable(struct dsa_port *dp)
169 {
170 	rtnl_lock();
171 	dsa_port_disable_rt(dp);
172 	rtnl_unlock();
173 }
174 
175 static int dsa_port_inherit_brport_flags(struct dsa_port *dp,
176 					 struct netlink_ext_ack *extack)
177 {
178 	const unsigned long mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD |
179 				   BR_BCAST_FLOOD;
180 	struct net_device *brport_dev = dsa_port_to_bridge_port(dp);
181 	int flag, err;
182 
183 	for_each_set_bit(flag, &mask, 32) {
184 		struct switchdev_brport_flags flags = {0};
185 
186 		flags.mask = BIT(flag);
187 
188 		if (br_port_flag_is_set(brport_dev, BIT(flag)))
189 			flags.val = BIT(flag);
190 
191 		err = dsa_port_bridge_flags(dp, flags, extack);
192 		if (err && err != -EOPNOTSUPP)
193 			return err;
194 	}
195 
196 	return 0;
197 }
198 
199 static void dsa_port_clear_brport_flags(struct dsa_port *dp)
200 {
201 	const unsigned long val = BR_FLOOD | BR_MCAST_FLOOD | BR_BCAST_FLOOD;
202 	const unsigned long mask = BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD |
203 				   BR_BCAST_FLOOD;
204 	int flag, err;
205 
206 	for_each_set_bit(flag, &mask, 32) {
207 		struct switchdev_brport_flags flags = {0};
208 
209 		flags.mask = BIT(flag);
210 		flags.val = val & BIT(flag);
211 
212 		err = dsa_port_bridge_flags(dp, flags, NULL);
213 		if (err && err != -EOPNOTSUPP)
214 			dev_err(dp->ds->dev,
215 				"failed to clear bridge port flag %lu: %pe\n",
216 				flags.val, ERR_PTR(err));
217 	}
218 }
219 
220 static int dsa_port_switchdev_sync_attrs(struct dsa_port *dp,
221 					 struct netlink_ext_ack *extack)
222 {
223 	struct net_device *brport_dev = dsa_port_to_bridge_port(dp);
224 	struct net_device *br = dsa_port_bridge_dev_get(dp);
225 	int err;
226 
227 	err = dsa_port_inherit_brport_flags(dp, extack);
228 	if (err)
229 		return err;
230 
231 	err = dsa_port_set_state(dp, br_port_get_stp_state(brport_dev), false);
232 	if (err && err != -EOPNOTSUPP)
233 		return err;
234 
235 	err = dsa_port_vlan_filtering(dp, br_vlan_enabled(br), extack);
236 	if (err && err != -EOPNOTSUPP)
237 		return err;
238 
239 	err = dsa_port_ageing_time(dp, br_get_ageing_time(br));
240 	if (err && err != -EOPNOTSUPP)
241 		return err;
242 
243 	return 0;
244 }
245 
246 static void dsa_port_switchdev_unsync_attrs(struct dsa_port *dp)
247 {
248 	/* Configure the port for standalone mode (no address learning,
249 	 * flood everything).
250 	 * The bridge only emits SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS events
251 	 * when the user requests it through netlink or sysfs, but not
252 	 * automatically at port join or leave, so we need to handle resetting
253 	 * the brport flags ourselves. But we even prefer it that way, because
254 	 * otherwise, some setups might never get the notification they need,
255 	 * for example, when a port leaves a LAG that offloads the bridge,
256 	 * it becomes standalone, but as far as the bridge is concerned, no
257 	 * port ever left.
258 	 */
259 	dsa_port_clear_brport_flags(dp);
260 
261 	/* Port left the bridge, put in BR_STATE_DISABLED by the bridge layer,
262 	 * so allow it to be in BR_STATE_FORWARDING to be kept functional
263 	 */
264 	dsa_port_set_state_now(dp, BR_STATE_FORWARDING, true);
265 
266 	/* VLAN filtering is handled by dsa_switch_bridge_leave */
267 
268 	/* Ageing time may be global to the switch chip, so don't change it
269 	 * here because we have no good reason (or value) to change it to.
270 	 */
271 }
272 
273 static void dsa_port_bridge_tx_fwd_unoffload(struct dsa_port *dp,
274 					     struct dsa_bridge bridge)
275 {
276 	struct dsa_switch *ds = dp->ds;
277 
278 	/* No bridge TX forwarding offload => do nothing */
279 	if (!ds->ops->port_bridge_tx_fwd_unoffload || !bridge.num)
280 		return;
281 
282 	/* Notify the chips only once the offload has been deactivated, so
283 	 * that they can update their configuration accordingly.
284 	 */
285 	ds->ops->port_bridge_tx_fwd_unoffload(ds, dp->index, bridge);
286 }
287 
288 static bool dsa_port_bridge_tx_fwd_offload(struct dsa_port *dp,
289 					   struct dsa_bridge bridge)
290 {
291 	struct dsa_switch *ds = dp->ds;
292 	int err;
293 
294 	/* FDB isolation is required for TX forwarding offload */
295 	if (!ds->ops->port_bridge_tx_fwd_offload || !bridge.num)
296 		return false;
297 
298 	/* Notify the driver */
299 	err = ds->ops->port_bridge_tx_fwd_offload(ds, dp->index, bridge);
300 
301 	return err ? false : true;
302 }
303 
304 static int dsa_port_bridge_create(struct dsa_port *dp,
305 				  struct net_device *br,
306 				  struct netlink_ext_ack *extack)
307 {
308 	struct dsa_switch *ds = dp->ds;
309 	struct dsa_bridge *bridge;
310 
311 	bridge = dsa_tree_bridge_find(ds->dst, br);
312 	if (bridge) {
313 		refcount_inc(&bridge->refcount);
314 		dp->bridge = bridge;
315 		return 0;
316 	}
317 
318 	bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
319 	if (!bridge)
320 		return -ENOMEM;
321 
322 	refcount_set(&bridge->refcount, 1);
323 
324 	bridge->dev = br;
325 
326 	bridge->num = dsa_bridge_num_get(br, ds->max_num_bridges);
327 	if (ds->max_num_bridges && !bridge->num) {
328 		NL_SET_ERR_MSG_MOD(extack,
329 				   "Range of offloadable bridges exceeded");
330 		kfree(bridge);
331 		return -EOPNOTSUPP;
332 	}
333 
334 	dp->bridge = bridge;
335 
336 	return 0;
337 }
338 
339 static void dsa_port_bridge_destroy(struct dsa_port *dp,
340 				    const struct net_device *br)
341 {
342 	struct dsa_bridge *bridge = dp->bridge;
343 
344 	dp->bridge = NULL;
345 
346 	if (!refcount_dec_and_test(&bridge->refcount))
347 		return;
348 
349 	if (bridge->num)
350 		dsa_bridge_num_put(br, bridge->num);
351 
352 	kfree(bridge);
353 }
354 
355 int dsa_port_bridge_join(struct dsa_port *dp, struct net_device *br,
356 			 struct netlink_ext_ack *extack)
357 {
358 	struct dsa_notifier_bridge_info info = {
359 		.tree_index = dp->ds->dst->index,
360 		.sw_index = dp->ds->index,
361 		.port = dp->index,
362 	};
363 	struct net_device *dev = dp->slave;
364 	struct net_device *brport_dev;
365 	bool tx_fwd_offload;
366 	int err;
367 
368 	/* Here the interface is already bridged. Reflect the current
369 	 * configuration so that drivers can program their chips accordingly.
370 	 */
371 	err = dsa_port_bridge_create(dp, br, extack);
372 	if (err)
373 		return err;
374 
375 	brport_dev = dsa_port_to_bridge_port(dp);
376 
377 	info.bridge = *dp->bridge;
378 	err = dsa_broadcast(DSA_NOTIFIER_BRIDGE_JOIN, &info);
379 	if (err)
380 		goto out_rollback;
381 
382 	tx_fwd_offload = dsa_port_bridge_tx_fwd_offload(dp, info.bridge);
383 
384 	err = switchdev_bridge_port_offload(brport_dev, dev, dp,
385 					    &dsa_slave_switchdev_notifier,
386 					    &dsa_slave_switchdev_blocking_notifier,
387 					    tx_fwd_offload, extack);
388 	if (err)
389 		goto out_rollback_unbridge;
390 
391 	err = dsa_port_switchdev_sync_attrs(dp, extack);
392 	if (err)
393 		goto out_rollback_unoffload;
394 
395 	return 0;
396 
397 out_rollback_unoffload:
398 	switchdev_bridge_port_unoffload(brport_dev, dp,
399 					&dsa_slave_switchdev_notifier,
400 					&dsa_slave_switchdev_blocking_notifier);
401 out_rollback_unbridge:
402 	dsa_broadcast(DSA_NOTIFIER_BRIDGE_LEAVE, &info);
403 out_rollback:
404 	dsa_port_bridge_destroy(dp, br);
405 	return err;
406 }
407 
408 void dsa_port_pre_bridge_leave(struct dsa_port *dp, struct net_device *br)
409 {
410 	struct net_device *brport_dev = dsa_port_to_bridge_port(dp);
411 
412 	/* Don't try to unoffload something that is not offloaded */
413 	if (!brport_dev)
414 		return;
415 
416 	switchdev_bridge_port_unoffload(brport_dev, dp,
417 					&dsa_slave_switchdev_notifier,
418 					&dsa_slave_switchdev_blocking_notifier);
419 
420 	dsa_flush_workqueue();
421 }
422 
423 void dsa_port_bridge_leave(struct dsa_port *dp, struct net_device *br)
424 {
425 	struct dsa_notifier_bridge_info info = {
426 		.tree_index = dp->ds->dst->index,
427 		.sw_index = dp->ds->index,
428 		.port = dp->index,
429 		.bridge = *dp->bridge,
430 	};
431 	int err;
432 
433 	/* Here the port is already unbridged. Reflect the current configuration
434 	 * so that drivers can program their chips accordingly.
435 	 */
436 	dsa_port_bridge_destroy(dp, br);
437 
438 	dsa_port_bridge_tx_fwd_unoffload(dp, info.bridge);
439 
440 	err = dsa_broadcast(DSA_NOTIFIER_BRIDGE_LEAVE, &info);
441 	if (err)
442 		dev_err(dp->ds->dev,
443 			"port %d failed to notify DSA_NOTIFIER_BRIDGE_LEAVE: %pe\n",
444 			dp->index, ERR_PTR(err));
445 
446 	dsa_port_switchdev_unsync_attrs(dp);
447 }
448 
449 int dsa_port_lag_change(struct dsa_port *dp,
450 			struct netdev_lag_lower_state_info *linfo)
451 {
452 	struct dsa_notifier_lag_info info = {
453 		.sw_index = dp->ds->index,
454 		.port = dp->index,
455 	};
456 	bool tx_enabled;
457 
458 	if (!dp->lag_dev)
459 		return 0;
460 
461 	/* On statically configured aggregates (e.g. loadbalance
462 	 * without LACP) ports will always be tx_enabled, even if the
463 	 * link is down. Thus we require both link_up and tx_enabled
464 	 * in order to include it in the tx set.
465 	 */
466 	tx_enabled = linfo->link_up && linfo->tx_enabled;
467 
468 	if (tx_enabled == dp->lag_tx_enabled)
469 		return 0;
470 
471 	dp->lag_tx_enabled = tx_enabled;
472 
473 	return dsa_port_notify(dp, DSA_NOTIFIER_LAG_CHANGE, &info);
474 }
475 
476 int dsa_port_lag_join(struct dsa_port *dp, struct net_device *lag,
477 		      struct netdev_lag_upper_info *uinfo,
478 		      struct netlink_ext_ack *extack)
479 {
480 	struct dsa_notifier_lag_info info = {
481 		.sw_index = dp->ds->index,
482 		.port = dp->index,
483 		.lag = lag,
484 		.info = uinfo,
485 	};
486 	struct net_device *bridge_dev;
487 	int err;
488 
489 	dsa_lag_map(dp->ds->dst, lag);
490 	dp->lag_dev = lag;
491 
492 	err = dsa_port_notify(dp, DSA_NOTIFIER_LAG_JOIN, &info);
493 	if (err)
494 		goto err_lag_join;
495 
496 	bridge_dev = netdev_master_upper_dev_get(lag);
497 	if (!bridge_dev || !netif_is_bridge_master(bridge_dev))
498 		return 0;
499 
500 	err = dsa_port_bridge_join(dp, bridge_dev, extack);
501 	if (err)
502 		goto err_bridge_join;
503 
504 	return 0;
505 
506 err_bridge_join:
507 	dsa_port_notify(dp, DSA_NOTIFIER_LAG_LEAVE, &info);
508 err_lag_join:
509 	dp->lag_dev = NULL;
510 	dsa_lag_unmap(dp->ds->dst, lag);
511 	return err;
512 }
513 
514 void dsa_port_pre_lag_leave(struct dsa_port *dp, struct net_device *lag)
515 {
516 	struct net_device *br = dsa_port_bridge_dev_get(dp);
517 
518 	if (br)
519 		dsa_port_pre_bridge_leave(dp, br);
520 }
521 
522 void dsa_port_lag_leave(struct dsa_port *dp, struct net_device *lag)
523 {
524 	struct net_device *br = dsa_port_bridge_dev_get(dp);
525 	struct dsa_notifier_lag_info info = {
526 		.sw_index = dp->ds->index,
527 		.port = dp->index,
528 		.lag = lag,
529 	};
530 	int err;
531 
532 	if (!dp->lag_dev)
533 		return;
534 
535 	/* Port might have been part of a LAG that in turn was
536 	 * attached to a bridge.
537 	 */
538 	if (br)
539 		dsa_port_bridge_leave(dp, br);
540 
541 	dp->lag_tx_enabled = false;
542 	dp->lag_dev = NULL;
543 
544 	err = dsa_port_notify(dp, DSA_NOTIFIER_LAG_LEAVE, &info);
545 	if (err)
546 		dev_err(dp->ds->dev,
547 			"port %d failed to notify DSA_NOTIFIER_LAG_LEAVE: %pe\n",
548 			dp->index, ERR_PTR(err));
549 
550 	dsa_lag_unmap(dp->ds->dst, lag);
551 }
552 
553 /* Must be called under rcu_read_lock() */
554 static bool dsa_port_can_apply_vlan_filtering(struct dsa_port *dp,
555 					      bool vlan_filtering,
556 					      struct netlink_ext_ack *extack)
557 {
558 	struct dsa_switch *ds = dp->ds;
559 	struct dsa_port *other_dp;
560 	int err;
561 
562 	/* VLAN awareness was off, so the question is "can we turn it on".
563 	 * We may have had 8021q uppers, those need to go. Make sure we don't
564 	 * enter an inconsistent state: deny changing the VLAN awareness state
565 	 * as long as we have 8021q uppers.
566 	 */
567 	if (vlan_filtering && dsa_port_is_user(dp)) {
568 		struct net_device *br = dsa_port_bridge_dev_get(dp);
569 		struct net_device *upper_dev, *slave = dp->slave;
570 		struct list_head *iter;
571 
572 		netdev_for_each_upper_dev_rcu(slave, upper_dev, iter) {
573 			struct bridge_vlan_info br_info;
574 			u16 vid;
575 
576 			if (!is_vlan_dev(upper_dev))
577 				continue;
578 
579 			vid = vlan_dev_vlan_id(upper_dev);
580 
581 			/* br_vlan_get_info() returns -EINVAL or -ENOENT if the
582 			 * device, respectively the VID is not found, returning
583 			 * 0 means success, which is a failure for us here.
584 			 */
585 			err = br_vlan_get_info(br, vid, &br_info);
586 			if (err == 0) {
587 				NL_SET_ERR_MSG_MOD(extack,
588 						   "Must first remove VLAN uppers having VIDs also present in bridge");
589 				return false;
590 			}
591 		}
592 	}
593 
594 	if (!ds->vlan_filtering_is_global)
595 		return true;
596 
597 	/* For cases where enabling/disabling VLAN awareness is global to the
598 	 * switch, we need to handle the case where multiple bridges span
599 	 * different ports of the same switch device and one of them has a
600 	 * different setting than what is being requested.
601 	 */
602 	dsa_switch_for_each_port(other_dp, ds) {
603 		struct net_device *other_br = dsa_port_bridge_dev_get(other_dp);
604 
605 		/* If it's the same bridge, it also has same
606 		 * vlan_filtering setting => no need to check
607 		 */
608 		if (!other_br || other_br == dsa_port_bridge_dev_get(dp))
609 			continue;
610 
611 		if (br_vlan_enabled(other_br) != vlan_filtering) {
612 			NL_SET_ERR_MSG_MOD(extack,
613 					   "VLAN filtering is a global setting");
614 			return false;
615 		}
616 	}
617 	return true;
618 }
619 
620 int dsa_port_vlan_filtering(struct dsa_port *dp, bool vlan_filtering,
621 			    struct netlink_ext_ack *extack)
622 {
623 	bool old_vlan_filtering = dsa_port_is_vlan_filtering(dp);
624 	struct dsa_switch *ds = dp->ds;
625 	bool apply;
626 	int err;
627 
628 	if (!ds->ops->port_vlan_filtering)
629 		return -EOPNOTSUPP;
630 
631 	/* We are called from dsa_slave_switchdev_blocking_event(),
632 	 * which is not under rcu_read_lock(), unlike
633 	 * dsa_slave_switchdev_event().
634 	 */
635 	rcu_read_lock();
636 	apply = dsa_port_can_apply_vlan_filtering(dp, vlan_filtering, extack);
637 	rcu_read_unlock();
638 	if (!apply)
639 		return -EINVAL;
640 
641 	if (dsa_port_is_vlan_filtering(dp) == vlan_filtering)
642 		return 0;
643 
644 	err = ds->ops->port_vlan_filtering(ds, dp->index, vlan_filtering,
645 					   extack);
646 	if (err)
647 		return err;
648 
649 	if (ds->vlan_filtering_is_global) {
650 		struct dsa_port *other_dp;
651 
652 		ds->vlan_filtering = vlan_filtering;
653 
654 		dsa_switch_for_each_user_port(other_dp, ds) {
655 			struct net_device *slave = dp->slave;
656 
657 			/* We might be called in the unbind path, so not
658 			 * all slave devices might still be registered.
659 			 */
660 			if (!slave)
661 				continue;
662 
663 			err = dsa_slave_manage_vlan_filtering(slave,
664 							      vlan_filtering);
665 			if (err)
666 				goto restore;
667 		}
668 	} else {
669 		dp->vlan_filtering = vlan_filtering;
670 
671 		err = dsa_slave_manage_vlan_filtering(dp->slave,
672 						      vlan_filtering);
673 		if (err)
674 			goto restore;
675 	}
676 
677 	return 0;
678 
679 restore:
680 	ds->ops->port_vlan_filtering(ds, dp->index, old_vlan_filtering, NULL);
681 
682 	if (ds->vlan_filtering_is_global)
683 		ds->vlan_filtering = old_vlan_filtering;
684 	else
685 		dp->vlan_filtering = old_vlan_filtering;
686 
687 	return err;
688 }
689 
690 /* This enforces legacy behavior for switch drivers which assume they can't
691  * receive VLAN configuration when enslaved to a bridge with vlan_filtering=0
692  */
693 bool dsa_port_skip_vlan_configuration(struct dsa_port *dp)
694 {
695 	struct net_device *br = dsa_port_bridge_dev_get(dp);
696 	struct dsa_switch *ds = dp->ds;
697 
698 	if (!br)
699 		return false;
700 
701 	return !ds->configure_vlan_while_not_filtering && !br_vlan_enabled(br);
702 }
703 
704 int dsa_port_ageing_time(struct dsa_port *dp, clock_t ageing_clock)
705 {
706 	unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock);
707 	unsigned int ageing_time = jiffies_to_msecs(ageing_jiffies);
708 	struct dsa_notifier_ageing_time_info info;
709 	int err;
710 
711 	info.ageing_time = ageing_time;
712 
713 	err = dsa_port_notify(dp, DSA_NOTIFIER_AGEING_TIME, &info);
714 	if (err)
715 		return err;
716 
717 	dp->ageing_time = ageing_time;
718 
719 	return 0;
720 }
721 
722 int dsa_port_pre_bridge_flags(const struct dsa_port *dp,
723 			      struct switchdev_brport_flags flags,
724 			      struct netlink_ext_ack *extack)
725 {
726 	struct dsa_switch *ds = dp->ds;
727 
728 	if (!ds->ops->port_pre_bridge_flags)
729 		return -EINVAL;
730 
731 	return ds->ops->port_pre_bridge_flags(ds, dp->index, flags, extack);
732 }
733 
734 int dsa_port_bridge_flags(struct dsa_port *dp,
735 			  struct switchdev_brport_flags flags,
736 			  struct netlink_ext_ack *extack)
737 {
738 	struct dsa_switch *ds = dp->ds;
739 	int err;
740 
741 	if (!ds->ops->port_bridge_flags)
742 		return -EOPNOTSUPP;
743 
744 	err = ds->ops->port_bridge_flags(ds, dp->index, flags, extack);
745 	if (err)
746 		return err;
747 
748 	if (flags.mask & BR_LEARNING) {
749 		bool learning = flags.val & BR_LEARNING;
750 
751 		if (learning == dp->learning)
752 			return 0;
753 
754 		if ((dp->learning && !learning) &&
755 		    (dp->stp_state == BR_STATE_LEARNING ||
756 		     dp->stp_state == BR_STATE_FORWARDING))
757 			dsa_port_fast_age(dp);
758 
759 		dp->learning = learning;
760 	}
761 
762 	return 0;
763 }
764 
765 int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
766 			bool targeted_match)
767 {
768 	struct dsa_notifier_mtu_info info = {
769 		.sw_index = dp->ds->index,
770 		.targeted_match = targeted_match,
771 		.port = dp->index,
772 		.mtu = new_mtu,
773 	};
774 
775 	return dsa_port_notify(dp, DSA_NOTIFIER_MTU, &info);
776 }
777 
778 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
779 		     u16 vid)
780 {
781 	struct dsa_notifier_fdb_info info = {
782 		.sw_index = dp->ds->index,
783 		.port = dp->index,
784 		.addr = addr,
785 		.vid = vid,
786 	};
787 
788 	return dsa_port_notify(dp, DSA_NOTIFIER_FDB_ADD, &info);
789 }
790 
791 int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr,
792 		     u16 vid)
793 {
794 	struct dsa_notifier_fdb_info info = {
795 		.sw_index = dp->ds->index,
796 		.port = dp->index,
797 		.addr = addr,
798 		.vid = vid,
799 
800 	};
801 
802 	return dsa_port_notify(dp, DSA_NOTIFIER_FDB_DEL, &info);
803 }
804 
805 int dsa_port_host_fdb_add(struct dsa_port *dp, const unsigned char *addr,
806 			  u16 vid)
807 {
808 	struct dsa_notifier_fdb_info info = {
809 		.sw_index = dp->ds->index,
810 		.port = dp->index,
811 		.addr = addr,
812 		.vid = vid,
813 	};
814 	struct dsa_port *cpu_dp = dp->cpu_dp;
815 	int err;
816 
817 	err = dev_uc_add(cpu_dp->master, addr);
818 	if (err)
819 		return err;
820 
821 	return dsa_port_notify(dp, DSA_NOTIFIER_HOST_FDB_ADD, &info);
822 }
823 
824 int dsa_port_host_fdb_del(struct dsa_port *dp, const unsigned char *addr,
825 			  u16 vid)
826 {
827 	struct dsa_notifier_fdb_info info = {
828 		.sw_index = dp->ds->index,
829 		.port = dp->index,
830 		.addr = addr,
831 		.vid = vid,
832 	};
833 	struct dsa_port *cpu_dp = dp->cpu_dp;
834 	int err;
835 
836 	err = dev_uc_del(cpu_dp->master, addr);
837 	if (err)
838 		return err;
839 
840 	return dsa_port_notify(dp, DSA_NOTIFIER_HOST_FDB_DEL, &info);
841 }
842 
843 int dsa_port_fdb_dump(struct dsa_port *dp, dsa_fdb_dump_cb_t *cb, void *data)
844 {
845 	struct dsa_switch *ds = dp->ds;
846 	int port = dp->index;
847 
848 	if (!ds->ops->port_fdb_dump)
849 		return -EOPNOTSUPP;
850 
851 	return ds->ops->port_fdb_dump(ds, port, cb, data);
852 }
853 
854 int dsa_port_mdb_add(const struct dsa_port *dp,
855 		     const struct switchdev_obj_port_mdb *mdb)
856 {
857 	struct dsa_notifier_mdb_info info = {
858 		.sw_index = dp->ds->index,
859 		.port = dp->index,
860 		.mdb = mdb,
861 	};
862 
863 	return dsa_port_notify(dp, DSA_NOTIFIER_MDB_ADD, &info);
864 }
865 
866 int dsa_port_mdb_del(const struct dsa_port *dp,
867 		     const struct switchdev_obj_port_mdb *mdb)
868 {
869 	struct dsa_notifier_mdb_info info = {
870 		.sw_index = dp->ds->index,
871 		.port = dp->index,
872 		.mdb = mdb,
873 	};
874 
875 	return dsa_port_notify(dp, DSA_NOTIFIER_MDB_DEL, &info);
876 }
877 
878 int dsa_port_host_mdb_add(const struct dsa_port *dp,
879 			  const struct switchdev_obj_port_mdb *mdb)
880 {
881 	struct dsa_notifier_mdb_info info = {
882 		.sw_index = dp->ds->index,
883 		.port = dp->index,
884 		.mdb = mdb,
885 	};
886 	struct dsa_port *cpu_dp = dp->cpu_dp;
887 	int err;
888 
889 	err = dev_mc_add(cpu_dp->master, mdb->addr);
890 	if (err)
891 		return err;
892 
893 	return dsa_port_notify(dp, DSA_NOTIFIER_HOST_MDB_ADD, &info);
894 }
895 
896 int dsa_port_host_mdb_del(const struct dsa_port *dp,
897 			  const struct switchdev_obj_port_mdb *mdb)
898 {
899 	struct dsa_notifier_mdb_info info = {
900 		.sw_index = dp->ds->index,
901 		.port = dp->index,
902 		.mdb = mdb,
903 	};
904 	struct dsa_port *cpu_dp = dp->cpu_dp;
905 	int err;
906 
907 	err = dev_mc_del(cpu_dp->master, mdb->addr);
908 	if (err)
909 		return err;
910 
911 	return dsa_port_notify(dp, DSA_NOTIFIER_HOST_MDB_DEL, &info);
912 }
913 
914 int dsa_port_vlan_add(struct dsa_port *dp,
915 		      const struct switchdev_obj_port_vlan *vlan,
916 		      struct netlink_ext_ack *extack)
917 {
918 	struct dsa_notifier_vlan_info info = {
919 		.sw_index = dp->ds->index,
920 		.port = dp->index,
921 		.vlan = vlan,
922 		.extack = extack,
923 	};
924 
925 	return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_ADD, &info);
926 }
927 
928 int dsa_port_vlan_del(struct dsa_port *dp,
929 		      const struct switchdev_obj_port_vlan *vlan)
930 {
931 	struct dsa_notifier_vlan_info info = {
932 		.sw_index = dp->ds->index,
933 		.port = dp->index,
934 		.vlan = vlan,
935 	};
936 
937 	return dsa_port_notify(dp, DSA_NOTIFIER_VLAN_DEL, &info);
938 }
939 
940 int dsa_port_mrp_add(const struct dsa_port *dp,
941 		     const struct switchdev_obj_mrp *mrp)
942 {
943 	struct dsa_notifier_mrp_info info = {
944 		.sw_index = dp->ds->index,
945 		.port = dp->index,
946 		.mrp = mrp,
947 	};
948 
949 	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD, &info);
950 }
951 
952 int dsa_port_mrp_del(const struct dsa_port *dp,
953 		     const struct switchdev_obj_mrp *mrp)
954 {
955 	struct dsa_notifier_mrp_info info = {
956 		.sw_index = dp->ds->index,
957 		.port = dp->index,
958 		.mrp = mrp,
959 	};
960 
961 	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL, &info);
962 }
963 
964 int dsa_port_mrp_add_ring_role(const struct dsa_port *dp,
965 			       const struct switchdev_obj_ring_role_mrp *mrp)
966 {
967 	struct dsa_notifier_mrp_ring_role_info info = {
968 		.sw_index = dp->ds->index,
969 		.port = dp->index,
970 		.mrp = mrp,
971 	};
972 
973 	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_ADD_RING_ROLE, &info);
974 }
975 
976 int dsa_port_mrp_del_ring_role(const struct dsa_port *dp,
977 			       const struct switchdev_obj_ring_role_mrp *mrp)
978 {
979 	struct dsa_notifier_mrp_ring_role_info info = {
980 		.sw_index = dp->ds->index,
981 		.port = dp->index,
982 		.mrp = mrp,
983 	};
984 
985 	return dsa_port_notify(dp, DSA_NOTIFIER_MRP_DEL_RING_ROLE, &info);
986 }
987 
988 void dsa_port_set_tag_protocol(struct dsa_port *cpu_dp,
989 			       const struct dsa_device_ops *tag_ops)
990 {
991 	cpu_dp->rcv = tag_ops->rcv;
992 	cpu_dp->tag_ops = tag_ops;
993 }
994 
995 static struct phy_device *dsa_port_get_phy_device(struct dsa_port *dp)
996 {
997 	struct device_node *phy_dn;
998 	struct phy_device *phydev;
999 
1000 	phy_dn = of_parse_phandle(dp->dn, "phy-handle", 0);
1001 	if (!phy_dn)
1002 		return NULL;
1003 
1004 	phydev = of_phy_find_device(phy_dn);
1005 	if (!phydev) {
1006 		of_node_put(phy_dn);
1007 		return ERR_PTR(-EPROBE_DEFER);
1008 	}
1009 
1010 	of_node_put(phy_dn);
1011 	return phydev;
1012 }
1013 
1014 static void dsa_port_phylink_validate(struct phylink_config *config,
1015 				      unsigned long *supported,
1016 				      struct phylink_link_state *state)
1017 {
1018 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1019 	struct dsa_switch *ds = dp->ds;
1020 
1021 	if (!ds->ops->phylink_validate) {
1022 		if (config->mac_capabilities)
1023 			phylink_generic_validate(config, supported, state);
1024 		return;
1025 	}
1026 
1027 	ds->ops->phylink_validate(ds, dp->index, supported, state);
1028 }
1029 
1030 static void dsa_port_phylink_mac_pcs_get_state(struct phylink_config *config,
1031 					       struct phylink_link_state *state)
1032 {
1033 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1034 	struct dsa_switch *ds = dp->ds;
1035 	int err;
1036 
1037 	/* Only called for inband modes */
1038 	if (!ds->ops->phylink_mac_link_state) {
1039 		state->link = 0;
1040 		return;
1041 	}
1042 
1043 	err = ds->ops->phylink_mac_link_state(ds, dp->index, state);
1044 	if (err < 0) {
1045 		dev_err(ds->dev, "p%d: phylink_mac_link_state() failed: %d\n",
1046 			dp->index, err);
1047 		state->link = 0;
1048 	}
1049 }
1050 
1051 static void dsa_port_phylink_mac_config(struct phylink_config *config,
1052 					unsigned int mode,
1053 					const struct phylink_link_state *state)
1054 {
1055 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1056 	struct dsa_switch *ds = dp->ds;
1057 
1058 	if (!ds->ops->phylink_mac_config)
1059 		return;
1060 
1061 	ds->ops->phylink_mac_config(ds, dp->index, mode, state);
1062 }
1063 
1064 static void dsa_port_phylink_mac_an_restart(struct phylink_config *config)
1065 {
1066 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1067 	struct dsa_switch *ds = dp->ds;
1068 
1069 	if (!ds->ops->phylink_mac_an_restart)
1070 		return;
1071 
1072 	ds->ops->phylink_mac_an_restart(ds, dp->index);
1073 }
1074 
1075 static void dsa_port_phylink_mac_link_down(struct phylink_config *config,
1076 					   unsigned int mode,
1077 					   phy_interface_t interface)
1078 {
1079 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1080 	struct phy_device *phydev = NULL;
1081 	struct dsa_switch *ds = dp->ds;
1082 
1083 	if (dsa_port_is_user(dp))
1084 		phydev = dp->slave->phydev;
1085 
1086 	if (!ds->ops->phylink_mac_link_down) {
1087 		if (ds->ops->adjust_link && phydev)
1088 			ds->ops->adjust_link(ds, dp->index, phydev);
1089 		return;
1090 	}
1091 
1092 	ds->ops->phylink_mac_link_down(ds, dp->index, mode, interface);
1093 }
1094 
1095 static void dsa_port_phylink_mac_link_up(struct phylink_config *config,
1096 					 struct phy_device *phydev,
1097 					 unsigned int mode,
1098 					 phy_interface_t interface,
1099 					 int speed, int duplex,
1100 					 bool tx_pause, bool rx_pause)
1101 {
1102 	struct dsa_port *dp = container_of(config, struct dsa_port, pl_config);
1103 	struct dsa_switch *ds = dp->ds;
1104 
1105 	if (!ds->ops->phylink_mac_link_up) {
1106 		if (ds->ops->adjust_link && phydev)
1107 			ds->ops->adjust_link(ds, dp->index, phydev);
1108 		return;
1109 	}
1110 
1111 	ds->ops->phylink_mac_link_up(ds, dp->index, mode, interface, phydev,
1112 				     speed, duplex, tx_pause, rx_pause);
1113 }
1114 
1115 static const struct phylink_mac_ops dsa_port_phylink_mac_ops = {
1116 	.validate = dsa_port_phylink_validate,
1117 	.mac_pcs_get_state = dsa_port_phylink_mac_pcs_get_state,
1118 	.mac_config = dsa_port_phylink_mac_config,
1119 	.mac_an_restart = dsa_port_phylink_mac_an_restart,
1120 	.mac_link_down = dsa_port_phylink_mac_link_down,
1121 	.mac_link_up = dsa_port_phylink_mac_link_up,
1122 };
1123 
1124 int dsa_port_phylink_create(struct dsa_port *dp)
1125 {
1126 	struct dsa_switch *ds = dp->ds;
1127 	phy_interface_t mode;
1128 	int err;
1129 
1130 	err = of_get_phy_mode(dp->dn, &mode);
1131 	if (err)
1132 		mode = PHY_INTERFACE_MODE_NA;
1133 
1134 	if (ds->ops->phylink_get_caps)
1135 		ds->ops->phylink_get_caps(ds, dp->index, &dp->pl_config);
1136 
1137 	dp->pl = phylink_create(&dp->pl_config, of_fwnode_handle(dp->dn),
1138 				mode, &dsa_port_phylink_mac_ops);
1139 	if (IS_ERR(dp->pl)) {
1140 		pr_err("error creating PHYLINK: %ld\n", PTR_ERR(dp->pl));
1141 		return PTR_ERR(dp->pl);
1142 	}
1143 
1144 	return 0;
1145 }
1146 
1147 static int dsa_port_setup_phy_of(struct dsa_port *dp, bool enable)
1148 {
1149 	struct dsa_switch *ds = dp->ds;
1150 	struct phy_device *phydev;
1151 	int port = dp->index;
1152 	int err = 0;
1153 
1154 	phydev = dsa_port_get_phy_device(dp);
1155 	if (!phydev)
1156 		return 0;
1157 
1158 	if (IS_ERR(phydev))
1159 		return PTR_ERR(phydev);
1160 
1161 	if (enable) {
1162 		err = genphy_resume(phydev);
1163 		if (err < 0)
1164 			goto err_put_dev;
1165 
1166 		err = genphy_read_status(phydev);
1167 		if (err < 0)
1168 			goto err_put_dev;
1169 	} else {
1170 		err = genphy_suspend(phydev);
1171 		if (err < 0)
1172 			goto err_put_dev;
1173 	}
1174 
1175 	if (ds->ops->adjust_link)
1176 		ds->ops->adjust_link(ds, port, phydev);
1177 
1178 	dev_dbg(ds->dev, "enabled port's phy: %s", phydev_name(phydev));
1179 
1180 err_put_dev:
1181 	put_device(&phydev->mdio.dev);
1182 	return err;
1183 }
1184 
1185 static int dsa_port_fixed_link_register_of(struct dsa_port *dp)
1186 {
1187 	struct device_node *dn = dp->dn;
1188 	struct dsa_switch *ds = dp->ds;
1189 	struct phy_device *phydev;
1190 	int port = dp->index;
1191 	phy_interface_t mode;
1192 	int err;
1193 
1194 	err = of_phy_register_fixed_link(dn);
1195 	if (err) {
1196 		dev_err(ds->dev,
1197 			"failed to register the fixed PHY of port %d\n",
1198 			port);
1199 		return err;
1200 	}
1201 
1202 	phydev = of_phy_find_device(dn);
1203 
1204 	err = of_get_phy_mode(dn, &mode);
1205 	if (err)
1206 		mode = PHY_INTERFACE_MODE_NA;
1207 	phydev->interface = mode;
1208 
1209 	genphy_read_status(phydev);
1210 
1211 	if (ds->ops->adjust_link)
1212 		ds->ops->adjust_link(ds, port, phydev);
1213 
1214 	put_device(&phydev->mdio.dev);
1215 
1216 	return 0;
1217 }
1218 
1219 static int dsa_port_phylink_register(struct dsa_port *dp)
1220 {
1221 	struct dsa_switch *ds = dp->ds;
1222 	struct device_node *port_dn = dp->dn;
1223 	int err;
1224 
1225 	dp->pl_config.dev = ds->dev;
1226 	dp->pl_config.type = PHYLINK_DEV;
1227 	dp->pl_config.pcs_poll = ds->pcs_poll;
1228 
1229 	err = dsa_port_phylink_create(dp);
1230 	if (err)
1231 		return err;
1232 
1233 	err = phylink_of_phy_connect(dp->pl, port_dn, 0);
1234 	if (err && err != -ENODEV) {
1235 		pr_err("could not attach to PHY: %d\n", err);
1236 		goto err_phy_connect;
1237 	}
1238 
1239 	return 0;
1240 
1241 err_phy_connect:
1242 	phylink_destroy(dp->pl);
1243 	return err;
1244 }
1245 
1246 int dsa_port_link_register_of(struct dsa_port *dp)
1247 {
1248 	struct dsa_switch *ds = dp->ds;
1249 	struct device_node *phy_np;
1250 	int port = dp->index;
1251 
1252 	if (!ds->ops->adjust_link) {
1253 		phy_np = of_parse_phandle(dp->dn, "phy-handle", 0);
1254 		if (of_phy_is_fixed_link(dp->dn) || phy_np) {
1255 			if (ds->ops->phylink_mac_link_down)
1256 				ds->ops->phylink_mac_link_down(ds, port,
1257 					MLO_AN_FIXED, PHY_INTERFACE_MODE_NA);
1258 			return dsa_port_phylink_register(dp);
1259 		}
1260 		return 0;
1261 	}
1262 
1263 	dev_warn(ds->dev,
1264 		 "Using legacy PHYLIB callbacks. Please migrate to PHYLINK!\n");
1265 
1266 	if (of_phy_is_fixed_link(dp->dn))
1267 		return dsa_port_fixed_link_register_of(dp);
1268 	else
1269 		return dsa_port_setup_phy_of(dp, true);
1270 }
1271 
1272 void dsa_port_link_unregister_of(struct dsa_port *dp)
1273 {
1274 	struct dsa_switch *ds = dp->ds;
1275 
1276 	if (!ds->ops->adjust_link && dp->pl) {
1277 		rtnl_lock();
1278 		phylink_disconnect_phy(dp->pl);
1279 		rtnl_unlock();
1280 		phylink_destroy(dp->pl);
1281 		dp->pl = NULL;
1282 		return;
1283 	}
1284 
1285 	if (of_phy_is_fixed_link(dp->dn))
1286 		of_phy_deregister_fixed_link(dp->dn);
1287 	else
1288 		dsa_port_setup_phy_of(dp, false);
1289 }
1290 
1291 int dsa_port_get_phy_strings(struct dsa_port *dp, uint8_t *data)
1292 {
1293 	struct phy_device *phydev;
1294 	int ret = -EOPNOTSUPP;
1295 
1296 	if (of_phy_is_fixed_link(dp->dn))
1297 		return ret;
1298 
1299 	phydev = dsa_port_get_phy_device(dp);
1300 	if (IS_ERR_OR_NULL(phydev))
1301 		return ret;
1302 
1303 	ret = phy_ethtool_get_strings(phydev, data);
1304 	put_device(&phydev->mdio.dev);
1305 
1306 	return ret;
1307 }
1308 EXPORT_SYMBOL_GPL(dsa_port_get_phy_strings);
1309 
1310 int dsa_port_get_ethtool_phy_stats(struct dsa_port *dp, uint64_t *data)
1311 {
1312 	struct phy_device *phydev;
1313 	int ret = -EOPNOTSUPP;
1314 
1315 	if (of_phy_is_fixed_link(dp->dn))
1316 		return ret;
1317 
1318 	phydev = dsa_port_get_phy_device(dp);
1319 	if (IS_ERR_OR_NULL(phydev))
1320 		return ret;
1321 
1322 	ret = phy_ethtool_get_stats(phydev, NULL, data);
1323 	put_device(&phydev->mdio.dev);
1324 
1325 	return ret;
1326 }
1327 EXPORT_SYMBOL_GPL(dsa_port_get_ethtool_phy_stats);
1328 
1329 int dsa_port_get_phy_sset_count(struct dsa_port *dp)
1330 {
1331 	struct phy_device *phydev;
1332 	int ret = -EOPNOTSUPP;
1333 
1334 	if (of_phy_is_fixed_link(dp->dn))
1335 		return ret;
1336 
1337 	phydev = dsa_port_get_phy_device(dp);
1338 	if (IS_ERR_OR_NULL(phydev))
1339 		return ret;
1340 
1341 	ret = phy_ethtool_get_sset_count(phydev);
1342 	put_device(&phydev->mdio.dev);
1343 
1344 	return ret;
1345 }
1346 EXPORT_SYMBOL_GPL(dsa_port_get_phy_sset_count);
1347 
1348 int dsa_port_hsr_join(struct dsa_port *dp, struct net_device *hsr)
1349 {
1350 	struct dsa_notifier_hsr_info info = {
1351 		.sw_index = dp->ds->index,
1352 		.port = dp->index,
1353 		.hsr = hsr,
1354 	};
1355 	int err;
1356 
1357 	dp->hsr_dev = hsr;
1358 
1359 	err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_JOIN, &info);
1360 	if (err)
1361 		dp->hsr_dev = NULL;
1362 
1363 	return err;
1364 }
1365 
1366 void dsa_port_hsr_leave(struct dsa_port *dp, struct net_device *hsr)
1367 {
1368 	struct dsa_notifier_hsr_info info = {
1369 		.sw_index = dp->ds->index,
1370 		.port = dp->index,
1371 		.hsr = hsr,
1372 	};
1373 	int err;
1374 
1375 	dp->hsr_dev = NULL;
1376 
1377 	err = dsa_port_notify(dp, DSA_NOTIFIER_HSR_LEAVE, &info);
1378 	if (err)
1379 		dev_err(dp->ds->dev,
1380 			"port %d failed to notify DSA_NOTIFIER_HSR_LEAVE: %pe\n",
1381 			dp->index, ERR_PTR(err));
1382 }
1383 
1384 int dsa_port_tag_8021q_vlan_add(struct dsa_port *dp, u16 vid, bool broadcast)
1385 {
1386 	struct dsa_notifier_tag_8021q_vlan_info info = {
1387 		.tree_index = dp->ds->dst->index,
1388 		.sw_index = dp->ds->index,
1389 		.port = dp->index,
1390 		.vid = vid,
1391 	};
1392 
1393 	if (broadcast)
1394 		return dsa_broadcast(DSA_NOTIFIER_TAG_8021Q_VLAN_ADD, &info);
1395 
1396 	return dsa_port_notify(dp, DSA_NOTIFIER_TAG_8021Q_VLAN_ADD, &info);
1397 }
1398 
1399 void dsa_port_tag_8021q_vlan_del(struct dsa_port *dp, u16 vid, bool broadcast)
1400 {
1401 	struct dsa_notifier_tag_8021q_vlan_info info = {
1402 		.tree_index = dp->ds->dst->index,
1403 		.sw_index = dp->ds->index,
1404 		.port = dp->index,
1405 		.vid = vid,
1406 	};
1407 	int err;
1408 
1409 	if (broadcast)
1410 		err = dsa_broadcast(DSA_NOTIFIER_TAG_8021Q_VLAN_DEL, &info);
1411 	else
1412 		err = dsa_port_notify(dp, DSA_NOTIFIER_TAG_8021Q_VLAN_DEL, &info);
1413 	if (err)
1414 		dev_err(dp->ds->dev,
1415 			"port %d failed to notify tag_8021q VLAN %d deletion: %pe\n",
1416 			dp->index, vid, ERR_PTR(err));
1417 }
1418