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
;
46 struct prestera_bridge_port
{
47 struct list_head head
;
48 struct net_device
*dev
;
49 struct prestera_bridge
*bridge
;
50 struct list_head vlan_list
;
56 struct prestera_bridge_vlan
{
57 struct list_head head
;
58 struct list_head port_vlan_list
;
62 struct prestera_port_vlan
{
63 struct list_head br_vlan_head
;
64 struct list_head port_head
;
65 struct prestera_port
*port
;
66 struct prestera_bridge_port
*br_port
;
70 static struct workqueue_struct
*swdev_wq
;
72 static void prestera_bridge_port_put(struct prestera_bridge_port
*br_port
);
74 static int prestera_port_vid_stp_set(struct prestera_port
*port
, u16 vid
,
77 static struct prestera_bridge_vlan
*
78 prestera_bridge_vlan_create(struct prestera_bridge_port
*br_port
, u16 vid
)
80 struct prestera_bridge_vlan
*br_vlan
;
82 br_vlan
= kzalloc(sizeof(*br_vlan
), GFP_KERNEL
);
86 INIT_LIST_HEAD(&br_vlan
->port_vlan_list
);
88 list_add(&br_vlan
->head
, &br_port
->vlan_list
);
93 static void prestera_bridge_vlan_destroy(struct prestera_bridge_vlan
*br_vlan
)
95 list_del(&br_vlan
->head
);
96 WARN_ON(!list_empty(&br_vlan
->port_vlan_list
));
100 static struct prestera_bridge_vlan
*
101 prestera_bridge_vlan_by_vid(struct prestera_bridge_port
*br_port
, u16 vid
)
103 struct prestera_bridge_vlan
*br_vlan
;
105 list_for_each_entry(br_vlan
, &br_port
->vlan_list
, head
) {
106 if (br_vlan
->vid
== vid
)
113 static int prestera_bridge_vlan_port_count(struct prestera_bridge
*bridge
,
116 struct prestera_bridge_port
*br_port
;
117 struct prestera_bridge_vlan
*br_vlan
;
120 list_for_each_entry(br_port
, &bridge
->port_list
, head
) {
121 list_for_each_entry(br_vlan
, &br_port
->vlan_list
, head
) {
122 if (br_vlan
->vid
== vid
) {
132 static void prestera_bridge_vlan_put(struct prestera_bridge_vlan
*br_vlan
)
134 if (list_empty(&br_vlan
->port_vlan_list
))
135 prestera_bridge_vlan_destroy(br_vlan
);
138 static struct prestera_port_vlan
*
139 prestera_port_vlan_by_vid(struct prestera_port
*port
, u16 vid
)
141 struct prestera_port_vlan
*port_vlan
;
143 list_for_each_entry(port_vlan
, &port
->vlans_list
, port_head
) {
144 if (port_vlan
->vid
== vid
)
151 static struct prestera_port_vlan
*
152 prestera_port_vlan_create(struct prestera_port
*port
, u16 vid
, bool untagged
)
154 struct prestera_port_vlan
*port_vlan
;
157 port_vlan
= prestera_port_vlan_by_vid(port
, vid
);
159 return ERR_PTR(-EEXIST
);
161 err
= prestera_hw_vlan_port_set(port
, vid
, true, untagged
);
165 port_vlan
= kzalloc(sizeof(*port_vlan
), GFP_KERNEL
);
168 goto err_port_vlan_alloc
;
171 port_vlan
->port
= port
;
172 port_vlan
->vid
= vid
;
174 list_add(&port_vlan
->port_head
, &port
->vlans_list
);
179 prestera_hw_vlan_port_set(port
, vid
, false, false);
183 static int prestera_fdb_add(struct prestera_port
*port
,
184 const unsigned char *mac
, u16 vid
, bool dynamic
)
186 if (prestera_port_is_lag_member(port
))
187 return prestera_hw_lag_fdb_add(port
->sw
, prestera_port_lag_id(port
),
190 return prestera_hw_fdb_add(port
, mac
, vid
, dynamic
);
193 static int prestera_fdb_del(struct prestera_port
*port
,
194 const unsigned char *mac
, u16 vid
)
196 if (prestera_port_is_lag_member(port
))
197 return prestera_hw_lag_fdb_del(port
->sw
, prestera_port_lag_id(port
),
200 return prestera_hw_fdb_del(port
, mac
, vid
);
203 static int prestera_fdb_flush_port_vlan(struct prestera_port
*port
, u16 vid
,
206 if (prestera_port_is_lag_member(port
))
207 return prestera_hw_fdb_flush_lag_vlan(port
->sw
, prestera_port_lag_id(port
),
210 return prestera_hw_fdb_flush_port_vlan(port
, vid
, mode
);
213 static int prestera_fdb_flush_port(struct prestera_port
*port
, u32 mode
)
215 if (prestera_port_is_lag_member(port
))
216 return prestera_hw_fdb_flush_lag(port
->sw
, prestera_port_lag_id(port
),
219 return prestera_hw_fdb_flush_port(port
, mode
);
223 prestera_port_vlan_bridge_leave(struct prestera_port_vlan
*port_vlan
)
225 u32 fdb_flush_mode
= PRESTERA_FDB_FLUSH_MODE_DYNAMIC
;
226 struct prestera_port
*port
= port_vlan
->port
;
227 struct prestera_bridge_vlan
*br_vlan
;
228 struct prestera_bridge_port
*br_port
;
229 bool last_port
, last_vlan
;
230 u16 vid
= port_vlan
->vid
;
233 br_port
= port_vlan
->br_port
;
234 port_count
= prestera_bridge_vlan_port_count(br_port
->bridge
, vid
);
235 br_vlan
= prestera_bridge_vlan_by_vid(br_port
, vid
);
237 last_vlan
= list_is_singular(&br_port
->vlan_list
);
238 last_port
= port_count
== 1;
241 prestera_fdb_flush_port(port
, fdb_flush_mode
);
243 prestera_hw_fdb_flush_vlan(port
->sw
, vid
, fdb_flush_mode
);
245 prestera_fdb_flush_port_vlan(port
, vid
, fdb_flush_mode
);
247 list_del(&port_vlan
->br_vlan_head
);
248 prestera_bridge_vlan_put(br_vlan
);
249 prestera_bridge_port_put(br_port
);
250 port_vlan
->br_port
= NULL
;
253 static void prestera_port_vlan_destroy(struct prestera_port_vlan
*port_vlan
)
255 struct prestera_port
*port
= port_vlan
->port
;
256 u16 vid
= port_vlan
->vid
;
258 if (port_vlan
->br_port
)
259 prestera_port_vlan_bridge_leave(port_vlan
);
261 prestera_hw_vlan_port_set(port
, vid
, false, false);
262 list_del(&port_vlan
->port_head
);
266 static struct prestera_bridge
*
267 prestera_bridge_create(struct prestera_switchdev
*swdev
, struct net_device
*dev
)
269 bool vlan_enabled
= br_vlan_enabled(dev
);
270 struct prestera_bridge
*bridge
;
274 if (vlan_enabled
&& swdev
->bridge_8021q_exists
) {
275 netdev_err(dev
, "Only one VLAN-aware bridge is supported\n");
276 return ERR_PTR(-EINVAL
);
279 bridge
= kzalloc(sizeof(*bridge
), GFP_KERNEL
);
281 return ERR_PTR(-ENOMEM
);
284 swdev
->bridge_8021q_exists
= true;
286 err
= prestera_hw_bridge_create(swdev
->sw
, &bridge_id
);
292 bridge
->bridge_id
= bridge_id
;
295 bridge
->vlan_enabled
= vlan_enabled
;
296 bridge
->swdev
= swdev
;
299 INIT_LIST_HEAD(&bridge
->port_list
);
301 list_add(&bridge
->head
, &swdev
->bridge_list
);
306 static void prestera_bridge_destroy(struct prestera_bridge
*bridge
)
308 struct prestera_switchdev
*swdev
= bridge
->swdev
;
310 list_del(&bridge
->head
);
312 if (bridge
->vlan_enabled
)
313 swdev
->bridge_8021q_exists
= false;
315 prestera_hw_bridge_delete(swdev
->sw
, bridge
->bridge_id
);
317 WARN_ON(!list_empty(&bridge
->port_list
));
321 static void prestera_bridge_put(struct prestera_bridge
*bridge
)
323 if (list_empty(&bridge
->port_list
))
324 prestera_bridge_destroy(bridge
);
328 struct prestera_bridge
*prestera_bridge_by_dev(struct prestera_switchdev
*swdev
,
329 const struct net_device
*dev
)
331 struct prestera_bridge
*bridge
;
333 list_for_each_entry(bridge
, &swdev
->bridge_list
, head
)
334 if (bridge
->dev
== dev
)
340 static struct prestera_bridge_port
*
341 __prestera_bridge_port_by_dev(struct prestera_bridge
*bridge
,
342 struct net_device
*dev
)
344 struct prestera_bridge_port
*br_port
;
346 list_for_each_entry(br_port
, &bridge
->port_list
, head
) {
347 if (br_port
->dev
== dev
)
354 static int prestera_match_upper_bridge_dev(struct net_device
*dev
,
355 struct netdev_nested_priv
*priv
)
357 if (netif_is_bridge_master(dev
))
363 static struct net_device
*prestera_get_upper_bridge_dev(struct net_device
*dev
)
365 struct netdev_nested_priv priv
= { };
367 netdev_walk_all_upper_dev_rcu(dev
, prestera_match_upper_bridge_dev
,
372 static struct prestera_bridge_port
*
373 prestera_bridge_port_by_dev(struct prestera_switchdev
*swdev
,
374 struct net_device
*dev
)
376 struct net_device
*br_dev
= prestera_get_upper_bridge_dev(dev
);
377 struct prestera_bridge
*bridge
;
382 bridge
= prestera_bridge_by_dev(swdev
, br_dev
);
386 return __prestera_bridge_port_by_dev(bridge
, dev
);
389 static struct prestera_bridge_port
*
390 prestera_bridge_port_create(struct prestera_bridge
*bridge
,
391 struct net_device
*dev
)
393 struct prestera_bridge_port
*br_port
;
395 br_port
= kzalloc(sizeof(*br_port
), GFP_KERNEL
);
399 br_port
->flags
= BR_LEARNING
| BR_FLOOD
| BR_LEARNING_SYNC
|
401 br_port
->stp_state
= BR_STATE_DISABLED
;
402 refcount_set(&br_port
->ref_count
, 1);
403 br_port
->bridge
= bridge
;
406 INIT_LIST_HEAD(&br_port
->vlan_list
);
407 list_add(&br_port
->head
, &bridge
->port_list
);
413 prestera_bridge_port_destroy(struct prestera_bridge_port
*br_port
)
415 list_del(&br_port
->head
);
416 WARN_ON(!list_empty(&br_port
->vlan_list
));
420 static void prestera_bridge_port_get(struct prestera_bridge_port
*br_port
)
422 refcount_inc(&br_port
->ref_count
);
425 static void prestera_bridge_port_put(struct prestera_bridge_port
*br_port
)
427 struct prestera_bridge
*bridge
= br_port
->bridge
;
429 if (refcount_dec_and_test(&br_port
->ref_count
)) {
430 prestera_bridge_port_destroy(br_port
);
431 prestera_bridge_put(bridge
);
435 static struct prestera_bridge_port
*
436 prestera_bridge_port_add(struct prestera_bridge
*bridge
, struct net_device
*dev
)
438 struct prestera_bridge_port
*br_port
;
440 br_port
= __prestera_bridge_port_by_dev(bridge
, dev
);
442 prestera_bridge_port_get(br_port
);
446 br_port
= prestera_bridge_port_create(bridge
, dev
);
448 return ERR_PTR(-ENOMEM
);
454 prestera_bridge_1d_port_join(struct prestera_bridge_port
*br_port
)
456 struct prestera_port
*port
= netdev_priv(br_port
->dev
);
457 struct prestera_bridge
*bridge
= br_port
->bridge
;
460 err
= prestera_hw_bridge_port_add(port
, bridge
->bridge_id
);
464 err
= prestera_hw_port_flood_set(port
, BR_FLOOD
| BR_MCAST_FLOOD
,
467 goto err_port_flood_set
;
469 err
= prestera_hw_port_learning_set(port
, br_port
->flags
& BR_LEARNING
);
471 goto err_port_learning_set
;
475 err_port_learning_set
:
477 prestera_hw_bridge_port_delete(port
, bridge
->bridge_id
);
482 int prestera_bridge_port_join(struct net_device
*br_dev
,
483 struct prestera_port
*port
)
485 struct prestera_switchdev
*swdev
= port
->sw
->swdev
;
486 struct prestera_bridge_port
*br_port
;
487 struct prestera_bridge
*bridge
;
490 bridge
= prestera_bridge_by_dev(swdev
, br_dev
);
492 bridge
= prestera_bridge_create(swdev
, br_dev
);
494 return PTR_ERR(bridge
);
497 br_port
= prestera_bridge_port_add(bridge
, port
->dev
);
498 if (IS_ERR(br_port
)) {
499 err
= PTR_ERR(br_port
);
500 goto err_brport_create
;
503 if (bridge
->vlan_enabled
)
506 err
= prestera_bridge_1d_port_join(br_port
);
513 prestera_bridge_port_put(br_port
);
515 prestera_bridge_put(bridge
);
519 static void prestera_bridge_1q_port_leave(struct prestera_bridge_port
*br_port
)
521 struct prestera_port
*port
= netdev_priv(br_port
->dev
);
523 prestera_hw_fdb_flush_port(port
, PRESTERA_FDB_FLUSH_MODE_ALL
);
524 prestera_port_pvid_set(port
, PRESTERA_DEFAULT_VID
);
527 static void prestera_bridge_1d_port_leave(struct prestera_bridge_port
*br_port
)
529 struct prestera_port
*port
= netdev_priv(br_port
->dev
);
531 prestera_hw_fdb_flush_port(port
, PRESTERA_FDB_FLUSH_MODE_ALL
);
532 prestera_hw_bridge_port_delete(port
, br_port
->bridge
->bridge_id
);
535 static int prestera_port_vid_stp_set(struct prestera_port
*port
, u16 vid
,
541 case BR_STATE_DISABLED
:
542 hw_state
= PRESTERA_STP_DISABLED
;
545 case BR_STATE_BLOCKING
:
546 case BR_STATE_LISTENING
:
547 hw_state
= PRESTERA_STP_BLOCK_LISTEN
;
550 case BR_STATE_LEARNING
:
551 hw_state
= PRESTERA_STP_LEARN
;
554 case BR_STATE_FORWARDING
:
555 hw_state
= PRESTERA_STP_FORWARD
;
562 return prestera_hw_vlan_port_stp_set(port
, vid
, hw_state
);
565 void prestera_bridge_port_leave(struct net_device
*br_dev
,
566 struct prestera_port
*port
)
568 struct prestera_switchdev
*swdev
= port
->sw
->swdev
;
569 struct prestera_bridge_port
*br_port
;
570 struct prestera_bridge
*bridge
;
572 bridge
= prestera_bridge_by_dev(swdev
, br_dev
);
576 br_port
= __prestera_bridge_port_by_dev(bridge
, port
->dev
);
580 bridge
= br_port
->bridge
;
582 if (bridge
->vlan_enabled
)
583 prestera_bridge_1q_port_leave(br_port
);
585 prestera_bridge_1d_port_leave(br_port
);
587 prestera_hw_port_learning_set(port
, false);
588 prestera_hw_port_flood_set(port
, BR_FLOOD
| BR_MCAST_FLOOD
, 0);
589 prestera_port_vid_stp_set(port
, PRESTERA_VID_ALL
, BR_STATE_FORWARDING
);
590 prestera_bridge_port_put(br_port
);
593 static int prestera_port_attr_br_flags_set(struct prestera_port
*port
,
594 struct net_device
*dev
,
595 struct switchdev_brport_flags flags
)
597 struct prestera_bridge_port
*br_port
;
600 br_port
= prestera_bridge_port_by_dev(port
->sw
->swdev
, dev
);
604 err
= prestera_hw_port_flood_set(port
, flags
.mask
, flags
.val
);
608 if (flags
.mask
& BR_LEARNING
) {
609 err
= prestera_hw_port_learning_set(port
,
610 flags
.val
& BR_LEARNING
);
615 memcpy(&br_port
->flags
, &flags
.val
, sizeof(flags
.val
));
620 static int prestera_port_attr_br_ageing_set(struct prestera_port
*port
,
621 unsigned long ageing_clock_t
)
623 unsigned long ageing_jiffies
= clock_t_to_jiffies(ageing_clock_t
);
624 u32 ageing_time_ms
= jiffies_to_msecs(ageing_jiffies
);
625 struct prestera_switch
*sw
= port
->sw
;
627 if (ageing_time_ms
< PRESTERA_MIN_AGEING_TIME_MS
||
628 ageing_time_ms
> PRESTERA_MAX_AGEING_TIME_MS
)
631 return prestera_hw_switch_ageing_set(sw
, ageing_time_ms
);
634 static int prestera_port_attr_br_vlan_set(struct prestera_port
*port
,
635 struct net_device
*dev
,
638 struct prestera_switch
*sw
= port
->sw
;
639 struct prestera_bridge
*bridge
;
641 bridge
= prestera_bridge_by_dev(sw
->swdev
, dev
);
642 if (WARN_ON(!bridge
))
645 if (bridge
->vlan_enabled
== vlan_enabled
)
648 netdev_err(bridge
->dev
, "VLAN filtering can't be changed for existing bridge\n");
653 static int prestera_port_bridge_vlan_stp_set(struct prestera_port
*port
,
654 struct prestera_bridge_vlan
*br_vlan
,
657 struct prestera_port_vlan
*port_vlan
;
659 list_for_each_entry(port_vlan
, &br_vlan
->port_vlan_list
, br_vlan_head
) {
660 if (port_vlan
->port
!= port
)
663 return prestera_port_vid_stp_set(port
, br_vlan
->vid
, state
);
669 static int prestera_port_attr_stp_state_set(struct prestera_port
*port
,
670 struct net_device
*dev
,
673 struct prestera_bridge_port
*br_port
;
674 struct prestera_bridge_vlan
*br_vlan
;
678 br_port
= prestera_bridge_port_by_dev(port
->sw
->swdev
, dev
);
682 if (!br_port
->bridge
->vlan_enabled
) {
683 vid
= br_port
->bridge
->bridge_id
;
684 err
= prestera_port_vid_stp_set(port
, vid
, state
);
686 goto err_port_stp_set
;
688 list_for_each_entry(br_vlan
, &br_port
->vlan_list
, head
) {
689 err
= prestera_port_bridge_vlan_stp_set(port
, br_vlan
,
692 goto err_port_vlan_stp_set
;
696 br_port
->stp_state
= state
;
700 err_port_vlan_stp_set
:
701 list_for_each_entry_continue_reverse(br_vlan
, &br_port
->vlan_list
, head
)
702 prestera_port_bridge_vlan_stp_set(port
, br_vlan
, br_port
->stp_state
);
706 prestera_port_vid_stp_set(port
, vid
, br_port
->stp_state
);
711 static int prestera_port_obj_attr_set(struct net_device
*dev
, const void *ctx
,
712 const struct switchdev_attr
*attr
,
713 struct netlink_ext_ack
*extack
)
715 struct prestera_port
*port
= netdev_priv(dev
);
719 case SWITCHDEV_ATTR_ID_PORT_STP_STATE
:
720 err
= prestera_port_attr_stp_state_set(port
, attr
->orig_dev
,
723 case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS
:
724 if (attr
->u
.brport_flags
.mask
&
725 ~(BR_LEARNING
| BR_FLOOD
| BR_MCAST_FLOOD
))
728 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS
:
729 err
= prestera_port_attr_br_flags_set(port
, attr
->orig_dev
,
730 attr
->u
.brport_flags
);
732 case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME
:
733 err
= prestera_port_attr_br_ageing_set(port
,
734 attr
->u
.ageing_time
);
736 case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING
:
737 err
= prestera_port_attr_br_vlan_set(port
, attr
->orig_dev
,
738 attr
->u
.vlan_filtering
);
748 prestera_fdb_offload_notify(struct prestera_port
*port
,
749 struct switchdev_notifier_fdb_info
*info
)
751 struct switchdev_notifier_fdb_info send_info
= {};
753 send_info
.addr
= info
->addr
;
754 send_info
.vid
= info
->vid
;
755 send_info
.offloaded
= true;
757 call_switchdev_notifiers(SWITCHDEV_FDB_OFFLOADED
, port
->dev
,
758 &send_info
.info
, NULL
);
761 static int prestera_port_fdb_set(struct prestera_port
*port
,
762 struct switchdev_notifier_fdb_info
*fdb_info
,
765 struct prestera_switch
*sw
= port
->sw
;
766 struct prestera_bridge_port
*br_port
;
767 struct prestera_bridge
*bridge
;
771 br_port
= prestera_bridge_port_by_dev(sw
->swdev
, port
->dev
);
775 bridge
= br_port
->bridge
;
777 if (bridge
->vlan_enabled
)
780 vid
= bridge
->bridge_id
;
783 err
= prestera_fdb_add(port
, fdb_info
->addr
, vid
, false);
785 err
= prestera_fdb_del(port
, fdb_info
->addr
, vid
);
790 static void prestera_fdb_event_work(struct work_struct
*work
)
792 struct switchdev_notifier_fdb_info
*fdb_info
;
793 struct prestera_fdb_event_work
*swdev_work
;
794 struct prestera_port
*port
;
795 struct net_device
*dev
;
798 swdev_work
= container_of(work
, struct prestera_fdb_event_work
, work
);
799 dev
= swdev_work
->dev
;
803 port
= prestera_port_dev_lower_find(dev
);
807 switch (swdev_work
->event
) {
808 case SWITCHDEV_FDB_ADD_TO_DEVICE
:
809 fdb_info
= &swdev_work
->fdb_info
;
810 if (!fdb_info
->added_by_user
|| fdb_info
->is_local
)
813 err
= prestera_port_fdb_set(port
, fdb_info
, true);
817 prestera_fdb_offload_notify(port
, fdb_info
);
820 case SWITCHDEV_FDB_DEL_TO_DEVICE
:
821 fdb_info
= &swdev_work
->fdb_info
;
822 prestera_port_fdb_set(port
, fdb_info
, false);
829 kfree(swdev_work
->fdb_info
.addr
);
834 static int prestera_switchdev_event(struct notifier_block
*unused
,
835 unsigned long event
, void *ptr
)
837 struct net_device
*dev
= switchdev_notifier_info_to_dev(ptr
);
838 struct switchdev_notifier_fdb_info
*fdb_info
;
839 struct switchdev_notifier_info
*info
= ptr
;
840 struct prestera_fdb_event_work
*swdev_work
;
841 struct net_device
*upper
;
844 if (event
== SWITCHDEV_PORT_ATTR_SET
) {
845 err
= switchdev_handle_port_attr_set(dev
, ptr
,
846 prestera_netdev_check
,
847 prestera_port_obj_attr_set
);
848 return notifier_from_errno(err
);
851 if (!prestera_netdev_check(dev
))
854 upper
= netdev_master_upper_dev_get_rcu(dev
);
858 if (!netif_is_bridge_master(upper
))
861 swdev_work
= kzalloc(sizeof(*swdev_work
), GFP_ATOMIC
);
865 swdev_work
->event
= event
;
866 swdev_work
->dev
= dev
;
869 case SWITCHDEV_FDB_ADD_TO_DEVICE
:
870 case SWITCHDEV_FDB_DEL_TO_DEVICE
:
871 fdb_info
= container_of(info
,
872 struct switchdev_notifier_fdb_info
,
875 INIT_WORK(&swdev_work
->work
, prestera_fdb_event_work
);
876 memcpy(&swdev_work
->fdb_info
, ptr
,
877 sizeof(swdev_work
->fdb_info
));
879 swdev_work
->fdb_info
.addr
= kzalloc(ETH_ALEN
, GFP_ATOMIC
);
880 if (!swdev_work
->fdb_info
.addr
)
883 ether_addr_copy((u8
*)swdev_work
->fdb_info
.addr
,
893 queue_work(swdev_wq
, &swdev_work
->work
);
902 prestera_port_vlan_bridge_join(struct prestera_port_vlan
*port_vlan
,
903 struct prestera_bridge_port
*br_port
)
905 struct prestera_port
*port
= port_vlan
->port
;
906 struct prestera_bridge_vlan
*br_vlan
;
907 u16 vid
= port_vlan
->vid
;
910 if (port_vlan
->br_port
)
913 err
= prestera_hw_port_flood_set(port
, BR_FLOOD
| BR_MCAST_FLOOD
,
918 err
= prestera_hw_port_learning_set(port
, br_port
->flags
& BR_LEARNING
);
920 goto err_port_learning_set
;
922 err
= prestera_port_vid_stp_set(port
, vid
, br_port
->stp_state
);
924 goto err_port_vid_stp_set
;
926 br_vlan
= prestera_bridge_vlan_by_vid(br_port
, vid
);
928 br_vlan
= prestera_bridge_vlan_create(br_port
, vid
);
931 goto err_bridge_vlan_get
;
935 list_add(&port_vlan
->br_vlan_head
, &br_vlan
->port_vlan_list
);
937 prestera_bridge_port_get(br_port
);
938 port_vlan
->br_port
= br_port
;
943 prestera_port_vid_stp_set(port
, vid
, BR_STATE_FORWARDING
);
944 err_port_vid_stp_set
:
945 prestera_hw_port_learning_set(port
, false);
946 err_port_learning_set
:
951 prestera_bridge_port_vlan_add(struct prestera_port
*port
,
952 struct prestera_bridge_port
*br_port
,
953 u16 vid
, bool is_untagged
, bool is_pvid
,
954 struct netlink_ext_ack
*extack
)
956 struct prestera_port_vlan
*port_vlan
;
957 u16 old_pvid
= port
->pvid
;
964 pvid
= port
->pvid
== vid
? 0 : port
->pvid
;
966 port_vlan
= prestera_port_vlan_by_vid(port
, vid
);
967 if (port_vlan
&& port_vlan
->br_port
!= br_port
)
971 port_vlan
= prestera_port_vlan_create(port
, vid
, is_untagged
);
972 if (IS_ERR(port_vlan
))
973 return PTR_ERR(port_vlan
);
975 err
= prestera_hw_vlan_port_set(port
, vid
, true, is_untagged
);
977 goto err_port_vlan_set
;
980 err
= prestera_port_pvid_set(port
, pvid
);
982 goto err_port_pvid_set
;
984 err
= prestera_port_vlan_bridge_join(port_vlan
, br_port
);
986 goto err_port_vlan_bridge_join
;
990 err_port_vlan_bridge_join
:
991 prestera_port_pvid_set(port
, old_pvid
);
993 prestera_hw_vlan_port_set(port
, vid
, false, false);
995 prestera_port_vlan_destroy(port_vlan
);
1001 prestera_bridge_port_vlan_del(struct prestera_port
*port
,
1002 struct prestera_bridge_port
*br_port
, u16 vid
)
1004 u16 pvid
= port
->pvid
== vid
? 0 : port
->pvid
;
1005 struct prestera_port_vlan
*port_vlan
;
1007 port_vlan
= prestera_port_vlan_by_vid(port
, vid
);
1008 if (WARN_ON(!port_vlan
))
1011 prestera_port_vlan_bridge_leave(port_vlan
);
1012 prestera_port_pvid_set(port
, pvid
);
1013 prestera_port_vlan_destroy(port_vlan
);
1016 static int prestera_port_vlans_add(struct prestera_port
*port
,
1017 const struct switchdev_obj_port_vlan
*vlan
,
1018 struct netlink_ext_ack
*extack
)
1020 bool flag_untagged
= vlan
->flags
& BRIDGE_VLAN_INFO_UNTAGGED
;
1021 bool flag_pvid
= vlan
->flags
& BRIDGE_VLAN_INFO_PVID
;
1022 struct net_device
*orig_dev
= vlan
->obj
.orig_dev
;
1023 struct prestera_bridge_port
*br_port
;
1024 struct prestera_switch
*sw
= port
->sw
;
1025 struct prestera_bridge
*bridge
;
1027 if (netif_is_bridge_master(orig_dev
))
1030 br_port
= prestera_bridge_port_by_dev(sw
->swdev
, port
->dev
);
1031 if (WARN_ON(!br_port
))
1034 bridge
= br_port
->bridge
;
1035 if (!bridge
->vlan_enabled
)
1038 return prestera_bridge_port_vlan_add(port
, br_port
,
1039 vlan
->vid
, flag_untagged
,
1043 static int prestera_port_obj_add(struct net_device
*dev
, const void *ctx
,
1044 const struct switchdev_obj
*obj
,
1045 struct netlink_ext_ack
*extack
)
1047 struct prestera_port
*port
= netdev_priv(dev
);
1048 const struct switchdev_obj_port_vlan
*vlan
;
1051 case SWITCHDEV_OBJ_ID_PORT_VLAN
:
1052 vlan
= SWITCHDEV_OBJ_PORT_VLAN(obj
);
1053 return prestera_port_vlans_add(port
, vlan
, extack
);
1059 static int prestera_port_vlans_del(struct prestera_port
*port
,
1060 const struct switchdev_obj_port_vlan
*vlan
)
1062 struct net_device
*orig_dev
= vlan
->obj
.orig_dev
;
1063 struct prestera_bridge_port
*br_port
;
1064 struct prestera_switch
*sw
= port
->sw
;
1066 if (netif_is_bridge_master(orig_dev
))
1069 br_port
= prestera_bridge_port_by_dev(sw
->swdev
, port
->dev
);
1070 if (WARN_ON(!br_port
))
1073 if (!br_port
->bridge
->vlan_enabled
)
1076 prestera_bridge_port_vlan_del(port
, br_port
, vlan
->vid
);
1081 static int prestera_port_obj_del(struct net_device
*dev
, const void *ctx
,
1082 const struct switchdev_obj
*obj
)
1084 struct prestera_port
*port
= netdev_priv(dev
);
1087 case SWITCHDEV_OBJ_ID_PORT_VLAN
:
1088 return prestera_port_vlans_del(port
, SWITCHDEV_OBJ_PORT_VLAN(obj
));
1094 static int prestera_switchdev_blk_event(struct notifier_block
*unused
,
1095 unsigned long event
, void *ptr
)
1097 struct net_device
*dev
= switchdev_notifier_info_to_dev(ptr
);
1101 case SWITCHDEV_PORT_OBJ_ADD
:
1102 err
= switchdev_handle_port_obj_add(dev
, ptr
,
1103 prestera_netdev_check
,
1104 prestera_port_obj_add
);
1106 case SWITCHDEV_PORT_OBJ_DEL
:
1107 err
= switchdev_handle_port_obj_del(dev
, ptr
,
1108 prestera_netdev_check
,
1109 prestera_port_obj_del
);
1111 case SWITCHDEV_PORT_ATTR_SET
:
1112 err
= switchdev_handle_port_attr_set(dev
, ptr
,
1113 prestera_netdev_check
,
1114 prestera_port_obj_attr_set
);
1120 return notifier_from_errno(err
);
1123 static void prestera_fdb_event(struct prestera_switch
*sw
,
1124 struct prestera_event
*evt
, void *arg
)
1126 struct switchdev_notifier_fdb_info info
= {};
1127 struct net_device
*dev
= NULL
;
1128 struct prestera_port
*port
;
1129 struct prestera_lag
*lag
;
1131 switch (evt
->fdb_evt
.type
) {
1132 case PRESTERA_FDB_ENTRY_TYPE_REG_PORT
:
1133 port
= prestera_find_port(sw
, evt
->fdb_evt
.dest
.port_id
);
1137 case PRESTERA_FDB_ENTRY_TYPE_LAG
:
1138 lag
= prestera_lag_by_id(sw
, evt
->fdb_evt
.dest
.lag_id
);
1149 info
.addr
= evt
->fdb_evt
.data
.mac
;
1150 info
.vid
= evt
->fdb_evt
.vid
;
1151 info
.offloaded
= true;
1156 case PRESTERA_FDB_EVENT_LEARNED
:
1157 call_switchdev_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE
,
1158 dev
, &info
.info
, NULL
);
1160 case PRESTERA_FDB_EVENT_AGED
:
1161 call_switchdev_notifiers(SWITCHDEV_FDB_DEL_TO_BRIDGE
,
1162 dev
, &info
.info
, NULL
);
1169 static int prestera_fdb_init(struct prestera_switch
*sw
)
1173 err
= prestera_hw_event_handler_register(sw
, PRESTERA_EVENT_TYPE_FDB
,
1174 prestera_fdb_event
, NULL
);
1178 err
= prestera_hw_switch_ageing_set(sw
, PRESTERA_DEFAULT_AGEING_TIME_MS
);
1180 goto err_ageing_set
;
1185 prestera_hw_event_handler_unregister(sw
, PRESTERA_EVENT_TYPE_FDB
,
1186 prestera_fdb_event
);
1190 static void prestera_fdb_fini(struct prestera_switch
*sw
)
1192 prestera_hw_event_handler_unregister(sw
, PRESTERA_EVENT_TYPE_FDB
,
1193 prestera_fdb_event
);
1196 static int prestera_switchdev_handler_init(struct prestera_switchdev
*swdev
)
1200 swdev
->swdev_nb
.notifier_call
= prestera_switchdev_event
;
1201 err
= register_switchdev_notifier(&swdev
->swdev_nb
);
1203 goto err_register_swdev_notifier
;
1205 swdev
->swdev_nb_blk
.notifier_call
= prestera_switchdev_blk_event
;
1206 err
= register_switchdev_blocking_notifier(&swdev
->swdev_nb_blk
);
1208 goto err_register_blk_swdev_notifier
;
1212 err_register_blk_swdev_notifier
:
1213 unregister_switchdev_notifier(&swdev
->swdev_nb
);
1214 err_register_swdev_notifier
:
1215 destroy_workqueue(swdev_wq
);
1219 static void prestera_switchdev_handler_fini(struct prestera_switchdev
*swdev
)
1221 unregister_switchdev_blocking_notifier(&swdev
->swdev_nb_blk
);
1222 unregister_switchdev_notifier(&swdev
->swdev_nb
);
1225 int prestera_switchdev_init(struct prestera_switch
*sw
)
1227 struct prestera_switchdev
*swdev
;
1230 swdev
= kzalloc(sizeof(*swdev
), GFP_KERNEL
);
1237 INIT_LIST_HEAD(&swdev
->bridge_list
);
1239 swdev_wq
= alloc_ordered_workqueue("%s_ordered", 0, "prestera_br");
1245 err
= prestera_switchdev_handler_init(swdev
);
1247 goto err_swdev_init
;
1249 err
= prestera_fdb_init(sw
);
1257 destroy_workqueue(swdev_wq
);
1264 void prestera_switchdev_fini(struct prestera_switch
*sw
)
1266 struct prestera_switchdev
*swdev
= sw
->swdev
;
1268 prestera_fdb_fini(sw
);
1269 prestera_switchdev_handler_fini(swdev
);
1270 destroy_workqueue(swdev_wq
);