xref: /openbmc/linux/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c (revision c1e01cdbe0312d95b8c1542abd67fe786b534f57)
1  // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
2  /* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
3  
4  #include <linux/kernel.h>
5  #include <linux/types.h>
6  #include <linux/netdevice.h>
7  #include <linux/etherdevice.h>
8  #include <linux/slab.h>
9  #include <linux/device.h>
10  #include <linux/skbuff.h>
11  #include <linux/if_vlan.h>
12  #include <linux/if_bridge.h>
13  #include <linux/workqueue.h>
14  #include <linux/jiffies.h>
15  #include <linux/rtnetlink.h>
16  #include <linux/netlink.h>
17  #include <net/switchdev.h>
18  #include <net/vxlan.h>
19  
20  #include "spectrum_span.h"
21  #include "spectrum_switchdev.h"
22  #include "spectrum.h"
23  #include "core.h"
24  #include "reg.h"
25  
26  struct mlxsw_sp_bridge_ops;
27  
28  struct mlxsw_sp_bridge {
29  	struct mlxsw_sp *mlxsw_sp;
30  	struct {
31  		struct delayed_work dw;
32  #define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
33  		unsigned int interval; /* ms */
34  	} fdb_notify;
35  #define MLXSW_SP_MIN_AGEING_TIME 10
36  #define MLXSW_SP_MAX_AGEING_TIME 1000000
37  #define MLXSW_SP_DEFAULT_AGEING_TIME 300
38  	u32 ageing_time;
39  	bool vlan_enabled_exists;
40  	struct list_head bridges_list;
41  	DECLARE_BITMAP(mids_bitmap, MLXSW_SP_MID_MAX);
42  	const struct mlxsw_sp_bridge_ops *bridge_8021q_ops;
43  	const struct mlxsw_sp_bridge_ops *bridge_8021d_ops;
44  	const struct mlxsw_sp_bridge_ops *bridge_8021ad_ops;
45  };
46  
47  struct mlxsw_sp_bridge_device {
48  	struct net_device *dev;
49  	struct list_head list;
50  	struct list_head ports_list;
51  	struct list_head mdb_list;
52  	struct rhashtable mdb_ht;
53  	u8 vlan_enabled:1,
54  	   multicast_enabled:1,
55  	   mrouter:1;
56  	const struct mlxsw_sp_bridge_ops *ops;
57  };
58  
59  struct mlxsw_sp_bridge_port {
60  	struct net_device *dev;
61  	struct mlxsw_sp_bridge_device *bridge_device;
62  	struct list_head list;
63  	struct list_head vlans_list;
64  	refcount_t ref_count;
65  	u8 stp_state;
66  	unsigned long flags;
67  	bool mrouter;
68  	bool lagged;
69  	union {
70  		u16 lag_id;
71  		u16 system_port;
72  	};
73  };
74  
75  struct mlxsw_sp_bridge_vlan {
76  	struct list_head list;
77  	struct list_head port_vlan_list;
78  	u16 vid;
79  };
80  
81  struct mlxsw_sp_bridge_ops {
82  	int (*port_join)(struct mlxsw_sp_bridge_device *bridge_device,
83  			 struct mlxsw_sp_bridge_port *bridge_port,
84  			 struct mlxsw_sp_port *mlxsw_sp_port,
85  			 struct netlink_ext_ack *extack);
86  	void (*port_leave)(struct mlxsw_sp_bridge_device *bridge_device,
87  			   struct mlxsw_sp_bridge_port *bridge_port,
88  			   struct mlxsw_sp_port *mlxsw_sp_port);
89  	int (*vxlan_join)(struct mlxsw_sp_bridge_device *bridge_device,
90  			  const struct net_device *vxlan_dev, u16 vid,
91  			  struct netlink_ext_ack *extack);
92  	struct mlxsw_sp_fid *
93  		(*fid_get)(struct mlxsw_sp_bridge_device *bridge_device,
94  			   u16 vid, struct netlink_ext_ack *extack);
95  	struct mlxsw_sp_fid *
96  		(*fid_lookup)(struct mlxsw_sp_bridge_device *bridge_device,
97  			      u16 vid);
98  	u16 (*fid_vid)(struct mlxsw_sp_bridge_device *bridge_device,
99  		       const struct mlxsw_sp_fid *fid);
100  };
101  
102  struct mlxsw_sp_switchdev_ops {
103  	void (*init)(struct mlxsw_sp *mlxsw_sp);
104  };
105  
106  struct mlxsw_sp_mdb_entry_key {
107  	unsigned char addr[ETH_ALEN];
108  	u16 fid;
109  };
110  
111  struct mlxsw_sp_mdb_entry {
112  	struct list_head list;
113  	struct rhash_head ht_node;
114  	struct mlxsw_sp_mdb_entry_key key;
115  	u16 mid;
116  	struct list_head ports_list;
117  	u16 ports_count;
118  };
119  
120  struct mlxsw_sp_mdb_entry_port {
121  	struct list_head list; /* Member of 'ports_list'. */
122  	u16 local_port;
123  	refcount_t refcount;
124  	bool mrouter;
125  };
126  
127  static const struct rhashtable_params mlxsw_sp_mdb_ht_params = {
128  	.key_offset = offsetof(struct mlxsw_sp_mdb_entry, key),
129  	.head_offset = offsetof(struct mlxsw_sp_mdb_entry, ht_node),
130  	.key_len = sizeof(struct mlxsw_sp_mdb_entry_key),
131  };
132  
133  static int
134  mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
135  			       struct mlxsw_sp_bridge_port *bridge_port,
136  			       u16 fid_index);
137  
138  static void
139  mlxsw_sp_bridge_port_mdb_flush(struct mlxsw_sp_port *mlxsw_sp_port,
140  			       struct mlxsw_sp_bridge_port *bridge_port,
141  			       u16 fid_index);
142  
143  static int
144  mlxsw_sp_bridge_mdb_mc_enable_sync(struct mlxsw_sp *mlxsw_sp,
145  				   struct mlxsw_sp_bridge_device
146  				   *bridge_device, bool mc_enabled);
147  
148  static void
149  mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port,
150  				 struct mlxsw_sp_bridge_port *bridge_port,
151  				 bool add);
152  
153  static struct mlxsw_sp_bridge_device *
mlxsw_sp_bridge_device_find(const struct mlxsw_sp_bridge * bridge,const struct net_device * br_dev)154  mlxsw_sp_bridge_device_find(const struct mlxsw_sp_bridge *bridge,
155  			    const struct net_device *br_dev)
156  {
157  	struct mlxsw_sp_bridge_device *bridge_device;
158  
159  	list_for_each_entry(bridge_device, &bridge->bridges_list, list)
160  		if (bridge_device->dev == br_dev)
161  			return bridge_device;
162  
163  	return NULL;
164  }
165  
mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp * mlxsw_sp,const struct net_device * br_dev)166  bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
167  					 const struct net_device *br_dev)
168  {
169  	return !!mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
170  }
171  
mlxsw_sp_bridge_device_upper_rif_destroy(struct net_device * dev,struct netdev_nested_priv * priv)172  static int mlxsw_sp_bridge_device_upper_rif_destroy(struct net_device *dev,
173  						    struct netdev_nested_priv *priv)
174  {
175  	struct mlxsw_sp *mlxsw_sp = priv->data;
176  
177  	mlxsw_sp_rif_destroy_by_dev(mlxsw_sp, dev);
178  	return 0;
179  }
180  
mlxsw_sp_bridge_device_rifs_destroy(struct mlxsw_sp * mlxsw_sp,struct net_device * dev)181  static void mlxsw_sp_bridge_device_rifs_destroy(struct mlxsw_sp *mlxsw_sp,
182  						struct net_device *dev)
183  {
184  	struct netdev_nested_priv priv = {
185  		.data = (void *)mlxsw_sp,
186  	};
187  
188  	mlxsw_sp_rif_destroy_by_dev(mlxsw_sp, dev);
189  	netdev_walk_all_upper_dev_rcu(dev,
190  				      mlxsw_sp_bridge_device_upper_rif_destroy,
191  				      &priv);
192  }
193  
mlxsw_sp_bridge_device_vxlan_init(struct mlxsw_sp_bridge * bridge,struct net_device * br_dev,struct netlink_ext_ack * extack)194  static int mlxsw_sp_bridge_device_vxlan_init(struct mlxsw_sp_bridge *bridge,
195  					     struct net_device *br_dev,
196  					     struct netlink_ext_ack *extack)
197  {
198  	struct net_device *dev, *stop_dev;
199  	struct list_head *iter;
200  	int err;
201  
202  	netdev_for_each_lower_dev(br_dev, dev, iter) {
203  		if (netif_is_vxlan(dev) && netif_running(dev)) {
204  			err = mlxsw_sp_bridge_vxlan_join(bridge->mlxsw_sp,
205  							 br_dev, dev, 0,
206  							 extack);
207  			if (err) {
208  				stop_dev = dev;
209  				goto err_vxlan_join;
210  			}
211  		}
212  	}
213  
214  	return 0;
215  
216  err_vxlan_join:
217  	netdev_for_each_lower_dev(br_dev, dev, iter) {
218  		if (netif_is_vxlan(dev) && netif_running(dev)) {
219  			if (stop_dev == dev)
220  				break;
221  			mlxsw_sp_bridge_vxlan_leave(bridge->mlxsw_sp, dev);
222  		}
223  	}
224  	return err;
225  }
226  
mlxsw_sp_bridge_device_vxlan_fini(struct mlxsw_sp_bridge * bridge,struct net_device * br_dev)227  static void mlxsw_sp_bridge_device_vxlan_fini(struct mlxsw_sp_bridge *bridge,
228  					      struct net_device *br_dev)
229  {
230  	struct net_device *dev;
231  	struct list_head *iter;
232  
233  	netdev_for_each_lower_dev(br_dev, dev, iter) {
234  		if (netif_is_vxlan(dev) && netif_running(dev))
235  			mlxsw_sp_bridge_vxlan_leave(bridge->mlxsw_sp, dev);
236  	}
237  }
238  
mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp * mlxsw_sp,bool no_delay)239  static void mlxsw_sp_fdb_notify_work_schedule(struct mlxsw_sp *mlxsw_sp,
240  					      bool no_delay)
241  {
242  	struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
243  	unsigned int interval = no_delay ? 0 : bridge->fdb_notify.interval;
244  
245  	mlxsw_core_schedule_dw(&bridge->fdb_notify.dw,
246  			       msecs_to_jiffies(interval));
247  }
248  
249  static struct mlxsw_sp_bridge_device *
mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge * bridge,struct net_device * br_dev,struct netlink_ext_ack * extack)250  mlxsw_sp_bridge_device_create(struct mlxsw_sp_bridge *bridge,
251  			      struct net_device *br_dev,
252  			      struct netlink_ext_ack *extack)
253  {
254  	struct device *dev = bridge->mlxsw_sp->bus_info->dev;
255  	struct mlxsw_sp_bridge_device *bridge_device;
256  	bool vlan_enabled = br_vlan_enabled(br_dev);
257  	int err;
258  
259  	if (vlan_enabled && bridge->vlan_enabled_exists) {
260  		dev_err(dev, "Only one VLAN-aware bridge is supported\n");
261  		NL_SET_ERR_MSG_MOD(extack, "Only one VLAN-aware bridge is supported");
262  		return ERR_PTR(-EINVAL);
263  	}
264  
265  	bridge_device = kzalloc(sizeof(*bridge_device), GFP_KERNEL);
266  	if (!bridge_device)
267  		return ERR_PTR(-ENOMEM);
268  
269  	err = rhashtable_init(&bridge_device->mdb_ht, &mlxsw_sp_mdb_ht_params);
270  	if (err)
271  		goto err_mdb_rhashtable_init;
272  
273  	bridge_device->dev = br_dev;
274  	bridge_device->vlan_enabled = vlan_enabled;
275  	bridge_device->multicast_enabled = br_multicast_enabled(br_dev);
276  	bridge_device->mrouter = br_multicast_router(br_dev);
277  	INIT_LIST_HEAD(&bridge_device->ports_list);
278  	if (vlan_enabled) {
279  		u16 proto;
280  
281  		bridge->vlan_enabled_exists = true;
282  		br_vlan_get_proto(br_dev, &proto);
283  		if (proto == ETH_P_8021AD)
284  			bridge_device->ops = bridge->bridge_8021ad_ops;
285  		else
286  			bridge_device->ops = bridge->bridge_8021q_ops;
287  	} else {
288  		bridge_device->ops = bridge->bridge_8021d_ops;
289  	}
290  	INIT_LIST_HEAD(&bridge_device->mdb_list);
291  
292  	if (list_empty(&bridge->bridges_list))
293  		mlxsw_sp_fdb_notify_work_schedule(bridge->mlxsw_sp, false);
294  	list_add(&bridge_device->list, &bridge->bridges_list);
295  
296  	/* It is possible we already have VXLAN devices enslaved to the bridge.
297  	 * In which case, we need to replay their configuration as if they were
298  	 * just now enslaved to the bridge.
299  	 */
300  	err = mlxsw_sp_bridge_device_vxlan_init(bridge, br_dev, extack);
301  	if (err)
302  		goto err_vxlan_init;
303  
304  	return bridge_device;
305  
306  err_vxlan_init:
307  	list_del(&bridge_device->list);
308  	if (bridge_device->vlan_enabled)
309  		bridge->vlan_enabled_exists = false;
310  	rhashtable_destroy(&bridge_device->mdb_ht);
311  err_mdb_rhashtable_init:
312  	kfree(bridge_device);
313  	return ERR_PTR(err);
314  }
315  
316  static void
mlxsw_sp_bridge_device_destroy(struct mlxsw_sp_bridge * bridge,struct mlxsw_sp_bridge_device * bridge_device)317  mlxsw_sp_bridge_device_destroy(struct mlxsw_sp_bridge *bridge,
318  			       struct mlxsw_sp_bridge_device *bridge_device)
319  {
320  	mlxsw_sp_bridge_device_vxlan_fini(bridge, bridge_device->dev);
321  	mlxsw_sp_bridge_device_rifs_destroy(bridge->mlxsw_sp,
322  					    bridge_device->dev);
323  	list_del(&bridge_device->list);
324  	if (list_empty(&bridge->bridges_list))
325  		cancel_delayed_work(&bridge->fdb_notify.dw);
326  	if (bridge_device->vlan_enabled)
327  		bridge->vlan_enabled_exists = false;
328  	WARN_ON(!list_empty(&bridge_device->ports_list));
329  	WARN_ON(!list_empty(&bridge_device->mdb_list));
330  	rhashtable_destroy(&bridge_device->mdb_ht);
331  	kfree(bridge_device);
332  }
333  
334  static struct mlxsw_sp_bridge_device *
mlxsw_sp_bridge_device_get(struct mlxsw_sp_bridge * bridge,struct net_device * br_dev,struct netlink_ext_ack * extack)335  mlxsw_sp_bridge_device_get(struct mlxsw_sp_bridge *bridge,
336  			   struct net_device *br_dev,
337  			   struct netlink_ext_ack *extack)
338  {
339  	struct mlxsw_sp_bridge_device *bridge_device;
340  
341  	bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
342  	if (bridge_device)
343  		return bridge_device;
344  
345  	return mlxsw_sp_bridge_device_create(bridge, br_dev, extack);
346  }
347  
348  static void
mlxsw_sp_bridge_device_put(struct mlxsw_sp_bridge * bridge,struct mlxsw_sp_bridge_device * bridge_device)349  mlxsw_sp_bridge_device_put(struct mlxsw_sp_bridge *bridge,
350  			   struct mlxsw_sp_bridge_device *bridge_device)
351  {
352  	if (list_empty(&bridge_device->ports_list))
353  		mlxsw_sp_bridge_device_destroy(bridge, bridge_device);
354  }
355  
356  static struct mlxsw_sp_bridge_port *
__mlxsw_sp_bridge_port_find(const struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * brport_dev)357  __mlxsw_sp_bridge_port_find(const struct mlxsw_sp_bridge_device *bridge_device,
358  			    const struct net_device *brport_dev)
359  {
360  	struct mlxsw_sp_bridge_port *bridge_port;
361  
362  	list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
363  		if (bridge_port->dev == brport_dev)
364  			return bridge_port;
365  	}
366  
367  	return NULL;
368  }
369  
370  struct mlxsw_sp_bridge_port *
mlxsw_sp_bridge_port_find(struct mlxsw_sp_bridge * bridge,struct net_device * brport_dev)371  mlxsw_sp_bridge_port_find(struct mlxsw_sp_bridge *bridge,
372  			  struct net_device *brport_dev)
373  {
374  	struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
375  	struct mlxsw_sp_bridge_device *bridge_device;
376  
377  	if (!br_dev)
378  		return NULL;
379  
380  	bridge_device = mlxsw_sp_bridge_device_find(bridge, br_dev);
381  	if (!bridge_device)
382  		return NULL;
383  
384  	return __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
385  }
386  
387  static int mlxsw_sp_port_obj_add(struct net_device *dev, const void *ctx,
388  				 const struct switchdev_obj *obj,
389  				 struct netlink_ext_ack *extack);
390  static int mlxsw_sp_port_obj_del(struct net_device *dev, const void *ctx,
391  				 const struct switchdev_obj *obj);
392  
393  struct mlxsw_sp_bridge_port_replay_switchdev_objs {
394  	struct net_device *brport_dev;
395  	struct mlxsw_sp_port *mlxsw_sp_port;
396  	int done;
397  };
398  
399  static int
mlxsw_sp_bridge_port_replay_switchdev_objs(struct notifier_block * nb,unsigned long event,void * ptr)400  mlxsw_sp_bridge_port_replay_switchdev_objs(struct notifier_block *nb,
401  					   unsigned long event, void *ptr)
402  {
403  	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
404  	struct switchdev_notifier_port_obj_info *port_obj_info = ptr;
405  	struct netlink_ext_ack *extack = port_obj_info->info.extack;
406  	struct mlxsw_sp_bridge_port_replay_switchdev_objs *rso;
407  	int err = 0;
408  
409  	rso = (void *)port_obj_info->info.ctx;
410  
411  	if (event != SWITCHDEV_PORT_OBJ_ADD ||
412  	    dev != rso->brport_dev)
413  		goto out;
414  
415  	/* When a port is joining the bridge through a LAG, there likely are
416  	 * VLANs configured on that LAG already. The replay will thus attempt to
417  	 * have the given port-vlans join the corresponding FIDs. But the LAG
418  	 * netdevice has already called the ndo_vlan_rx_add_vid NDO for its VLAN
419  	 * memberships, back before CHANGEUPPER was distributed and netdevice
420  	 * master set. So now before propagating the VLAN events further, we
421  	 * first need to kill the corresponding VID at the mlxsw_sp_port.
422  	 *
423  	 * Note that this doesn't need to be rolled back on failure -- if the
424  	 * replay fails, the enslavement is off, and the VIDs would be killed by
425  	 * LAG anyway as part of its rollback.
426  	 */
427  	if (port_obj_info->obj->id == SWITCHDEV_OBJ_ID_PORT_VLAN) {
428  		u16 vid = SWITCHDEV_OBJ_PORT_VLAN(port_obj_info->obj)->vid;
429  
430  		err = mlxsw_sp_port_kill_vid(rso->mlxsw_sp_port->dev, 0, vid);
431  		if (err)
432  			goto out;
433  	}
434  
435  	++rso->done;
436  	err = mlxsw_sp_port_obj_add(rso->mlxsw_sp_port->dev, NULL,
437  				    port_obj_info->obj, extack);
438  
439  out:
440  	return notifier_from_errno(err);
441  }
442  
443  static struct notifier_block mlxsw_sp_bridge_port_replay_switchdev_objs_nb = {
444  	.notifier_call = mlxsw_sp_bridge_port_replay_switchdev_objs,
445  };
446  
447  static int
mlxsw_sp_bridge_port_unreplay_switchdev_objs(struct notifier_block * nb,unsigned long event,void * ptr)448  mlxsw_sp_bridge_port_unreplay_switchdev_objs(struct notifier_block *nb,
449  					     unsigned long event, void *ptr)
450  {
451  	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
452  	struct switchdev_notifier_port_obj_info *port_obj_info = ptr;
453  	struct mlxsw_sp_bridge_port_replay_switchdev_objs *rso;
454  
455  	rso = (void *)port_obj_info->info.ctx;
456  
457  	if (event != SWITCHDEV_PORT_OBJ_ADD ||
458  	    dev != rso->brport_dev)
459  		return NOTIFY_DONE;
460  	if (!rso->done--)
461  		return NOTIFY_STOP;
462  
463  	mlxsw_sp_port_obj_del(rso->mlxsw_sp_port->dev, NULL,
464  			      port_obj_info->obj);
465  	return NOTIFY_DONE;
466  }
467  
468  static struct notifier_block mlxsw_sp_bridge_port_unreplay_switchdev_objs_nb = {
469  	.notifier_call = mlxsw_sp_bridge_port_unreplay_switchdev_objs,
470  };
471  
472  static struct mlxsw_sp_bridge_port *
mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device * bridge_device,struct net_device * brport_dev,struct netlink_ext_ack * extack)473  mlxsw_sp_bridge_port_create(struct mlxsw_sp_bridge_device *bridge_device,
474  			    struct net_device *brport_dev,
475  			    struct netlink_ext_ack *extack)
476  {
477  	struct mlxsw_sp_bridge_port *bridge_port;
478  	struct mlxsw_sp_port *mlxsw_sp_port;
479  	int err;
480  
481  	bridge_port = kzalloc(sizeof(*bridge_port), GFP_KERNEL);
482  	if (!bridge_port)
483  		return ERR_PTR(-ENOMEM);
484  
485  	mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(brport_dev);
486  	bridge_port->lagged = mlxsw_sp_port->lagged;
487  	if (bridge_port->lagged)
488  		bridge_port->lag_id = mlxsw_sp_port->lag_id;
489  	else
490  		bridge_port->system_port = mlxsw_sp_port->local_port;
491  	bridge_port->dev = brport_dev;
492  	bridge_port->bridge_device = bridge_device;
493  	bridge_port->stp_state = br_port_get_stp_state(brport_dev);
494  	bridge_port->flags = BR_LEARNING | BR_FLOOD | BR_LEARNING_SYNC |
495  			     BR_MCAST_FLOOD;
496  	INIT_LIST_HEAD(&bridge_port->vlans_list);
497  	list_add(&bridge_port->list, &bridge_device->ports_list);
498  	refcount_set(&bridge_port->ref_count, 1);
499  
500  	err = switchdev_bridge_port_offload(brport_dev, mlxsw_sp_port->dev,
501  					    NULL, NULL, NULL, false, extack);
502  	if (err)
503  		goto err_switchdev_offload;
504  
505  	return bridge_port;
506  
507  err_switchdev_offload:
508  	list_del(&bridge_port->list);
509  	kfree(bridge_port);
510  	return ERR_PTR(err);
511  }
512  
513  static void
mlxsw_sp_bridge_port_destroy(struct mlxsw_sp_bridge_port * bridge_port)514  mlxsw_sp_bridge_port_destroy(struct mlxsw_sp_bridge_port *bridge_port)
515  {
516  	switchdev_bridge_port_unoffload(bridge_port->dev, NULL, NULL, NULL);
517  	list_del(&bridge_port->list);
518  	WARN_ON(!list_empty(&bridge_port->vlans_list));
519  	kfree(bridge_port);
520  }
521  
522  static struct mlxsw_sp_bridge_port *
mlxsw_sp_bridge_port_get(struct mlxsw_sp_bridge * bridge,struct net_device * brport_dev,struct netlink_ext_ack * extack)523  mlxsw_sp_bridge_port_get(struct mlxsw_sp_bridge *bridge,
524  			 struct net_device *brport_dev,
525  			 struct netlink_ext_ack *extack)
526  {
527  	struct net_device *br_dev = netdev_master_upper_dev_get(brport_dev);
528  	struct mlxsw_sp_bridge_device *bridge_device;
529  	struct mlxsw_sp_bridge_port *bridge_port;
530  	int err;
531  
532  	bridge_port = mlxsw_sp_bridge_port_find(bridge, brport_dev);
533  	if (bridge_port) {
534  		refcount_inc(&bridge_port->ref_count);
535  		return bridge_port;
536  	}
537  
538  	bridge_device = mlxsw_sp_bridge_device_get(bridge, br_dev, extack);
539  	if (IS_ERR(bridge_device))
540  		return ERR_CAST(bridge_device);
541  
542  	bridge_port = mlxsw_sp_bridge_port_create(bridge_device, brport_dev,
543  						  extack);
544  	if (IS_ERR(bridge_port)) {
545  		err = PTR_ERR(bridge_port);
546  		goto err_bridge_port_create;
547  	}
548  
549  	return bridge_port;
550  
551  err_bridge_port_create:
552  	mlxsw_sp_bridge_device_put(bridge, bridge_device);
553  	return ERR_PTR(err);
554  }
555  
mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge * bridge,struct mlxsw_sp_bridge_port * bridge_port)556  static void mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge *bridge,
557  				     struct mlxsw_sp_bridge_port *bridge_port)
558  {
559  	struct mlxsw_sp_bridge_device *bridge_device;
560  
561  	if (!refcount_dec_and_test(&bridge_port->ref_count))
562  		return;
563  	bridge_device = bridge_port->bridge_device;
564  	mlxsw_sp_bridge_port_destroy(bridge_port);
565  	mlxsw_sp_bridge_device_put(bridge, bridge_device);
566  }
567  
568  static struct mlxsw_sp_port_vlan *
mlxsw_sp_port_vlan_find_by_bridge(struct mlxsw_sp_port * mlxsw_sp_port,const struct mlxsw_sp_bridge_device * bridge_device,u16 vid)569  mlxsw_sp_port_vlan_find_by_bridge(struct mlxsw_sp_port *mlxsw_sp_port,
570  				  const struct mlxsw_sp_bridge_device *
571  				  bridge_device,
572  				  u16 vid)
573  {
574  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
575  
576  	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
577  			    list) {
578  		if (!mlxsw_sp_port_vlan->bridge_port)
579  			continue;
580  		if (mlxsw_sp_port_vlan->bridge_port->bridge_device !=
581  		    bridge_device)
582  			continue;
583  		if (bridge_device->vlan_enabled &&
584  		    mlxsw_sp_port_vlan->vid != vid)
585  			continue;
586  		return mlxsw_sp_port_vlan;
587  	}
588  
589  	return NULL;
590  }
591  
592  static struct mlxsw_sp_port_vlan*
mlxsw_sp_port_vlan_find_by_fid(struct mlxsw_sp_port * mlxsw_sp_port,u16 fid_index)593  mlxsw_sp_port_vlan_find_by_fid(struct mlxsw_sp_port *mlxsw_sp_port,
594  			       u16 fid_index)
595  {
596  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
597  
598  	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
599  			    list) {
600  		struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
601  
602  		if (fid && mlxsw_sp_fid_index(fid) == fid_index)
603  			return mlxsw_sp_port_vlan;
604  	}
605  
606  	return NULL;
607  }
608  
609  static struct mlxsw_sp_bridge_vlan *
mlxsw_sp_bridge_vlan_find(const struct mlxsw_sp_bridge_port * bridge_port,u16 vid)610  mlxsw_sp_bridge_vlan_find(const struct mlxsw_sp_bridge_port *bridge_port,
611  			  u16 vid)
612  {
613  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
614  
615  	list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
616  		if (bridge_vlan->vid == vid)
617  			return bridge_vlan;
618  	}
619  
620  	return NULL;
621  }
622  
623  static struct mlxsw_sp_bridge_vlan *
mlxsw_sp_bridge_vlan_create(struct mlxsw_sp_bridge_port * bridge_port,u16 vid)624  mlxsw_sp_bridge_vlan_create(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
625  {
626  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
627  
628  	bridge_vlan = kzalloc(sizeof(*bridge_vlan), GFP_KERNEL);
629  	if (!bridge_vlan)
630  		return NULL;
631  
632  	INIT_LIST_HEAD(&bridge_vlan->port_vlan_list);
633  	bridge_vlan->vid = vid;
634  	list_add(&bridge_vlan->list, &bridge_port->vlans_list);
635  
636  	return bridge_vlan;
637  }
638  
639  static void
mlxsw_sp_bridge_vlan_destroy(struct mlxsw_sp_bridge_vlan * bridge_vlan)640  mlxsw_sp_bridge_vlan_destroy(struct mlxsw_sp_bridge_vlan *bridge_vlan)
641  {
642  	list_del(&bridge_vlan->list);
643  	WARN_ON(!list_empty(&bridge_vlan->port_vlan_list));
644  	kfree(bridge_vlan);
645  }
646  
647  static struct mlxsw_sp_bridge_vlan *
mlxsw_sp_bridge_vlan_get(struct mlxsw_sp_bridge_port * bridge_port,u16 vid)648  mlxsw_sp_bridge_vlan_get(struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
649  {
650  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
651  
652  	bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
653  	if (bridge_vlan)
654  		return bridge_vlan;
655  
656  	return mlxsw_sp_bridge_vlan_create(bridge_port, vid);
657  }
658  
mlxsw_sp_bridge_vlan_put(struct mlxsw_sp_bridge_vlan * bridge_vlan)659  static void mlxsw_sp_bridge_vlan_put(struct mlxsw_sp_bridge_vlan *bridge_vlan)
660  {
661  	if (list_empty(&bridge_vlan->port_vlan_list))
662  		mlxsw_sp_bridge_vlan_destroy(bridge_vlan);
663  }
664  
665  static int
mlxsw_sp_port_bridge_vlan_stp_set(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_vlan * bridge_vlan,u8 state)666  mlxsw_sp_port_bridge_vlan_stp_set(struct mlxsw_sp_port *mlxsw_sp_port,
667  				  struct mlxsw_sp_bridge_vlan *bridge_vlan,
668  				  u8 state)
669  {
670  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
671  
672  	list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
673  			    bridge_vlan_node) {
674  		if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
675  			continue;
676  		return mlxsw_sp_port_vid_stp_set(mlxsw_sp_port,
677  						 bridge_vlan->vid, state);
678  	}
679  
680  	return 0;
681  }
682  
mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,u8 state)683  static int mlxsw_sp_port_attr_stp_state_set(struct mlxsw_sp_port *mlxsw_sp_port,
684  					    struct net_device *orig_dev,
685  					    u8 state)
686  {
687  	struct mlxsw_sp_bridge_port *bridge_port;
688  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
689  	int err;
690  
691  	/* It's possible we failed to enslave the port, yet this
692  	 * operation is executed due to it being deferred.
693  	 */
694  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
695  						orig_dev);
696  	if (!bridge_port)
697  		return 0;
698  
699  	list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
700  		err = mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port,
701  							bridge_vlan, state);
702  		if (err)
703  			goto err_port_bridge_vlan_stp_set;
704  	}
705  
706  	bridge_port->stp_state = state;
707  
708  	return 0;
709  
710  err_port_bridge_vlan_stp_set:
711  	list_for_each_entry_continue_reverse(bridge_vlan,
712  					     &bridge_port->vlans_list, list)
713  		mlxsw_sp_port_bridge_vlan_stp_set(mlxsw_sp_port, bridge_vlan,
714  						  bridge_port->stp_state);
715  	return err;
716  }
717  
718  static int
mlxsw_sp_port_bridge_vlan_flood_set(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_vlan * bridge_vlan,enum mlxsw_sp_flood_type packet_type,bool member)719  mlxsw_sp_port_bridge_vlan_flood_set(struct mlxsw_sp_port *mlxsw_sp_port,
720  				    struct mlxsw_sp_bridge_vlan *bridge_vlan,
721  				    enum mlxsw_sp_flood_type packet_type,
722  				    bool member)
723  {
724  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
725  
726  	list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
727  			    bridge_vlan_node) {
728  		if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
729  			continue;
730  		return mlxsw_sp_fid_flood_set(mlxsw_sp_port_vlan->fid,
731  					      packet_type,
732  					      mlxsw_sp_port->local_port,
733  					      member);
734  	}
735  
736  	return 0;
737  }
738  
739  static int
mlxsw_sp_bridge_port_flood_table_set(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,enum mlxsw_sp_flood_type packet_type,bool member)740  mlxsw_sp_bridge_port_flood_table_set(struct mlxsw_sp_port *mlxsw_sp_port,
741  				     struct mlxsw_sp_bridge_port *bridge_port,
742  				     enum mlxsw_sp_flood_type packet_type,
743  				     bool member)
744  {
745  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
746  	int err;
747  
748  	list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
749  		err = mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port,
750  							  bridge_vlan,
751  							  packet_type,
752  							  member);
753  		if (err)
754  			goto err_port_bridge_vlan_flood_set;
755  	}
756  
757  	return 0;
758  
759  err_port_bridge_vlan_flood_set:
760  	list_for_each_entry_continue_reverse(bridge_vlan,
761  					     &bridge_port->vlans_list, list)
762  		mlxsw_sp_port_bridge_vlan_flood_set(mlxsw_sp_port, bridge_vlan,
763  						    packet_type, !member);
764  	return err;
765  }
766  
767  static int
mlxsw_sp_bridge_vlans_flood_set(struct mlxsw_sp_bridge_vlan * bridge_vlan,enum mlxsw_sp_flood_type packet_type,bool member)768  mlxsw_sp_bridge_vlans_flood_set(struct mlxsw_sp_bridge_vlan *bridge_vlan,
769  				enum mlxsw_sp_flood_type packet_type,
770  				bool member)
771  {
772  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
773  	int err;
774  
775  	list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
776  			    bridge_vlan_node) {
777  		u16 local_port = mlxsw_sp_port_vlan->mlxsw_sp_port->local_port;
778  
779  		err = mlxsw_sp_fid_flood_set(mlxsw_sp_port_vlan->fid,
780  					     packet_type, local_port, member);
781  		if (err)
782  			goto err_fid_flood_set;
783  	}
784  
785  	return 0;
786  
787  err_fid_flood_set:
788  	list_for_each_entry_continue_reverse(mlxsw_sp_port_vlan,
789  					     &bridge_vlan->port_vlan_list,
790  					     list) {
791  		u16 local_port = mlxsw_sp_port_vlan->mlxsw_sp_port->local_port;
792  
793  		mlxsw_sp_fid_flood_set(mlxsw_sp_port_vlan->fid, packet_type,
794  				       local_port, !member);
795  	}
796  
797  	return err;
798  }
799  
800  static int
mlxsw_sp_bridge_ports_flood_table_set(struct mlxsw_sp_bridge_port * bridge_port,enum mlxsw_sp_flood_type packet_type,bool member)801  mlxsw_sp_bridge_ports_flood_table_set(struct mlxsw_sp_bridge_port *bridge_port,
802  				      enum mlxsw_sp_flood_type packet_type,
803  				      bool member)
804  {
805  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
806  	int err;
807  
808  	list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
809  		err = mlxsw_sp_bridge_vlans_flood_set(bridge_vlan, packet_type,
810  						      member);
811  		if (err)
812  			goto err_bridge_vlans_flood_set;
813  	}
814  
815  	return 0;
816  
817  err_bridge_vlans_flood_set:
818  	list_for_each_entry_continue_reverse(bridge_vlan,
819  					     &bridge_port->vlans_list, list)
820  		mlxsw_sp_bridge_vlans_flood_set(bridge_vlan, packet_type,
821  						!member);
822  	return err;
823  }
824  
825  static int
mlxsw_sp_port_bridge_vlan_learning_set(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_vlan * bridge_vlan,bool set)826  mlxsw_sp_port_bridge_vlan_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
827  				       struct mlxsw_sp_bridge_vlan *bridge_vlan,
828  				       bool set)
829  {
830  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
831  	u16 vid = bridge_vlan->vid;
832  
833  	list_for_each_entry(mlxsw_sp_port_vlan, &bridge_vlan->port_vlan_list,
834  			    bridge_vlan_node) {
835  		if (mlxsw_sp_port_vlan->mlxsw_sp_port != mlxsw_sp_port)
836  			continue;
837  		return mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, set);
838  	}
839  
840  	return 0;
841  }
842  
843  static int
mlxsw_sp_bridge_port_learning_set(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,bool set)844  mlxsw_sp_bridge_port_learning_set(struct mlxsw_sp_port *mlxsw_sp_port,
845  				  struct mlxsw_sp_bridge_port *bridge_port,
846  				  bool set)
847  {
848  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
849  	int err;
850  
851  	list_for_each_entry(bridge_vlan, &bridge_port->vlans_list, list) {
852  		err = mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
853  							     bridge_vlan, set);
854  		if (err)
855  			goto err_port_bridge_vlan_learning_set;
856  	}
857  
858  	return 0;
859  
860  err_port_bridge_vlan_learning_set:
861  	list_for_each_entry_continue_reverse(bridge_vlan,
862  					     &bridge_port->vlans_list, list)
863  		mlxsw_sp_port_bridge_vlan_learning_set(mlxsw_sp_port,
864  						       bridge_vlan, !set);
865  	return err;
866  }
867  
868  static int
mlxsw_sp_port_attr_br_pre_flags_set(struct mlxsw_sp_port * mlxsw_sp_port,const struct net_device * orig_dev,struct switchdev_brport_flags flags,struct netlink_ext_ack * extack)869  mlxsw_sp_port_attr_br_pre_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
870  				    const struct net_device *orig_dev,
871  				    struct switchdev_brport_flags flags,
872  				    struct netlink_ext_ack *extack)
873  {
874  	if (flags.mask & ~(BR_LEARNING | BR_FLOOD | BR_MCAST_FLOOD |
875  			   BR_PORT_LOCKED | BR_PORT_MAB)) {
876  		NL_SET_ERR_MSG_MOD(extack, "Unsupported bridge port flag");
877  		return -EINVAL;
878  	}
879  
880  	if ((flags.mask & BR_PORT_LOCKED) && is_vlan_dev(orig_dev)) {
881  		NL_SET_ERR_MSG_MOD(extack, "Locked flag cannot be set on a VLAN upper");
882  		return -EINVAL;
883  	}
884  
885  	if ((flags.mask & BR_PORT_LOCKED) && vlan_uses_dev(orig_dev)) {
886  		NL_SET_ERR_MSG_MOD(extack, "Locked flag cannot be set on a bridge port that has VLAN uppers");
887  		return -EINVAL;
888  	}
889  
890  	return 0;
891  }
892  
mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,struct switchdev_brport_flags flags)893  static int mlxsw_sp_port_attr_br_flags_set(struct mlxsw_sp_port *mlxsw_sp_port,
894  					   struct net_device *orig_dev,
895  					   struct switchdev_brport_flags flags)
896  {
897  	struct mlxsw_sp_bridge_port *bridge_port;
898  	int err;
899  
900  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
901  						orig_dev);
902  	if (!bridge_port)
903  		return 0;
904  
905  	if (flags.mask & BR_FLOOD) {
906  		err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
907  							   bridge_port,
908  							   MLXSW_SP_FLOOD_TYPE_UC,
909  							   flags.val & BR_FLOOD);
910  		if (err)
911  			return err;
912  	}
913  
914  	if (flags.mask & BR_LEARNING) {
915  		err = mlxsw_sp_bridge_port_learning_set(mlxsw_sp_port,
916  							bridge_port,
917  							flags.val & BR_LEARNING);
918  		if (err)
919  			return err;
920  	}
921  
922  	if (flags.mask & BR_PORT_LOCKED) {
923  		err = mlxsw_sp_port_security_set(mlxsw_sp_port,
924  						 flags.val & BR_PORT_LOCKED);
925  		if (err)
926  			return err;
927  	}
928  
929  	if (bridge_port->bridge_device->multicast_enabled)
930  		goto out;
931  
932  	if (flags.mask & BR_MCAST_FLOOD) {
933  		err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port,
934  							   bridge_port,
935  							   MLXSW_SP_FLOOD_TYPE_MC,
936  							   flags.val & BR_MCAST_FLOOD);
937  		if (err)
938  			return err;
939  	}
940  
941  out:
942  	memcpy(&bridge_port->flags, &flags.val, sizeof(flags.val));
943  	return 0;
944  }
945  
mlxsw_sp_ageing_set(struct mlxsw_sp * mlxsw_sp,u32 ageing_time)946  static int mlxsw_sp_ageing_set(struct mlxsw_sp *mlxsw_sp, u32 ageing_time)
947  {
948  	char sfdat_pl[MLXSW_REG_SFDAT_LEN];
949  	int err;
950  
951  	mlxsw_reg_sfdat_pack(sfdat_pl, ageing_time);
952  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdat), sfdat_pl);
953  	if (err)
954  		return err;
955  	mlxsw_sp->bridge->ageing_time = ageing_time;
956  	return 0;
957  }
958  
mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port * mlxsw_sp_port,unsigned long ageing_clock_t)959  static int mlxsw_sp_port_attr_br_ageing_set(struct mlxsw_sp_port *mlxsw_sp_port,
960  					    unsigned long ageing_clock_t)
961  {
962  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
963  	unsigned long ageing_jiffies = clock_t_to_jiffies(ageing_clock_t);
964  	u32 ageing_time = jiffies_to_msecs(ageing_jiffies) / 1000;
965  
966  	if (ageing_time < MLXSW_SP_MIN_AGEING_TIME ||
967  	    ageing_time > MLXSW_SP_MAX_AGEING_TIME)
968  		return -ERANGE;
969  
970  	return mlxsw_sp_ageing_set(mlxsw_sp, ageing_time);
971  }
972  
mlxsw_sp_port_attr_br_vlan_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,bool vlan_enabled)973  static int mlxsw_sp_port_attr_br_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port,
974  					  struct net_device *orig_dev,
975  					  bool vlan_enabled)
976  {
977  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
978  	struct mlxsw_sp_bridge_device *bridge_device;
979  
980  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
981  	if (WARN_ON(!bridge_device))
982  		return -EINVAL;
983  
984  	if (bridge_device->vlan_enabled == vlan_enabled)
985  		return 0;
986  
987  	netdev_err(bridge_device->dev, "VLAN filtering can't be changed for existing bridge\n");
988  	return -EINVAL;
989  }
990  
mlxsw_sp_port_attr_br_vlan_proto_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,u16 vlan_proto)991  static int mlxsw_sp_port_attr_br_vlan_proto_set(struct mlxsw_sp_port *mlxsw_sp_port,
992  						struct net_device *orig_dev,
993  						u16 vlan_proto)
994  {
995  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
996  	struct mlxsw_sp_bridge_device *bridge_device;
997  
998  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
999  	if (WARN_ON(!bridge_device))
1000  		return -EINVAL;
1001  
1002  	netdev_err(bridge_device->dev, "VLAN protocol can't be changed on existing bridge\n");
1003  	return -EINVAL;
1004  }
1005  
mlxsw_sp_port_attr_mrouter_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,bool is_port_mrouter)1006  static int mlxsw_sp_port_attr_mrouter_set(struct mlxsw_sp_port *mlxsw_sp_port,
1007  					  struct net_device *orig_dev,
1008  					  bool is_port_mrouter)
1009  {
1010  	struct mlxsw_sp_bridge_port *bridge_port;
1011  	int err;
1012  
1013  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp_port->mlxsw_sp->bridge,
1014  						orig_dev);
1015  	if (!bridge_port)
1016  		return 0;
1017  
1018  	mlxsw_sp_port_mrouter_update_mdb(mlxsw_sp_port, bridge_port,
1019  					 is_port_mrouter);
1020  
1021  	if (!bridge_port->bridge_device->multicast_enabled)
1022  		goto out;
1023  
1024  	err = mlxsw_sp_bridge_port_flood_table_set(mlxsw_sp_port, bridge_port,
1025  						   MLXSW_SP_FLOOD_TYPE_MC,
1026  						   is_port_mrouter);
1027  	if (err)
1028  		return err;
1029  
1030  out:
1031  	bridge_port->mrouter = is_port_mrouter;
1032  	return 0;
1033  }
1034  
mlxsw_sp_mc_flood(const struct mlxsw_sp_bridge_port * bridge_port)1035  static bool mlxsw_sp_mc_flood(const struct mlxsw_sp_bridge_port *bridge_port)
1036  {
1037  	const struct mlxsw_sp_bridge_device *bridge_device;
1038  
1039  	bridge_device = bridge_port->bridge_device;
1040  	return bridge_device->multicast_enabled ? bridge_port->mrouter :
1041  					bridge_port->flags & BR_MCAST_FLOOD;
1042  }
1043  
mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,bool mc_disabled)1044  static int mlxsw_sp_port_mc_disabled_set(struct mlxsw_sp_port *mlxsw_sp_port,
1045  					 struct net_device *orig_dev,
1046  					 bool mc_disabled)
1047  {
1048  	enum mlxsw_sp_flood_type packet_type = MLXSW_SP_FLOOD_TYPE_MC;
1049  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1050  	struct mlxsw_sp_bridge_device *bridge_device;
1051  	struct mlxsw_sp_bridge_port *bridge_port;
1052  	int err;
1053  
1054  	/* It's possible we failed to enslave the port, yet this
1055  	 * operation is executed due to it being deferred.
1056  	 */
1057  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
1058  	if (!bridge_device)
1059  		return 0;
1060  
1061  	if (bridge_device->multicast_enabled == !mc_disabled)
1062  		return 0;
1063  
1064  	bridge_device->multicast_enabled = !mc_disabled;
1065  	err = mlxsw_sp_bridge_mdb_mc_enable_sync(mlxsw_sp, bridge_device,
1066  						 !mc_disabled);
1067  	if (err)
1068  		goto err_mc_enable_sync;
1069  
1070  	list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
1071  		bool member = mlxsw_sp_mc_flood(bridge_port);
1072  
1073  		err = mlxsw_sp_bridge_ports_flood_table_set(bridge_port,
1074  							    packet_type,
1075  							    member);
1076  		if (err)
1077  			goto err_flood_table_set;
1078  	}
1079  
1080  	return 0;
1081  
1082  err_flood_table_set:
1083  	list_for_each_entry_continue_reverse(bridge_port,
1084  					     &bridge_device->ports_list, list) {
1085  		bool member = mlxsw_sp_mc_flood(bridge_port);
1086  
1087  		mlxsw_sp_bridge_ports_flood_table_set(bridge_port, packet_type,
1088  						      !member);
1089  	}
1090  	mlxsw_sp_bridge_mdb_mc_enable_sync(mlxsw_sp, bridge_device,
1091  					   mc_disabled);
1092  err_mc_enable_sync:
1093  	bridge_device->multicast_enabled = mc_disabled;
1094  	return err;
1095  }
1096  
1097  static struct mlxsw_sp_mdb_entry_port *
mlxsw_sp_mdb_entry_port_lookup(struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port)1098  mlxsw_sp_mdb_entry_port_lookup(struct mlxsw_sp_mdb_entry *mdb_entry,
1099  			       u16 local_port)
1100  {
1101  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1102  
1103  	list_for_each_entry(mdb_entry_port, &mdb_entry->ports_list, list) {
1104  		if (mdb_entry_port->local_port == local_port)
1105  			return mdb_entry_port;
1106  	}
1107  
1108  	return NULL;
1109  }
1110  
1111  static struct mlxsw_sp_mdb_entry_port *
mlxsw_sp_mdb_entry_port_get(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port)1112  mlxsw_sp_mdb_entry_port_get(struct mlxsw_sp *mlxsw_sp,
1113  			    struct mlxsw_sp_mdb_entry *mdb_entry,
1114  			    u16 local_port)
1115  {
1116  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1117  	int err;
1118  
1119  	mdb_entry_port = mlxsw_sp_mdb_entry_port_lookup(mdb_entry, local_port);
1120  	if (mdb_entry_port) {
1121  		if (mdb_entry_port->mrouter &&
1122  		    refcount_read(&mdb_entry_port->refcount) == 1)
1123  			mdb_entry->ports_count++;
1124  
1125  		refcount_inc(&mdb_entry_port->refcount);
1126  		return mdb_entry_port;
1127  	}
1128  
1129  	err = mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1130  					  mdb_entry->key.fid, local_port, true);
1131  	if (err)
1132  		return ERR_PTR(err);
1133  
1134  	mdb_entry_port = kzalloc(sizeof(*mdb_entry_port), GFP_KERNEL);
1135  	if (!mdb_entry_port) {
1136  		err = -ENOMEM;
1137  		goto err_mdb_entry_port_alloc;
1138  	}
1139  
1140  	mdb_entry_port->local_port = local_port;
1141  	refcount_set(&mdb_entry_port->refcount, 1);
1142  	list_add(&mdb_entry_port->list, &mdb_entry->ports_list);
1143  	mdb_entry->ports_count++;
1144  
1145  	return mdb_entry_port;
1146  
1147  err_mdb_entry_port_alloc:
1148  	mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1149  				    mdb_entry->key.fid, local_port, false);
1150  	return ERR_PTR(err);
1151  }
1152  
1153  static void
mlxsw_sp_mdb_entry_port_put(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port,bool force)1154  mlxsw_sp_mdb_entry_port_put(struct mlxsw_sp *mlxsw_sp,
1155  			    struct mlxsw_sp_mdb_entry *mdb_entry,
1156  			    u16 local_port, bool force)
1157  {
1158  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1159  
1160  	mdb_entry_port = mlxsw_sp_mdb_entry_port_lookup(mdb_entry, local_port);
1161  	if (!mdb_entry_port)
1162  		return;
1163  
1164  	if (!force && !refcount_dec_and_test(&mdb_entry_port->refcount)) {
1165  		if (mdb_entry_port->mrouter &&
1166  		    refcount_read(&mdb_entry_port->refcount) == 1)
1167  			mdb_entry->ports_count--;
1168  		return;
1169  	}
1170  
1171  	mdb_entry->ports_count--;
1172  	list_del(&mdb_entry_port->list);
1173  	kfree(mdb_entry_port);
1174  	mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1175  				    mdb_entry->key.fid, local_port, false);
1176  }
1177  
1178  static __always_unused struct mlxsw_sp_mdb_entry_port *
mlxsw_sp_mdb_entry_mrouter_port_get(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port)1179  mlxsw_sp_mdb_entry_mrouter_port_get(struct mlxsw_sp *mlxsw_sp,
1180  				    struct mlxsw_sp_mdb_entry *mdb_entry,
1181  				    u16 local_port)
1182  {
1183  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1184  	int err;
1185  
1186  	mdb_entry_port = mlxsw_sp_mdb_entry_port_lookup(mdb_entry, local_port);
1187  	if (mdb_entry_port) {
1188  		if (!mdb_entry_port->mrouter)
1189  			refcount_inc(&mdb_entry_port->refcount);
1190  		return mdb_entry_port;
1191  	}
1192  
1193  	err = mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1194  					  mdb_entry->key.fid, local_port, true);
1195  	if (err)
1196  		return ERR_PTR(err);
1197  
1198  	mdb_entry_port = kzalloc(sizeof(*mdb_entry_port), GFP_KERNEL);
1199  	if (!mdb_entry_port) {
1200  		err = -ENOMEM;
1201  		goto err_mdb_entry_port_alloc;
1202  	}
1203  
1204  	mdb_entry_port->local_port = local_port;
1205  	refcount_set(&mdb_entry_port->refcount, 1);
1206  	mdb_entry_port->mrouter = true;
1207  	list_add(&mdb_entry_port->list, &mdb_entry->ports_list);
1208  
1209  	return mdb_entry_port;
1210  
1211  err_mdb_entry_port_alloc:
1212  	mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1213  				    mdb_entry->key.fid, local_port, false);
1214  	return ERR_PTR(err);
1215  }
1216  
1217  static __always_unused void
mlxsw_sp_mdb_entry_mrouter_port_put(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port)1218  mlxsw_sp_mdb_entry_mrouter_port_put(struct mlxsw_sp *mlxsw_sp,
1219  				    struct mlxsw_sp_mdb_entry *mdb_entry,
1220  				    u16 local_port)
1221  {
1222  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1223  
1224  	mdb_entry_port = mlxsw_sp_mdb_entry_port_lookup(mdb_entry, local_port);
1225  	if (!mdb_entry_port)
1226  		return;
1227  
1228  	if (!mdb_entry_port->mrouter)
1229  		return;
1230  
1231  	mdb_entry_port->mrouter = false;
1232  	if (!refcount_dec_and_test(&mdb_entry_port->refcount))
1233  		return;
1234  
1235  	list_del(&mdb_entry_port->list);
1236  	kfree(mdb_entry_port);
1237  	mlxsw_sp_pgt_entry_port_set(mlxsw_sp, mdb_entry->mid,
1238  				    mdb_entry->key.fid, local_port, false);
1239  }
1240  
1241  static void
mlxsw_sp_bridge_mrouter_update_mdb(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,bool add)1242  mlxsw_sp_bridge_mrouter_update_mdb(struct mlxsw_sp *mlxsw_sp,
1243  				   struct mlxsw_sp_bridge_device *bridge_device,
1244  				   bool add)
1245  {
1246  	u16 local_port = mlxsw_sp_router_port(mlxsw_sp);
1247  	struct mlxsw_sp_mdb_entry *mdb_entry;
1248  
1249  	list_for_each_entry(mdb_entry, &bridge_device->mdb_list, list) {
1250  		if (add)
1251  			mlxsw_sp_mdb_entry_mrouter_port_get(mlxsw_sp, mdb_entry,
1252  							    local_port);
1253  		else
1254  			mlxsw_sp_mdb_entry_mrouter_port_put(mlxsw_sp, mdb_entry,
1255  							    local_port);
1256  	}
1257  }
1258  
1259  static int
mlxsw_sp_port_attr_br_mrouter_set(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * orig_dev,bool is_mrouter)1260  mlxsw_sp_port_attr_br_mrouter_set(struct mlxsw_sp_port *mlxsw_sp_port,
1261  				  struct net_device *orig_dev,
1262  				  bool is_mrouter)
1263  {
1264  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1265  	struct mlxsw_sp_bridge_device *bridge_device;
1266  
1267  	/* It's possible we failed to enslave the port, yet this
1268  	 * operation is executed due to it being deferred.
1269  	 */
1270  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, orig_dev);
1271  	if (!bridge_device)
1272  		return 0;
1273  
1274  	if (bridge_device->mrouter != is_mrouter)
1275  		mlxsw_sp_bridge_mrouter_update_mdb(mlxsw_sp, bridge_device,
1276  						   is_mrouter);
1277  	bridge_device->mrouter = is_mrouter;
1278  	return 0;
1279  }
1280  
mlxsw_sp_port_attr_set(struct net_device * dev,const void * ctx,const struct switchdev_attr * attr,struct netlink_ext_ack * extack)1281  static int mlxsw_sp_port_attr_set(struct net_device *dev, const void *ctx,
1282  				  const struct switchdev_attr *attr,
1283  				  struct netlink_ext_ack *extack)
1284  {
1285  	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
1286  	int err;
1287  
1288  	switch (attr->id) {
1289  	case SWITCHDEV_ATTR_ID_PORT_STP_STATE:
1290  		err = mlxsw_sp_port_attr_stp_state_set(mlxsw_sp_port,
1291  						       attr->orig_dev,
1292  						       attr->u.stp_state);
1293  		break;
1294  	case SWITCHDEV_ATTR_ID_PORT_PRE_BRIDGE_FLAGS:
1295  		err = mlxsw_sp_port_attr_br_pre_flags_set(mlxsw_sp_port,
1296  							  attr->orig_dev,
1297  							  attr->u.brport_flags,
1298  							  extack);
1299  		break;
1300  	case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
1301  		err = mlxsw_sp_port_attr_br_flags_set(mlxsw_sp_port,
1302  						      attr->orig_dev,
1303  						      attr->u.brport_flags);
1304  		break;
1305  	case SWITCHDEV_ATTR_ID_BRIDGE_AGEING_TIME:
1306  		err = mlxsw_sp_port_attr_br_ageing_set(mlxsw_sp_port,
1307  						       attr->u.ageing_time);
1308  		break;
1309  	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_FILTERING:
1310  		err = mlxsw_sp_port_attr_br_vlan_set(mlxsw_sp_port,
1311  						     attr->orig_dev,
1312  						     attr->u.vlan_filtering);
1313  		break;
1314  	case SWITCHDEV_ATTR_ID_BRIDGE_VLAN_PROTOCOL:
1315  		err = mlxsw_sp_port_attr_br_vlan_proto_set(mlxsw_sp_port,
1316  							   attr->orig_dev,
1317  							   attr->u.vlan_protocol);
1318  		break;
1319  	case SWITCHDEV_ATTR_ID_PORT_MROUTER:
1320  		err = mlxsw_sp_port_attr_mrouter_set(mlxsw_sp_port,
1321  						     attr->orig_dev,
1322  						     attr->u.mrouter);
1323  		break;
1324  	case SWITCHDEV_ATTR_ID_BRIDGE_MC_DISABLED:
1325  		err = mlxsw_sp_port_mc_disabled_set(mlxsw_sp_port,
1326  						    attr->orig_dev,
1327  						    attr->u.mc_disabled);
1328  		break;
1329  	case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER:
1330  		err = mlxsw_sp_port_attr_br_mrouter_set(mlxsw_sp_port,
1331  							attr->orig_dev,
1332  							attr->u.mrouter);
1333  		break;
1334  	default:
1335  		err = -EOPNOTSUPP;
1336  		break;
1337  	}
1338  
1339  	mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
1340  
1341  	return err;
1342  }
1343  
1344  static int
mlxsw_sp_port_vlan_fid_join(struct mlxsw_sp_port_vlan * mlxsw_sp_port_vlan,struct mlxsw_sp_bridge_port * bridge_port,struct netlink_ext_ack * extack)1345  mlxsw_sp_port_vlan_fid_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
1346  			    struct mlxsw_sp_bridge_port *bridge_port,
1347  			    struct netlink_ext_ack *extack)
1348  {
1349  	struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1350  	struct mlxsw_sp_bridge_device *bridge_device;
1351  	u16 local_port = mlxsw_sp_port->local_port;
1352  	u16 vid = mlxsw_sp_port_vlan->vid;
1353  	struct mlxsw_sp_fid *fid;
1354  	int err;
1355  
1356  	bridge_device = bridge_port->bridge_device;
1357  	fid = bridge_device->ops->fid_get(bridge_device, vid, extack);
1358  	if (IS_ERR(fid))
1359  		return PTR_ERR(fid);
1360  
1361  	err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port,
1362  				     bridge_port->flags & BR_FLOOD);
1363  	if (err)
1364  		goto err_fid_uc_flood_set;
1365  
1366  	err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port,
1367  				     mlxsw_sp_mc_flood(bridge_port));
1368  	if (err)
1369  		goto err_fid_mc_flood_set;
1370  
1371  	err = mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port,
1372  				     true);
1373  	if (err)
1374  		goto err_fid_bc_flood_set;
1375  
1376  	err = mlxsw_sp_fid_port_vid_map(fid, mlxsw_sp_port, vid);
1377  	if (err)
1378  		goto err_fid_port_vid_map;
1379  
1380  	mlxsw_sp_port_vlan->fid = fid;
1381  
1382  	return 0;
1383  
1384  err_fid_port_vid_map:
1385  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
1386  err_fid_bc_flood_set:
1387  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
1388  err_fid_mc_flood_set:
1389  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
1390  err_fid_uc_flood_set:
1391  	mlxsw_sp_fid_put(fid);
1392  	return err;
1393  }
1394  
1395  static void
mlxsw_sp_port_vlan_fid_leave(struct mlxsw_sp_port_vlan * mlxsw_sp_port_vlan)1396  mlxsw_sp_port_vlan_fid_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
1397  {
1398  	struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1399  	struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1400  	u16 local_port = mlxsw_sp_port->local_port;
1401  	u16 vid = mlxsw_sp_port_vlan->vid;
1402  
1403  	mlxsw_sp_port_vlan->fid = NULL;
1404  	mlxsw_sp_fid_port_vid_unmap(fid, mlxsw_sp_port, vid);
1405  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_BC, local_port, false);
1406  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_MC, local_port, false);
1407  	mlxsw_sp_fid_flood_set(fid, MLXSW_SP_FLOOD_TYPE_UC, local_port, false);
1408  	mlxsw_sp_fid_put(fid);
1409  }
1410  
1411  static u16
mlxsw_sp_port_pvid_determine(const struct mlxsw_sp_port * mlxsw_sp_port,u16 vid,bool is_pvid)1412  mlxsw_sp_port_pvid_determine(const struct mlxsw_sp_port *mlxsw_sp_port,
1413  			     u16 vid, bool is_pvid)
1414  {
1415  	if (is_pvid)
1416  		return vid;
1417  	else if (mlxsw_sp_port->pvid == vid)
1418  		return 0;	/* Dis-allow untagged packets */
1419  	else
1420  		return mlxsw_sp_port->pvid;
1421  }
1422  
1423  static int
mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan * mlxsw_sp_port_vlan,struct mlxsw_sp_bridge_port * bridge_port,struct netlink_ext_ack * extack)1424  mlxsw_sp_port_vlan_bridge_join(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan,
1425  			       struct mlxsw_sp_bridge_port *bridge_port,
1426  			       struct netlink_ext_ack *extack)
1427  {
1428  	struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1429  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
1430  	u16 vid = mlxsw_sp_port_vlan->vid;
1431  	int err;
1432  
1433  	/* No need to continue if only VLAN flags were changed */
1434  	if (mlxsw_sp_port_vlan->bridge_port)
1435  		return 0;
1436  
1437  	err = mlxsw_sp_port_vlan_fid_join(mlxsw_sp_port_vlan, bridge_port,
1438  					  extack);
1439  	if (err)
1440  		return err;
1441  
1442  	err = mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid,
1443  					     bridge_port->flags & BR_LEARNING);
1444  	if (err)
1445  		goto err_port_vid_learning_set;
1446  
1447  	err = mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid,
1448  					bridge_port->stp_state);
1449  	if (err)
1450  		goto err_port_vid_stp_set;
1451  
1452  	bridge_vlan = mlxsw_sp_bridge_vlan_get(bridge_port, vid);
1453  	if (!bridge_vlan) {
1454  		err = -ENOMEM;
1455  		goto err_bridge_vlan_get;
1456  	}
1457  
1458  	list_add(&mlxsw_sp_port_vlan->bridge_vlan_node,
1459  		 &bridge_vlan->port_vlan_list);
1460  
1461  	mlxsw_sp_bridge_port_get(mlxsw_sp_port->mlxsw_sp->bridge,
1462  				 bridge_port->dev, extack);
1463  	mlxsw_sp_port_vlan->bridge_port = bridge_port;
1464  
1465  	return 0;
1466  
1467  err_bridge_vlan_get:
1468  	mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
1469  err_port_vid_stp_set:
1470  	mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
1471  err_port_vid_learning_set:
1472  	mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
1473  	return err;
1474  }
1475  
1476  void
mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan * mlxsw_sp_port_vlan)1477  mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan)
1478  {
1479  	struct mlxsw_sp_port *mlxsw_sp_port = mlxsw_sp_port_vlan->mlxsw_sp_port;
1480  	struct mlxsw_sp_fid *fid = mlxsw_sp_port_vlan->fid;
1481  	struct mlxsw_sp_bridge_vlan *bridge_vlan;
1482  	struct mlxsw_sp_bridge_port *bridge_port;
1483  	u16 vid = mlxsw_sp_port_vlan->vid;
1484  	bool last_port;
1485  
1486  	if (WARN_ON(mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021Q &&
1487  		    mlxsw_sp_fid_type(fid) != MLXSW_SP_FID_TYPE_8021D))
1488  		return;
1489  
1490  	bridge_port = mlxsw_sp_port_vlan->bridge_port;
1491  	bridge_vlan = mlxsw_sp_bridge_vlan_find(bridge_port, vid);
1492  	last_port = list_is_singular(&bridge_vlan->port_vlan_list);
1493  
1494  	list_del(&mlxsw_sp_port_vlan->bridge_vlan_node);
1495  	mlxsw_sp_bridge_vlan_put(bridge_vlan);
1496  	mlxsw_sp_port_vid_stp_set(mlxsw_sp_port, vid, BR_STATE_DISABLED);
1497  	mlxsw_sp_port_vid_learning_set(mlxsw_sp_port, vid, false);
1498  	if (last_port)
1499  		mlxsw_sp_bridge_port_fdb_flush(mlxsw_sp_port->mlxsw_sp,
1500  					       bridge_port,
1501  					       mlxsw_sp_fid_index(fid));
1502  
1503  	mlxsw_sp_bridge_port_mdb_flush(mlxsw_sp_port, bridge_port,
1504  				       mlxsw_sp_fid_index(fid));
1505  
1506  	mlxsw_sp_port_vlan_fid_leave(mlxsw_sp_port_vlan);
1507  
1508  	mlxsw_sp_bridge_port_put(mlxsw_sp_port->mlxsw_sp->bridge, bridge_port);
1509  	mlxsw_sp_port_vlan->bridge_port = NULL;
1510  }
1511  
1512  static int
mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,u16 vid,bool is_untagged,bool is_pvid,struct netlink_ext_ack * extack)1513  mlxsw_sp_bridge_port_vlan_add(struct mlxsw_sp_port *mlxsw_sp_port,
1514  			      struct mlxsw_sp_bridge_port *bridge_port,
1515  			      u16 vid, bool is_untagged, bool is_pvid,
1516  			      struct netlink_ext_ack *extack)
1517  {
1518  	u16 pvid = mlxsw_sp_port_pvid_determine(mlxsw_sp_port, vid, is_pvid);
1519  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1520  	u16 old_pvid = mlxsw_sp_port->pvid;
1521  	u16 proto;
1522  	int err;
1523  
1524  	/* The only valid scenario in which a port-vlan already exists, is if
1525  	 * the VLAN flags were changed and the port-vlan is associated with the
1526  	 * correct bridge port
1527  	 */
1528  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
1529  	if (mlxsw_sp_port_vlan &&
1530  	    mlxsw_sp_port_vlan->bridge_port != bridge_port)
1531  		return -EEXIST;
1532  
1533  	if (!mlxsw_sp_port_vlan) {
1534  		mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_create(mlxsw_sp_port,
1535  							       vid);
1536  		if (IS_ERR(mlxsw_sp_port_vlan))
1537  			return PTR_ERR(mlxsw_sp_port_vlan);
1538  	}
1539  
1540  	err = mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, true,
1541  				     is_untagged);
1542  	if (err)
1543  		goto err_port_vlan_set;
1544  
1545  	br_vlan_get_proto(bridge_port->bridge_device->dev, &proto);
1546  	err = mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid, proto);
1547  	if (err)
1548  		goto err_port_pvid_set;
1549  
1550  	err = mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port,
1551  					     extack);
1552  	if (err)
1553  		goto err_port_vlan_bridge_join;
1554  
1555  	return 0;
1556  
1557  err_port_vlan_bridge_join:
1558  	mlxsw_sp_port_pvid_set(mlxsw_sp_port, old_pvid, proto);
1559  err_port_pvid_set:
1560  	mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
1561  err_port_vlan_set:
1562  	mlxsw_sp_port_vlan_destroy(mlxsw_sp_port_vlan);
1563  	return err;
1564  }
1565  
1566  static int
mlxsw_sp_br_rif_pvid_change(struct mlxsw_sp * mlxsw_sp,struct net_device * br_dev,const struct switchdev_obj_port_vlan * vlan,struct netlink_ext_ack * extack)1567  mlxsw_sp_br_rif_pvid_change(struct mlxsw_sp *mlxsw_sp,
1568  			    struct net_device *br_dev,
1569  			    const struct switchdev_obj_port_vlan *vlan,
1570  			    struct netlink_ext_ack *extack)
1571  {
1572  	bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1573  
1574  	return mlxsw_sp_router_bridge_vlan_add(mlxsw_sp, br_dev, vlan->vid,
1575  					       flag_pvid, extack);
1576  }
1577  
mlxsw_sp_port_vlans_add(struct mlxsw_sp_port * mlxsw_sp_port,const struct switchdev_obj_port_vlan * vlan,struct netlink_ext_ack * extack)1578  static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
1579  				   const struct switchdev_obj_port_vlan *vlan,
1580  				   struct netlink_ext_ack *extack)
1581  {
1582  	bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
1583  	bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
1584  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1585  	struct net_device *orig_dev = vlan->obj.orig_dev;
1586  	struct mlxsw_sp_bridge_port *bridge_port;
1587  
1588  	if (netif_is_bridge_master(orig_dev)) {
1589  		int err = 0;
1590  
1591  		if (br_vlan_enabled(orig_dev))
1592  			err = mlxsw_sp_br_rif_pvid_change(mlxsw_sp, orig_dev,
1593  							  vlan, extack);
1594  		if (!err)
1595  			err = -EOPNOTSUPP;
1596  		return err;
1597  	}
1598  
1599  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1600  	if (WARN_ON(!bridge_port))
1601  		return -EINVAL;
1602  
1603  	if (!bridge_port->bridge_device->vlan_enabled)
1604  		return 0;
1605  
1606  	return mlxsw_sp_bridge_port_vlan_add(mlxsw_sp_port, bridge_port,
1607  					     vlan->vid, flag_untagged,
1608  					     flag_pvid, extack);
1609  }
1610  
mlxsw_sp_fdb_flush_type(bool lagged)1611  static enum mlxsw_reg_sfdf_flush_type mlxsw_sp_fdb_flush_type(bool lagged)
1612  {
1613  	return lagged ? MLXSW_REG_SFDF_FLUSH_PER_LAG_AND_FID :
1614  			MLXSW_REG_SFDF_FLUSH_PER_PORT_AND_FID;
1615  }
1616  
1617  static int
mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_port * bridge_port,u16 fid_index)1618  mlxsw_sp_bridge_port_fdb_flush(struct mlxsw_sp *mlxsw_sp,
1619  			       struct mlxsw_sp_bridge_port *bridge_port,
1620  			       u16 fid_index)
1621  {
1622  	bool lagged = bridge_port->lagged;
1623  	char sfdf_pl[MLXSW_REG_SFDF_LEN];
1624  	u16 system_port;
1625  
1626  	system_port = lagged ? bridge_port->lag_id : bridge_port->system_port;
1627  	mlxsw_reg_sfdf_pack(sfdf_pl, mlxsw_sp_fdb_flush_type(lagged));
1628  	mlxsw_reg_sfdf_fid_set(sfdf_pl, fid_index);
1629  	mlxsw_reg_sfdf_port_fid_system_port_set(sfdf_pl, system_port);
1630  
1631  	return mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfdf), sfdf_pl);
1632  }
1633  
mlxsw_sp_sfd_rec_policy(bool dynamic)1634  static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
1635  {
1636  	return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
1637  			 MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_MLAG;
1638  }
1639  
mlxsw_sp_sfd_op(bool adding)1640  static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
1641  {
1642  	return adding ? MLXSW_REG_SFD_OP_WRITE_EDIT :
1643  			MLXSW_REG_SFD_OP_WRITE_REMOVE;
1644  }
1645  
1646  static int
mlxsw_sp_port_fdb_tun_uc_op4(struct mlxsw_sp * mlxsw_sp,bool dynamic,const char * mac,u16 fid,__be32 addr,bool adding)1647  mlxsw_sp_port_fdb_tun_uc_op4(struct mlxsw_sp *mlxsw_sp, bool dynamic,
1648  			     const char *mac, u16 fid, __be32 addr, bool adding)
1649  {
1650  	char *sfd_pl;
1651  	u8 num_rec;
1652  	u32 uip;
1653  	int err;
1654  
1655  	sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1656  	if (!sfd_pl)
1657  		return -ENOMEM;
1658  
1659  	uip = be32_to_cpu(addr);
1660  	mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1661  	mlxsw_reg_sfd_uc_tunnel_pack4(sfd_pl, 0,
1662  				      mlxsw_sp_sfd_rec_policy(dynamic), mac,
1663  				      fid, MLXSW_REG_SFD_REC_ACTION_NOP, uip);
1664  	num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1665  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1666  	if (err)
1667  		goto out;
1668  
1669  	if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1670  		err = -EBUSY;
1671  
1672  out:
1673  	kfree(sfd_pl);
1674  	return err;
1675  }
1676  
mlxsw_sp_port_fdb_tun_uc_op6_sfd_write(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,u32 kvdl_index,bool adding)1677  static int mlxsw_sp_port_fdb_tun_uc_op6_sfd_write(struct mlxsw_sp *mlxsw_sp,
1678  						  const char *mac, u16 fid,
1679  						  u32 kvdl_index, bool adding)
1680  {
1681  	char *sfd_pl;
1682  	u8 num_rec;
1683  	int err;
1684  
1685  	sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1686  	if (!sfd_pl)
1687  		return -ENOMEM;
1688  
1689  	mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1690  	mlxsw_reg_sfd_uc_tunnel_pack6(sfd_pl, 0, mac, fid,
1691  				      MLXSW_REG_SFD_REC_ACTION_NOP, kvdl_index);
1692  	num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1693  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1694  	if (err)
1695  		goto out;
1696  
1697  	if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1698  		err = -EBUSY;
1699  
1700  out:
1701  	kfree(sfd_pl);
1702  	return err;
1703  }
1704  
mlxsw_sp_port_fdb_tun_uc_op6_add(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,const struct in6_addr * addr)1705  static int mlxsw_sp_port_fdb_tun_uc_op6_add(struct mlxsw_sp *mlxsw_sp,
1706  					    const char *mac, u16 fid,
1707  					    const struct in6_addr *addr)
1708  {
1709  	u32 kvdl_index;
1710  	int err;
1711  
1712  	err = mlxsw_sp_nve_ipv6_addr_kvdl_set(mlxsw_sp, addr, &kvdl_index);
1713  	if (err)
1714  		return err;
1715  
1716  	err = mlxsw_sp_port_fdb_tun_uc_op6_sfd_write(mlxsw_sp, mac, fid,
1717  						     kvdl_index, true);
1718  	if (err)
1719  		goto err_sfd_write;
1720  
1721  	err = mlxsw_sp_nve_ipv6_addr_map_replace(mlxsw_sp, mac, fid, addr);
1722  	if (err)
1723  		/* Replace can fail only for creating new mapping, so removing
1724  		 * the FDB entry in the error path is OK.
1725  		 */
1726  		goto err_addr_replace;
1727  
1728  	return 0;
1729  
1730  err_addr_replace:
1731  	mlxsw_sp_port_fdb_tun_uc_op6_sfd_write(mlxsw_sp, mac, fid, kvdl_index,
1732  					       false);
1733  err_sfd_write:
1734  	mlxsw_sp_nve_ipv6_addr_kvdl_unset(mlxsw_sp, addr);
1735  	return err;
1736  }
1737  
mlxsw_sp_port_fdb_tun_uc_op6_del(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,const struct in6_addr * addr)1738  static void mlxsw_sp_port_fdb_tun_uc_op6_del(struct mlxsw_sp *mlxsw_sp,
1739  					     const char *mac, u16 fid,
1740  					     const struct in6_addr *addr)
1741  {
1742  	mlxsw_sp_nve_ipv6_addr_map_del(mlxsw_sp, mac, fid);
1743  	mlxsw_sp_port_fdb_tun_uc_op6_sfd_write(mlxsw_sp, mac, fid, 0, false);
1744  	mlxsw_sp_nve_ipv6_addr_kvdl_unset(mlxsw_sp, addr);
1745  }
1746  
1747  static int
mlxsw_sp_port_fdb_tun_uc_op6(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,const struct in6_addr * addr,bool adding)1748  mlxsw_sp_port_fdb_tun_uc_op6(struct mlxsw_sp *mlxsw_sp, const char *mac,
1749  			     u16 fid, const struct in6_addr *addr, bool adding)
1750  {
1751  	if (adding)
1752  		return mlxsw_sp_port_fdb_tun_uc_op6_add(mlxsw_sp, mac, fid,
1753  							addr);
1754  
1755  	mlxsw_sp_port_fdb_tun_uc_op6_del(mlxsw_sp, mac, fid, addr);
1756  	return 0;
1757  }
1758  
mlxsw_sp_port_fdb_tunnel_uc_op(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,enum mlxsw_sp_l3proto proto,const union mlxsw_sp_l3addr * addr,bool adding,bool dynamic)1759  static int mlxsw_sp_port_fdb_tunnel_uc_op(struct mlxsw_sp *mlxsw_sp,
1760  					  const char *mac, u16 fid,
1761  					  enum mlxsw_sp_l3proto proto,
1762  					  const union mlxsw_sp_l3addr *addr,
1763  					  bool adding, bool dynamic)
1764  {
1765  	switch (proto) {
1766  	case MLXSW_SP_L3_PROTO_IPV4:
1767  		return mlxsw_sp_port_fdb_tun_uc_op4(mlxsw_sp, dynamic, mac, fid,
1768  						    addr->addr4, adding);
1769  	case MLXSW_SP_L3_PROTO_IPV6:
1770  		return mlxsw_sp_port_fdb_tun_uc_op6(mlxsw_sp, mac, fid,
1771  						    &addr->addr6, adding);
1772  	default:
1773  		WARN_ON(1);
1774  		return -EOPNOTSUPP;
1775  	}
1776  }
1777  
__mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp * mlxsw_sp,u16 local_port,const char * mac,u16 fid,u16 vid,bool adding,enum mlxsw_reg_sfd_rec_action action,enum mlxsw_reg_sfd_rec_policy policy)1778  static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u16 local_port,
1779  				     const char *mac, u16 fid, u16 vid,
1780  				     bool adding,
1781  				     enum mlxsw_reg_sfd_rec_action action,
1782  				     enum mlxsw_reg_sfd_rec_policy policy)
1783  {
1784  	char *sfd_pl;
1785  	u8 num_rec;
1786  	int err;
1787  
1788  	sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1789  	if (!sfd_pl)
1790  		return -ENOMEM;
1791  
1792  	mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1793  	mlxsw_reg_sfd_uc_pack(sfd_pl, 0, policy, mac, fid, vid, action,
1794  			      local_port);
1795  	num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1796  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1797  	if (err)
1798  		goto out;
1799  
1800  	if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1801  		err = -EBUSY;
1802  
1803  out:
1804  	kfree(sfd_pl);
1805  	return err;
1806  }
1807  
mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp * mlxsw_sp,u16 local_port,const char * mac,u16 fid,u16 vid,bool adding,bool dynamic)1808  static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u16 local_port,
1809  				   const char *mac, u16 fid, u16 vid,
1810  				   bool adding, bool dynamic)
1811  {
1812  	return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, vid,
1813  					 adding, MLXSW_REG_SFD_REC_ACTION_NOP,
1814  					 mlxsw_sp_sfd_rec_policy(dynamic));
1815  }
1816  
mlxsw_sp_rif_fdb_op(struct mlxsw_sp * mlxsw_sp,const char * mac,u16 fid,bool adding)1817  int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
1818  			bool adding)
1819  {
1820  	return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, 0, adding,
1821  					 MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
1822  					 MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY);
1823  }
1824  
mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp * mlxsw_sp,u16 lag_id,const char * mac,u16 fid,u16 lag_vid,bool adding,bool dynamic)1825  static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,
1826  				       const char *mac, u16 fid, u16 lag_vid,
1827  				       bool adding, bool dynamic)
1828  {
1829  	char *sfd_pl;
1830  	u8 num_rec;
1831  	int err;
1832  
1833  	sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1834  	if (!sfd_pl)
1835  		return -ENOMEM;
1836  
1837  	mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1838  	mlxsw_reg_sfd_uc_lag_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
1839  				  mac, fid, MLXSW_REG_SFD_REC_ACTION_NOP,
1840  				  lag_vid, lag_id);
1841  	num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1842  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1843  	if (err)
1844  		goto out;
1845  
1846  	if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1847  		err = -EBUSY;
1848  
1849  out:
1850  	kfree(sfd_pl);
1851  	return err;
1852  }
1853  
1854  static int
mlxsw_sp_port_fdb_set(struct mlxsw_sp_port * mlxsw_sp_port,struct switchdev_notifier_fdb_info * fdb_info,bool adding)1855  mlxsw_sp_port_fdb_set(struct mlxsw_sp_port *mlxsw_sp_port,
1856  		      struct switchdev_notifier_fdb_info *fdb_info, bool adding)
1857  {
1858  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
1859  	struct net_device *orig_dev = fdb_info->info.dev;
1860  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
1861  	struct mlxsw_sp_bridge_device *bridge_device;
1862  	struct mlxsw_sp_bridge_port *bridge_port;
1863  	u16 fid_index, vid;
1864  
1865  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
1866  	if (!bridge_port)
1867  		return -EINVAL;
1868  
1869  	bridge_device = bridge_port->bridge_device;
1870  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
1871  							       bridge_device,
1872  							       fdb_info->vid);
1873  	if (!mlxsw_sp_port_vlan)
1874  		return 0;
1875  
1876  	fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
1877  	vid = mlxsw_sp_port_vlan->vid;
1878  
1879  	if (!bridge_port->lagged)
1880  		return mlxsw_sp_port_fdb_uc_op(mlxsw_sp,
1881  					       bridge_port->system_port,
1882  					       fdb_info->addr, fid_index, vid,
1883  					       adding, false);
1884  	else
1885  		return mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp,
1886  						   bridge_port->lag_id,
1887  						   fdb_info->addr, fid_index,
1888  						   vid, adding, false);
1889  }
1890  
mlxsw_sp_mdb_entry_write(struct mlxsw_sp * mlxsw_sp,const struct mlxsw_sp_mdb_entry * mdb_entry,bool adding)1891  static int mlxsw_sp_mdb_entry_write(struct mlxsw_sp *mlxsw_sp,
1892  				    const struct mlxsw_sp_mdb_entry *mdb_entry,
1893  				    bool adding)
1894  {
1895  	char *sfd_pl;
1896  	u8 num_rec;
1897  	int err;
1898  
1899  	sfd_pl = kmalloc(MLXSW_REG_SFD_LEN, GFP_KERNEL);
1900  	if (!sfd_pl)
1901  		return -ENOMEM;
1902  
1903  	mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
1904  	mlxsw_reg_sfd_mc_pack(sfd_pl, 0, mdb_entry->key.addr,
1905  			      mdb_entry->key.fid, MLXSW_REG_SFD_REC_ACTION_NOP,
1906  			      mdb_entry->mid);
1907  	num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
1908  	err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
1909  	if (err)
1910  		goto out;
1911  
1912  	if (num_rec != mlxsw_reg_sfd_num_rec_get(sfd_pl))
1913  		err = -EBUSY;
1914  
1915  out:
1916  	kfree(sfd_pl);
1917  	return err;
1918  }
1919  
1920  static void
mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_ports_bitmap * ports_bm)1921  mlxsw_sp_bridge_port_get_ports_bitmap(struct mlxsw_sp *mlxsw_sp,
1922  				      struct mlxsw_sp_bridge_port *bridge_port,
1923  				      struct mlxsw_sp_ports_bitmap *ports_bm)
1924  {
1925  	struct mlxsw_sp_port *mlxsw_sp_port;
1926  	u64 max_lag_members, i;
1927  	int lag_id;
1928  
1929  	if (!bridge_port->lagged) {
1930  		set_bit(bridge_port->system_port, ports_bm->bitmap);
1931  	} else {
1932  		max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
1933  						     MAX_LAG_MEMBERS);
1934  		lag_id = bridge_port->lag_id;
1935  		for (i = 0; i < max_lag_members; i++) {
1936  			mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp,
1937  								 lag_id, i);
1938  			if (mlxsw_sp_port)
1939  				set_bit(mlxsw_sp_port->local_port,
1940  					ports_bm->bitmap);
1941  		}
1942  	}
1943  }
1944  
1945  static void
mlxsw_sp_mc_get_mrouters_bitmap(struct mlxsw_sp_ports_bitmap * flood_bm,struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp * mlxsw_sp)1946  mlxsw_sp_mc_get_mrouters_bitmap(struct mlxsw_sp_ports_bitmap *flood_bm,
1947  				struct mlxsw_sp_bridge_device *bridge_device,
1948  				struct mlxsw_sp *mlxsw_sp)
1949  {
1950  	struct mlxsw_sp_bridge_port *bridge_port;
1951  
1952  	list_for_each_entry(bridge_port, &bridge_device->ports_list, list) {
1953  		if (bridge_port->mrouter) {
1954  			mlxsw_sp_bridge_port_get_ports_bitmap(mlxsw_sp,
1955  							      bridge_port,
1956  							      flood_bm);
1957  		}
1958  	}
1959  }
1960  
mlxsw_sp_mc_mdb_mrouters_add(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_ports_bitmap * ports_bm,struct mlxsw_sp_mdb_entry * mdb_entry)1961  static int mlxsw_sp_mc_mdb_mrouters_add(struct mlxsw_sp *mlxsw_sp,
1962  					struct mlxsw_sp_ports_bitmap *ports_bm,
1963  					struct mlxsw_sp_mdb_entry *mdb_entry)
1964  {
1965  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
1966  	unsigned int nbits = ports_bm->nbits;
1967  	int i;
1968  
1969  	for_each_set_bit(i, ports_bm->bitmap, nbits) {
1970  		mdb_entry_port = mlxsw_sp_mdb_entry_mrouter_port_get(mlxsw_sp,
1971  								     mdb_entry,
1972  								     i);
1973  		if (IS_ERR(mdb_entry_port)) {
1974  			nbits = i;
1975  			goto err_mrouter_port_get;
1976  		}
1977  	}
1978  
1979  	return 0;
1980  
1981  err_mrouter_port_get:
1982  	for_each_set_bit(i, ports_bm->bitmap, nbits)
1983  		mlxsw_sp_mdb_entry_mrouter_port_put(mlxsw_sp, mdb_entry, i);
1984  	return PTR_ERR(mdb_entry_port);
1985  }
1986  
mlxsw_sp_mc_mdb_mrouters_del(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_ports_bitmap * ports_bm,struct mlxsw_sp_mdb_entry * mdb_entry)1987  static void mlxsw_sp_mc_mdb_mrouters_del(struct mlxsw_sp *mlxsw_sp,
1988  					 struct mlxsw_sp_ports_bitmap *ports_bm,
1989  					 struct mlxsw_sp_mdb_entry *mdb_entry)
1990  {
1991  	int i;
1992  
1993  	for_each_set_bit(i, ports_bm->bitmap, ports_bm->nbits)
1994  		mlxsw_sp_mdb_entry_mrouter_port_put(mlxsw_sp, mdb_entry, i);
1995  }
1996  
1997  static int
mlxsw_sp_mc_mdb_mrouters_set(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_mdb_entry * mdb_entry,bool add)1998  mlxsw_sp_mc_mdb_mrouters_set(struct mlxsw_sp *mlxsw_sp,
1999  			     struct mlxsw_sp_bridge_device *bridge_device,
2000  			     struct mlxsw_sp_mdb_entry *mdb_entry, bool add)
2001  {
2002  	struct mlxsw_sp_ports_bitmap ports_bm;
2003  	int err;
2004  
2005  	err = mlxsw_sp_port_bitmap_init(mlxsw_sp, &ports_bm);
2006  	if (err)
2007  		return err;
2008  
2009  	mlxsw_sp_mc_get_mrouters_bitmap(&ports_bm, bridge_device, mlxsw_sp);
2010  
2011  	if (add)
2012  		err = mlxsw_sp_mc_mdb_mrouters_add(mlxsw_sp, &ports_bm,
2013  						   mdb_entry);
2014  	else
2015  		mlxsw_sp_mc_mdb_mrouters_del(mlxsw_sp, &ports_bm, mdb_entry);
2016  
2017  	mlxsw_sp_port_bitmap_fini(&ports_bm);
2018  	return err;
2019  }
2020  
2021  static struct mlxsw_sp_mdb_entry *
mlxsw_sp_mc_mdb_entry_init(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,const unsigned char * addr,u16 fid,u16 local_port)2022  mlxsw_sp_mc_mdb_entry_init(struct mlxsw_sp *mlxsw_sp,
2023  			   struct mlxsw_sp_bridge_device *bridge_device,
2024  			   const unsigned char *addr, u16 fid, u16 local_port)
2025  {
2026  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
2027  	struct mlxsw_sp_mdb_entry *mdb_entry;
2028  	int err;
2029  
2030  	mdb_entry = kzalloc(sizeof(*mdb_entry), GFP_KERNEL);
2031  	if (!mdb_entry)
2032  		return ERR_PTR(-ENOMEM);
2033  
2034  	ether_addr_copy(mdb_entry->key.addr, addr);
2035  	mdb_entry->key.fid = fid;
2036  	err = mlxsw_sp_pgt_mid_alloc(mlxsw_sp, &mdb_entry->mid);
2037  	if (err)
2038  		goto err_pgt_mid_alloc;
2039  
2040  	INIT_LIST_HEAD(&mdb_entry->ports_list);
2041  
2042  	err = mlxsw_sp_mc_mdb_mrouters_set(mlxsw_sp, bridge_device, mdb_entry,
2043  					   true);
2044  	if (err)
2045  		goto err_mdb_mrouters_set;
2046  
2047  	mdb_entry_port = mlxsw_sp_mdb_entry_port_get(mlxsw_sp, mdb_entry,
2048  						     local_port);
2049  	if (IS_ERR(mdb_entry_port)) {
2050  		err = PTR_ERR(mdb_entry_port);
2051  		goto err_mdb_entry_port_get;
2052  	}
2053  
2054  	if (bridge_device->multicast_enabled) {
2055  		err = mlxsw_sp_mdb_entry_write(mlxsw_sp, mdb_entry, true);
2056  		if (err)
2057  			goto err_mdb_entry_write;
2058  	}
2059  
2060  	err = rhashtable_insert_fast(&bridge_device->mdb_ht,
2061  				     &mdb_entry->ht_node,
2062  				     mlxsw_sp_mdb_ht_params);
2063  	if (err)
2064  		goto err_rhashtable_insert;
2065  
2066  	list_add_tail(&mdb_entry->list, &bridge_device->mdb_list);
2067  
2068  	return mdb_entry;
2069  
2070  err_rhashtable_insert:
2071  	if (bridge_device->multicast_enabled)
2072  		mlxsw_sp_mdb_entry_write(mlxsw_sp, mdb_entry, false);
2073  err_mdb_entry_write:
2074  	mlxsw_sp_mdb_entry_port_put(mlxsw_sp, mdb_entry, local_port, false);
2075  err_mdb_entry_port_get:
2076  	mlxsw_sp_mc_mdb_mrouters_set(mlxsw_sp, bridge_device, mdb_entry, false);
2077  err_mdb_mrouters_set:
2078  	mlxsw_sp_pgt_mid_free(mlxsw_sp, mdb_entry->mid);
2079  err_pgt_mid_alloc:
2080  	kfree(mdb_entry);
2081  	return ERR_PTR(err);
2082  }
2083  
2084  static void
mlxsw_sp_mc_mdb_entry_fini(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_mdb_entry * mdb_entry,struct mlxsw_sp_bridge_device * bridge_device,u16 local_port,bool force)2085  mlxsw_sp_mc_mdb_entry_fini(struct mlxsw_sp *mlxsw_sp,
2086  			   struct mlxsw_sp_mdb_entry *mdb_entry,
2087  			   struct mlxsw_sp_bridge_device *bridge_device,
2088  			   u16 local_port, bool force)
2089  {
2090  	list_del(&mdb_entry->list);
2091  	rhashtable_remove_fast(&bridge_device->mdb_ht, &mdb_entry->ht_node,
2092  			       mlxsw_sp_mdb_ht_params);
2093  	if (bridge_device->multicast_enabled)
2094  		mlxsw_sp_mdb_entry_write(mlxsw_sp, mdb_entry, false);
2095  	mlxsw_sp_mdb_entry_port_put(mlxsw_sp, mdb_entry, local_port, force);
2096  	mlxsw_sp_mc_mdb_mrouters_set(mlxsw_sp, bridge_device, mdb_entry, false);
2097  	WARN_ON(!list_empty(&mdb_entry->ports_list));
2098  	mlxsw_sp_pgt_mid_free(mlxsw_sp, mdb_entry->mid);
2099  	kfree(mdb_entry);
2100  }
2101  
2102  static struct mlxsw_sp_mdb_entry *
mlxsw_sp_mc_mdb_entry_get(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,const unsigned char * addr,u16 fid,u16 local_port)2103  mlxsw_sp_mc_mdb_entry_get(struct mlxsw_sp *mlxsw_sp,
2104  			  struct mlxsw_sp_bridge_device *bridge_device,
2105  			  const unsigned char *addr, u16 fid, u16 local_port)
2106  {
2107  	struct mlxsw_sp_mdb_entry_key key = {};
2108  	struct mlxsw_sp_mdb_entry *mdb_entry;
2109  
2110  	ether_addr_copy(key.addr, addr);
2111  	key.fid = fid;
2112  	mdb_entry = rhashtable_lookup_fast(&bridge_device->mdb_ht, &key,
2113  					   mlxsw_sp_mdb_ht_params);
2114  	if (mdb_entry) {
2115  		struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
2116  
2117  		mdb_entry_port = mlxsw_sp_mdb_entry_port_get(mlxsw_sp,
2118  							     mdb_entry,
2119  							     local_port);
2120  		if (IS_ERR(mdb_entry_port))
2121  			return ERR_CAST(mdb_entry_port);
2122  
2123  		return mdb_entry;
2124  	}
2125  
2126  	return mlxsw_sp_mc_mdb_entry_init(mlxsw_sp, bridge_device, addr, fid,
2127  					  local_port);
2128  }
2129  
2130  static bool
mlxsw_sp_mc_mdb_entry_remove(struct mlxsw_sp_mdb_entry * mdb_entry,struct mlxsw_sp_mdb_entry_port * removed_entry_port,bool force)2131  mlxsw_sp_mc_mdb_entry_remove(struct mlxsw_sp_mdb_entry *mdb_entry,
2132  			     struct mlxsw_sp_mdb_entry_port *removed_entry_port,
2133  			     bool force)
2134  {
2135  	if (mdb_entry->ports_count > 1)
2136  		return false;
2137  
2138  	if (force)
2139  		return true;
2140  
2141  	if (!removed_entry_port->mrouter &&
2142  	    refcount_read(&removed_entry_port->refcount) > 1)
2143  		return false;
2144  
2145  	if (removed_entry_port->mrouter &&
2146  	    refcount_read(&removed_entry_port->refcount) > 2)
2147  		return false;
2148  
2149  	return true;
2150  }
2151  
2152  static void
mlxsw_sp_mc_mdb_entry_put(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_mdb_entry * mdb_entry,u16 local_port,bool force)2153  mlxsw_sp_mc_mdb_entry_put(struct mlxsw_sp *mlxsw_sp,
2154  			  struct mlxsw_sp_bridge_device *bridge_device,
2155  			  struct mlxsw_sp_mdb_entry *mdb_entry, u16 local_port,
2156  			  bool force)
2157  {
2158  	struct mlxsw_sp_mdb_entry_port *mdb_entry_port;
2159  
2160  	mdb_entry_port = mlxsw_sp_mdb_entry_port_lookup(mdb_entry, local_port);
2161  	if (!mdb_entry_port)
2162  		return;
2163  
2164  	/* Avoid a temporary situation in which the MDB entry points to an empty
2165  	 * PGT entry, as otherwise packets will be temporarily dropped instead
2166  	 * of being flooded. Instead, in this situation, call
2167  	 * mlxsw_sp_mc_mdb_entry_fini(), which first deletes the MDB entry and
2168  	 * then releases the PGT entry.
2169  	 */
2170  	if (mlxsw_sp_mc_mdb_entry_remove(mdb_entry, mdb_entry_port, force))
2171  		mlxsw_sp_mc_mdb_entry_fini(mlxsw_sp, mdb_entry, bridge_device,
2172  					   local_port, force);
2173  	else
2174  		mlxsw_sp_mdb_entry_port_put(mlxsw_sp, mdb_entry, local_port,
2175  					    force);
2176  }
2177  
mlxsw_sp_port_mdb_add(struct mlxsw_sp_port * mlxsw_sp_port,const struct switchdev_obj_port_mdb * mdb)2178  static int mlxsw_sp_port_mdb_add(struct mlxsw_sp_port *mlxsw_sp_port,
2179  				 const struct switchdev_obj_port_mdb *mdb)
2180  {
2181  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2182  	struct net_device *orig_dev = mdb->obj.orig_dev;
2183  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2184  	struct mlxsw_sp_bridge_device *bridge_device;
2185  	struct mlxsw_sp_bridge_port *bridge_port;
2186  	struct mlxsw_sp_mdb_entry *mdb_entry;
2187  	u16 fid_index;
2188  
2189  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
2190  	if (!bridge_port)
2191  		return 0;
2192  
2193  	bridge_device = bridge_port->bridge_device;
2194  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
2195  							       bridge_device,
2196  							       mdb->vid);
2197  	if (!mlxsw_sp_port_vlan)
2198  		return 0;
2199  
2200  	fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
2201  
2202  	mdb_entry = mlxsw_sp_mc_mdb_entry_get(mlxsw_sp, bridge_device,
2203  					      mdb->addr, fid_index,
2204  					      mlxsw_sp_port->local_port);
2205  	if (IS_ERR(mdb_entry))
2206  		return PTR_ERR(mdb_entry);
2207  
2208  	return 0;
2209  }
2210  
2211  static int
mlxsw_sp_bridge_mdb_mc_enable_sync(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,bool mc_enabled)2212  mlxsw_sp_bridge_mdb_mc_enable_sync(struct mlxsw_sp *mlxsw_sp,
2213  				   struct mlxsw_sp_bridge_device *bridge_device,
2214  				   bool mc_enabled)
2215  {
2216  	struct mlxsw_sp_mdb_entry *mdb_entry;
2217  	int err;
2218  
2219  	list_for_each_entry(mdb_entry, &bridge_device->mdb_list, list) {
2220  		err = mlxsw_sp_mdb_entry_write(mlxsw_sp, mdb_entry, mc_enabled);
2221  		if (err)
2222  			goto err_mdb_entry_write;
2223  	}
2224  	return 0;
2225  
2226  err_mdb_entry_write:
2227  	list_for_each_entry_continue_reverse(mdb_entry,
2228  					     &bridge_device->mdb_list, list)
2229  		mlxsw_sp_mdb_entry_write(mlxsw_sp, mdb_entry, !mc_enabled);
2230  	return err;
2231  }
2232  
2233  static void
mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,bool add)2234  mlxsw_sp_port_mrouter_update_mdb(struct mlxsw_sp_port *mlxsw_sp_port,
2235  				 struct mlxsw_sp_bridge_port *bridge_port,
2236  				 bool add)
2237  {
2238  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2239  	struct mlxsw_sp_bridge_device *bridge_device;
2240  	u16 local_port = mlxsw_sp_port->local_port;
2241  	struct mlxsw_sp_mdb_entry *mdb_entry;
2242  
2243  	bridge_device = bridge_port->bridge_device;
2244  
2245  	list_for_each_entry(mdb_entry, &bridge_device->mdb_list, list) {
2246  		if (add)
2247  			mlxsw_sp_mdb_entry_mrouter_port_get(mlxsw_sp, mdb_entry,
2248  							    local_port);
2249  		else
2250  			mlxsw_sp_mdb_entry_mrouter_port_put(mlxsw_sp, mdb_entry,
2251  							    local_port);
2252  	}
2253  }
2254  
mlxsw_sp_port_obj_add(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj,struct netlink_ext_ack * extack)2255  static int mlxsw_sp_port_obj_add(struct net_device *dev, const void *ctx,
2256  				 const struct switchdev_obj *obj,
2257  				 struct netlink_ext_ack *extack)
2258  {
2259  	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
2260  	const struct switchdev_obj_port_vlan *vlan;
2261  	int err = 0;
2262  
2263  	switch (obj->id) {
2264  	case SWITCHDEV_OBJ_ID_PORT_VLAN:
2265  		vlan = SWITCHDEV_OBJ_PORT_VLAN(obj);
2266  
2267  		err = mlxsw_sp_port_vlans_add(mlxsw_sp_port, vlan, extack);
2268  
2269  		/* The event is emitted before the changes are actually
2270  		 * applied to the bridge. Therefore schedule the respin
2271  		 * call for later, so that the respin logic sees the
2272  		 * updated bridge state.
2273  		 */
2274  		mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
2275  		break;
2276  	case SWITCHDEV_OBJ_ID_PORT_MDB:
2277  		err = mlxsw_sp_port_mdb_add(mlxsw_sp_port,
2278  					    SWITCHDEV_OBJ_PORT_MDB(obj));
2279  		break;
2280  	default:
2281  		err = -EOPNOTSUPP;
2282  		break;
2283  	}
2284  
2285  	return err;
2286  }
2287  
2288  static void
mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,u16 vid)2289  mlxsw_sp_bridge_port_vlan_del(struct mlxsw_sp_port *mlxsw_sp_port,
2290  			      struct mlxsw_sp_bridge_port *bridge_port, u16 vid)
2291  {
2292  	u16 pvid = mlxsw_sp_port->pvid == vid ? 0 : mlxsw_sp_port->pvid;
2293  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2294  	u16 proto;
2295  
2296  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
2297  	if (WARN_ON(!mlxsw_sp_port_vlan))
2298  		return;
2299  
2300  	mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
2301  	br_vlan_get_proto(bridge_port->bridge_device->dev, &proto);
2302  	mlxsw_sp_port_pvid_set(mlxsw_sp_port, pvid, proto);
2303  	mlxsw_sp_port_vlan_set(mlxsw_sp_port, vid, vid, false, false);
2304  	mlxsw_sp_port_vlan_destroy(mlxsw_sp_port_vlan);
2305  }
2306  
mlxsw_sp_port_vlans_del(struct mlxsw_sp_port * mlxsw_sp_port,const struct switchdev_obj_port_vlan * vlan)2307  static int mlxsw_sp_port_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port,
2308  				   const struct switchdev_obj_port_vlan *vlan)
2309  {
2310  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2311  	struct net_device *orig_dev = vlan->obj.orig_dev;
2312  	struct mlxsw_sp_bridge_port *bridge_port;
2313  
2314  	if (netif_is_bridge_master(orig_dev))
2315  		return -EOPNOTSUPP;
2316  
2317  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
2318  	if (WARN_ON(!bridge_port))
2319  		return -EINVAL;
2320  
2321  	if (!bridge_port->bridge_device->vlan_enabled)
2322  		return 0;
2323  
2324  	mlxsw_sp_bridge_port_vlan_del(mlxsw_sp_port, bridge_port, vlan->vid);
2325  
2326  	return 0;
2327  }
2328  
mlxsw_sp_port_mdb_del(struct mlxsw_sp_port * mlxsw_sp_port,const struct switchdev_obj_port_mdb * mdb)2329  static int mlxsw_sp_port_mdb_del(struct mlxsw_sp_port *mlxsw_sp_port,
2330  				 const struct switchdev_obj_port_mdb *mdb)
2331  {
2332  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2333  	struct net_device *orig_dev = mdb->obj.orig_dev;
2334  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2335  	struct mlxsw_sp_bridge_device *bridge_device;
2336  	struct net_device *dev = mlxsw_sp_port->dev;
2337  	struct mlxsw_sp_bridge_port *bridge_port;
2338  	struct mlxsw_sp_mdb_entry_key key = {};
2339  	struct mlxsw_sp_mdb_entry *mdb_entry;
2340  	u16 fid_index;
2341  
2342  	bridge_port = mlxsw_sp_bridge_port_find(mlxsw_sp->bridge, orig_dev);
2343  	if (!bridge_port)
2344  		return 0;
2345  
2346  	bridge_device = bridge_port->bridge_device;
2347  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_bridge(mlxsw_sp_port,
2348  							       bridge_device,
2349  							       mdb->vid);
2350  	if (!mlxsw_sp_port_vlan)
2351  		return 0;
2352  
2353  	fid_index = mlxsw_sp_fid_index(mlxsw_sp_port_vlan->fid);
2354  
2355  	ether_addr_copy(key.addr, mdb->addr);
2356  	key.fid = fid_index;
2357  	mdb_entry = rhashtable_lookup_fast(&bridge_device->mdb_ht, &key,
2358  					   mlxsw_sp_mdb_ht_params);
2359  	if (!mdb_entry) {
2360  		netdev_err(dev, "Unable to remove port from MC DB\n");
2361  		return -EINVAL;
2362  	}
2363  
2364  	mlxsw_sp_mc_mdb_entry_put(mlxsw_sp, bridge_device, mdb_entry,
2365  				  mlxsw_sp_port->local_port, false);
2366  	return 0;
2367  }
2368  
2369  static void
mlxsw_sp_bridge_port_mdb_flush(struct mlxsw_sp_port * mlxsw_sp_port,struct mlxsw_sp_bridge_port * bridge_port,u16 fid_index)2370  mlxsw_sp_bridge_port_mdb_flush(struct mlxsw_sp_port *mlxsw_sp_port,
2371  			       struct mlxsw_sp_bridge_port *bridge_port,
2372  			       u16 fid_index)
2373  {
2374  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2375  	struct mlxsw_sp_bridge_device *bridge_device;
2376  	struct mlxsw_sp_mdb_entry *mdb_entry, *tmp;
2377  	u16 local_port = mlxsw_sp_port->local_port;
2378  
2379  	bridge_device = bridge_port->bridge_device;
2380  
2381  	list_for_each_entry_safe(mdb_entry, tmp, &bridge_device->mdb_list,
2382  				 list) {
2383  		if (mdb_entry->key.fid != fid_index)
2384  			continue;
2385  
2386  		if (bridge_port->mrouter)
2387  			mlxsw_sp_mdb_entry_mrouter_port_put(mlxsw_sp,
2388  							    mdb_entry,
2389  							    local_port);
2390  
2391  		mlxsw_sp_mc_mdb_entry_put(mlxsw_sp, bridge_device, mdb_entry,
2392  					  local_port, true);
2393  	}
2394  }
2395  
mlxsw_sp_port_obj_del(struct net_device * dev,const void * ctx,const struct switchdev_obj * obj)2396  static int mlxsw_sp_port_obj_del(struct net_device *dev, const void *ctx,
2397  				 const struct switchdev_obj *obj)
2398  {
2399  	struct mlxsw_sp_port *mlxsw_sp_port = netdev_priv(dev);
2400  	int err = 0;
2401  
2402  	switch (obj->id) {
2403  	case SWITCHDEV_OBJ_ID_PORT_VLAN:
2404  		err = mlxsw_sp_port_vlans_del(mlxsw_sp_port,
2405  					      SWITCHDEV_OBJ_PORT_VLAN(obj));
2406  		break;
2407  	case SWITCHDEV_OBJ_ID_PORT_MDB:
2408  		err = mlxsw_sp_port_mdb_del(mlxsw_sp_port,
2409  					    SWITCHDEV_OBJ_PORT_MDB(obj));
2410  		break;
2411  	default:
2412  		err = -EOPNOTSUPP;
2413  		break;
2414  	}
2415  
2416  	mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
2417  
2418  	return err;
2419  }
2420  
mlxsw_sp_lag_rep_port(struct mlxsw_sp * mlxsw_sp,u16 lag_id)2421  static struct mlxsw_sp_port *mlxsw_sp_lag_rep_port(struct mlxsw_sp *mlxsw_sp,
2422  						   u16 lag_id)
2423  {
2424  	struct mlxsw_sp_port *mlxsw_sp_port;
2425  	u64 max_lag_members;
2426  	int i;
2427  
2428  	max_lag_members = MLXSW_CORE_RES_GET(mlxsw_sp->core,
2429  					     MAX_LAG_MEMBERS);
2430  	for (i = 0; i < max_lag_members; i++) {
2431  		mlxsw_sp_port = mlxsw_sp_port_lagged_get(mlxsw_sp, lag_id, i);
2432  		if (mlxsw_sp_port)
2433  			return mlxsw_sp_port;
2434  	}
2435  	return NULL;
2436  }
2437  
2438  static int
mlxsw_sp_bridge_port_replay(struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2439  mlxsw_sp_bridge_port_replay(struct mlxsw_sp_bridge_port *bridge_port,
2440  			    struct mlxsw_sp_port *mlxsw_sp_port,
2441  			    struct netlink_ext_ack *extack)
2442  {
2443  	struct mlxsw_sp_bridge_port_replay_switchdev_objs rso = {
2444  		.brport_dev = bridge_port->dev,
2445  		.mlxsw_sp_port = mlxsw_sp_port,
2446  	};
2447  	struct notifier_block *nb;
2448  	int err;
2449  
2450  	nb = &mlxsw_sp_bridge_port_replay_switchdev_objs_nb;
2451  	err = switchdev_bridge_port_replay(bridge_port->dev, mlxsw_sp_port->dev,
2452  					   &rso, NULL, nb, extack);
2453  	if (err)
2454  		goto err_replay;
2455  
2456  	return 0;
2457  
2458  err_replay:
2459  	nb = &mlxsw_sp_bridge_port_unreplay_switchdev_objs_nb;
2460  	switchdev_bridge_port_replay(bridge_port->dev, mlxsw_sp_port->dev,
2461  				     &rso, NULL, nb, extack);
2462  	return err;
2463  }
2464  
2465  static int
mlxsw_sp_bridge_vlan_aware_port_join(struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2466  mlxsw_sp_bridge_vlan_aware_port_join(struct mlxsw_sp_bridge_port *bridge_port,
2467  				     struct mlxsw_sp_port *mlxsw_sp_port,
2468  				     struct netlink_ext_ack *extack)
2469  {
2470  	if (is_vlan_dev(bridge_port->dev)) {
2471  		NL_SET_ERR_MSG_MOD(extack, "Can not enslave a VLAN device to a VLAN-aware bridge");
2472  		return -EINVAL;
2473  	}
2474  
2475  	/* Port is no longer usable as a router interface */
2476  	if (mlxsw_sp_port->default_vlan->fid)
2477  		mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port->default_vlan);
2478  
2479  	return mlxsw_sp_bridge_port_replay(bridge_port, mlxsw_sp_port, extack);
2480  }
2481  
2482  static int
mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2483  mlxsw_sp_bridge_8021q_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2484  				struct mlxsw_sp_bridge_port *bridge_port,
2485  				struct mlxsw_sp_port *mlxsw_sp_port,
2486  				struct netlink_ext_ack *extack)
2487  {
2488  	return mlxsw_sp_bridge_vlan_aware_port_join(bridge_port, mlxsw_sp_port,
2489  						    extack);
2490  }
2491  
2492  static void
mlxsw_sp_bridge_vlan_aware_port_leave(struct mlxsw_sp_port * mlxsw_sp_port)2493  mlxsw_sp_bridge_vlan_aware_port_leave(struct mlxsw_sp_port *mlxsw_sp_port)
2494  {
2495  	/* Make sure untagged frames are allowed to ingress */
2496  	mlxsw_sp_port_pvid_set(mlxsw_sp_port, MLXSW_SP_DEFAULT_VID,
2497  			       ETH_P_8021Q);
2498  }
2499  
2500  static void
mlxsw_sp_bridge_8021q_port_leave(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port)2501  mlxsw_sp_bridge_8021q_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2502  				 struct mlxsw_sp_bridge_port *bridge_port,
2503  				 struct mlxsw_sp_port *mlxsw_sp_port)
2504  {
2505  	mlxsw_sp_bridge_vlan_aware_port_leave(mlxsw_sp_port);
2506  }
2507  
2508  static int
mlxsw_sp_bridge_vlan_aware_vxlan_join(struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid,u16 ethertype,struct netlink_ext_ack * extack)2509  mlxsw_sp_bridge_vlan_aware_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2510  				      const struct net_device *vxlan_dev,
2511  				      u16 vid, u16 ethertype,
2512  				      struct netlink_ext_ack *extack)
2513  {
2514  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2515  	struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2516  	struct mlxsw_sp_nve_params params = {
2517  		.type = MLXSW_SP_NVE_TYPE_VXLAN,
2518  		.vni = vxlan->cfg.vni,
2519  		.dev = vxlan_dev,
2520  		.ethertype = ethertype,
2521  	};
2522  	struct mlxsw_sp_fid *fid;
2523  	int err;
2524  
2525  	/* If the VLAN is 0, we need to find the VLAN that is configured as
2526  	 * PVID and egress untagged on the bridge port of the VxLAN device.
2527  	 * It is possible no such VLAN exists
2528  	 */
2529  	if (!vid) {
2530  		err = mlxsw_sp_vxlan_mapped_vid(vxlan_dev, &vid);
2531  		if (err || !vid)
2532  			return err;
2533  	}
2534  
2535  	fid = mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
2536  	if (IS_ERR(fid)) {
2537  		NL_SET_ERR_MSG_MOD(extack, "Failed to create 802.1Q FID");
2538  		return PTR_ERR(fid);
2539  	}
2540  
2541  	if (mlxsw_sp_fid_vni_is_set(fid)) {
2542  		NL_SET_ERR_MSG_MOD(extack, "VNI is already set on FID");
2543  		err = -EINVAL;
2544  		goto err_vni_exists;
2545  	}
2546  
2547  	err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
2548  	if (err)
2549  		goto err_nve_fid_enable;
2550  
2551  	return 0;
2552  
2553  err_nve_fid_enable:
2554  err_vni_exists:
2555  	mlxsw_sp_fid_put(fid);
2556  	return err;
2557  }
2558  
2559  static int
mlxsw_sp_bridge_8021q_vxlan_join(struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid,struct netlink_ext_ack * extack)2560  mlxsw_sp_bridge_8021q_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2561  				 const struct net_device *vxlan_dev, u16 vid,
2562  				 struct netlink_ext_ack *extack)
2563  {
2564  	return mlxsw_sp_bridge_vlan_aware_vxlan_join(bridge_device, vxlan_dev,
2565  						     vid, ETH_P_8021Q, extack);
2566  }
2567  
2568  static struct net_device *
mlxsw_sp_bridge_8021q_vxlan_dev_find(struct net_device * br_dev,u16 vid)2569  mlxsw_sp_bridge_8021q_vxlan_dev_find(struct net_device *br_dev, u16 vid)
2570  {
2571  	struct net_device *dev;
2572  	struct list_head *iter;
2573  
2574  	netdev_for_each_lower_dev(br_dev, dev, iter) {
2575  		u16 pvid;
2576  		int err;
2577  
2578  		if (!netif_is_vxlan(dev))
2579  			continue;
2580  
2581  		err = mlxsw_sp_vxlan_mapped_vid(dev, &pvid);
2582  		if (err || pvid != vid)
2583  			continue;
2584  
2585  		return dev;
2586  	}
2587  
2588  	return NULL;
2589  }
2590  
2591  static struct mlxsw_sp_fid *
mlxsw_sp_bridge_8021q_fid_get(struct mlxsw_sp_bridge_device * bridge_device,u16 vid,struct netlink_ext_ack * extack)2592  mlxsw_sp_bridge_8021q_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
2593  			      u16 vid, struct netlink_ext_ack *extack)
2594  {
2595  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2596  
2597  	return mlxsw_sp_fid_8021q_get(mlxsw_sp, vid);
2598  }
2599  
2600  static struct mlxsw_sp_fid *
mlxsw_sp_bridge_8021q_fid_lookup(struct mlxsw_sp_bridge_device * bridge_device,u16 vid)2601  mlxsw_sp_bridge_8021q_fid_lookup(struct mlxsw_sp_bridge_device *bridge_device,
2602  				 u16 vid)
2603  {
2604  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2605  
2606  	return mlxsw_sp_fid_8021q_lookup(mlxsw_sp, vid);
2607  }
2608  
2609  static u16
mlxsw_sp_bridge_8021q_fid_vid(struct mlxsw_sp_bridge_device * bridge_device,const struct mlxsw_sp_fid * fid)2610  mlxsw_sp_bridge_8021q_fid_vid(struct mlxsw_sp_bridge_device *bridge_device,
2611  			      const struct mlxsw_sp_fid *fid)
2612  {
2613  	return mlxsw_sp_fid_8021q_vid(fid);
2614  }
2615  
2616  static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021q_ops = {
2617  	.port_join	= mlxsw_sp_bridge_8021q_port_join,
2618  	.port_leave	= mlxsw_sp_bridge_8021q_port_leave,
2619  	.vxlan_join	= mlxsw_sp_bridge_8021q_vxlan_join,
2620  	.fid_get	= mlxsw_sp_bridge_8021q_fid_get,
2621  	.fid_lookup	= mlxsw_sp_bridge_8021q_fid_lookup,
2622  	.fid_vid	= mlxsw_sp_bridge_8021q_fid_vid,
2623  };
2624  
2625  static bool
mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port * mlxsw_sp_port,const struct net_device * br_dev)2626  mlxsw_sp_port_is_br_member(const struct mlxsw_sp_port *mlxsw_sp_port,
2627  			   const struct net_device *br_dev)
2628  {
2629  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2630  
2631  	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
2632  			    list) {
2633  		if (mlxsw_sp_port_vlan->bridge_port &&
2634  		    mlxsw_sp_port_vlan->bridge_port->bridge_device->dev ==
2635  		    br_dev)
2636  			return true;
2637  	}
2638  
2639  	return false;
2640  }
2641  
2642  static int
mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2643  mlxsw_sp_bridge_8021d_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2644  				struct mlxsw_sp_bridge_port *bridge_port,
2645  				struct mlxsw_sp_port *mlxsw_sp_port,
2646  				struct netlink_ext_ack *extack)
2647  {
2648  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2649  	struct net_device *dev = bridge_port->dev;
2650  	u16 vid;
2651  	int err;
2652  
2653  	vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : MLXSW_SP_DEFAULT_VID;
2654  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
2655  	if (WARN_ON(!mlxsw_sp_port_vlan))
2656  		return -EINVAL;
2657  
2658  	if (mlxsw_sp_port_is_br_member(mlxsw_sp_port, bridge_device->dev)) {
2659  		NL_SET_ERR_MSG_MOD(extack, "Can not bridge VLAN uppers of the same port");
2660  		return -EINVAL;
2661  	}
2662  
2663  	/* Port is no longer usable as a router interface */
2664  	if (mlxsw_sp_port_vlan->fid)
2665  		mlxsw_sp_port_vlan_router_leave(mlxsw_sp_port_vlan);
2666  
2667  	err = mlxsw_sp_port_vlan_bridge_join(mlxsw_sp_port_vlan, bridge_port,
2668  					     extack);
2669  	if (err)
2670  		return err;
2671  
2672  	err = mlxsw_sp_bridge_port_replay(bridge_port, mlxsw_sp_port, extack);
2673  	if (err)
2674  		goto err_replay;
2675  
2676  	return 0;
2677  
2678  err_replay:
2679  	mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
2680  	return err;
2681  }
2682  
2683  static void
mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port)2684  mlxsw_sp_bridge_8021d_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2685  				 struct mlxsw_sp_bridge_port *bridge_port,
2686  				 struct mlxsw_sp_port *mlxsw_sp_port)
2687  {
2688  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
2689  	struct net_device *dev = bridge_port->dev;
2690  	u16 vid;
2691  
2692  	vid = is_vlan_dev(dev) ? vlan_dev_vlan_id(dev) : MLXSW_SP_DEFAULT_VID;
2693  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_vid(mlxsw_sp_port, vid);
2694  	if (!mlxsw_sp_port_vlan || !mlxsw_sp_port_vlan->bridge_port)
2695  		return;
2696  
2697  	mlxsw_sp_port_vlan_bridge_leave(mlxsw_sp_port_vlan);
2698  }
2699  
2700  static int
mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid,struct netlink_ext_ack * extack)2701  mlxsw_sp_bridge_8021d_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2702  				 const struct net_device *vxlan_dev, u16 vid,
2703  				 struct netlink_ext_ack *extack)
2704  {
2705  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2706  	struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2707  	struct mlxsw_sp_nve_params params = {
2708  		.type = MLXSW_SP_NVE_TYPE_VXLAN,
2709  		.vni = vxlan->cfg.vni,
2710  		.dev = vxlan_dev,
2711  		.ethertype = ETH_P_8021Q,
2712  	};
2713  	struct mlxsw_sp_fid *fid;
2714  	int err;
2715  
2716  	fid = mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
2717  	if (IS_ERR(fid)) {
2718  		NL_SET_ERR_MSG_MOD(extack, "Failed to create 802.1D FID");
2719  		return -EINVAL;
2720  	}
2721  
2722  	if (mlxsw_sp_fid_vni_is_set(fid)) {
2723  		NL_SET_ERR_MSG_MOD(extack, "VNI is already set on FID");
2724  		err = -EINVAL;
2725  		goto err_vni_exists;
2726  	}
2727  
2728  	err = mlxsw_sp_nve_fid_enable(mlxsw_sp, fid, &params, extack);
2729  	if (err)
2730  		goto err_nve_fid_enable;
2731  
2732  	return 0;
2733  
2734  err_nve_fid_enable:
2735  err_vni_exists:
2736  	mlxsw_sp_fid_put(fid);
2737  	return err;
2738  }
2739  
2740  static struct mlxsw_sp_fid *
mlxsw_sp_bridge_8021d_fid_get(struct mlxsw_sp_bridge_device * bridge_device,u16 vid,struct netlink_ext_ack * extack)2741  mlxsw_sp_bridge_8021d_fid_get(struct mlxsw_sp_bridge_device *bridge_device,
2742  			      u16 vid, struct netlink_ext_ack *extack)
2743  {
2744  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2745  
2746  	return mlxsw_sp_fid_8021d_get(mlxsw_sp, bridge_device->dev->ifindex);
2747  }
2748  
2749  static struct mlxsw_sp_fid *
mlxsw_sp_bridge_8021d_fid_lookup(struct mlxsw_sp_bridge_device * bridge_device,u16 vid)2750  mlxsw_sp_bridge_8021d_fid_lookup(struct mlxsw_sp_bridge_device *bridge_device,
2751  				 u16 vid)
2752  {
2753  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_lower_get(bridge_device->dev);
2754  
2755  	/* The only valid VLAN for a VLAN-unaware bridge is 0 */
2756  	if (vid)
2757  		return NULL;
2758  
2759  	return mlxsw_sp_fid_8021d_lookup(mlxsw_sp, bridge_device->dev->ifindex);
2760  }
2761  
2762  static u16
mlxsw_sp_bridge_8021d_fid_vid(struct mlxsw_sp_bridge_device * bridge_device,const struct mlxsw_sp_fid * fid)2763  mlxsw_sp_bridge_8021d_fid_vid(struct mlxsw_sp_bridge_device *bridge_device,
2764  			      const struct mlxsw_sp_fid *fid)
2765  {
2766  	return 0;
2767  }
2768  
2769  static const struct mlxsw_sp_bridge_ops mlxsw_sp_bridge_8021d_ops = {
2770  	.port_join	= mlxsw_sp_bridge_8021d_port_join,
2771  	.port_leave	= mlxsw_sp_bridge_8021d_port_leave,
2772  	.vxlan_join	= mlxsw_sp_bridge_8021d_vxlan_join,
2773  	.fid_get	= mlxsw_sp_bridge_8021d_fid_get,
2774  	.fid_lookup	= mlxsw_sp_bridge_8021d_fid_lookup,
2775  	.fid_vid	= mlxsw_sp_bridge_8021d_fid_vid,
2776  };
2777  
2778  static int
mlxsw_sp_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2779  mlxsw_sp_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2780  				 struct mlxsw_sp_bridge_port *bridge_port,
2781  				 struct mlxsw_sp_port *mlxsw_sp_port,
2782  				 struct netlink_ext_ack *extack)
2783  {
2784  	int err;
2785  
2786  	err = mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, true, false);
2787  	if (err)
2788  		return err;
2789  
2790  	err = mlxsw_sp_bridge_vlan_aware_port_join(bridge_port, mlxsw_sp_port,
2791  						   extack);
2792  	if (err)
2793  		goto err_bridge_vlan_aware_port_join;
2794  
2795  	return 0;
2796  
2797  err_bridge_vlan_aware_port_join:
2798  	mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
2799  	return err;
2800  }
2801  
2802  static void
mlxsw_sp_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port)2803  mlxsw_sp_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2804  				  struct mlxsw_sp_bridge_port *bridge_port,
2805  				  struct mlxsw_sp_port *mlxsw_sp_port)
2806  {
2807  	mlxsw_sp_bridge_vlan_aware_port_leave(mlxsw_sp_port);
2808  	mlxsw_sp_port_vlan_classification_set(mlxsw_sp_port, false, true);
2809  }
2810  
2811  static int
mlxsw_sp_bridge_8021ad_vxlan_join(struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid,struct netlink_ext_ack * extack)2812  mlxsw_sp_bridge_8021ad_vxlan_join(struct mlxsw_sp_bridge_device *bridge_device,
2813  				  const struct net_device *vxlan_dev, u16 vid,
2814  				  struct netlink_ext_ack *extack)
2815  {
2816  	return mlxsw_sp_bridge_vlan_aware_vxlan_join(bridge_device, vxlan_dev,
2817  						     vid, ETH_P_8021AD, extack);
2818  }
2819  
2820  static const struct mlxsw_sp_bridge_ops mlxsw_sp1_bridge_8021ad_ops = {
2821  	.port_join	= mlxsw_sp_bridge_8021ad_port_join,
2822  	.port_leave	= mlxsw_sp_bridge_8021ad_port_leave,
2823  	.vxlan_join	= mlxsw_sp_bridge_8021ad_vxlan_join,
2824  	.fid_get	= mlxsw_sp_bridge_8021q_fid_get,
2825  	.fid_lookup	= mlxsw_sp_bridge_8021q_fid_lookup,
2826  	.fid_vid	= mlxsw_sp_bridge_8021q_fid_vid,
2827  };
2828  
2829  static int
mlxsw_sp2_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port,struct netlink_ext_ack * extack)2830  mlxsw_sp2_bridge_8021ad_port_join(struct mlxsw_sp_bridge_device *bridge_device,
2831  				  struct mlxsw_sp_bridge_port *bridge_port,
2832  				  struct mlxsw_sp_port *mlxsw_sp_port,
2833  				  struct netlink_ext_ack *extack)
2834  {
2835  	int err;
2836  
2837  	/* The EtherType of decapsulated packets is determined at the egress
2838  	 * port to allow 802.1d and 802.1ad bridges with VXLAN devices to
2839  	 * co-exist.
2840  	 */
2841  	err = mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021AD);
2842  	if (err)
2843  		return err;
2844  
2845  	err = mlxsw_sp_bridge_8021ad_port_join(bridge_device, bridge_port,
2846  					       mlxsw_sp_port, extack);
2847  	if (err)
2848  		goto err_bridge_8021ad_port_join;
2849  
2850  	return 0;
2851  
2852  err_bridge_8021ad_port_join:
2853  	mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021Q);
2854  	return err;
2855  }
2856  
2857  static void
mlxsw_sp2_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device * bridge_device,struct mlxsw_sp_bridge_port * bridge_port,struct mlxsw_sp_port * mlxsw_sp_port)2858  mlxsw_sp2_bridge_8021ad_port_leave(struct mlxsw_sp_bridge_device *bridge_device,
2859  				   struct mlxsw_sp_bridge_port *bridge_port,
2860  				   struct mlxsw_sp_port *mlxsw_sp_port)
2861  {
2862  	mlxsw_sp_bridge_8021ad_port_leave(bridge_device, bridge_port,
2863  					  mlxsw_sp_port);
2864  	mlxsw_sp_port_egress_ethtype_set(mlxsw_sp_port, ETH_P_8021Q);
2865  }
2866  
2867  static const struct mlxsw_sp_bridge_ops mlxsw_sp2_bridge_8021ad_ops = {
2868  	.port_join	= mlxsw_sp2_bridge_8021ad_port_join,
2869  	.port_leave	= mlxsw_sp2_bridge_8021ad_port_leave,
2870  	.vxlan_join	= mlxsw_sp_bridge_8021ad_vxlan_join,
2871  	.fid_get	= mlxsw_sp_bridge_8021q_fid_get,
2872  	.fid_lookup	= mlxsw_sp_bridge_8021q_fid_lookup,
2873  	.fid_vid	= mlxsw_sp_bridge_8021q_fid_vid,
2874  };
2875  
mlxsw_sp_port_bridge_join(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * brport_dev,struct net_device * br_dev,struct netlink_ext_ack * extack)2876  int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
2877  			      struct net_device *brport_dev,
2878  			      struct net_device *br_dev,
2879  			      struct netlink_ext_ack *extack)
2880  {
2881  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2882  	struct mlxsw_sp_bridge_device *bridge_device;
2883  	struct mlxsw_sp_bridge_port *bridge_port;
2884  	int err;
2885  
2886  	bridge_port = mlxsw_sp_bridge_port_get(mlxsw_sp->bridge, brport_dev,
2887  					       extack);
2888  	if (IS_ERR(bridge_port))
2889  		return PTR_ERR(bridge_port);
2890  	bridge_device = bridge_port->bridge_device;
2891  
2892  	err = bridge_device->ops->port_join(bridge_device, bridge_port,
2893  					    mlxsw_sp_port, extack);
2894  	if (err)
2895  		goto err_port_join;
2896  
2897  	err = mlxsw_sp_netdevice_enslavement_replay(mlxsw_sp, br_dev, extack);
2898  	if (err)
2899  		goto err_replay;
2900  
2901  	return 0;
2902  
2903  err_replay:
2904  	bridge_device->ops->port_leave(bridge_device, bridge_port,
2905  				       mlxsw_sp_port);
2906  err_port_join:
2907  	mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
2908  	return err;
2909  }
2910  
mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port * mlxsw_sp_port,struct net_device * brport_dev,struct net_device * br_dev)2911  void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
2912  				struct net_device *brport_dev,
2913  				struct net_device *br_dev)
2914  {
2915  	struct mlxsw_sp *mlxsw_sp = mlxsw_sp_port->mlxsw_sp;
2916  	struct mlxsw_sp_bridge_device *bridge_device;
2917  	struct mlxsw_sp_bridge_port *bridge_port;
2918  
2919  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2920  	if (!bridge_device)
2921  		return;
2922  	bridge_port = __mlxsw_sp_bridge_port_find(bridge_device, brport_dev);
2923  	if (!bridge_port)
2924  		return;
2925  
2926  	bridge_device->ops->port_leave(bridge_device, bridge_port,
2927  				       mlxsw_sp_port);
2928  	mlxsw_sp_port_security_set(mlxsw_sp_port, false);
2929  	mlxsw_sp_bridge_port_put(mlxsw_sp->bridge, bridge_port);
2930  }
2931  
mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp * mlxsw_sp,const struct net_device * br_dev,const struct net_device * vxlan_dev,u16 vid,struct netlink_ext_ack * extack)2932  int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
2933  			       const struct net_device *br_dev,
2934  			       const struct net_device *vxlan_dev, u16 vid,
2935  			       struct netlink_ext_ack *extack)
2936  {
2937  	struct mlxsw_sp_bridge_device *bridge_device;
2938  
2939  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
2940  	if (WARN_ON(!bridge_device))
2941  		return -EINVAL;
2942  
2943  	return bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, vid,
2944  					      extack);
2945  }
2946  
mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp * mlxsw_sp,const struct net_device * vxlan_dev)2947  void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
2948  				 const struct net_device *vxlan_dev)
2949  {
2950  	struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
2951  	struct mlxsw_sp_fid *fid;
2952  
2953  	/* If the VxLAN device is down, then the FID does not have a VNI */
2954  	fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan->cfg.vni);
2955  	if (!fid)
2956  		return;
2957  
2958  	mlxsw_sp_nve_fid_disable(mlxsw_sp, fid);
2959  	/* Drop both the reference we just took during lookup and the reference
2960  	 * the VXLAN device took.
2961  	 */
2962  	mlxsw_sp_fid_put(fid);
2963  	mlxsw_sp_fid_put(fid);
2964  }
2965  
2966  static void
mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr * vxlan_addr,enum mlxsw_sp_l3proto * proto,union mlxsw_sp_l3addr * addr)2967  mlxsw_sp_switchdev_vxlan_addr_convert(const union vxlan_addr *vxlan_addr,
2968  				      enum mlxsw_sp_l3proto *proto,
2969  				      union mlxsw_sp_l3addr *addr)
2970  {
2971  	if (vxlan_addr->sa.sa_family == AF_INET) {
2972  		addr->addr4 = vxlan_addr->sin.sin_addr.s_addr;
2973  		*proto = MLXSW_SP_L3_PROTO_IPV4;
2974  	} else {
2975  		addr->addr6 = vxlan_addr->sin6.sin6_addr;
2976  		*proto = MLXSW_SP_L3_PROTO_IPV6;
2977  	}
2978  }
2979  
2980  static void
mlxsw_sp_switchdev_addr_vxlan_convert(enum mlxsw_sp_l3proto proto,const union mlxsw_sp_l3addr * addr,union vxlan_addr * vxlan_addr)2981  mlxsw_sp_switchdev_addr_vxlan_convert(enum mlxsw_sp_l3proto proto,
2982  				      const union mlxsw_sp_l3addr *addr,
2983  				      union vxlan_addr *vxlan_addr)
2984  {
2985  	switch (proto) {
2986  	case MLXSW_SP_L3_PROTO_IPV4:
2987  		vxlan_addr->sa.sa_family = AF_INET;
2988  		vxlan_addr->sin.sin_addr.s_addr = addr->addr4;
2989  		break;
2990  	case MLXSW_SP_L3_PROTO_IPV6:
2991  		vxlan_addr->sa.sa_family = AF_INET6;
2992  		vxlan_addr->sin6.sin6_addr = addr->addr6;
2993  		break;
2994  	}
2995  }
2996  
mlxsw_sp_fdb_vxlan_call_notifiers(struct net_device * dev,const char * mac,enum mlxsw_sp_l3proto proto,union mlxsw_sp_l3addr * addr,__be32 vni,bool adding)2997  static void mlxsw_sp_fdb_vxlan_call_notifiers(struct net_device *dev,
2998  					      const char *mac,
2999  					      enum mlxsw_sp_l3proto proto,
3000  					      union mlxsw_sp_l3addr *addr,
3001  					      __be32 vni, bool adding)
3002  {
3003  	struct switchdev_notifier_vxlan_fdb_info info;
3004  	struct vxlan_dev *vxlan = netdev_priv(dev);
3005  	enum switchdev_notifier_type type;
3006  
3007  	type = adding ? SWITCHDEV_VXLAN_FDB_ADD_TO_BRIDGE :
3008  			SWITCHDEV_VXLAN_FDB_DEL_TO_BRIDGE;
3009  	mlxsw_sp_switchdev_addr_vxlan_convert(proto, addr, &info.remote_ip);
3010  	info.remote_port = vxlan->cfg.dst_port;
3011  	info.remote_vni = vni;
3012  	info.remote_ifindex = 0;
3013  	ether_addr_copy(info.eth_addr, mac);
3014  	info.vni = vni;
3015  	info.offloaded = adding;
3016  	call_switchdev_notifiers(type, dev, &info.info, NULL);
3017  }
3018  
mlxsw_sp_fdb_nve_call_notifiers(struct net_device * dev,const char * mac,enum mlxsw_sp_l3proto proto,union mlxsw_sp_l3addr * addr,__be32 vni,bool adding)3019  static void mlxsw_sp_fdb_nve_call_notifiers(struct net_device *dev,
3020  					    const char *mac,
3021  					    enum mlxsw_sp_l3proto proto,
3022  					    union mlxsw_sp_l3addr *addr,
3023  					    __be32 vni,
3024  					    bool adding)
3025  {
3026  	if (netif_is_vxlan(dev))
3027  		mlxsw_sp_fdb_vxlan_call_notifiers(dev, mac, proto, addr, vni,
3028  						  adding);
3029  }
3030  
3031  static void
mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,const char * mac,u16 vid,struct net_device * dev,bool offloaded,bool locked)3032  mlxsw_sp_fdb_call_notifiers(enum switchdev_notifier_type type,
3033  			    const char *mac, u16 vid,
3034  			    struct net_device *dev, bool offloaded, bool locked)
3035  {
3036  	struct switchdev_notifier_fdb_info info = {};
3037  
3038  	info.addr = mac;
3039  	info.vid = vid;
3040  	info.offloaded = offloaded;
3041  	info.locked = locked;
3042  	call_switchdev_notifiers(type, dev, &info.info, NULL);
3043  }
3044  
mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp * mlxsw_sp,char * sfn_pl,int rec_index,bool adding)3045  static void mlxsw_sp_fdb_notify_mac_process(struct mlxsw_sp *mlxsw_sp,
3046  					    char *sfn_pl, int rec_index,
3047  					    bool adding)
3048  {
3049  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
3050  	struct mlxsw_sp_bridge_device *bridge_device;
3051  	struct mlxsw_sp_bridge_port *bridge_port;
3052  	struct mlxsw_sp_port *mlxsw_sp_port;
3053  	u16 local_port, vid, fid, evid = 0;
3054  	enum switchdev_notifier_type type;
3055  	char mac[ETH_ALEN];
3056  	bool do_notification = true;
3057  	int err;
3058  
3059  	mlxsw_reg_sfn_mac_unpack(sfn_pl, rec_index, mac, &fid, &local_port);
3060  
3061  	if (WARN_ON_ONCE(!mlxsw_sp_local_port_is_valid(mlxsw_sp, local_port)))
3062  		return;
3063  	mlxsw_sp_port = mlxsw_sp->ports[local_port];
3064  	if (!mlxsw_sp_port) {
3065  		dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Incorrect local port in FDB notification\n");
3066  		goto just_remove;
3067  	}
3068  
3069  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
3070  	if (!mlxsw_sp_port_vlan) {
3071  		netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
3072  		goto just_remove;
3073  	}
3074  
3075  	bridge_port = mlxsw_sp_port_vlan->bridge_port;
3076  	if (!bridge_port) {
3077  		netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
3078  		goto just_remove;
3079  	}
3080  
3081  	bridge_device = bridge_port->bridge_device;
3082  	vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
3083  	evid = mlxsw_sp_port_vlan->vid;
3084  
3085  	if (adding && mlxsw_sp_port->security) {
3086  		mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, mac,
3087  					    vid, bridge_port->dev, false, true);
3088  		return;
3089  	}
3090  
3091  do_fdb_op:
3092  	err = mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, evid,
3093  				      adding, true);
3094  	if (err) {
3095  		dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
3096  		return;
3097  	}
3098  
3099  	if (!do_notification)
3100  		return;
3101  	type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
3102  	mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev, adding,
3103  				    false);
3104  
3105  	return;
3106  
3107  just_remove:
3108  	adding = false;
3109  	do_notification = false;
3110  	goto do_fdb_op;
3111  }
3112  
mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp * mlxsw_sp,char * sfn_pl,int rec_index,bool adding)3113  static void mlxsw_sp_fdb_notify_mac_lag_process(struct mlxsw_sp *mlxsw_sp,
3114  						char *sfn_pl, int rec_index,
3115  						bool adding)
3116  {
3117  	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
3118  	struct mlxsw_sp_bridge_device *bridge_device;
3119  	struct mlxsw_sp_bridge_port *bridge_port;
3120  	struct mlxsw_sp_port *mlxsw_sp_port;
3121  	enum switchdev_notifier_type type;
3122  	char mac[ETH_ALEN];
3123  	u16 lag_vid = 0;
3124  	u16 lag_id;
3125  	u16 vid, fid;
3126  	bool do_notification = true;
3127  	int err;
3128  
3129  	mlxsw_reg_sfn_mac_lag_unpack(sfn_pl, rec_index, mac, &fid, &lag_id);
3130  	mlxsw_sp_port = mlxsw_sp_lag_rep_port(mlxsw_sp, lag_id);
3131  	if (!mlxsw_sp_port) {
3132  		dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Cannot find port representor for LAG\n");
3133  		goto just_remove;
3134  	}
3135  
3136  	mlxsw_sp_port_vlan = mlxsw_sp_port_vlan_find_by_fid(mlxsw_sp_port, fid);
3137  	if (!mlxsw_sp_port_vlan) {
3138  		netdev_err(mlxsw_sp_port->dev, "Failed to find a matching {Port, VID} following FDB notification\n");
3139  		goto just_remove;
3140  	}
3141  
3142  	bridge_port = mlxsw_sp_port_vlan->bridge_port;
3143  	if (!bridge_port) {
3144  		netdev_err(mlxsw_sp_port->dev, "{Port, VID} not associated with a bridge\n");
3145  		goto just_remove;
3146  	}
3147  
3148  	bridge_device = bridge_port->bridge_device;
3149  	vid = bridge_device->vlan_enabled ? mlxsw_sp_port_vlan->vid : 0;
3150  	lag_vid = mlxsw_sp_port_vlan->vid;
3151  
3152  	if (adding && mlxsw_sp_port->security) {
3153  		mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_ADD_TO_BRIDGE, mac,
3154  					    vid, bridge_port->dev, false, true);
3155  		return;
3156  	}
3157  
3158  do_fdb_op:
3159  	err = mlxsw_sp_port_fdb_uc_lag_op(mlxsw_sp, lag_id, mac, fid, lag_vid,
3160  					  adding, true);
3161  	if (err) {
3162  		dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to set FDB entry\n");
3163  		return;
3164  	}
3165  
3166  	if (!do_notification)
3167  		return;
3168  	type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE : SWITCHDEV_FDB_DEL_TO_BRIDGE;
3169  	mlxsw_sp_fdb_call_notifiers(type, mac, vid, bridge_port->dev, adding,
3170  				    false);
3171  
3172  	return;
3173  
3174  just_remove:
3175  	adding = false;
3176  	do_notification = false;
3177  	goto do_fdb_op;
3178  }
3179  
3180  static int
__mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp * mlxsw_sp,const struct mlxsw_sp_fid * fid,bool adding,struct net_device ** nve_dev,u16 * p_vid,__be32 * p_vni)3181  __mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp *mlxsw_sp,
3182  					    const struct mlxsw_sp_fid *fid,
3183  					    bool adding,
3184  					    struct net_device **nve_dev,
3185  					    u16 *p_vid, __be32 *p_vni)
3186  {
3187  	struct mlxsw_sp_bridge_device *bridge_device;
3188  	struct net_device *br_dev, *dev;
3189  	int nve_ifindex;
3190  	int err;
3191  
3192  	err = mlxsw_sp_fid_nve_ifindex(fid, &nve_ifindex);
3193  	if (err)
3194  		return err;
3195  
3196  	err = mlxsw_sp_fid_vni(fid, p_vni);
3197  	if (err)
3198  		return err;
3199  
3200  	dev = __dev_get_by_index(mlxsw_sp_net(mlxsw_sp), nve_ifindex);
3201  	if (!dev)
3202  		return -EINVAL;
3203  	*nve_dev = dev;
3204  
3205  	if (!netif_running(dev))
3206  		return -EINVAL;
3207  
3208  	if (adding && !br_port_flag_is_set(dev, BR_LEARNING))
3209  		return -EINVAL;
3210  
3211  	if (adding && netif_is_vxlan(dev)) {
3212  		struct vxlan_dev *vxlan = netdev_priv(dev);
3213  
3214  		if (!(vxlan->cfg.flags & VXLAN_F_LEARN))
3215  			return -EINVAL;
3216  	}
3217  
3218  	br_dev = netdev_master_upper_dev_get(dev);
3219  	if (!br_dev)
3220  		return -EINVAL;
3221  
3222  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3223  	if (!bridge_device)
3224  		return -EINVAL;
3225  
3226  	*p_vid = bridge_device->ops->fid_vid(bridge_device, fid);
3227  
3228  	return 0;
3229  }
3230  
mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp * mlxsw_sp,char * sfn_pl,int rec_index,bool adding)3231  static void mlxsw_sp_fdb_notify_mac_uc_tunnel_process(struct mlxsw_sp *mlxsw_sp,
3232  						      char *sfn_pl,
3233  						      int rec_index,
3234  						      bool adding)
3235  {
3236  	enum mlxsw_reg_sfn_uc_tunnel_protocol sfn_proto;
3237  	enum switchdev_notifier_type type;
3238  	struct net_device *nve_dev;
3239  	union mlxsw_sp_l3addr addr;
3240  	struct mlxsw_sp_fid *fid;
3241  	char mac[ETH_ALEN];
3242  	u16 fid_index, vid;
3243  	__be32 vni;
3244  	u32 uip;
3245  	int err;
3246  
3247  	mlxsw_reg_sfn_uc_tunnel_unpack(sfn_pl, rec_index, mac, &fid_index,
3248  				       &uip, &sfn_proto);
3249  
3250  	fid = mlxsw_sp_fid_lookup_by_index(mlxsw_sp, fid_index);
3251  	if (!fid)
3252  		goto err_fid_lookup;
3253  
3254  	err = mlxsw_sp_nve_learned_ip_resolve(mlxsw_sp, uip,
3255  					      (enum mlxsw_sp_l3proto) sfn_proto,
3256  					      &addr);
3257  	if (err)
3258  		goto err_ip_resolve;
3259  
3260  	err = __mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, fid, adding,
3261  							  &nve_dev, &vid, &vni);
3262  	if (err)
3263  		goto err_fdb_process;
3264  
3265  	err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, mac, fid_index,
3266  					     (enum mlxsw_sp_l3proto) sfn_proto,
3267  					     &addr, adding, true);
3268  	if (err)
3269  		goto err_fdb_op;
3270  
3271  	mlxsw_sp_fdb_nve_call_notifiers(nve_dev, mac,
3272  					(enum mlxsw_sp_l3proto) sfn_proto,
3273  					&addr, vni, adding);
3274  
3275  	type = adding ? SWITCHDEV_FDB_ADD_TO_BRIDGE :
3276  			SWITCHDEV_FDB_DEL_TO_BRIDGE;
3277  	mlxsw_sp_fdb_call_notifiers(type, mac, vid, nve_dev, adding, false);
3278  
3279  	mlxsw_sp_fid_put(fid);
3280  
3281  	return;
3282  
3283  err_fdb_op:
3284  err_fdb_process:
3285  err_ip_resolve:
3286  	mlxsw_sp_fid_put(fid);
3287  err_fid_lookup:
3288  	/* Remove an FDB entry in case we cannot process it. Otherwise the
3289  	 * device will keep sending the same notification over and over again.
3290  	 */
3291  	mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, mac, fid_index,
3292  				       (enum mlxsw_sp_l3proto) sfn_proto, &addr,
3293  				       false, true);
3294  }
3295  
mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp * mlxsw_sp,char * sfn_pl,int rec_index)3296  static void mlxsw_sp_fdb_notify_rec_process(struct mlxsw_sp *mlxsw_sp,
3297  					    char *sfn_pl, int rec_index)
3298  {
3299  	switch (mlxsw_reg_sfn_rec_type_get(sfn_pl, rec_index)) {
3300  	case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC:
3301  		mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
3302  						rec_index, true);
3303  		break;
3304  	case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC:
3305  		mlxsw_sp_fdb_notify_mac_process(mlxsw_sp, sfn_pl,
3306  						rec_index, false);
3307  		break;
3308  	case MLXSW_REG_SFN_REC_TYPE_LEARNED_MAC_LAG:
3309  		mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
3310  						    rec_index, true);
3311  		break;
3312  	case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_MAC_LAG:
3313  		mlxsw_sp_fdb_notify_mac_lag_process(mlxsw_sp, sfn_pl,
3314  						    rec_index, false);
3315  		break;
3316  	case MLXSW_REG_SFN_REC_TYPE_LEARNED_UNICAST_TUNNEL:
3317  		mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, sfn_pl,
3318  							  rec_index, true);
3319  		break;
3320  	case MLXSW_REG_SFN_REC_TYPE_AGED_OUT_UNICAST_TUNNEL:
3321  		mlxsw_sp_fdb_notify_mac_uc_tunnel_process(mlxsw_sp, sfn_pl,
3322  							  rec_index, false);
3323  		break;
3324  	}
3325  }
3326  
3327  #define MLXSW_SP_FDB_SFN_QUERIES_PER_SESSION 10
3328  
mlxsw_sp_fdb_notify_work(struct work_struct * work)3329  static void mlxsw_sp_fdb_notify_work(struct work_struct *work)
3330  {
3331  	struct mlxsw_sp_bridge *bridge;
3332  	struct mlxsw_sp *mlxsw_sp;
3333  	bool reschedule = false;
3334  	char *sfn_pl;
3335  	int queries;
3336  	u8 num_rec;
3337  	int i;
3338  	int err;
3339  
3340  	sfn_pl = kmalloc(MLXSW_REG_SFN_LEN, GFP_KERNEL);
3341  	if (!sfn_pl)
3342  		return;
3343  
3344  	bridge = container_of(work, struct mlxsw_sp_bridge, fdb_notify.dw.work);
3345  	mlxsw_sp = bridge->mlxsw_sp;
3346  
3347  	rtnl_lock();
3348  	if (list_empty(&bridge->bridges_list))
3349  		goto out;
3350  	reschedule = true;
3351  	queries = MLXSW_SP_FDB_SFN_QUERIES_PER_SESSION;
3352  	while (queries > 0) {
3353  		mlxsw_reg_sfn_pack(sfn_pl);
3354  		err = mlxsw_reg_query(mlxsw_sp->core, MLXSW_REG(sfn), sfn_pl);
3355  		if (err) {
3356  			dev_err_ratelimited(mlxsw_sp->bus_info->dev, "Failed to get FDB notifications\n");
3357  			goto out;
3358  		}
3359  		num_rec = mlxsw_reg_sfn_num_rec_get(sfn_pl);
3360  		for (i = 0; i < num_rec; i++)
3361  			mlxsw_sp_fdb_notify_rec_process(mlxsw_sp, sfn_pl, i);
3362  		if (num_rec != MLXSW_REG_SFN_REC_MAX_COUNT)
3363  			goto out;
3364  		queries--;
3365  	}
3366  
3367  out:
3368  	rtnl_unlock();
3369  	kfree(sfn_pl);
3370  	if (!reschedule)
3371  		return;
3372  	mlxsw_sp_fdb_notify_work_schedule(mlxsw_sp, !queries);
3373  }
3374  
3375  struct mlxsw_sp_switchdev_event_work {
3376  	struct work_struct work;
3377  	netdevice_tracker dev_tracker;
3378  	union {
3379  		struct switchdev_notifier_fdb_info fdb_info;
3380  		struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info;
3381  	};
3382  	struct net_device *dev;
3383  	unsigned long event;
3384  };
3385  
3386  static void
mlxsw_sp_switchdev_bridge_vxlan_fdb_event(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_switchdev_event_work * switchdev_work,struct mlxsw_sp_fid * fid,__be32 vni)3387  mlxsw_sp_switchdev_bridge_vxlan_fdb_event(struct mlxsw_sp *mlxsw_sp,
3388  					  struct mlxsw_sp_switchdev_event_work *
3389  					  switchdev_work,
3390  					  struct mlxsw_sp_fid *fid, __be32 vni)
3391  {
3392  	struct switchdev_notifier_vxlan_fdb_info vxlan_fdb_info;
3393  	struct switchdev_notifier_fdb_info *fdb_info;
3394  	struct net_device *dev = switchdev_work->dev;
3395  	enum mlxsw_sp_l3proto proto;
3396  	union mlxsw_sp_l3addr addr;
3397  	int err;
3398  
3399  	fdb_info = &switchdev_work->fdb_info;
3400  	err = vxlan_fdb_find_uc(dev, fdb_info->addr, vni, &vxlan_fdb_info);
3401  	if (err)
3402  		return;
3403  
3404  	mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info.remote_ip,
3405  					      &proto, &addr);
3406  
3407  	switch (switchdev_work->event) {
3408  	case SWITCHDEV_FDB_ADD_TO_DEVICE:
3409  		err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp,
3410  						     vxlan_fdb_info.eth_addr,
3411  						     mlxsw_sp_fid_index(fid),
3412  						     proto, &addr, true, false);
3413  		if (err)
3414  			return;
3415  		vxlan_fdb_info.offloaded = true;
3416  		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3417  					 &vxlan_fdb_info.info, NULL);
3418  		mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3419  					    vxlan_fdb_info.eth_addr,
3420  					    fdb_info->vid, dev, true, false);
3421  		break;
3422  	case SWITCHDEV_FDB_DEL_TO_DEVICE:
3423  		err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp,
3424  						     vxlan_fdb_info.eth_addr,
3425  						     mlxsw_sp_fid_index(fid),
3426  						     proto, &addr, false,
3427  						     false);
3428  		vxlan_fdb_info.offloaded = false;
3429  		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3430  					 &vxlan_fdb_info.info, NULL);
3431  		break;
3432  	}
3433  }
3434  
3435  static void
mlxsw_sp_switchdev_bridge_nve_fdb_event(struct mlxsw_sp_switchdev_event_work * switchdev_work)3436  mlxsw_sp_switchdev_bridge_nve_fdb_event(struct mlxsw_sp_switchdev_event_work *
3437  					switchdev_work)
3438  {
3439  	struct mlxsw_sp_bridge_device *bridge_device;
3440  	struct net_device *dev = switchdev_work->dev;
3441  	struct net_device *br_dev;
3442  	struct mlxsw_sp *mlxsw_sp;
3443  	struct mlxsw_sp_fid *fid;
3444  	__be32 vni;
3445  	int err;
3446  
3447  	if (switchdev_work->event != SWITCHDEV_FDB_ADD_TO_DEVICE &&
3448  	    switchdev_work->event != SWITCHDEV_FDB_DEL_TO_DEVICE)
3449  		return;
3450  
3451  	if (switchdev_work->event == SWITCHDEV_FDB_ADD_TO_DEVICE &&
3452  	    (!switchdev_work->fdb_info.added_by_user ||
3453  	     switchdev_work->fdb_info.is_local))
3454  		return;
3455  
3456  	if (!netif_running(dev))
3457  		return;
3458  	br_dev = netdev_master_upper_dev_get(dev);
3459  	if (!br_dev)
3460  		return;
3461  	if (!netif_is_bridge_master(br_dev))
3462  		return;
3463  	mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3464  	if (!mlxsw_sp)
3465  		return;
3466  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3467  	if (!bridge_device)
3468  		return;
3469  
3470  	fid = bridge_device->ops->fid_lookup(bridge_device,
3471  					     switchdev_work->fdb_info.vid);
3472  	if (!fid)
3473  		return;
3474  
3475  	err = mlxsw_sp_fid_vni(fid, &vni);
3476  	if (err)
3477  		goto out;
3478  
3479  	mlxsw_sp_switchdev_bridge_vxlan_fdb_event(mlxsw_sp, switchdev_work, fid,
3480  						  vni);
3481  
3482  out:
3483  	mlxsw_sp_fid_put(fid);
3484  }
3485  
mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct * work)3486  static void mlxsw_sp_switchdev_bridge_fdb_event_work(struct work_struct *work)
3487  {
3488  	struct mlxsw_sp_switchdev_event_work *switchdev_work =
3489  		container_of(work, struct mlxsw_sp_switchdev_event_work, work);
3490  	struct net_device *dev = switchdev_work->dev;
3491  	struct switchdev_notifier_fdb_info *fdb_info;
3492  	struct mlxsw_sp_port *mlxsw_sp_port;
3493  	int err;
3494  
3495  	rtnl_lock();
3496  	if (netif_is_vxlan(dev)) {
3497  		mlxsw_sp_switchdev_bridge_nve_fdb_event(switchdev_work);
3498  		goto out;
3499  	}
3500  
3501  	mlxsw_sp_port = mlxsw_sp_port_dev_lower_find(dev);
3502  	if (!mlxsw_sp_port)
3503  		goto out;
3504  
3505  	switch (switchdev_work->event) {
3506  	case SWITCHDEV_FDB_ADD_TO_DEVICE:
3507  		fdb_info = &switchdev_work->fdb_info;
3508  		if (!fdb_info->added_by_user || fdb_info->is_local)
3509  			break;
3510  		err = mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, true);
3511  		if (err)
3512  			break;
3513  		mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3514  					    fdb_info->addr,
3515  					    fdb_info->vid, dev, true, false);
3516  		break;
3517  	case SWITCHDEV_FDB_DEL_TO_DEVICE:
3518  		fdb_info = &switchdev_work->fdb_info;
3519  		mlxsw_sp_port_fdb_set(mlxsw_sp_port, fdb_info, false);
3520  		break;
3521  	case SWITCHDEV_FDB_ADD_TO_BRIDGE:
3522  	case SWITCHDEV_FDB_DEL_TO_BRIDGE:
3523  		/* These events are only used to potentially update an existing
3524  		 * SPAN mirror.
3525  		 */
3526  		break;
3527  	}
3528  
3529  	mlxsw_sp_span_respin(mlxsw_sp_port->mlxsw_sp);
3530  
3531  out:
3532  	rtnl_unlock();
3533  	kfree(switchdev_work->fdb_info.addr);
3534  	netdev_put(dev, &switchdev_work->dev_tracker);
3535  	kfree(switchdev_work);
3536  }
3537  
3538  static void
mlxsw_sp_switchdev_vxlan_fdb_add(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_switchdev_event_work * switchdev_work)3539  mlxsw_sp_switchdev_vxlan_fdb_add(struct mlxsw_sp *mlxsw_sp,
3540  				 struct mlxsw_sp_switchdev_event_work *
3541  				 switchdev_work)
3542  {
3543  	struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3544  	struct mlxsw_sp_bridge_device *bridge_device;
3545  	struct net_device *dev = switchdev_work->dev;
3546  	enum mlxsw_sp_l3proto proto;
3547  	union mlxsw_sp_l3addr addr;
3548  	struct net_device *br_dev;
3549  	struct mlxsw_sp_fid *fid;
3550  	u16 vid;
3551  	int err;
3552  
3553  	vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
3554  	br_dev = netdev_master_upper_dev_get(dev);
3555  
3556  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3557  	if (!bridge_device)
3558  		return;
3559  
3560  	fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan_fdb_info->vni);
3561  	if (!fid)
3562  		return;
3563  
3564  	mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info->remote_ip,
3565  					      &proto, &addr);
3566  
3567  	if (is_zero_ether_addr(vxlan_fdb_info->eth_addr)) {
3568  		err = mlxsw_sp_nve_flood_ip_add(mlxsw_sp, fid, proto, &addr);
3569  		if (err) {
3570  			mlxsw_sp_fid_put(fid);
3571  			return;
3572  		}
3573  		vxlan_fdb_info->offloaded = true;
3574  		call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3575  					 &vxlan_fdb_info->info, NULL);
3576  		mlxsw_sp_fid_put(fid);
3577  		return;
3578  	}
3579  
3580  	/* The device has a single FDB table, whereas Linux has two - one
3581  	 * in the bridge driver and another in the VxLAN driver. We only
3582  	 * program an entry to the device if the MAC points to the VxLAN
3583  	 * device in the bridge's FDB table
3584  	 */
3585  	vid = bridge_device->ops->fid_vid(bridge_device, fid);
3586  	if (br_fdb_find_port(br_dev, vxlan_fdb_info->eth_addr, vid) != dev)
3587  		goto err_br_fdb_find;
3588  
3589  	err = mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, vxlan_fdb_info->eth_addr,
3590  					     mlxsw_sp_fid_index(fid), proto,
3591  					     &addr, true, false);
3592  	if (err)
3593  		goto err_fdb_tunnel_uc_op;
3594  	vxlan_fdb_info->offloaded = true;
3595  	call_switchdev_notifiers(SWITCHDEV_VXLAN_FDB_OFFLOADED, dev,
3596  				 &vxlan_fdb_info->info, NULL);
3597  	mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3598  				    vxlan_fdb_info->eth_addr, vid, dev, true,
3599  				    false);
3600  
3601  	mlxsw_sp_fid_put(fid);
3602  
3603  	return;
3604  
3605  err_fdb_tunnel_uc_op:
3606  err_br_fdb_find:
3607  	mlxsw_sp_fid_put(fid);
3608  }
3609  
3610  static void
mlxsw_sp_switchdev_vxlan_fdb_del(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_switchdev_event_work * switchdev_work)3611  mlxsw_sp_switchdev_vxlan_fdb_del(struct mlxsw_sp *mlxsw_sp,
3612  				 struct mlxsw_sp_switchdev_event_work *
3613  				 switchdev_work)
3614  {
3615  	struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3616  	struct mlxsw_sp_bridge_device *bridge_device;
3617  	struct net_device *dev = switchdev_work->dev;
3618  	struct net_device *br_dev = netdev_master_upper_dev_get(dev);
3619  	enum mlxsw_sp_l3proto proto;
3620  	union mlxsw_sp_l3addr addr;
3621  	struct mlxsw_sp_fid *fid;
3622  	u16 vid;
3623  
3624  	vxlan_fdb_info = &switchdev_work->vxlan_fdb_info;
3625  	if (!vxlan_fdb_info->offloaded)
3626  		return;
3627  
3628  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3629  	if (!bridge_device)
3630  		return;
3631  
3632  	fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vxlan_fdb_info->vni);
3633  	if (!fid)
3634  		return;
3635  
3636  	mlxsw_sp_switchdev_vxlan_addr_convert(&vxlan_fdb_info->remote_ip,
3637  					      &proto, &addr);
3638  
3639  	if (is_zero_ether_addr(vxlan_fdb_info->eth_addr)) {
3640  		mlxsw_sp_nve_flood_ip_del(mlxsw_sp, fid, proto, &addr);
3641  		mlxsw_sp_fid_put(fid);
3642  		return;
3643  	}
3644  
3645  	mlxsw_sp_port_fdb_tunnel_uc_op(mlxsw_sp, vxlan_fdb_info->eth_addr,
3646  				       mlxsw_sp_fid_index(fid), proto, &addr,
3647  				       false, false);
3648  	vid = bridge_device->ops->fid_vid(bridge_device, fid);
3649  	mlxsw_sp_fdb_call_notifiers(SWITCHDEV_FDB_OFFLOADED,
3650  				    vxlan_fdb_info->eth_addr, vid, dev, false,
3651  				    false);
3652  
3653  	mlxsw_sp_fid_put(fid);
3654  }
3655  
mlxsw_sp_switchdev_vxlan_fdb_event_work(struct work_struct * work)3656  static void mlxsw_sp_switchdev_vxlan_fdb_event_work(struct work_struct *work)
3657  {
3658  	struct mlxsw_sp_switchdev_event_work *switchdev_work =
3659  		container_of(work, struct mlxsw_sp_switchdev_event_work, work);
3660  	struct net_device *dev = switchdev_work->dev;
3661  	struct mlxsw_sp *mlxsw_sp;
3662  	struct net_device *br_dev;
3663  
3664  	rtnl_lock();
3665  
3666  	if (!netif_running(dev))
3667  		goto out;
3668  	br_dev = netdev_master_upper_dev_get(dev);
3669  	if (!br_dev)
3670  		goto out;
3671  	if (!netif_is_bridge_master(br_dev))
3672  		goto out;
3673  	mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3674  	if (!mlxsw_sp)
3675  		goto out;
3676  
3677  	switch (switchdev_work->event) {
3678  	case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE:
3679  		mlxsw_sp_switchdev_vxlan_fdb_add(mlxsw_sp, switchdev_work);
3680  		break;
3681  	case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE:
3682  		mlxsw_sp_switchdev_vxlan_fdb_del(mlxsw_sp, switchdev_work);
3683  		break;
3684  	}
3685  
3686  out:
3687  	rtnl_unlock();
3688  	netdev_put(dev, &switchdev_work->dev_tracker);
3689  	kfree(switchdev_work);
3690  }
3691  
3692  static int
mlxsw_sp_switchdev_vxlan_work_prepare(struct mlxsw_sp_switchdev_event_work * switchdev_work,struct switchdev_notifier_info * info)3693  mlxsw_sp_switchdev_vxlan_work_prepare(struct mlxsw_sp_switchdev_event_work *
3694  				      switchdev_work,
3695  				      struct switchdev_notifier_info *info)
3696  {
3697  	struct vxlan_dev *vxlan = netdev_priv(switchdev_work->dev);
3698  	struct switchdev_notifier_vxlan_fdb_info *vxlan_fdb_info;
3699  	struct vxlan_config *cfg = &vxlan->cfg;
3700  	struct netlink_ext_ack *extack;
3701  
3702  	extack = switchdev_notifier_info_to_extack(info);
3703  	vxlan_fdb_info = container_of(info,
3704  				      struct switchdev_notifier_vxlan_fdb_info,
3705  				      info);
3706  
3707  	if (vxlan_fdb_info->remote_port != cfg->dst_port) {
3708  		NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Non-default remote port is not supported");
3709  		return -EOPNOTSUPP;
3710  	}
3711  	if (vxlan_fdb_info->remote_vni != cfg->vni ||
3712  	    vxlan_fdb_info->vni != cfg->vni) {
3713  		NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Non-default VNI is not supported");
3714  		return -EOPNOTSUPP;
3715  	}
3716  	if (vxlan_fdb_info->remote_ifindex) {
3717  		NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Local interface is not supported");
3718  		return -EOPNOTSUPP;
3719  	}
3720  	if (is_multicast_ether_addr(vxlan_fdb_info->eth_addr)) {
3721  		NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Multicast MAC addresses not supported");
3722  		return -EOPNOTSUPP;
3723  	}
3724  	if (vxlan_addr_multicast(&vxlan_fdb_info->remote_ip)) {
3725  		NL_SET_ERR_MSG_MOD(extack, "VxLAN: FDB: Multicast destination IP is not supported");
3726  		return -EOPNOTSUPP;
3727  	}
3728  
3729  	switchdev_work->vxlan_fdb_info = *vxlan_fdb_info;
3730  
3731  	return 0;
3732  }
3733  
3734  /* Called under rcu_read_lock() */
mlxsw_sp_switchdev_event(struct notifier_block * unused,unsigned long event,void * ptr)3735  static int mlxsw_sp_switchdev_event(struct notifier_block *unused,
3736  				    unsigned long event, void *ptr)
3737  {
3738  	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
3739  	struct mlxsw_sp_switchdev_event_work *switchdev_work;
3740  	struct switchdev_notifier_fdb_info *fdb_info;
3741  	struct switchdev_notifier_info *info = ptr;
3742  	struct net_device *br_dev;
3743  	int err;
3744  
3745  	if (event == SWITCHDEV_PORT_ATTR_SET) {
3746  		err = switchdev_handle_port_attr_set(dev, ptr,
3747  						     mlxsw_sp_port_dev_check,
3748  						     mlxsw_sp_port_attr_set);
3749  		return notifier_from_errno(err);
3750  	}
3751  
3752  	/* Tunnel devices are not our uppers, so check their master instead */
3753  	br_dev = netdev_master_upper_dev_get_rcu(dev);
3754  	if (!br_dev)
3755  		return NOTIFY_DONE;
3756  	if (!netif_is_bridge_master(br_dev))
3757  		return NOTIFY_DONE;
3758  	if (!mlxsw_sp_port_dev_lower_find_rcu(br_dev))
3759  		return NOTIFY_DONE;
3760  
3761  	switchdev_work = kzalloc(sizeof(*switchdev_work), GFP_ATOMIC);
3762  	if (!switchdev_work)
3763  		return NOTIFY_BAD;
3764  
3765  	switchdev_work->dev = dev;
3766  	switchdev_work->event = event;
3767  
3768  	switch (event) {
3769  	case SWITCHDEV_FDB_ADD_TO_DEVICE:
3770  	case SWITCHDEV_FDB_DEL_TO_DEVICE:
3771  	case SWITCHDEV_FDB_ADD_TO_BRIDGE:
3772  	case SWITCHDEV_FDB_DEL_TO_BRIDGE:
3773  		fdb_info = container_of(info,
3774  					struct switchdev_notifier_fdb_info,
3775  					info);
3776  		INIT_WORK(&switchdev_work->work,
3777  			  mlxsw_sp_switchdev_bridge_fdb_event_work);
3778  		memcpy(&switchdev_work->fdb_info, ptr,
3779  		       sizeof(switchdev_work->fdb_info));
3780  		switchdev_work->fdb_info.addr = kzalloc(ETH_ALEN, GFP_ATOMIC);
3781  		if (!switchdev_work->fdb_info.addr)
3782  			goto err_addr_alloc;
3783  		ether_addr_copy((u8 *)switchdev_work->fdb_info.addr,
3784  				fdb_info->addr);
3785  		/* Take a reference on the device. This can be either
3786  		 * upper device containig mlxsw_sp_port or just a
3787  		 * mlxsw_sp_port
3788  		 */
3789  		netdev_hold(dev, &switchdev_work->dev_tracker, GFP_ATOMIC);
3790  		break;
3791  	case SWITCHDEV_VXLAN_FDB_ADD_TO_DEVICE:
3792  	case SWITCHDEV_VXLAN_FDB_DEL_TO_DEVICE:
3793  		INIT_WORK(&switchdev_work->work,
3794  			  mlxsw_sp_switchdev_vxlan_fdb_event_work);
3795  		err = mlxsw_sp_switchdev_vxlan_work_prepare(switchdev_work,
3796  							    info);
3797  		if (err)
3798  			goto err_vxlan_work_prepare;
3799  		netdev_hold(dev, &switchdev_work->dev_tracker, GFP_ATOMIC);
3800  		break;
3801  	default:
3802  		kfree(switchdev_work);
3803  		return NOTIFY_DONE;
3804  	}
3805  
3806  	mlxsw_core_schedule_work(&switchdev_work->work);
3807  
3808  	return NOTIFY_DONE;
3809  
3810  err_vxlan_work_prepare:
3811  err_addr_alloc:
3812  	kfree(switchdev_work);
3813  	return NOTIFY_BAD;
3814  }
3815  
3816  struct notifier_block mlxsw_sp_switchdev_notifier = {
3817  	.notifier_call = mlxsw_sp_switchdev_event,
3818  };
3819  
3820  static int
mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid,bool flag_untagged,bool flag_pvid,struct netlink_ext_ack * extack)3821  mlxsw_sp_switchdev_vxlan_vlan_add(struct mlxsw_sp *mlxsw_sp,
3822  				  struct mlxsw_sp_bridge_device *bridge_device,
3823  				  const struct net_device *vxlan_dev, u16 vid,
3824  				  bool flag_untagged, bool flag_pvid,
3825  				  struct netlink_ext_ack *extack)
3826  {
3827  	struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
3828  	__be32 vni = vxlan->cfg.vni;
3829  	struct mlxsw_sp_fid *fid;
3830  	u16 old_vid;
3831  	int err;
3832  
3833  	/* We cannot have the same VLAN as PVID and egress untagged on multiple
3834  	 * VxLAN devices. Note that we get this notification before the VLAN is
3835  	 * actually added to the bridge's database, so it is not possible for
3836  	 * the lookup function to return 'vxlan_dev'
3837  	 */
3838  	if (flag_untagged && flag_pvid &&
3839  	    mlxsw_sp_bridge_8021q_vxlan_dev_find(bridge_device->dev, vid)) {
3840  		NL_SET_ERR_MSG_MOD(extack, "VLAN already mapped to a different VNI");
3841  		return -EINVAL;
3842  	}
3843  
3844  	if (!netif_running(vxlan_dev))
3845  		return 0;
3846  
3847  	/* First case: FID is not associated with this VNI, but the new VLAN
3848  	 * is both PVID and egress untagged. Need to enable NVE on the FID, if
3849  	 * it exists
3850  	 */
3851  	fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vni);
3852  	if (!fid) {
3853  		if (!flag_untagged || !flag_pvid)
3854  			return 0;
3855  		return bridge_device->ops->vxlan_join(bridge_device, vxlan_dev,
3856  						      vid, extack);
3857  	}
3858  
3859  	/* Second case: FID is associated with the VNI and the VLAN associated
3860  	 * with the FID is the same as the notified VLAN. This means the flags
3861  	 * (PVID / egress untagged) were toggled and that NVE should be
3862  	 * disabled on the FID
3863  	 */
3864  	old_vid = mlxsw_sp_fid_8021q_vid(fid);
3865  	if (vid == old_vid) {
3866  		if (WARN_ON(flag_untagged && flag_pvid)) {
3867  			mlxsw_sp_fid_put(fid);
3868  			return -EINVAL;
3869  		}
3870  		mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3871  		mlxsw_sp_fid_put(fid);
3872  		return 0;
3873  	}
3874  
3875  	/* Third case: A new VLAN was configured on the VxLAN device, but this
3876  	 * VLAN is not PVID, so there is nothing to do.
3877  	 */
3878  	if (!flag_pvid) {
3879  		mlxsw_sp_fid_put(fid);
3880  		return 0;
3881  	}
3882  
3883  	/* Fourth case: Thew new VLAN is PVID, which means the VLAN currently
3884  	 * mapped to the VNI should be unmapped
3885  	 */
3886  	mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3887  	mlxsw_sp_fid_put(fid);
3888  
3889  	/* Fifth case: The new VLAN is also egress untagged, which means the
3890  	 * VLAN needs to be mapped to the VNI
3891  	 */
3892  	if (!flag_untagged)
3893  		return 0;
3894  
3895  	err = bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, vid, extack);
3896  	if (err)
3897  		goto err_vxlan_join;
3898  
3899  	return 0;
3900  
3901  err_vxlan_join:
3902  	bridge_device->ops->vxlan_join(bridge_device, vxlan_dev, old_vid, NULL);
3903  	return err;
3904  }
3905  
3906  static void
mlxsw_sp_switchdev_vxlan_vlan_del(struct mlxsw_sp * mlxsw_sp,struct mlxsw_sp_bridge_device * bridge_device,const struct net_device * vxlan_dev,u16 vid)3907  mlxsw_sp_switchdev_vxlan_vlan_del(struct mlxsw_sp *mlxsw_sp,
3908  				  struct mlxsw_sp_bridge_device *bridge_device,
3909  				  const struct net_device *vxlan_dev, u16 vid)
3910  {
3911  	struct vxlan_dev *vxlan = netdev_priv(vxlan_dev);
3912  	__be32 vni = vxlan->cfg.vni;
3913  	struct mlxsw_sp_fid *fid;
3914  
3915  	if (!netif_running(vxlan_dev))
3916  		return;
3917  
3918  	fid = mlxsw_sp_fid_lookup_by_vni(mlxsw_sp, vni);
3919  	if (!fid)
3920  		return;
3921  
3922  	/* A different VLAN than the one mapped to the VNI is deleted */
3923  	if (mlxsw_sp_fid_8021q_vid(fid) != vid)
3924  		goto out;
3925  
3926  	mlxsw_sp_bridge_vxlan_leave(mlxsw_sp, vxlan_dev);
3927  
3928  out:
3929  	mlxsw_sp_fid_put(fid);
3930  }
3931  
3932  static int
mlxsw_sp_switchdev_vxlan_vlans_add(struct net_device * vxlan_dev,struct switchdev_notifier_port_obj_info * port_obj_info)3933  mlxsw_sp_switchdev_vxlan_vlans_add(struct net_device *vxlan_dev,
3934  				   struct switchdev_notifier_port_obj_info *
3935  				   port_obj_info)
3936  {
3937  	struct switchdev_obj_port_vlan *vlan =
3938  		SWITCHDEV_OBJ_PORT_VLAN(port_obj_info->obj);
3939  	bool flag_untagged = vlan->flags & BRIDGE_VLAN_INFO_UNTAGGED;
3940  	bool flag_pvid = vlan->flags & BRIDGE_VLAN_INFO_PVID;
3941  	struct mlxsw_sp_bridge_device *bridge_device;
3942  	struct netlink_ext_ack *extack;
3943  	struct mlxsw_sp *mlxsw_sp;
3944  	struct net_device *br_dev;
3945  
3946  	extack = switchdev_notifier_info_to_extack(&port_obj_info->info);
3947  	br_dev = netdev_master_upper_dev_get(vxlan_dev);
3948  	if (!br_dev)
3949  		return 0;
3950  
3951  	mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3952  	if (!mlxsw_sp)
3953  		return 0;
3954  
3955  	port_obj_info->handled = true;
3956  
3957  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3958  	if (!bridge_device)
3959  		return -EINVAL;
3960  
3961  	if (!bridge_device->vlan_enabled)
3962  		return 0;
3963  
3964  	return mlxsw_sp_switchdev_vxlan_vlan_add(mlxsw_sp, bridge_device,
3965  						 vxlan_dev, vlan->vid,
3966  						 flag_untagged,
3967  						 flag_pvid, extack);
3968  }
3969  
3970  static void
mlxsw_sp_switchdev_vxlan_vlans_del(struct net_device * vxlan_dev,struct switchdev_notifier_port_obj_info * port_obj_info)3971  mlxsw_sp_switchdev_vxlan_vlans_del(struct net_device *vxlan_dev,
3972  				   struct switchdev_notifier_port_obj_info *
3973  				   port_obj_info)
3974  {
3975  	struct switchdev_obj_port_vlan *vlan =
3976  		SWITCHDEV_OBJ_PORT_VLAN(port_obj_info->obj);
3977  	struct mlxsw_sp_bridge_device *bridge_device;
3978  	struct mlxsw_sp *mlxsw_sp;
3979  	struct net_device *br_dev;
3980  
3981  	br_dev = netdev_master_upper_dev_get(vxlan_dev);
3982  	if (!br_dev)
3983  		return;
3984  
3985  	mlxsw_sp = mlxsw_sp_lower_get(br_dev);
3986  	if (!mlxsw_sp)
3987  		return;
3988  
3989  	port_obj_info->handled = true;
3990  
3991  	bridge_device = mlxsw_sp_bridge_device_find(mlxsw_sp->bridge, br_dev);
3992  	if (!bridge_device)
3993  		return;
3994  
3995  	if (!bridge_device->vlan_enabled)
3996  		return;
3997  
3998  	mlxsw_sp_switchdev_vxlan_vlan_del(mlxsw_sp, bridge_device, vxlan_dev,
3999  					  vlan->vid);
4000  }
4001  
4002  static int
mlxsw_sp_switchdev_handle_vxlan_obj_add(struct net_device * vxlan_dev,struct switchdev_notifier_port_obj_info * port_obj_info)4003  mlxsw_sp_switchdev_handle_vxlan_obj_add(struct net_device *vxlan_dev,
4004  					struct switchdev_notifier_port_obj_info *
4005  					port_obj_info)
4006  {
4007  	int err = 0;
4008  
4009  	switch (port_obj_info->obj->id) {
4010  	case SWITCHDEV_OBJ_ID_PORT_VLAN:
4011  		err = mlxsw_sp_switchdev_vxlan_vlans_add(vxlan_dev,
4012  							 port_obj_info);
4013  		break;
4014  	default:
4015  		break;
4016  	}
4017  
4018  	return err;
4019  }
4020  
4021  static void
mlxsw_sp_switchdev_handle_vxlan_obj_del(struct net_device * vxlan_dev,struct switchdev_notifier_port_obj_info * port_obj_info)4022  mlxsw_sp_switchdev_handle_vxlan_obj_del(struct net_device *vxlan_dev,
4023  					struct switchdev_notifier_port_obj_info *
4024  					port_obj_info)
4025  {
4026  	switch (port_obj_info->obj->id) {
4027  	case SWITCHDEV_OBJ_ID_PORT_VLAN:
4028  		mlxsw_sp_switchdev_vxlan_vlans_del(vxlan_dev, port_obj_info);
4029  		break;
4030  	default:
4031  		break;
4032  	}
4033  }
4034  
mlxsw_sp_switchdev_blocking_event(struct notifier_block * unused,unsigned long event,void * ptr)4035  static int mlxsw_sp_switchdev_blocking_event(struct notifier_block *unused,
4036  					     unsigned long event, void *ptr)
4037  {
4038  	struct net_device *dev = switchdev_notifier_info_to_dev(ptr);
4039  	int err = 0;
4040  
4041  	switch (event) {
4042  	case SWITCHDEV_PORT_OBJ_ADD:
4043  		if (netif_is_vxlan(dev))
4044  			err = mlxsw_sp_switchdev_handle_vxlan_obj_add(dev, ptr);
4045  		else
4046  			err = switchdev_handle_port_obj_add(dev, ptr,
4047  							mlxsw_sp_port_dev_check,
4048  							mlxsw_sp_port_obj_add);
4049  		return notifier_from_errno(err);
4050  	case SWITCHDEV_PORT_OBJ_DEL:
4051  		if (netif_is_vxlan(dev))
4052  			mlxsw_sp_switchdev_handle_vxlan_obj_del(dev, ptr);
4053  		else
4054  			err = switchdev_handle_port_obj_del(dev, ptr,
4055  							mlxsw_sp_port_dev_check,
4056  							mlxsw_sp_port_obj_del);
4057  		return notifier_from_errno(err);
4058  	case SWITCHDEV_PORT_ATTR_SET:
4059  		err = switchdev_handle_port_attr_set(dev, ptr,
4060  						     mlxsw_sp_port_dev_check,
4061  						     mlxsw_sp_port_attr_set);
4062  		return notifier_from_errno(err);
4063  	}
4064  
4065  	return NOTIFY_DONE;
4066  }
4067  
4068  static struct notifier_block mlxsw_sp_switchdev_blocking_notifier = {
4069  	.notifier_call = mlxsw_sp_switchdev_blocking_event,
4070  };
4071  
4072  u8
mlxsw_sp_bridge_port_stp_state(struct mlxsw_sp_bridge_port * bridge_port)4073  mlxsw_sp_bridge_port_stp_state(struct mlxsw_sp_bridge_port *bridge_port)
4074  {
4075  	return bridge_port->stp_state;
4076  }
4077  
mlxsw_sp_fdb_init(struct mlxsw_sp * mlxsw_sp)4078  static int mlxsw_sp_fdb_init(struct mlxsw_sp *mlxsw_sp)
4079  {
4080  	struct mlxsw_sp_bridge *bridge = mlxsw_sp->bridge;
4081  	struct notifier_block *nb;
4082  	int err;
4083  
4084  	err = mlxsw_sp_ageing_set(mlxsw_sp, MLXSW_SP_DEFAULT_AGEING_TIME);
4085  	if (err) {
4086  		dev_err(mlxsw_sp->bus_info->dev, "Failed to set default ageing time\n");
4087  		return err;
4088  	}
4089  
4090  	err = register_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
4091  	if (err) {
4092  		dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev notifier\n");
4093  		return err;
4094  	}
4095  
4096  	nb = &mlxsw_sp_switchdev_blocking_notifier;
4097  	err = register_switchdev_blocking_notifier(nb);
4098  	if (err) {
4099  		dev_err(mlxsw_sp->bus_info->dev, "Failed to register switchdev blocking notifier\n");
4100  		goto err_register_switchdev_blocking_notifier;
4101  	}
4102  
4103  	INIT_DELAYED_WORK(&bridge->fdb_notify.dw, mlxsw_sp_fdb_notify_work);
4104  	bridge->fdb_notify.interval = MLXSW_SP_DEFAULT_LEARNING_INTERVAL;
4105  	return 0;
4106  
4107  err_register_switchdev_blocking_notifier:
4108  	unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
4109  	return err;
4110  }
4111  
mlxsw_sp_fdb_fini(struct mlxsw_sp * mlxsw_sp)4112  static void mlxsw_sp_fdb_fini(struct mlxsw_sp *mlxsw_sp)
4113  {
4114  	struct notifier_block *nb;
4115  
4116  	cancel_delayed_work_sync(&mlxsw_sp->bridge->fdb_notify.dw);
4117  
4118  	nb = &mlxsw_sp_switchdev_blocking_notifier;
4119  	unregister_switchdev_blocking_notifier(nb);
4120  
4121  	unregister_switchdev_notifier(&mlxsw_sp_switchdev_notifier);
4122  }
4123  
mlxsw_sp1_switchdev_init(struct mlxsw_sp * mlxsw_sp)4124  static void mlxsw_sp1_switchdev_init(struct mlxsw_sp *mlxsw_sp)
4125  {
4126  	mlxsw_sp->bridge->bridge_8021ad_ops = &mlxsw_sp1_bridge_8021ad_ops;
4127  }
4128  
4129  const struct mlxsw_sp_switchdev_ops mlxsw_sp1_switchdev_ops = {
4130  	.init	= mlxsw_sp1_switchdev_init,
4131  };
4132  
mlxsw_sp2_switchdev_init(struct mlxsw_sp * mlxsw_sp)4133  static void mlxsw_sp2_switchdev_init(struct mlxsw_sp *mlxsw_sp)
4134  {
4135  	mlxsw_sp->bridge->bridge_8021ad_ops = &mlxsw_sp2_bridge_8021ad_ops;
4136  }
4137  
4138  const struct mlxsw_sp_switchdev_ops mlxsw_sp2_switchdev_ops = {
4139  	.init	= mlxsw_sp2_switchdev_init,
4140  };
4141  
mlxsw_sp_switchdev_init(struct mlxsw_sp * mlxsw_sp)4142  int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp)
4143  {
4144  	struct mlxsw_sp_bridge *bridge;
4145  
4146  	bridge = kzalloc(sizeof(*mlxsw_sp->bridge), GFP_KERNEL);
4147  	if (!bridge)
4148  		return -ENOMEM;
4149  	mlxsw_sp->bridge = bridge;
4150  	bridge->mlxsw_sp = mlxsw_sp;
4151  
4152  	INIT_LIST_HEAD(&mlxsw_sp->bridge->bridges_list);
4153  
4154  	bridge->bridge_8021q_ops = &mlxsw_sp_bridge_8021q_ops;
4155  	bridge->bridge_8021d_ops = &mlxsw_sp_bridge_8021d_ops;
4156  
4157  	mlxsw_sp->switchdev_ops->init(mlxsw_sp);
4158  
4159  	return mlxsw_sp_fdb_init(mlxsw_sp);
4160  }
4161  
mlxsw_sp_switchdev_fini(struct mlxsw_sp * mlxsw_sp)4162  void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp)
4163  {
4164  	mlxsw_sp_fdb_fini(mlxsw_sp);
4165  	WARN_ON(!list_empty(&mlxsw_sp->bridge->bridges_list));
4166  	kfree(mlxsw_sp->bridge);
4167  }
4168  
4169