Lines Matching +full:dsa +full:- +full:specific

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (c) 2017 Savoir-faire Linux Inc.
15 #include "dsa.h"
29 if (dp->ageing_time && dp->ageing_time < ageing_time) in dsa_switch_fastest_ageing_time()
30 ageing_time = dp->ageing_time; in dsa_switch_fastest_ageing_time()
38 unsigned int ageing_time = info->ageing_time; in dsa_switch_ageing_time()
40 if (ds->ageing_time_min && ageing_time < ds->ageing_time_min) in dsa_switch_ageing_time()
41 return -ERANGE; in dsa_switch_ageing_time()
43 if (ds->ageing_time_max && ageing_time > ds->ageing_time_max) in dsa_switch_ageing_time()
44 return -ERANGE; in dsa_switch_ageing_time()
49 if (ds->ops->set_ageing_time) in dsa_switch_ageing_time()
50 return ds->ops->set_ageing_time(ds, ageing_time); in dsa_switch_ageing_time()
58 return dp == info->dp || dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp); in dsa_port_mtu_match()
67 if (!ds->ops->port_change_mtu) in dsa_switch_mtu()
68 return -EOPNOTSUPP; in dsa_switch_mtu()
72 ret = ds->ops->port_change_mtu(ds, dp->index, in dsa_switch_mtu()
73 info->mtu); in dsa_switch_mtu()
87 if (info->dp->ds == ds) { in dsa_switch_bridge_join()
88 if (!ds->ops->port_bridge_join) in dsa_switch_bridge_join()
89 return -EOPNOTSUPP; in dsa_switch_bridge_join()
91 err = ds->ops->port_bridge_join(ds, info->dp->index, in dsa_switch_bridge_join()
92 info->bridge, in dsa_switch_bridge_join()
93 &info->tx_fwd_offload, in dsa_switch_bridge_join()
94 info->extack); in dsa_switch_bridge_join()
99 if (info->dp->ds != ds && ds->ops->crosschip_bridge_join) { in dsa_switch_bridge_join()
100 err = ds->ops->crosschip_bridge_join(ds, in dsa_switch_bridge_join()
101 info->dp->ds->dst->index, in dsa_switch_bridge_join()
102 info->dp->ds->index, in dsa_switch_bridge_join()
103 info->dp->index, in dsa_switch_bridge_join()
104 info->bridge, in dsa_switch_bridge_join()
105 info->extack); in dsa_switch_bridge_join()
116 if (info->dp->ds == ds && ds->ops->port_bridge_leave) in dsa_switch_bridge_leave()
117 ds->ops->port_bridge_leave(ds, info->dp->index, info->bridge); in dsa_switch_bridge_leave()
119 if (info->dp->ds != ds && ds->ops->crosschip_bridge_leave) in dsa_switch_bridge_leave()
120 ds->ops->crosschip_bridge_leave(ds, info->dp->ds->dst->index, in dsa_switch_bridge_leave()
121 info->dp->ds->index, in dsa_switch_bridge_leave()
122 info->dp->index, in dsa_switch_bridge_leave()
123 info->bridge); in dsa_switch_bridge_leave()
128 /* Matches for all upstream-facing ports (the CPU port and all upstream-facing
129 * DSA links) that sit between the targeted port on which the notifier was
135 struct dsa_port *cpu_dp = targeted_dp->cpu_dp; in dsa_port_host_address_match()
137 if (dsa_switch_is_upstream_of(dp->ds, targeted_dp->ds)) in dsa_port_host_address_match()
138 return dp->index == dsa_towards_port(dp->ds, cpu_dp->ds->index, in dsa_port_host_address_match()
139 cpu_dp->index); in dsa_port_host_address_match()
151 if (ether_addr_equal(a->addr, addr) && a->vid == vid && in dsa_mac_addr_find()
152 dsa_db_equal(&a->db, &db)) in dsa_mac_addr_find()
162 struct dsa_switch *ds = dp->ds; in dsa_port_do_mdb_add()
164 int port = dp->index; in dsa_port_do_mdb_add()
169 err = ds->ops->port_mdb_add(ds, port, mdb, db); in dsa_port_do_mdb_add()
170 trace_dsa_mdb_add_hw(dp, mdb->addr, mdb->vid, &db, err); in dsa_port_do_mdb_add()
175 mutex_lock(&dp->addr_lists_lock); in dsa_port_do_mdb_add()
177 a = dsa_mac_addr_find(&dp->mdbs, mdb->addr, mdb->vid, db); in dsa_port_do_mdb_add()
179 refcount_inc(&a->refcount); in dsa_port_do_mdb_add()
180 trace_dsa_mdb_add_bump(dp, mdb->addr, mdb->vid, &db, in dsa_port_do_mdb_add()
181 &a->refcount); in dsa_port_do_mdb_add()
187 err = -ENOMEM; in dsa_port_do_mdb_add()
191 err = ds->ops->port_mdb_add(ds, port, mdb, db); in dsa_port_do_mdb_add()
192 trace_dsa_mdb_add_hw(dp, mdb->addr, mdb->vid, &db, err); in dsa_port_do_mdb_add()
198 ether_addr_copy(a->addr, mdb->addr); in dsa_port_do_mdb_add()
199 a->vid = mdb->vid; in dsa_port_do_mdb_add()
200 a->db = db; in dsa_port_do_mdb_add()
201 refcount_set(&a->refcount, 1); in dsa_port_do_mdb_add()
202 list_add_tail(&a->list, &dp->mdbs); in dsa_port_do_mdb_add()
205 mutex_unlock(&dp->addr_lists_lock); in dsa_port_do_mdb_add()
214 struct dsa_switch *ds = dp->ds; in dsa_port_do_mdb_del()
216 int port = dp->index; in dsa_port_do_mdb_del()
221 err = ds->ops->port_mdb_del(ds, port, mdb, db); in dsa_port_do_mdb_del()
222 trace_dsa_mdb_del_hw(dp, mdb->addr, mdb->vid, &db, err); in dsa_port_do_mdb_del()
227 mutex_lock(&dp->addr_lists_lock); in dsa_port_do_mdb_del()
229 a = dsa_mac_addr_find(&dp->mdbs, mdb->addr, mdb->vid, db); in dsa_port_do_mdb_del()
231 trace_dsa_mdb_del_not_found(dp, mdb->addr, mdb->vid, &db); in dsa_port_do_mdb_del()
232 err = -ENOENT; in dsa_port_do_mdb_del()
236 if (!refcount_dec_and_test(&a->refcount)) { in dsa_port_do_mdb_del()
237 trace_dsa_mdb_del_drop(dp, mdb->addr, mdb->vid, &db, in dsa_port_do_mdb_del()
238 &a->refcount); in dsa_port_do_mdb_del()
242 err = ds->ops->port_mdb_del(ds, port, mdb, db); in dsa_port_do_mdb_del()
243 trace_dsa_mdb_del_hw(dp, mdb->addr, mdb->vid, &db, err); in dsa_port_do_mdb_del()
245 refcount_set(&a->refcount, 1); in dsa_port_do_mdb_del()
249 list_del(&a->list); in dsa_port_do_mdb_del()
253 mutex_unlock(&dp->addr_lists_lock); in dsa_port_do_mdb_del()
261 struct dsa_switch *ds = dp->ds; in dsa_port_do_fdb_add()
263 int port = dp->index; in dsa_port_do_fdb_add()
268 err = ds->ops->port_fdb_add(ds, port, addr, vid, db); in dsa_port_do_fdb_add()
274 mutex_lock(&dp->addr_lists_lock); in dsa_port_do_fdb_add()
276 a = dsa_mac_addr_find(&dp->fdbs, addr, vid, db); in dsa_port_do_fdb_add()
278 refcount_inc(&a->refcount); in dsa_port_do_fdb_add()
279 trace_dsa_fdb_add_bump(dp, addr, vid, &db, &a->refcount); in dsa_port_do_fdb_add()
285 err = -ENOMEM; in dsa_port_do_fdb_add()
289 err = ds->ops->port_fdb_add(ds, port, addr, vid, db); in dsa_port_do_fdb_add()
296 ether_addr_copy(a->addr, addr); in dsa_port_do_fdb_add()
297 a->vid = vid; in dsa_port_do_fdb_add()
298 a->db = db; in dsa_port_do_fdb_add()
299 refcount_set(&a->refcount, 1); in dsa_port_do_fdb_add()
300 list_add_tail(&a->list, &dp->fdbs); in dsa_port_do_fdb_add()
303 mutex_unlock(&dp->addr_lists_lock); in dsa_port_do_fdb_add()
311 struct dsa_switch *ds = dp->ds; in dsa_port_do_fdb_del()
313 int port = dp->index; in dsa_port_do_fdb_del()
318 err = ds->ops->port_fdb_del(ds, port, addr, vid, db); in dsa_port_do_fdb_del()
324 mutex_lock(&dp->addr_lists_lock); in dsa_port_do_fdb_del()
326 a = dsa_mac_addr_find(&dp->fdbs, addr, vid, db); in dsa_port_do_fdb_del()
329 err = -ENOENT; in dsa_port_do_fdb_del()
333 if (!refcount_dec_and_test(&a->refcount)) { in dsa_port_do_fdb_del()
334 trace_dsa_fdb_del_drop(dp, addr, vid, &db, &a->refcount); in dsa_port_do_fdb_del()
338 err = ds->ops->port_fdb_del(ds, port, addr, vid, db); in dsa_port_do_fdb_del()
341 refcount_set(&a->refcount, 1); in dsa_port_do_fdb_del()
345 list_del(&a->list); in dsa_port_do_fdb_del()
349 mutex_unlock(&dp->addr_lists_lock); in dsa_port_do_fdb_del()
361 mutex_lock(&lag->fdb_lock); in dsa_switch_do_lag_fdb_add()
363 a = dsa_mac_addr_find(&lag->fdbs, addr, vid, db); in dsa_switch_do_lag_fdb_add()
365 refcount_inc(&a->refcount); in dsa_switch_do_lag_fdb_add()
366 trace_dsa_lag_fdb_add_bump(lag->dev, addr, vid, &db, in dsa_switch_do_lag_fdb_add()
367 &a->refcount); in dsa_switch_do_lag_fdb_add()
373 err = -ENOMEM; in dsa_switch_do_lag_fdb_add()
377 err = ds->ops->lag_fdb_add(ds, *lag, addr, vid, db); in dsa_switch_do_lag_fdb_add()
378 trace_dsa_lag_fdb_add_hw(lag->dev, addr, vid, &db, err); in dsa_switch_do_lag_fdb_add()
384 ether_addr_copy(a->addr, addr); in dsa_switch_do_lag_fdb_add()
385 a->vid = vid; in dsa_switch_do_lag_fdb_add()
386 a->db = db; in dsa_switch_do_lag_fdb_add()
387 refcount_set(&a->refcount, 1); in dsa_switch_do_lag_fdb_add()
388 list_add_tail(&a->list, &lag->fdbs); in dsa_switch_do_lag_fdb_add()
391 mutex_unlock(&lag->fdb_lock); in dsa_switch_do_lag_fdb_add()
403 mutex_lock(&lag->fdb_lock); in dsa_switch_do_lag_fdb_del()
405 a = dsa_mac_addr_find(&lag->fdbs, addr, vid, db); in dsa_switch_do_lag_fdb_del()
407 trace_dsa_lag_fdb_del_not_found(lag->dev, addr, vid, &db); in dsa_switch_do_lag_fdb_del()
408 err = -ENOENT; in dsa_switch_do_lag_fdb_del()
412 if (!refcount_dec_and_test(&a->refcount)) { in dsa_switch_do_lag_fdb_del()
413 trace_dsa_lag_fdb_del_drop(lag->dev, addr, vid, &db, in dsa_switch_do_lag_fdb_del()
414 &a->refcount); in dsa_switch_do_lag_fdb_del()
418 err = ds->ops->lag_fdb_del(ds, *lag, addr, vid, db); in dsa_switch_do_lag_fdb_del()
419 trace_dsa_lag_fdb_del_hw(lag->dev, addr, vid, &db, err); in dsa_switch_do_lag_fdb_del()
421 refcount_set(&a->refcount, 1); in dsa_switch_do_lag_fdb_del()
425 list_del(&a->list); in dsa_switch_do_lag_fdb_del()
429 mutex_unlock(&lag->fdb_lock); in dsa_switch_do_lag_fdb_del()
440 if (!ds->ops->port_fdb_add) in dsa_switch_host_fdb_add()
441 return -EOPNOTSUPP; in dsa_switch_host_fdb_add()
444 if (dsa_port_host_address_match(dp, info->dp)) { in dsa_switch_host_fdb_add()
445 if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { in dsa_switch_host_fdb_add()
446 err = dsa_switch_do_lag_fdb_add(ds, dp->lag, in dsa_switch_host_fdb_add()
447 info->addr, in dsa_switch_host_fdb_add()
448 info->vid, in dsa_switch_host_fdb_add()
449 info->db); in dsa_switch_host_fdb_add()
451 err = dsa_port_do_fdb_add(dp, info->addr, in dsa_switch_host_fdb_add()
452 info->vid, info->db); in dsa_switch_host_fdb_add()
468 if (!ds->ops->port_fdb_del) in dsa_switch_host_fdb_del()
469 return -EOPNOTSUPP; in dsa_switch_host_fdb_del()
472 if (dsa_port_host_address_match(dp, info->dp)) { in dsa_switch_host_fdb_del()
473 if (dsa_port_is_cpu(dp) && info->dp->cpu_port_in_lag) { in dsa_switch_host_fdb_del()
474 err = dsa_switch_do_lag_fdb_del(ds, dp->lag, in dsa_switch_host_fdb_del()
475 info->addr, in dsa_switch_host_fdb_del()
476 info->vid, in dsa_switch_host_fdb_del()
477 info->db); in dsa_switch_host_fdb_del()
479 err = dsa_port_do_fdb_del(dp, info->addr, in dsa_switch_host_fdb_del()
480 info->vid, info->db); in dsa_switch_host_fdb_del()
493 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); in dsa_switch_fdb_add()
496 if (!ds->ops->port_fdb_add) in dsa_switch_fdb_add()
497 return -EOPNOTSUPP; in dsa_switch_fdb_add()
499 return dsa_port_do_fdb_add(dp, info->addr, info->vid, info->db); in dsa_switch_fdb_add()
505 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); in dsa_switch_fdb_del()
508 if (!ds->ops->port_fdb_del) in dsa_switch_fdb_del()
509 return -EOPNOTSUPP; in dsa_switch_fdb_del()
511 return dsa_port_do_fdb_del(dp, info->addr, info->vid, info->db); in dsa_switch_fdb_del()
519 if (!ds->ops->lag_fdb_add) in dsa_switch_lag_fdb_add()
520 return -EOPNOTSUPP; in dsa_switch_lag_fdb_add()
524 if (dsa_port_offloads_lag(dp, info->lag)) in dsa_switch_lag_fdb_add()
525 return dsa_switch_do_lag_fdb_add(ds, info->lag, in dsa_switch_lag_fdb_add()
526 info->addr, info->vid, in dsa_switch_lag_fdb_add()
527 info->db); in dsa_switch_lag_fdb_add()
537 if (!ds->ops->lag_fdb_del) in dsa_switch_lag_fdb_del()
538 return -EOPNOTSUPP; in dsa_switch_lag_fdb_del()
542 if (dsa_port_offloads_lag(dp, info->lag)) in dsa_switch_lag_fdb_del()
543 return dsa_switch_do_lag_fdb_del(ds, info->lag, in dsa_switch_lag_fdb_del()
544 info->addr, info->vid, in dsa_switch_lag_fdb_del()
545 info->db); in dsa_switch_lag_fdb_del()
553 if (info->dp->ds == ds && ds->ops->port_lag_change) in dsa_switch_lag_change()
554 return ds->ops->port_lag_change(ds, info->dp->index); in dsa_switch_lag_change()
556 if (info->dp->ds != ds && ds->ops->crosschip_lag_change) in dsa_switch_lag_change()
557 return ds->ops->crosschip_lag_change(ds, info->dp->ds->index, in dsa_switch_lag_change()
558 info->dp->index); in dsa_switch_lag_change()
566 if (info->dp->ds == ds && ds->ops->port_lag_join) in dsa_switch_lag_join()
567 return ds->ops->port_lag_join(ds, info->dp->index, info->lag, in dsa_switch_lag_join()
568 info->info, info->extack); in dsa_switch_lag_join()
570 if (info->dp->ds != ds && ds->ops->crosschip_lag_join) in dsa_switch_lag_join()
571 return ds->ops->crosschip_lag_join(ds, info->dp->ds->index, in dsa_switch_lag_join()
572 info->dp->index, info->lag, in dsa_switch_lag_join()
573 info->info, info->extack); in dsa_switch_lag_join()
575 return -EOPNOTSUPP; in dsa_switch_lag_join()
581 if (info->dp->ds == ds && ds->ops->port_lag_leave) in dsa_switch_lag_leave()
582 return ds->ops->port_lag_leave(ds, info->dp->index, info->lag); in dsa_switch_lag_leave()
584 if (info->dp->ds != ds && ds->ops->crosschip_lag_leave) in dsa_switch_lag_leave()
585 return ds->ops->crosschip_lag_leave(ds, info->dp->ds->index, in dsa_switch_lag_leave()
586 info->dp->index, info->lag); in dsa_switch_lag_leave()
588 return -EOPNOTSUPP; in dsa_switch_lag_leave()
594 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); in dsa_switch_mdb_add()
597 if (!ds->ops->port_mdb_add) in dsa_switch_mdb_add()
598 return -EOPNOTSUPP; in dsa_switch_mdb_add()
600 return dsa_port_do_mdb_add(dp, info->mdb, info->db); in dsa_switch_mdb_add()
606 int port = dsa_towards_port(ds, info->dp->ds->index, info->dp->index); in dsa_switch_mdb_del()
609 if (!ds->ops->port_mdb_del) in dsa_switch_mdb_del()
610 return -EOPNOTSUPP; in dsa_switch_mdb_del()
612 return dsa_port_do_mdb_del(dp, info->mdb, info->db); in dsa_switch_mdb_del()
621 if (!ds->ops->port_mdb_add) in dsa_switch_host_mdb_add()
622 return -EOPNOTSUPP; in dsa_switch_host_mdb_add()
625 if (dsa_port_host_address_match(dp, info->dp)) { in dsa_switch_host_mdb_add()
626 err = dsa_port_do_mdb_add(dp, info->mdb, info->db); in dsa_switch_host_mdb_add()
641 if (!ds->ops->port_mdb_del) in dsa_switch_host_mdb_del()
642 return -EOPNOTSUPP; in dsa_switch_host_mdb_del()
645 if (dsa_port_host_address_match(dp, info->dp)) { in dsa_switch_host_mdb_del()
646 err = dsa_port_do_mdb_del(dp, info->mdb, info->db); in dsa_switch_host_mdb_del()
655 /* Port VLANs match on the targeted port and on all DSA ports */
659 return dsa_port_is_dsa(dp) || dp == info->dp; in dsa_port_vlan_match()
662 /* Host VLANs match on the targeted port's CPU port, and on all DSA ports
668 struct dsa_port *cpu_dp = targeted_dp->cpu_dp; in dsa_port_host_vlan_match()
670 if (dsa_switch_is_upstream_of(dp->ds, targeted_dp->ds)) in dsa_port_host_vlan_match()
682 if (v->vid == vlan->vid) in dsa_vlan_find()
692 struct dsa_switch *ds = dp->ds; in dsa_port_do_vlan_add()
693 int port = dp->index; in dsa_port_do_vlan_add()
699 err = ds->ops->port_vlan_add(ds, port, vlan, extack); in dsa_port_do_vlan_add()
706 * re-notified after just the flags have changed. This would cause a in dsa_port_do_vlan_add()
710 if (vlan->changed) in dsa_port_do_vlan_add()
713 mutex_lock(&dp->vlans_lock); in dsa_port_do_vlan_add()
715 v = dsa_vlan_find(&dp->vlans, vlan); in dsa_port_do_vlan_add()
717 refcount_inc(&v->refcount); in dsa_port_do_vlan_add()
718 trace_dsa_vlan_add_bump(dp, vlan, &v->refcount); in dsa_port_do_vlan_add()
724 err = -ENOMEM; in dsa_port_do_vlan_add()
728 err = ds->ops->port_vlan_add(ds, port, vlan, extack); in dsa_port_do_vlan_add()
735 v->vid = vlan->vid; in dsa_port_do_vlan_add()
736 refcount_set(&v->refcount, 1); in dsa_port_do_vlan_add()
737 list_add_tail(&v->list, &dp->vlans); in dsa_port_do_vlan_add()
740 mutex_unlock(&dp->vlans_lock); in dsa_port_do_vlan_add()
748 struct dsa_switch *ds = dp->ds; in dsa_port_do_vlan_del()
749 int port = dp->index; in dsa_port_do_vlan_del()
755 err = ds->ops->port_vlan_del(ds, port, vlan); in dsa_port_do_vlan_del()
761 mutex_lock(&dp->vlans_lock); in dsa_port_do_vlan_del()
763 v = dsa_vlan_find(&dp->vlans, vlan); in dsa_port_do_vlan_del()
766 err = -ENOENT; in dsa_port_do_vlan_del()
770 if (!refcount_dec_and_test(&v->refcount)) { in dsa_port_do_vlan_del()
771 trace_dsa_vlan_del_drop(dp, vlan, &v->refcount); in dsa_port_do_vlan_del()
775 err = ds->ops->port_vlan_del(ds, port, vlan); in dsa_port_do_vlan_del()
778 refcount_set(&v->refcount, 1); in dsa_port_do_vlan_del()
782 list_del(&v->list); in dsa_port_do_vlan_del()
786 mutex_unlock(&dp->vlans_lock); in dsa_port_do_vlan_del()
797 if (!ds->ops->port_vlan_add) in dsa_switch_vlan_add()
798 return -EOPNOTSUPP; in dsa_switch_vlan_add()
802 err = dsa_port_do_vlan_add(dp, info->vlan, in dsa_switch_vlan_add()
803 info->extack); in dsa_switch_vlan_add()
818 if (!ds->ops->port_vlan_del) in dsa_switch_vlan_del()
819 return -EOPNOTSUPP; in dsa_switch_vlan_del()
823 err = dsa_port_do_vlan_del(dp, info->vlan); in dsa_switch_vlan_del()
838 if (!ds->ops->port_vlan_add) in dsa_switch_host_vlan_add()
839 return -EOPNOTSUPP; in dsa_switch_host_vlan_add()
842 if (dsa_port_host_vlan_match(dp, info->dp)) { in dsa_switch_host_vlan_add()
843 err = dsa_port_do_vlan_add(dp, info->vlan, in dsa_switch_host_vlan_add()
844 info->extack); in dsa_switch_host_vlan_add()
859 if (!ds->ops->port_vlan_del) in dsa_switch_host_vlan_del()
860 return -EOPNOTSUPP; in dsa_switch_host_vlan_del()
863 if (dsa_port_host_vlan_match(dp, info->dp)) { in dsa_switch_host_vlan_del()
864 err = dsa_port_do_vlan_del(dp, info->vlan); in dsa_switch_host_vlan_del()
876 const struct dsa_device_ops *tag_ops = info->tag_ops; in dsa_switch_change_tag_proto()
880 if (!ds->ops->change_tag_protocol) in dsa_switch_change_tag_proto()
881 return -EOPNOTSUPP; in dsa_switch_change_tag_proto()
885 err = ds->ops->change_tag_protocol(ds, tag_ops->proto); in dsa_switch_change_tag_proto()
897 struct net_device *user = dp->user; in dsa_switch_change_tag_proto()
902 dsa_user_change_mtu(user, user->mtu); in dsa_switch_change_tag_proto()
908 /* We use the same cross-chip notifiers to inform both the tagger side, as well
910 * Since ds->tagger_data is owned by the tagger, it isn't a hard error if the
913 * leak: the tagger will still operate with persistent per-switch memory, just
921 const struct dsa_device_ops *tag_ops = info->tag_ops; in dsa_switch_connect_tag_proto()
925 if (tag_ops->connect) { in dsa_switch_connect_tag_proto()
926 err = tag_ops->connect(ds); in dsa_switch_connect_tag_proto()
931 if (!ds->ops->connect_tag_protocol) in dsa_switch_connect_tag_proto()
932 return -EOPNOTSUPP; in dsa_switch_connect_tag_proto()
935 err = ds->ops->connect_tag_protocol(ds, tag_ops->proto); in dsa_switch_connect_tag_proto()
938 if (tag_ops->disconnect) in dsa_switch_connect_tag_proto()
939 tag_ops->disconnect(ds); in dsa_switch_connect_tag_proto()
950 const struct dsa_device_ops *tag_ops = info->tag_ops; in dsa_switch_disconnect_tag_proto()
953 if (tag_ops->disconnect && ds->tagger_data) in dsa_switch_disconnect_tag_proto()
954 tag_ops->disconnect(ds); in dsa_switch_disconnect_tag_proto()
966 if (!ds->ops->conduit_state_change) in dsa_switch_conduit_state_change()
969 ds->ops->conduit_state_change(ds, info->conduit, info->operational); in dsa_switch_conduit_state_change()
1063 err = -EOPNOTSUPP; in dsa_switch_event()
1068 dev_dbg(ds->dev, "breaking chain for DSA event %lu (%d)\n", in dsa_switch_event()
1075 * dsa_tree_notify - Execute code for all switches in a DSA switch tree.
1078 * @v: event-specific value.
1081 * each member DSA switch. The other alternative of traversing the tree is only
1086 struct raw_notifier_head *nh = &dst->nh; in dsa_tree_notify()
1095 * dsa_broadcast - Notify all DSA trees in the system.
1097 * @v: event-specific value.
1099 * Can be used to notify the switching fabric of events such as cross-chip
1100 * bridging between disjoint trees (such as islands of tagger-compatible
1104 * between trees is asynchronous and not all DSA trees might have probed.
1122 ds->nb.notifier_call = dsa_switch_event; in dsa_switch_register_notifier()
1124 return raw_notifier_chain_register(&ds->dst->nh, &ds->nb); in dsa_switch_register_notifier()
1131 err = raw_notifier_chain_unregister(&ds->dst->nh, &ds->nb); in dsa_switch_unregister_notifier()
1133 dev_err(ds->dev, "failed to unregister notifier (%d)\n", err); in dsa_switch_unregister_notifier()