1 // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2 /* Copyright (c) 2019-2020 Marvell International Ltd. All rights reserved */
4 #include <linux/if_bridge.h>
5 #include <linux/if_vlan.h>
6 #include <linux/kernel.h>
7 #include <linux/module.h>
8 #include <linux/notifier.h>
9 #include <net/netevent.h>
10 #include <net/switchdev.h>
13 #include "prestera_hw.h"
14 #include "prestera_switchdev.h"
16 #define PRESTERA_VID_ALL (0xffff)
18 #define PRESTERA_DEFAULT_AGEING_TIME_MS 300000
19 #define PRESTERA_MAX_AGEING_TIME_MS 1000000000
20 #define PRESTERA_MIN_AGEING_TIME_MS 32000
22 struct prestera_fdb_event_work {
23 struct work_struct work;
24 struct switchdev_notifier_fdb_info fdb_info;
25 struct net_device *dev;
29 struct prestera_switchdev {
30 struct prestera_switch *sw;
31 struct list_head bridge_list;
32 bool bridge_8021q_exists;
33 struct notifier_block swdev_nb_blk;
34 struct notifier_block swdev_nb;
37 struct prestera_bridge {
38 struct list_head head;
39 struct net_device *dev;
40 struct prestera_switchdev *swdev;
41 struct list_head port_list;
42 struct list_head br_mdb_entry_list;
45 bool multicast_enabled;
49 struct prestera_bridge_port {
50 struct list_head head;
51 struct net_device *dev;
52 struct prestera_bridge *bridge;
53 struct list_head vlan_list;
54 struct list_head br_mdb_port_list;
61 struct prestera_bridge_vlan {
62 struct list_head head;
63 struct list_head port_vlan_list;
67 struct prestera_port_vlan {
68 struct list_head br_vlan_head;
69 struct list_head port_head;
70 struct prestera_port *port;
71 struct prestera_bridge_port *br_port;
75 struct prestera_br_mdb_port {
76 struct prestera_bridge_port *br_port;
77 struct list_head br_mdb_port_node;
80 /* Software representation of MDB table. */
81 struct prestera_br_mdb_entry {
82 struct prestera_bridge *bridge;
83 struct prestera_mdb_entry *mdb;
84 struct list_head br_mdb_port_list;
85 struct list_head br_mdb_entry_node;
89 static struct workqueue_struct *swdev_wq;
91 static void prestera_bridge_port_put(struct prestera_bridge_port *br_port);
93 static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
96 static struct prestera_bridge *
97 prestera_bridge_find(const struct prestera_switch *sw,
98 const struct net_device *br_dev)
100 struct prestera_bridge *bridge;
102 list_for_each_entry(bridge, &sw->swdev->bridge_list, head)
103 if (bridge->dev == br_dev)
109 static struct prestera_bridge_port *
110 __prestera_bridge_port_find(const struct prestera_bridge *bridge,
111 const struct net_device *brport_dev)
113 struct prestera_bridge_port *br_port;
115 list_for_each_entry(br_port, &bridge->port_list, head)
116 if (br_port->dev == brport_dev)
122 static struct prestera_bridge_port *
123 prestera_bridge_port_find(struct prestera_switch *sw,
124 struct net_device *brport_dev)
126 struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
127 struct prestera_bridge *bridge;
132 bridge = prestera_bridge_find(sw, br_dev);
136 return __prestera_bridge_port_find(bridge, brport_dev);
140 prestera_br_port_flags_reset(struct prestera_bridge_port *br_port,
141 struct prestera_port *port)
143 prestera_port_uc_flood_set(port, false);
144 prestera_port_mc_flood_set(port, false);
145 prestera_port_learning_set(port, false);
146 prestera_port_br_locked_set(port, false);
149 static int prestera_br_port_flags_set(struct prestera_bridge_port *br_port,
150 struct prestera_port *port)
154 err = prestera_port_uc_flood_set(port, br_port->flags & BR_FLOOD);
158 err = prestera_port_mc_flood_set(port, br_port->flags & BR_MCAST_FLOOD);
162 err = prestera_port_learning_set(port, br_port->flags & BR_LEARNING);
166 err = prestera_port_br_locked_set(port,
167 br_port->flags & BR_PORT_LOCKED);
174 prestera_br_port_flags_reset(br_port, port);
178 static struct prestera_bridge_vlan *
179 prestera_bridge_vlan_create(struct prestera_bridge_port *br_port, u16 vid)
181 struct prestera_bridge_vlan *br_vlan;
183 br_vlan = kzalloc(sizeof(*br_vlan), GFP_KERNEL);
187 INIT_LIST_HEAD(&br_vlan->port_vlan_list);
189 list_add(&br_vlan->head, &br_port->vlan_list);
194 static void prestera_bridge_vlan_destroy(struct prestera_bridge_vlan *br_vlan)
196 list_del(&br_vlan->head);
197 WARN_ON(!list_empty(&br_vlan->port_vlan_list));
201 static struct prestera_bridge_vlan *
202 prestera_bridge_vlan_by_vid(struct prestera_bridge_port *br_port, u16 vid)
204 struct prestera_bridge_vlan *br_vlan;
206 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
207 if (br_vlan->vid == vid)
214 static int prestera_bridge_vlan_port_count(struct prestera_bridge *bridge,
217 struct prestera_bridge_port *br_port;
218 struct prestera_bridge_vlan *br_vlan;
221 list_for_each_entry(br_port, &bridge->port_list, head) {
222 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
223 if (br_vlan->vid == vid) {
233 static void prestera_bridge_vlan_put(struct prestera_bridge_vlan *br_vlan)
235 if (list_empty(&br_vlan->port_vlan_list))
236 prestera_bridge_vlan_destroy(br_vlan);
239 static struct prestera_port_vlan *
240 prestera_port_vlan_by_vid(struct prestera_port *port, u16 vid)
242 struct prestera_port_vlan *port_vlan;
244 list_for_each_entry(port_vlan, &port->vlans_list, port_head) {
245 if (port_vlan->vid == vid)
252 static struct prestera_port_vlan *
253 prestera_port_vlan_create(struct prestera_port *port, u16 vid, bool untagged)
255 struct prestera_port_vlan *port_vlan;
258 port_vlan = prestera_port_vlan_by_vid(port, vid);
260 return ERR_PTR(-EEXIST);
262 err = prestera_hw_vlan_port_set(port, vid, true, untagged);
266 port_vlan = kzalloc(sizeof(*port_vlan), GFP_KERNEL);
269 goto err_port_vlan_alloc;
272 port_vlan->port = port;
273 port_vlan->vid = vid;
275 list_add(&port_vlan->port_head, &port->vlans_list);
280 prestera_hw_vlan_port_set(port, vid, false, false);
284 static int prestera_fdb_add(struct prestera_port *port,
285 const unsigned char *mac, u16 vid, bool dynamic)
287 if (prestera_port_is_lag_member(port))
288 return prestera_hw_lag_fdb_add(port->sw, prestera_port_lag_id(port),
291 return prestera_hw_fdb_add(port, mac, vid, dynamic);
294 static int prestera_fdb_del(struct prestera_port *port,
295 const unsigned char *mac, u16 vid)
297 if (prestera_port_is_lag_member(port))
298 return prestera_hw_lag_fdb_del(port->sw, prestera_port_lag_id(port),
301 return prestera_hw_fdb_del(port, mac, vid);
304 static int prestera_fdb_flush_port_vlan(struct prestera_port *port, u16 vid,
307 if (prestera_port_is_lag_member(port))
308 return prestera_hw_fdb_flush_lag_vlan(port->sw, prestera_port_lag_id(port),
311 return prestera_hw_fdb_flush_port_vlan(port, vid, mode);
314 static int prestera_fdb_flush_port(struct prestera_port *port, u32 mode)
316 if (prestera_port_is_lag_member(port))
317 return prestera_hw_fdb_flush_lag(port->sw, prestera_port_lag_id(port),
320 return prestera_hw_fdb_flush_port(port, mode);
324 prestera_mdb_port_del(struct prestera_mdb_entry *mdb,
325 struct net_device *orig_dev)
327 struct prestera_flood_domain *fl_domain = mdb->flood_domain;
328 struct prestera_flood_domain_port *flood_domain_port;
330 flood_domain_port = prestera_flood_domain_port_find(fl_domain,
333 if (flood_domain_port)
334 prestera_flood_domain_port_destroy(flood_domain_port);
338 prestera_br_mdb_entry_put(struct prestera_br_mdb_entry *br_mdb)
340 struct prestera_bridge_port *br_port;
342 if (list_empty(&br_mdb->br_mdb_port_list)) {
343 list_for_each_entry(br_port, &br_mdb->bridge->port_list, head)
344 prestera_mdb_port_del(br_mdb->mdb, br_port->dev);
346 prestera_mdb_entry_destroy(br_mdb->mdb);
347 list_del(&br_mdb->br_mdb_entry_node);
353 prestera_br_mdb_port_del(struct prestera_br_mdb_entry *br_mdb,
354 struct prestera_bridge_port *br_port)
356 struct prestera_br_mdb_port *br_mdb_port, *tmp;
358 list_for_each_entry_safe(br_mdb_port, tmp, &br_mdb->br_mdb_port_list,
360 if (br_mdb_port->br_port == br_port) {
361 list_del(&br_mdb_port->br_mdb_port_node);
368 prestera_mdb_flush_bridge_port(struct prestera_bridge_port *br_port)
370 struct prestera_br_mdb_port *br_mdb_port, *tmp_port;
371 struct prestera_br_mdb_entry *br_mdb, *br_mdb_tmp;
372 struct prestera_bridge *br_dev = br_port->bridge;
374 list_for_each_entry_safe(br_mdb, br_mdb_tmp, &br_dev->br_mdb_entry_list,
376 list_for_each_entry_safe(br_mdb_port, tmp_port,
377 &br_mdb->br_mdb_port_list,
379 prestera_mdb_port_del(br_mdb->mdb,
380 br_mdb_port->br_port->dev);
381 prestera_br_mdb_port_del(br_mdb, br_mdb_port->br_port);
383 prestera_br_mdb_entry_put(br_mdb);
388 prestera_port_vlan_bridge_leave(struct prestera_port_vlan *port_vlan)
390 u32 fdb_flush_mode = PRESTERA_FDB_FLUSH_MODE_DYNAMIC;
391 struct prestera_port *port = port_vlan->port;
392 struct prestera_bridge_vlan *br_vlan;
393 struct prestera_bridge_port *br_port;
394 bool last_port, last_vlan;
395 u16 vid = port_vlan->vid;
398 br_port = port_vlan->br_port;
399 port_count = prestera_bridge_vlan_port_count(br_port->bridge, vid);
400 br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
402 last_vlan = list_is_singular(&br_port->vlan_list);
403 last_port = port_count == 1;
406 prestera_fdb_flush_port(port, fdb_flush_mode);
408 prestera_hw_fdb_flush_vlan(port->sw, vid, fdb_flush_mode);
410 prestera_fdb_flush_port_vlan(port, vid, fdb_flush_mode);
412 prestera_mdb_flush_bridge_port(br_port);
414 list_del(&port_vlan->br_vlan_head);
415 prestera_bridge_vlan_put(br_vlan);
416 prestera_bridge_port_put(br_port);
417 port_vlan->br_port = NULL;
420 static void prestera_port_vlan_destroy(struct prestera_port_vlan *port_vlan)
422 struct prestera_port *port = port_vlan->port;
423 u16 vid = port_vlan->vid;
425 if (port_vlan->br_port)
426 prestera_port_vlan_bridge_leave(port_vlan);
428 prestera_hw_vlan_port_set(port, vid, false, false);
429 list_del(&port_vlan->port_head);
433 static struct prestera_bridge *
434 prestera_bridge_create(struct prestera_switchdev *swdev, struct net_device *dev)
436 bool vlan_enabled = br_vlan_enabled(dev);
437 struct prestera_bridge *bridge;
441 if (vlan_enabled && swdev->bridge_8021q_exists) {
442 netdev_err(dev, "Only one VLAN-aware bridge is supported\n");
443 return ERR_PTR(-EINVAL);
446 bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
448 return ERR_PTR(-ENOMEM);
451 swdev->bridge_8021q_exists = true;
453 err = prestera_hw_bridge_create(swdev->sw, &bridge_id);
459 bridge->bridge_id = bridge_id;
462 bridge->vlan_enabled = vlan_enabled;
463 bridge->swdev = swdev;
465 bridge->multicast_enabled = br_multicast_enabled(dev);
467 INIT_LIST_HEAD(&bridge->port_list);
468 INIT_LIST_HEAD(&bridge->br_mdb_entry_list);
470 list_add(&bridge->head, &swdev->bridge_list);
475 static void prestera_bridge_destroy(struct prestera_bridge *bridge)
477 struct prestera_switchdev *swdev = bridge->swdev;
479 list_del(&bridge->head);
481 if (bridge->vlan_enabled)
482 swdev->bridge_8021q_exists = false;
484 prestera_hw_bridge_delete(swdev->sw, bridge->bridge_id);
486 WARN_ON(!list_empty(&bridge->br_mdb_entry_list));
487 WARN_ON(!list_empty(&bridge->port_list));
491 static void prestera_bridge_put(struct prestera_bridge *bridge)
493 if (list_empty(&bridge->port_list))
494 prestera_bridge_destroy(bridge);
498 struct prestera_bridge *prestera_bridge_by_dev(struct prestera_switchdev *swdev,
499 const struct net_device *dev)
501 struct prestera_bridge *bridge;
503 list_for_each_entry(bridge, &swdev->bridge_list, head)
504 if (bridge->dev == dev)
510 static struct prestera_bridge_port *
511 __prestera_bridge_port_by_dev(struct prestera_bridge *bridge,
512 struct net_device *dev)
514 struct prestera_bridge_port *br_port;
516 list_for_each_entry(br_port, &bridge->port_list, head) {
517 if (br_port->dev == dev)
524 static int prestera_match_upper_bridge_dev(struct net_device *dev,
525 struct netdev_nested_priv *priv)
527 if (netif_is_bridge_master(dev))
533 static struct net_device *prestera_get_upper_bridge_dev(struct net_device *dev)
535 struct netdev_nested_priv priv = { };
537 netdev_walk_all_upper_dev_rcu(dev, prestera_match_upper_bridge_dev,
542 static struct prestera_bridge_port *
543 prestera_bridge_port_by_dev(struct prestera_switchdev *swdev,
544 struct net_device *dev)
546 struct net_device *br_dev = prestera_get_upper_bridge_dev(dev);
547 struct prestera_bridge *bridge;
552 bridge = prestera_bridge_by_dev(swdev, br_dev);
556 return __prestera_bridge_port_by_dev(bridge, dev);
559 static struct prestera_bridge_port *
560 prestera_bridge_port_create(struct prestera_bridge *bridge,
561 struct net_device *dev)
563 struct prestera_bridge_port *br_port;
565 br_port = kzalloc(sizeof(*br_port), GFP_KERNEL);
569 br_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC |
571 br_port->stp_state = BR_STATE_DISABLED;
572 refcount_set(&br_port->ref_count, 1);
573 br_port->bridge = bridge;
576 INIT_LIST_HEAD(&br_port->vlan_list);
577 list_add(&br_port->head, &bridge->port_list);
578 INIT_LIST_HEAD(&br_port->br_mdb_port_list);
584 prestera_bridge_port_destroy(struct prestera_bridge_port *br_port)
586 list_del(&br_port->head);
587 WARN_ON(!list_empty(&br_port->vlan_list));
588 WARN_ON(!list_empty(&br_port->br_mdb_port_list));
592 static void prestera_bridge_port_get(struct prestera_bridge_port *br_port)
594 refcount_inc(&br_port->ref_count);
597 static void prestera_bridge_port_put(struct prestera_bridge_port *br_port)
599 struct prestera_bridge *bridge = br_port->bridge;
601 if (refcount_dec_and_test(&br_port->ref_count)) {
602 prestera_bridge_port_destroy(br_port);
603 prestera_bridge_put(bridge);
607 static struct prestera_bridge_port *
608 prestera_bridge_port_add(struct prestera_bridge *bridge, struct net_device *dev)
610 struct prestera_bridge_port *br_port;
612 br_port = __prestera_bridge_port_by_dev(bridge, dev);
614 prestera_bridge_port_get(br_port);
618 br_port = prestera_bridge_port_create(bridge, dev);
620 return ERR_PTR(-ENOMEM);
626 prestera_bridge_1d_port_join(struct prestera_bridge_port *br_port)
628 struct prestera_port *port = netdev_priv(br_port->dev);
629 struct prestera_bridge *bridge = br_port->bridge;
632 err = prestera_hw_bridge_port_add(port, bridge->bridge_id);
636 err = prestera_br_port_flags_set(br_port, port);
638 goto err_flags2port_set;
643 prestera_hw_bridge_port_delete(port, bridge->bridge_id);
648 int prestera_bridge_port_join(struct net_device *br_dev,
649 struct prestera_port *port,
650 struct netlink_ext_ack *extack)
652 struct prestera_switchdev *swdev = port->sw->swdev;
653 struct prestera_bridge_port *br_port;
654 struct prestera_bridge *bridge;
657 bridge = prestera_bridge_by_dev(swdev, br_dev);
659 bridge = prestera_bridge_create(swdev, br_dev);
661 return PTR_ERR(bridge);
664 br_port = prestera_bridge_port_add(bridge, port->dev);
665 if (IS_ERR(br_port)) {
666 prestera_bridge_put(bridge);
667 return PTR_ERR(br_port);
670 err = switchdev_bridge_port_offload(br_port->dev, port->dev, NULL,
671 NULL, NULL, false, extack);
673 goto err_switchdev_offload;
675 if (bridge->vlan_enabled)
678 err = prestera_bridge_1d_port_join(br_port);
685 switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
686 err_switchdev_offload:
687 prestera_bridge_port_put(br_port);
691 static void prestera_bridge_1q_port_leave(struct prestera_bridge_port *br_port)
693 struct prestera_port *port = netdev_priv(br_port->dev);
695 prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
696 prestera_port_pvid_set(port, PRESTERA_DEFAULT_VID);
699 static void prestera_bridge_1d_port_leave(struct prestera_bridge_port *br_port)
701 struct prestera_port *port = netdev_priv(br_port->dev);
703 prestera_hw_fdb_flush_port(port, PRESTERA_FDB_FLUSH_MODE_ALL);
704 prestera_hw_bridge_port_delete(port, br_port->bridge->bridge_id);
707 static int prestera_port_vid_stp_set(struct prestera_port *port, u16 vid,
713 case BR_STATE_DISABLED:
714 hw_state = PRESTERA_STP_DISABLED;
717 case BR_STATE_BLOCKING:
718 case BR_STATE_LISTENING:
719 hw_state = PRESTERA_STP_BLOCK_LISTEN;
722 case BR_STATE_LEARNING:
723 hw_state = PRESTERA_STP_LEARN;
726 case BR_STATE_FORWARDING:
727 hw_state = PRESTERA_STP_FORWARD;
734 return prestera_hw_vlan_port_stp_set(port, vid, hw_state);
737 void prestera_bridge_port_leave(struct net_device *br_dev,
738 struct prestera_port *port)
740 struct prestera_switchdev *swdev = port->sw->swdev;
741 struct prestera_bridge_port *br_port;
742 struct prestera_bridge *bridge;
744 bridge = prestera_bridge_by_dev(swdev, br_dev);
748 br_port = __prestera_bridge_port_by_dev(bridge, port->dev);
752 bridge = br_port->bridge;
754 if (bridge->vlan_enabled)
755 prestera_bridge_1q_port_leave(br_port);
757 prestera_bridge_1d_port_leave(br_port);
759 switchdev_bridge_port_unoffload(br_port->dev, NULL, NULL, NULL);
761 prestera_mdb_flush_bridge_port(br_port);
763 prestera_br_port_flags_reset(br_port, port);
764 prestera_port_vid_stp_set(port, PRESTERA_VID_ALL, BR_STATE_FORWARDING);
765 prestera_bridge_port_put(br_port);
768 static int prestera_port_attr_br_flags_set(struct prestera_port *port,
769 struct net_device *dev,
770 struct switchdev_brport_flags flags)
772 struct prestera_bridge_port *br_port;
774 br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
778 br_port->flags &= ~flags.mask;
779 br_port->flags |= flags.val & flags.mask;
780 return prestera_br_port_flags_set(br_port, port);
783 static int prestera_port_attr_br_ageing_set(struct prestera_port *port,
784 unsigned long ageing_clock_t)
786 unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
787 u32 ageing_time_ms = jiffies_to_msecs(ageing_jiffies);
788 struct prestera_switch *sw = port->sw;
790 if (ageing_time_ms < PRESTERA_MIN_AGEING_TIME_MS ||
791 ageing_time_ms > PRESTERA_MAX_AGEING_TIME_MS)
794 return prestera_hw_switch_ageing_set(sw, ageing_time_ms);
797 static int prestera_port_attr_br_vlan_set(struct prestera_port *port,
798 struct net_device *dev,
801 struct prestera_switch *sw = port->sw;
802 struct prestera_bridge *bridge;
804 bridge = prestera_bridge_by_dev(sw->swdev, dev);
805 if (WARN_ON(!bridge))
808 if (bridge->vlan_enabled == vlan_enabled)
811 netdev_err(bridge->dev, "VLAN filtering can't be changed for existing bridge\n");
816 static int prestera_port_bridge_vlan_stp_set(struct prestera_port *port,
817 struct prestera_bridge_vlan *br_vlan,
820 struct prestera_port_vlan *port_vlan;
822 list_for_each_entry(port_vlan, &br_vlan->port_vlan_list, br_vlan_head) {
823 if (port_vlan->port != port)
826 return prestera_port_vid_stp_set(port, br_vlan->vid, state);
832 static int prestera_port_attr_stp_state_set(struct prestera_port *port,
833 struct net_device *dev,
836 struct prestera_bridge_port *br_port;
837 struct prestera_bridge_vlan *br_vlan;
841 br_port = prestera_bridge_port_by_dev(port->sw->swdev, dev);
845 if (!br_port->bridge->vlan_enabled) {
846 vid = br_port->bridge->bridge_id;
847 err = prestera_port_vid_stp_set(port, vid, state);
849 goto err_port_stp_set;
851 list_for_each_entry(br_vlan, &br_port->vlan_list, head) {
852 err = prestera_port_bridge_vlan_stp_set(port, br_vlan,
855 goto err_port_vlan_stp_set;
859 br_port->stp_state = state;
863 err_port_vlan_stp_set:
864 list_for_each_entry_continue_reverse(br_vlan, &br_port->vlan_list, head)
865 prestera_port_bridge_vlan_stp_set(port, br_vlan, br_port->stp_state);
869 prestera_port_vid_stp_set(port, vid, br_port->stp_state);
875 prestera_br_port_lag_mdb_mc_enable_sync(struct prestera_bridge_port *br_port,
878 struct prestera_port *pr_port;
879 struct prestera_switch *sw;
883 pr_port = prestera_port_dev_lower_find(br_port->dev);
888 err = prestera_lag_id(sw, br_port->dev, &lag_id);
892 list_for_each_entry(pr_port, &sw->port_list, list) {
893 if (pr_port->lag->lag_id == lag_id) {
894 err = prestera_port_mc_flood_set(pr_port, enabled);
903 static int prestera_br_mdb_mc_enable_sync(struct prestera_bridge *br_dev)
905 struct prestera_bridge_port *br_port;
906 struct prestera_port *port;
910 /* if mrouter exists:
911 * - make sure every mrouter receives unreg mcast traffic;
912 * if mrouter doesn't exists:
913 * - make sure every port receives unreg mcast traffic;
915 list_for_each_entry(br_port, &br_dev->port_list, head) {
916 if (br_dev->multicast_enabled && br_dev->mrouter_exist)
917 enabled = br_port->mrouter;
919 enabled = br_port->flags & BR_MCAST_FLOOD;
921 if (netif_is_lag_master(br_port->dev)) {
922 err = prestera_br_port_lag_mdb_mc_enable_sync(br_port,
929 port = prestera_port_dev_lower_find(br_port->dev);
933 err = prestera_port_mc_flood_set(port, enabled);
942 prestera_br_mdb_port_is_member(struct prestera_br_mdb_entry *br_mdb,
943 struct net_device *orig_dev)
945 struct prestera_br_mdb_port *tmp_port;
947 list_for_each_entry(tmp_port, &br_mdb->br_mdb_port_list,
949 if (tmp_port->br_port->dev == orig_dev)
956 prestera_mdb_port_add(struct prestera_mdb_entry *mdb,
957 struct net_device *orig_dev,
958 const unsigned char addr[ETH_ALEN], u16 vid)
960 struct prestera_flood_domain *flood_domain = mdb->flood_domain;
963 if (!prestera_flood_domain_port_find(flood_domain,
965 err = prestera_flood_domain_port_create(flood_domain, orig_dev,
974 /* Sync bridge mdb (software table) with HW table (if MC is enabled). */
975 static int prestera_br_mdb_sync(struct prestera_bridge *br_dev)
977 struct prestera_br_mdb_port *br_mdb_port;
978 struct prestera_bridge_port *br_port;
979 struct prestera_br_mdb_entry *br_mdb;
980 struct prestera_mdb_entry *mdb;
981 struct prestera_port *pr_port;
984 if (!br_dev->multicast_enabled)
987 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
990 /* Make sure every port that explicitly been added to the mdb
991 * joins the specified group.
993 list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
995 br_port = br_mdb_port->br_port;
996 pr_port = prestera_port_dev_lower_find(br_port->dev);
998 /* Match only mdb and br_mdb ports that belong to the
999 * same broadcast domain.
1001 if (br_dev->vlan_enabled &&
1002 !prestera_port_vlan_by_vid(pr_port,
1006 /* If port is not in MDB or there's no Mrouter
1009 if (prestera_br_mdb_port_is_member(br_mdb,
1010 br_mdb_port->br_port->dev) &&
1011 br_dev->mrouter_exist)
1012 err = prestera_mdb_port_add(mdb, br_port->dev,
1016 prestera_mdb_port_del(mdb, br_port->dev);
1022 /* Make sure that every mrouter port joins every MC group int
1023 * broadcast domain. If it's not an mrouter - it should leave
1025 list_for_each_entry(br_port, &br_dev->port_list, head) {
1026 pr_port = prestera_port_dev_lower_find(br_port->dev);
1028 /* Make sure mrouter woudln't receive traffci from
1029 * another broadcast domain (e.g. from a vlan, which
1030 * mrouter port is not a member of).
1032 if (br_dev->vlan_enabled &&
1033 !prestera_port_vlan_by_vid(pr_port,
1037 if (br_port->mrouter) {
1038 err = prestera_mdb_port_add(mdb, br_port->dev,
1043 } else if (!br_port->mrouter &&
1044 !prestera_br_mdb_port_is_member
1045 (br_mdb, br_port->dev)) {
1046 prestera_mdb_port_del(mdb, br_port->dev);
1055 prestera_mdb_enable_set(struct prestera_br_mdb_entry *br_mdb, bool enable)
1059 if (enable != br_mdb->enabled) {
1061 err = prestera_hw_mdb_create(br_mdb->mdb);
1063 err = prestera_hw_mdb_destroy(br_mdb->mdb);
1068 br_mdb->enabled = enable;
1075 prestera_br_mdb_enable_set(struct prestera_bridge *br_dev, bool enable)
1077 struct prestera_br_mdb_entry *br_mdb;
1080 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
1081 br_mdb_entry_node) {
1082 err = prestera_mdb_enable_set(br_mdb, enable);
1090 static int prestera_port_attr_br_mc_disabled_set(struct prestera_port *port,
1091 struct net_device *orig_dev,
1094 struct prestera_switch *sw = port->sw;
1095 struct prestera_bridge *br_dev;
1097 br_dev = prestera_bridge_find(sw, orig_dev);
1101 br_dev->multicast_enabled = !mc_disabled;
1103 /* There's no point in enabling mdb back if router is missing. */
1104 WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
1105 br_dev->mrouter_exist));
1107 WARN_ON(prestera_br_mdb_sync(br_dev));
1109 WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
1115 prestera_bridge_mdb_mc_mrouter_exists(struct prestera_bridge *br_dev)
1117 struct prestera_bridge_port *br_port;
1119 list_for_each_entry(br_port, &br_dev->port_list, head)
1120 if (br_port->mrouter)
1127 prestera_port_attr_mrouter_set(struct prestera_port *port,
1128 struct net_device *orig_dev,
1129 bool is_port_mrouter)
1131 struct prestera_bridge_port *br_port;
1132 struct prestera_bridge *br_dev;
1134 br_port = prestera_bridge_port_find(port->sw, orig_dev);
1138 br_dev = br_port->bridge;
1139 br_port->mrouter = is_port_mrouter;
1141 br_dev->mrouter_exist = prestera_bridge_mdb_mc_mrouter_exists(br_dev);
1143 /* Enable MDB processing if both mrouter exists and mc is enabled.
1144 * In case if MC enabled, but there is no mrouter, device would flood
1145 * all multicast traffic (even if MDB table is not empty) with the use
1146 * of bridge's flood capabilities (without the use of flood_domain).
1148 WARN_ON(prestera_br_mdb_enable_set(br_dev, br_dev->multicast_enabled &&
1149 br_dev->mrouter_exist));
1151 WARN_ON(prestera_br_mdb_sync(br_dev));
1153 WARN_ON(prestera_br_mdb_mc_enable_sync(br_dev));
1158 static int prestera_port_obj_attr_set(struct net_device *dev, const void *ctx,
1159 const struct switchdev_attr *attr,
1160 struct netlink_ext_ack *extack)
1162 struct prestera_port *port = netdev_priv(dev);
1166 case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1167 err = prestera_port_attr_stp_state_set(port, attr->orig_dev,
1170 case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
1171 if (attr->u.brport_flags.mask &
1172 ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD | BR_PORT_LOCKED))
1175 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
1176 err = prestera_port_attr_br_flags_set(port, attr->orig_dev,
1177 attr->u.brport_flags);
1179 case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
1180 err = prestera_port_attr_br_ageing_set(port,
1181 attr->u.ageing_time);
1183 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
1184 err = prestera_port_attr_br_vlan_set(port, attr->orig_dev,
1185 attr->u.vlan_filtering);
1187 case SWITCHDEV_ATTR_ID_PORT_MROUTER:
1188 err = prestera_port_attr_mrouter_set(port, attr->orig_dev,
1191 case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
1192 err = prestera_port_attr_br_mc_disabled_set(port, attr->orig_dev,
1193 attr->u.mc_disabled);
1203 prestera_fdb_offload_notify(struct prestera_port *port,
1204 struct switchdev_notifier_fdb_info *info)
1206 struct switchdev_notifier_fdb_info send_info = {};
1208 send_info.addr = info->addr;
1209 send_info.vid = info->vid;
1210 send_info.offloaded = true;
1212 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED, port->dev,
1213 &send_info.info, NULL);
1216 static int prestera_port_fdb_set(struct prestera_port *port,
1217 struct switchdev_notifier_fdb_info *fdb_info,
1220 struct prestera_switch *sw = port->sw;
1221 struct prestera_bridge_port *br_port;
1222 struct prestera_bridge *bridge;
1226 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1230 bridge = br_port->bridge;
1232 if (bridge->vlan_enabled)
1233 vid = fdb_info->vid;
1235 vid = bridge->bridge_id;
1238 err = prestera_fdb_add(port, fdb_info->addr, vid, false);
1240 err = prestera_fdb_del(port, fdb_info->addr, vid);
1245 static void prestera_fdb_event_work(struct work_struct *work)
1247 struct switchdev_notifier_fdb_info *fdb_info;
1248 struct prestera_fdb_event_work *swdev_work;
1249 struct prestera_port *port;
1250 struct net_device *dev;
1253 swdev_work = container_of(work, struct prestera_fdb_event_work, work);
1254 dev = swdev_work->dev;
1258 port = prestera_port_dev_lower_find(dev);
1262 switch (swdev_work->event) {
1263 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1264 fdb_info = &swdev_work->fdb_info;
1265 if (!fdb_info->added_by_user || fdb_info->is_local)
1268 err = prestera_port_fdb_set(port, fdb_info, true);
1272 prestera_fdb_offload_notify(port, fdb_info);
1275 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1276 fdb_info = &swdev_work->fdb_info;
1277 prestera_port_fdb_set(port, fdb_info, false);
1284 kfree(swdev_work->fdb_info.addr);
1289 static int prestera_switchdev_event(struct notifier_block *unused,
1290 unsigned long event, void *ptr)
1292 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1293 struct switchdev_notifier_fdb_info *fdb_info;
1294 struct switchdev_notifier_info *info = ptr;
1295 struct prestera_fdb_event_work *swdev_work;
1296 struct net_device *upper;
1299 if (event == SWITCHDEV_PORT_ATTR_SET) {
1300 err = switchdev_handle_port_attr_set(dev, ptr,
1301 prestera_netdev_check,
1302 prestera_port_obj_attr_set);
1303 return notifier_from_errno(err);
1306 if (!prestera_netdev_check(dev))
1309 upper = netdev_master_upper_dev_get_rcu(dev);
1313 if (!netif_is_bridge_master(upper))
1316 swdev_work = kzalloc(sizeof(*swdev_work), GFP_ATOMIC);
1320 swdev_work->event = event;
1321 swdev_work->dev = dev;
1324 case SWITCHDEV_FDB_ADD_TO_DEVICE:
1325 case SWITCHDEV_FDB_DEL_TO_DEVICE:
1326 fdb_info = container_of(info,
1327 struct switchdev_notifier_fdb_info,
1330 INIT_WORK(&swdev_work->work, prestera_fdb_event_work);
1331 memcpy(&swdev_work->fdb_info, ptr,
1332 sizeof(swdev_work->fdb_info));
1334 swdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
1335 if (!swdev_work->fdb_info.addr)
1338 ether_addr_copy((u8 *)swdev_work->fdb_info.addr,
1348 queue_work(swdev_wq, &swdev_work->work);
1357 prestera_port_vlan_bridge_join(struct prestera_port_vlan *port_vlan,
1358 struct prestera_bridge_port *br_port)
1360 struct prestera_port *port = port_vlan->port;
1361 struct prestera_bridge_vlan *br_vlan;
1362 u16 vid = port_vlan->vid;
1365 if (port_vlan->br_port)
1368 err = prestera_br_port_flags_set(br_port, port);
1370 goto err_flags2port_set;
1372 err = prestera_port_vid_stp_set(port, vid, br_port->stp_state);
1374 goto err_port_vid_stp_set;
1376 br_vlan = prestera_bridge_vlan_by_vid(br_port, vid);
1378 br_vlan = prestera_bridge_vlan_create(br_port, vid);
1381 goto err_bridge_vlan_get;
1385 list_add(&port_vlan->br_vlan_head, &br_vlan->port_vlan_list);
1387 prestera_bridge_port_get(br_port);
1388 port_vlan->br_port = br_port;
1392 err_bridge_vlan_get:
1393 prestera_port_vid_stp_set(port, vid, BR_STATE_FORWARDING);
1394 err_port_vid_stp_set:
1395 prestera_br_port_flags_reset(br_port, port);
1401 prestera_bridge_port_vlan_add(struct prestera_port *port,
1402 struct prestera_bridge_port *br_port,
1403 u16 vid, bool is_untagged, bool is_pvid,
1404 struct netlink_ext_ack *extack)
1406 struct prestera_port_vlan *port_vlan;
1407 u16 old_pvid = port->pvid;
1414 pvid = port->pvid == vid ? 0 : port->pvid;
1416 port_vlan = prestera_port_vlan_by_vid(port, vid);
1417 if (port_vlan && port_vlan->br_port != br_port)
1421 port_vlan = prestera_port_vlan_create(port, vid, is_untagged);
1422 if (IS_ERR(port_vlan))
1423 return PTR_ERR(port_vlan);
1425 err = prestera_hw_vlan_port_set(port, vid, true, is_untagged);
1427 goto err_port_vlan_set;
1430 err = prestera_port_pvid_set(port, pvid);
1432 goto err_port_pvid_set;
1434 err = prestera_port_vlan_bridge_join(port_vlan, br_port);
1436 goto err_port_vlan_bridge_join;
1440 err_port_vlan_bridge_join:
1441 prestera_port_pvid_set(port, old_pvid);
1443 prestera_hw_vlan_port_set(port, vid, false, false);
1445 prestera_port_vlan_destroy(port_vlan);
1451 prestera_bridge_port_vlan_del(struct prestera_port *port,
1452 struct prestera_bridge_port *br_port, u16 vid)
1454 u16 pvid = port->pvid == vid ? 0 : port->pvid;
1455 struct prestera_port_vlan *port_vlan;
1457 port_vlan = prestera_port_vlan_by_vid(port, vid);
1458 if (WARN_ON(!port_vlan))
1461 prestera_port_vlan_bridge_leave(port_vlan);
1462 prestera_port_pvid_set(port, pvid);
1463 prestera_port_vlan_destroy(port_vlan);
1466 static int prestera_port_vlans_add(struct prestera_port *port,
1467 const struct switchdev_obj_port_vlan *vlan,
1468 struct netlink_ext_ack *extack)
1470 bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1471 bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1472 struct net_device *orig_dev = vlan->obj.orig_dev;
1473 struct prestera_bridge_port *br_port;
1474 struct prestera_switch *sw = port->sw;
1475 struct prestera_bridge *bridge;
1477 if (netif_is_bridge_master(orig_dev))
1480 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1481 if (WARN_ON(!br_port))
1484 bridge = br_port->bridge;
1485 if (!bridge->vlan_enabled)
1488 return prestera_bridge_port_vlan_add(port, br_port,
1489 vlan->vid, flag_untagged,
1493 static struct prestera_br_mdb_entry *
1494 prestera_br_mdb_entry_create(struct prestera_switch *sw,
1495 struct prestera_bridge *br_dev,
1496 const unsigned char *addr, u16 vid)
1498 struct prestera_br_mdb_entry *br_mdb_entry;
1499 struct prestera_mdb_entry *mdb_entry;
1501 br_mdb_entry = kzalloc(sizeof(*br_mdb_entry), GFP_KERNEL);
1505 mdb_entry = prestera_mdb_entry_create(sw, addr, vid);
1509 br_mdb_entry->mdb = mdb_entry;
1510 br_mdb_entry->bridge = br_dev;
1511 br_mdb_entry->enabled = true;
1512 INIT_LIST_HEAD(&br_mdb_entry->br_mdb_port_list);
1514 list_add(&br_mdb_entry->br_mdb_entry_node, &br_dev->br_mdb_entry_list);
1516 return br_mdb_entry;
1519 kfree(br_mdb_entry);
1523 static int prestera_br_mdb_port_add(struct prestera_br_mdb_entry *br_mdb,
1524 struct prestera_bridge_port *br_port)
1526 struct prestera_br_mdb_port *br_mdb_port;
1528 list_for_each_entry(br_mdb_port, &br_mdb->br_mdb_port_list,
1530 if (br_mdb_port->br_port == br_port)
1533 br_mdb_port = kzalloc(sizeof(*br_mdb_port), GFP_KERNEL);
1537 br_mdb_port->br_port = br_port;
1538 list_add(&br_mdb_port->br_mdb_port_node,
1539 &br_mdb->br_mdb_port_list);
1544 static struct prestera_br_mdb_entry *
1545 prestera_br_mdb_entry_find(struct prestera_bridge *br_dev,
1546 const unsigned char *addr, u16 vid)
1548 struct prestera_br_mdb_entry *br_mdb;
1550 list_for_each_entry(br_mdb, &br_dev->br_mdb_entry_list,
1552 if (ether_addr_equal(&br_mdb->mdb->addr[0], addr) &&
1553 vid == br_mdb->mdb->vid)
1559 static struct prestera_br_mdb_entry *
1560 prestera_br_mdb_entry_get(struct prestera_switch *sw,
1561 struct prestera_bridge *br_dev,
1562 const unsigned char *addr, u16 vid)
1564 struct prestera_br_mdb_entry *br_mdb;
1566 br_mdb = prestera_br_mdb_entry_find(br_dev, addr, vid);
1570 return prestera_br_mdb_entry_create(sw, br_dev, addr, vid);
1574 prestera_mdb_port_addr_obj_add(const struct switchdev_obj_port_mdb *mdb)
1576 struct prestera_br_mdb_entry *br_mdb;
1577 struct prestera_bridge_port *br_port;
1578 struct prestera_bridge *br_dev;
1579 struct prestera_switch *sw;
1580 struct prestera_port *port;
1583 sw = prestera_switch_get(mdb->obj.orig_dev);
1584 port = prestera_port_dev_lower_find(mdb->obj.orig_dev);
1586 br_port = prestera_bridge_port_find(sw, mdb->obj.orig_dev);
1590 br_dev = br_port->bridge;
1592 if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
1596 br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
1599 br_mdb = prestera_br_mdb_entry_get(sw, br_dev, &mdb->addr[0],
1605 /* Make sure newly allocated MDB entry gets disabled if either MC is
1606 * disabled, or the mrouter does not exist.
1608 WARN_ON(prestera_mdb_enable_set(br_mdb, br_dev->multicast_enabled &&
1609 br_dev->mrouter_exist));
1611 err = prestera_br_mdb_port_add(br_mdb, br_port);
1613 prestera_br_mdb_entry_put(br_mdb);
1617 err = prestera_br_mdb_sync(br_dev);
1624 static int prestera_port_obj_add(struct net_device *dev, const void *ctx,
1625 const struct switchdev_obj *obj,
1626 struct netlink_ext_ack *extack)
1628 struct prestera_port *port = netdev_priv(dev);
1629 const struct switchdev_obj_port_vlan *vlan;
1630 const struct switchdev_obj_port_mdb *mdb;
1634 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1635 vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
1636 return prestera_port_vlans_add(port, vlan, extack);
1637 case SWITCHDEV_OBJ_ID_PORT_MDB:
1638 mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
1639 err = prestera_mdb_port_addr_obj_add(mdb);
1641 case SWITCHDEV_OBJ_ID_HOST_MDB:
1651 static int prestera_port_vlans_del(struct prestera_port *port,
1652 const struct switchdev_obj_port_vlan *vlan)
1654 struct net_device *orig_dev = vlan->obj.orig_dev;
1655 struct prestera_bridge_port *br_port;
1656 struct prestera_switch *sw = port->sw;
1658 if (netif_is_bridge_master(orig_dev))
1661 br_port = prestera_bridge_port_by_dev(sw->swdev, port->dev);
1662 if (WARN_ON(!br_port))
1665 if (!br_port->bridge->vlan_enabled)
1668 prestera_bridge_port_vlan_del(port, br_port, vlan->vid);
1674 prestera_mdb_port_addr_obj_del(struct prestera_port *port,
1675 const struct switchdev_obj_port_mdb *mdb)
1677 struct prestera_br_mdb_entry *br_mdb;
1678 struct prestera_bridge_port *br_port;
1679 struct prestera_bridge *br_dev;
1682 /* Bridge port no longer exists - and so does this MDB entry */
1683 br_port = prestera_bridge_port_find(port->sw, mdb->obj.orig_dev);
1687 /* Removing MDB with non-existing VLAN - not supported; */
1688 if (mdb->vid && !prestera_port_vlan_by_vid(port, mdb->vid))
1691 br_dev = br_port->bridge;
1693 if (br_port->bridge->vlan_enabled)
1694 br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
1697 br_mdb = prestera_br_mdb_entry_find(br_dev, &mdb->addr[0],
1698 br_port->bridge->bridge_id);
1703 /* Since there might be a situation that this port was the last in the
1704 * MDB group, we have to both remove this port from software and HW MDB,
1705 * sync MDB table, and then destroy software MDB (if needed).
1707 prestera_br_mdb_port_del(br_mdb, br_port);
1709 prestera_br_mdb_entry_put(br_mdb);
1711 err = prestera_br_mdb_sync(br_dev);
1718 static int prestera_port_obj_del(struct net_device *dev, const void *ctx,
1719 const struct switchdev_obj *obj)
1721 struct prestera_port *port = netdev_priv(dev);
1722 const struct switchdev_obj_port_mdb *mdb;
1726 case SWITCHDEV_OBJ_ID_PORT_VLAN:
1727 return prestera_port_vlans_del(port, SWITCHDEV_OBJ_PORT_VLAN(obj));
1728 case SWITCHDEV_OBJ_ID_PORT_MDB:
1729 mdb = SWITCHDEV_OBJ_PORT_MDB(obj);
1730 err = prestera_mdb_port_addr_obj_del(port, mdb);
1740 static int prestera_switchdev_blk_event(struct notifier_block *unused,
1741 unsigned long event, void *ptr)
1743 struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
1747 case SWITCHDEV_PORT_OBJ_ADD:
1748 err = switchdev_handle_port_obj_add(dev, ptr,
1749 prestera_netdev_check,
1750 prestera_port_obj_add);
1752 case SWITCHDEV_PORT_OBJ_DEL:
1753 err = switchdev_handle_port_obj_del(dev, ptr,
1754 prestera_netdev_check,
1755 prestera_port_obj_del);
1757 case SWITCHDEV_PORT_ATTR_SET:
1758 err = switchdev_handle_port_attr_set(dev, ptr,
1759 prestera_netdev_check,
1760 prestera_port_obj_attr_set);
1766 return notifier_from_errno(err);
1769 static void prestera_fdb_event(struct prestera_switch *sw,
1770 struct prestera_event *evt, void *arg)
1772 struct switchdev_notifier_fdb_info info = {};
1773 struct net_device *dev = NULL;
1774 struct prestera_port *port;
1775 struct prestera_lag *lag;
1777 switch (evt->fdb_evt.type) {
1778 case PRESTERA_FDB_ENTRY_TYPE_REG_PORT:
1779 port = prestera_find_port(sw, evt->fdb_evt.dest.port_id);
1783 case PRESTERA_FDB_ENTRY_TYPE_LAG:
1784 lag = prestera_lag_by_id(sw, evt->fdb_evt.dest.lag_id);
1795 info.addr = evt->fdb_evt.data.mac;
1796 info.vid = evt->fdb_evt.vid;
1797 info.offloaded = true;
1802 case PRESTERA_FDB_EVENT_LEARNED:
1803 call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE,
1804 dev, &info.info, NULL);
1806 case PRESTERA_FDB_EVENT_AGED:
1807 call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE,
1808 dev, &info.info, NULL);
1815 static int prestera_fdb_init(struct prestera_switch *sw)
1819 err = prestera_hw_event_handler_register(sw, PRESTERA_EVENT_TYPE_FDB,
1820 prestera_fdb_event, NULL);
1824 err = prestera_hw_switch_ageing_set(sw, PRESTERA_DEFAULT_AGEING_TIME_MS);
1826 goto err_ageing_set;
1831 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
1832 prestera_fdb_event);
1836 static void prestera_fdb_fini(struct prestera_switch *sw)
1838 prestera_hw_event_handler_unregister(sw, PRESTERA_EVENT_TYPE_FDB,
1839 prestera_fdb_event);
1842 static int prestera_switchdev_handler_init(struct prestera_switchdev *swdev)
1846 swdev->swdev_nb.notifier_call = prestera_switchdev_event;
1847 err = register_switchdev_notifier(&swdev->swdev_nb);
1849 goto err_register_swdev_notifier;
1851 swdev->swdev_nb_blk.notifier_call = prestera_switchdev_blk_event;
1852 err = register_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
1854 goto err_register_blk_swdev_notifier;
1858 err_register_blk_swdev_notifier:
1859 unregister_switchdev_notifier(&swdev->swdev_nb);
1860 err_register_swdev_notifier:
1861 destroy_workqueue(swdev_wq);
1865 static void prestera_switchdev_handler_fini(struct prestera_switchdev *swdev)
1867 unregister_switchdev_blocking_notifier(&swdev->swdev_nb_blk);
1868 unregister_switchdev_notifier(&swdev->swdev_nb);
1871 int prestera_switchdev_init(struct prestera_switch *sw)
1873 struct prestera_switchdev *swdev;
1876 swdev = kzalloc(sizeof(*swdev), GFP_KERNEL);
1883 INIT_LIST_HEAD(&swdev->bridge_list);
1885 swdev_wq = alloc_ordered_workqueue("%s_ordered", 0, "prestera_br");
1891 err = prestera_switchdev_handler_init(swdev);
1893 goto err_swdev_init;
1895 err = prestera_fdb_init(sw);
1903 destroy_workqueue(swdev_wq);
1910 void prestera_switchdev_fini(struct prestera_switch *sw)
1912 struct prestera_switchdev *swdev = sw->swdev;
1914 prestera_fdb_fini(sw);
1915 prestera_switchdev_handler_fini(swdev);
1916 destroy_workqueue(swdev_wq);