xref: /linux/drivers/net/ethernet/mellanox/mlxsw/spectrum.h (revision 02ff58dcf70ad7d11b01523dc404166ed11021da)
1 /* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
2 /* Copyright (c) 2015-2018 Mellanox Technologies. All rights reserved */
3 
4 #ifndef _MLXSW_SPECTRUM_H
5 #define _MLXSW_SPECTRUM_H
6 
7 #include <linux/types.h>
8 #include <linux/netdevice.h>
9 #include <linux/rhashtable.h>
10 #include <linux/bitops.h>
11 #include <linux/if_bridge.h>
12 #include <linux/if_vlan.h>
13 #include <linux/list.h>
14 #include <linux/dcbnl.h>
15 #include <linux/in6.h>
16 #include <linux/notifier.h>
17 #include <net/psample.h>
18 #include <net/pkt_cls.h>
19 #include <net/red.h>
20 #include <net/vxlan.h>
21 
22 #include "port.h"
23 #include "core.h"
24 #include "core_acl_flex_keys.h"
25 #include "core_acl_flex_actions.h"
26 #include "reg.h"
27 
28 #define MLXSW_SP_FID_8021D_MAX 1024
29 
30 #define MLXSW_SP_MID_MAX 7000
31 
32 #define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
33 
34 #define MLXSW_SP_PORT_BASE_SPEED 25000	/* Mb/s */
35 
36 #define MLXSW_SP_KVD_LINEAR_SIZE 98304 /* entries */
37 #define MLXSW_SP_KVD_GRANULARITY 128
38 
39 #define MLXSW_SP_RESOURCE_NAME_KVD "kvd"
40 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR "linear"
41 #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_SINGLE "hash_single"
42 #define MLXSW_SP_RESOURCE_NAME_KVD_HASH_DOUBLE "hash_double"
43 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_SINGLES "singles"
44 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_CHUNKS "chunks"
45 #define MLXSW_SP_RESOURCE_NAME_KVD_LINEAR_LARGE_CHUNKS "large_chunks"
46 
47 enum mlxsw_sp_resource_id {
48 	MLXSW_SP_RESOURCE_KVD = 1,
49 	MLXSW_SP_RESOURCE_KVD_LINEAR,
50 	MLXSW_SP_RESOURCE_KVD_HASH_SINGLE,
51 	MLXSW_SP_RESOURCE_KVD_HASH_DOUBLE,
52 	MLXSW_SP_RESOURCE_KVD_LINEAR_SINGLE,
53 	MLXSW_SP_RESOURCE_KVD_LINEAR_CHUNKS,
54 	MLXSW_SP_RESOURCE_KVD_LINEAR_LARGE_CHUNKS,
55 };
56 
57 struct mlxsw_sp_port;
58 struct mlxsw_sp_rif;
59 struct mlxsw_sp_span_entry;
60 enum mlxsw_sp_l3proto;
61 union mlxsw_sp_l3addr;
62 
63 struct mlxsw_sp_upper {
64 	struct net_device *dev;
65 	unsigned int ref_count;
66 };
67 
68 enum mlxsw_sp_rif_type {
69 	MLXSW_SP_RIF_TYPE_SUBPORT,
70 	MLXSW_SP_RIF_TYPE_VLAN,
71 	MLXSW_SP_RIF_TYPE_FID,
72 	MLXSW_SP_RIF_TYPE_IPIP_LB, /* IP-in-IP loopback. */
73 	MLXSW_SP_RIF_TYPE_MAX,
74 };
75 
76 enum mlxsw_sp_fid_type {
77 	MLXSW_SP_FID_TYPE_8021Q,
78 	MLXSW_SP_FID_TYPE_8021D,
79 	MLXSW_SP_FID_TYPE_RFID,
80 	MLXSW_SP_FID_TYPE_DUMMY,
81 	MLXSW_SP_FID_TYPE_MAX,
82 };
83 
84 enum mlxsw_sp_nve_type {
85 	MLXSW_SP_NVE_TYPE_VXLAN,
86 };
87 
88 struct mlxsw_sp_mid {
89 	struct list_head list;
90 	unsigned char addr[ETH_ALEN];
91 	u16 fid;
92 	u16 mid;
93 	bool in_hw;
94 	unsigned long *ports_in_mid; /* bits array */
95 };
96 
97 enum mlxsw_sp_port_mall_action_type {
98 	MLXSW_SP_PORT_MALL_MIRROR,
99 	MLXSW_SP_PORT_MALL_SAMPLE,
100 };
101 
102 struct mlxsw_sp_port_mall_mirror_tc_entry {
103 	int span_id;
104 	bool ingress;
105 };
106 
107 struct mlxsw_sp_port_mall_tc_entry {
108 	struct list_head list;
109 	unsigned long cookie;
110 	enum mlxsw_sp_port_mall_action_type type;
111 	union {
112 		struct mlxsw_sp_port_mall_mirror_tc_entry mirror;
113 	};
114 };
115 
116 struct mlxsw_sp_sb;
117 struct mlxsw_sp_bridge;
118 struct mlxsw_sp_router;
119 struct mlxsw_sp_mr;
120 struct mlxsw_sp_acl;
121 struct mlxsw_sp_counter_pool;
122 struct mlxsw_sp_fid_core;
123 struct mlxsw_sp_kvdl;
124 struct mlxsw_sp_nve;
125 struct mlxsw_sp_kvdl_ops;
126 struct mlxsw_sp_mr_tcam_ops;
127 struct mlxsw_sp_acl_tcam_ops;
128 struct mlxsw_sp_nve_ops;
129 
130 struct mlxsw_sp {
131 	struct mlxsw_sp_port **ports;
132 	struct mlxsw_core *core;
133 	const struct mlxsw_bus_info *bus_info;
134 	unsigned char base_mac[ETH_ALEN];
135 	struct mlxsw_sp_upper *lags;
136 	int *port_to_module;
137 	struct mlxsw_sp_sb *sb;
138 	struct mlxsw_sp_bridge *bridge;
139 	struct mlxsw_sp_router *router;
140 	struct mlxsw_sp_mr *mr;
141 	struct mlxsw_afa *afa;
142 	struct mlxsw_sp_acl *acl;
143 	struct mlxsw_sp_fid_core *fid_core;
144 	struct mlxsw_sp_kvdl *kvdl;
145 	struct mlxsw_sp_nve *nve;
146 	struct notifier_block netdevice_nb;
147 
148 	struct mlxsw_sp_counter_pool *counter_pool;
149 	struct {
150 		struct mlxsw_sp_span_entry *entries;
151 		int entries_count;
152 	} span;
153 	const struct mlxsw_fw_rev *req_rev;
154 	const char *fw_filename;
155 	const struct mlxsw_sp_kvdl_ops *kvdl_ops;
156 	const struct mlxsw_afa_ops *afa_ops;
157 	const struct mlxsw_afk_ops *afk_ops;
158 	const struct mlxsw_sp_mr_tcam_ops *mr_tcam_ops;
159 	const struct mlxsw_sp_acl_tcam_ops *acl_tcam_ops;
160 	const struct mlxsw_sp_nve_ops **nve_ops_arr;
161 };
162 
163 static inline struct mlxsw_sp_upper *
164 mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
165 {
166 	return &mlxsw_sp->lags[lag_id];
167 }
168 
169 struct mlxsw_sp_port_pcpu_stats {
170 	u64			rx_packets;
171 	u64			rx_bytes;
172 	u64			tx_packets;
173 	u64			tx_bytes;
174 	struct u64_stats_sync	syncp;
175 	u32			tx_dropped;
176 };
177 
178 struct mlxsw_sp_port_sample {
179 	struct psample_group __rcu *psample_group;
180 	u32 trunc_size;
181 	u32 rate;
182 	bool truncate;
183 };
184 
185 struct mlxsw_sp_bridge_port;
186 struct mlxsw_sp_fid;
187 
188 struct mlxsw_sp_port_vlan {
189 	struct list_head list;
190 	struct mlxsw_sp_port *mlxsw_sp_port;
191 	struct mlxsw_sp_fid *fid;
192 	unsigned int ref_count;
193 	u16 vid;
194 	struct mlxsw_sp_bridge_port *bridge_port;
195 	struct list_head bridge_vlan_node;
196 };
197 
198 /* No need an internal lock; At worse - miss a single periodic iteration */
199 struct mlxsw_sp_port_xstats {
200 	u64 ecn;
201 	u64 wred_drop[TC_MAX_QUEUE];
202 	u64 tail_drop[TC_MAX_QUEUE];
203 	u64 backlog[TC_MAX_QUEUE];
204 	u64 tx_bytes[IEEE_8021QAZ_MAX_TCS];
205 	u64 tx_packets[IEEE_8021QAZ_MAX_TCS];
206 };
207 
208 struct mlxsw_sp_port {
209 	struct net_device *dev;
210 	struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
211 	struct mlxsw_sp *mlxsw_sp;
212 	u8 local_port;
213 	u8 lagged:1,
214 	   split:1;
215 	u16 pvid;
216 	u16 lag_id;
217 	struct {
218 		u8 tx_pause:1,
219 		   rx_pause:1,
220 		   autoneg:1;
221 	} link;
222 	struct {
223 		struct ieee_ets *ets;
224 		struct ieee_maxrate *maxrate;
225 		struct ieee_pfc *pfc;
226 		enum mlxsw_reg_qpts_trust_state trust_state;
227 	} dcb;
228 	struct {
229 		u8 module;
230 		u8 width;
231 		u8 lane;
232 	} mapping;
233 	/* TC handles */
234 	struct list_head mall_tc_list;
235 	struct {
236 		#define MLXSW_HW_STATS_UPDATE_TIME HZ
237 		struct rtnl_link_stats64 stats;
238 		struct mlxsw_sp_port_xstats xstats;
239 		struct delayed_work update_dw;
240 	} periodic_hw_stats;
241 	struct mlxsw_sp_port_sample *sample;
242 	struct list_head vlans_list;
243 	struct mlxsw_sp_qdisc *root_qdisc;
244 	struct mlxsw_sp_qdisc *tclass_qdiscs;
245 	unsigned acl_rule_count;
246 	struct mlxsw_sp_acl_block *ing_acl_block;
247 	struct mlxsw_sp_acl_block *eg_acl_block;
248 };
249 
250 static inline struct net_device *
251 mlxsw_sp_bridge_vxlan_dev_find(struct net_device *br_dev)
252 {
253 	struct net_device *dev;
254 	struct list_head *iter;
255 
256 	netdev_for_each_lower_dev(br_dev, dev, iter) {
257 		if (netif_is_vxlan(dev))
258 			return dev;
259 	}
260 
261 	return NULL;
262 }
263 
264 static inline bool mlxsw_sp_bridge_has_vxlan(struct net_device *br_dev)
265 {
266 	return !!mlxsw_sp_bridge_vxlan_dev_find(br_dev);
267 }
268 
269 static inline int
270 mlxsw_sp_vxlan_mapped_vid(const struct net_device *vxlan_dev, u16 *p_vid)
271 {
272 	struct bridge_vlan_info vinfo;
273 	u16 vid = 0;
274 	int err;
275 
276 	err = br_vlan_get_pvid(vxlan_dev, &vid);
277 	if (err || !vid)
278 		goto out;
279 
280 	err = br_vlan_get_info(vxlan_dev, vid, &vinfo);
281 	if (err || !(vinfo.flags & BRIDGE_VLAN_INFO_UNTAGGED))
282 		vid = 0;
283 
284 out:
285 	*p_vid = vid;
286 	return err;
287 }
288 
289 static inline bool
290 mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
291 {
292 	return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
293 }
294 
295 static inline struct mlxsw_sp_port *
296 mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
297 {
298 	struct mlxsw_sp_port *mlxsw_sp_port;
299 	u8 local_port;
300 
301 	local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
302 						lag_id, port_index);
303 	mlxsw_sp_port = mlxsw_sp->ports[local_port];
304 	return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
305 }
306 
307 static inline struct mlxsw_sp_port_vlan *
308 mlxsw_sp_port_vlan_find_by_vid(const struct mlxsw_sp_port *mlxsw_sp_port,
309 			       u16 vid)
310 {
311 	struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan;
312 
313 	list_for_each_entry(mlxsw_sp_port_vlan, &mlxsw_sp_port->vlans_list,
314 			    list) {
315 		if (mlxsw_sp_port_vlan->vid == vid)
316 			return mlxsw_sp_port_vlan;
317 	}
318 
319 	return NULL;
320 }
321 
322 enum mlxsw_sp_flood_type {
323 	MLXSW_SP_FLOOD_TYPE_UC,
324 	MLXSW_SP_FLOOD_TYPE_BC,
325 	MLXSW_SP_FLOOD_TYPE_MC,
326 };
327 
328 /* spectrum_buffers.c */
329 int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
330 void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
331 int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
332 int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
333 			 unsigned int sb_index, u16 pool_index,
334 			 struct devlink_sb_pool_info *pool_info);
335 int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
336 			 unsigned int sb_index, u16 pool_index, u32 size,
337 			 enum devlink_sb_threshold_type threshold_type);
338 int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
339 			      unsigned int sb_index, u16 pool_index,
340 			      u32 *p_threshold);
341 int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
342 			      unsigned int sb_index, u16 pool_index,
343 			      u32 threshold);
344 int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
345 				 unsigned int sb_index, u16 tc_index,
346 				 enum devlink_sb_pool_type pool_type,
347 				 u16 *p_pool_index, u32 *p_threshold);
348 int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
349 				 unsigned int sb_index, u16 tc_index,
350 				 enum devlink_sb_pool_type pool_type,
351 				 u16 pool_index, u32 threshold);
352 int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
353 			     unsigned int sb_index);
354 int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
355 			      unsigned int sb_index);
356 int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
357 				  unsigned int sb_index, u16 pool_index,
358 				  u32 *p_cur, u32 *p_max);
359 int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
360 				     unsigned int sb_index, u16 tc_index,
361 				     enum devlink_sb_pool_type pool_type,
362 				     u32 *p_cur, u32 *p_max);
363 u32 mlxsw_sp_cells_bytes(const struct mlxsw_sp *mlxsw_sp, u32 cells);
364 u32 mlxsw_sp_bytes_cells(const struct mlxsw_sp *mlxsw_sp, u32 bytes);
365 
366 /* spectrum_switchdev.c */
367 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
368 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
369 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port);
370 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port);
371 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
372 			bool adding);
373 void
374 mlxsw_sp_port_vlan_bridge_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
375 int mlxsw_sp_port_bridge_join(struct mlxsw_sp_port *mlxsw_sp_port,
376 			      struct net_device *brport_dev,
377 			      struct net_device *br_dev,
378 			      struct netlink_ext_ack *extack);
379 void mlxsw_sp_port_bridge_leave(struct mlxsw_sp_port *mlxsw_sp_port,
380 				struct net_device *brport_dev,
381 				struct net_device *br_dev);
382 bool mlxsw_sp_bridge_device_is_offloaded(const struct mlxsw_sp *mlxsw_sp,
383 					 const struct net_device *br_dev);
384 int mlxsw_sp_bridge_vxlan_join(struct mlxsw_sp *mlxsw_sp,
385 			       const struct net_device *br_dev,
386 			       const struct net_device *vxlan_dev, u16 vid,
387 			       struct netlink_ext_ack *extack);
388 void mlxsw_sp_bridge_vxlan_leave(struct mlxsw_sp *mlxsw_sp,
389 				 const struct net_device *vxlan_dev);
390 extern struct notifier_block mlxsw_sp_switchdev_notifier;
391 
392 /* spectrum.c */
393 int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
394 			  enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
395 			  bool dwrr, u8 dwrr_weight);
396 int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
397 			      u8 switch_prio, u8 tclass);
398 int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
399 				 u8 *prio_tc, bool pause_en,
400 				 struct ieee_pfc *my_pfc);
401 int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
402 				  enum mlxsw_reg_qeec_hr hr, u8 index,
403 				  u8 next_index, u32 maxrate);
404 enum mlxsw_reg_spms_state mlxsw_sp_stp_spms_state(u8 stp_state);
405 int mlxsw_sp_port_vid_stp_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
406 			      u8 state);
407 int mlxsw_sp_port_vp_mode_set(struct mlxsw_sp_port *mlxsw_sp_port, bool enable);
408 int mlxsw_sp_port_vid_learning_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid,
409 				   bool learn_enable);
410 int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
411 struct mlxsw_sp_port_vlan *
412 mlxsw_sp_port_vlan_get(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
413 void mlxsw_sp_port_vlan_put(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
414 int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
415 			   u16 vid_end, bool is_member, bool untagged);
416 int mlxsw_sp_flow_counter_get(struct mlxsw_sp *mlxsw_sp,
417 			      unsigned int counter_index, u64 *packets,
418 			      u64 *bytes);
419 int mlxsw_sp_flow_counter_alloc(struct mlxsw_sp *mlxsw_sp,
420 				unsigned int *p_counter_index);
421 void mlxsw_sp_flow_counter_free(struct mlxsw_sp *mlxsw_sp,
422 				unsigned int counter_index);
423 bool mlxsw_sp_port_dev_check(const struct net_device *dev);
424 struct mlxsw_sp *mlxsw_sp_lower_get(struct net_device *dev);
425 struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find(struct net_device *dev);
426 struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
427 void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port);
428 struct mlxsw_sp_port *mlxsw_sp_port_dev_lower_find_rcu(struct net_device *dev);
429 
430 /* spectrum_dcb.c */
431 #ifdef CONFIG_MLXSW_SPECTRUM_DCB
432 int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
433 void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
434 #else
435 static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
436 {
437 	return 0;
438 }
439 static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
440 {}
441 #endif
442 
443 /* spectrum_router.c */
444 enum mlxsw_sp_l3proto {
445 	MLXSW_SP_L3_PROTO_IPV4,
446 	MLXSW_SP_L3_PROTO_IPV6,
447 #define MLXSW_SP_L3_PROTO_MAX	(MLXSW_SP_L3_PROTO_IPV6 + 1)
448 };
449 
450 union mlxsw_sp_l3addr {
451 	__be32 addr4;
452 	struct in6_addr addr6;
453 };
454 
455 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
456 void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
457 int mlxsw_sp_netdevice_router_port_event(struct net_device *dev);
458 void mlxsw_sp_rif_macvlan_del(struct mlxsw_sp *mlxsw_sp,
459 			      const struct net_device *macvlan_dev);
460 int mlxsw_sp_inetaddr_event(struct notifier_block *unused,
461 			    unsigned long event, void *ptr);
462 int mlxsw_sp_inetaddr_valid_event(struct notifier_block *unused,
463 				  unsigned long event, void *ptr);
464 int mlxsw_sp_inet6addr_event(struct notifier_block *unused,
465 			     unsigned long event, void *ptr);
466 int mlxsw_sp_inet6addr_valid_event(struct notifier_block *unused,
467 				   unsigned long event, void *ptr);
468 int mlxsw_sp_netdevice_vrf_event(struct net_device *l3_dev, unsigned long event,
469 				 struct netdev_notifier_changeupper_info *info);
470 bool mlxsw_sp_netdev_is_ipip_ol(const struct mlxsw_sp *mlxsw_sp,
471 				const struct net_device *dev);
472 bool mlxsw_sp_netdev_is_ipip_ul(const struct mlxsw_sp *mlxsw_sp,
473 				const struct net_device *dev);
474 int mlxsw_sp_netdevice_ipip_ol_event(struct mlxsw_sp *mlxsw_sp,
475 				     struct net_device *l3_dev,
476 				     unsigned long event,
477 				     struct netdev_notifier_info *info);
478 int
479 mlxsw_sp_netdevice_ipip_ul_event(struct mlxsw_sp *mlxsw_sp,
480 				 struct net_device *l3_dev,
481 				 unsigned long event,
482 				 struct netdev_notifier_info *info);
483 void
484 mlxsw_sp_port_vlan_router_leave(struct mlxsw_sp_port_vlan *mlxsw_sp_port_vlan);
485 void mlxsw_sp_rif_destroy(struct mlxsw_sp_rif *rif);
486 void mlxsw_sp_rif_destroy_by_dev(struct mlxsw_sp *mlxsw_sp,
487 				 struct net_device *dev);
488 struct mlxsw_sp_rif *mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp,
489 					      const struct net_device *dev);
490 u8 mlxsw_sp_router_port(const struct mlxsw_sp *mlxsw_sp);
491 struct mlxsw_sp_fid *mlxsw_sp_rif_fid(const struct mlxsw_sp_rif *rif);
492 int mlxsw_sp_router_nve_promote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
493 				      enum mlxsw_sp_l3proto ul_proto,
494 				      const union mlxsw_sp_l3addr *ul_sip,
495 				      u32 tunnel_index);
496 void mlxsw_sp_router_nve_demote_decap(struct mlxsw_sp *mlxsw_sp, u32 ul_tb_id,
497 				      enum mlxsw_sp_l3proto ul_proto,
498 				      const union mlxsw_sp_l3addr *ul_sip);
499 int mlxsw_sp_router_tb_id_vr_id(struct mlxsw_sp *mlxsw_sp, u32 tb_id,
500 				u16 *vr_id);
501 
502 /* spectrum_kvdl.c */
503 enum mlxsw_sp_kvdl_entry_type {
504 	MLXSW_SP_KVDL_ENTRY_TYPE_ADJ,
505 	MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET,
506 	MLXSW_SP_KVDL_ENTRY_TYPE_PBS,
507 	MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR,
508 	MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT,
509 };
510 
511 static inline unsigned int
512 mlxsw_sp_kvdl_entry_size(enum mlxsw_sp_kvdl_entry_type type)
513 {
514 	switch (type) {
515 	case MLXSW_SP_KVDL_ENTRY_TYPE_ADJ: /* fall through */
516 	case MLXSW_SP_KVDL_ENTRY_TYPE_ACTSET: /* fall through */
517 	case MLXSW_SP_KVDL_ENTRY_TYPE_PBS: /* fall through */
518 	case MLXSW_SP_KVDL_ENTRY_TYPE_MCRIGR: /* fall through */
519 	case MLXSW_SP_KVDL_ENTRY_TYPE_TNUMT: /* fall through */
520 	default:
521 		return 1;
522 	}
523 }
524 
525 struct mlxsw_sp_kvdl_ops {
526 	size_t priv_size;
527 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
528 	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
529 	int (*alloc)(struct mlxsw_sp *mlxsw_sp, void *priv,
530 		     enum mlxsw_sp_kvdl_entry_type type,
531 		     unsigned int entry_count, u32 *p_entry_index);
532 	void (*free)(struct mlxsw_sp *mlxsw_sp, void *priv,
533 		     enum mlxsw_sp_kvdl_entry_type type,
534 		     unsigned int entry_count, int entry_index);
535 	int (*alloc_size_query)(struct mlxsw_sp *mlxsw_sp, void *priv,
536 				enum mlxsw_sp_kvdl_entry_type type,
537 				unsigned int entry_count,
538 				unsigned int *p_alloc_count);
539 	int (*resources_register)(struct mlxsw_sp *mlxsw_sp, void *priv);
540 };
541 
542 int mlxsw_sp_kvdl_init(struct mlxsw_sp *mlxsw_sp);
543 void mlxsw_sp_kvdl_fini(struct mlxsw_sp *mlxsw_sp);
544 int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp,
545 			enum mlxsw_sp_kvdl_entry_type type,
546 			unsigned int entry_count, u32 *p_entry_index);
547 void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp,
548 			enum mlxsw_sp_kvdl_entry_type type,
549 			unsigned int entry_count, int entry_index);
550 int mlxsw_sp_kvdl_alloc_count_query(struct mlxsw_sp *mlxsw_sp,
551 				    enum mlxsw_sp_kvdl_entry_type type,
552 				    unsigned int entry_count,
553 				    unsigned int *p_alloc_count);
554 
555 /* spectrum1_kvdl.c */
556 extern const struct mlxsw_sp_kvdl_ops mlxsw_sp1_kvdl_ops;
557 int mlxsw_sp1_kvdl_resources_register(struct mlxsw_core *mlxsw_core);
558 
559 /* spectrum2_kvdl.c */
560 extern const struct mlxsw_sp_kvdl_ops mlxsw_sp2_kvdl_ops;
561 
562 struct mlxsw_sp_acl_rule_info {
563 	unsigned int priority;
564 	struct mlxsw_afk_element_values values;
565 	struct mlxsw_afa_block *act_block;
566 	unsigned int counter_index;
567 };
568 
569 struct mlxsw_sp_acl_block;
570 struct mlxsw_sp_acl_ruleset;
571 
572 /* spectrum_acl.c */
573 enum mlxsw_sp_acl_profile {
574 	MLXSW_SP_ACL_PROFILE_FLOWER,
575 };
576 
577 struct mlxsw_afk *mlxsw_sp_acl_afk(struct mlxsw_sp_acl *acl);
578 struct mlxsw_sp *mlxsw_sp_acl_block_mlxsw_sp(struct mlxsw_sp_acl_block *block);
579 unsigned int mlxsw_sp_acl_block_rule_count(struct mlxsw_sp_acl_block *block);
580 void mlxsw_sp_acl_block_disable_inc(struct mlxsw_sp_acl_block *block);
581 void mlxsw_sp_acl_block_disable_dec(struct mlxsw_sp_acl_block *block);
582 bool mlxsw_sp_acl_block_disabled(struct mlxsw_sp_acl_block *block);
583 struct mlxsw_sp_acl_block *mlxsw_sp_acl_block_create(struct mlxsw_sp *mlxsw_sp,
584 						     struct net *net);
585 void mlxsw_sp_acl_block_destroy(struct mlxsw_sp_acl_block *block);
586 int mlxsw_sp_acl_block_bind(struct mlxsw_sp *mlxsw_sp,
587 			    struct mlxsw_sp_acl_block *block,
588 			    struct mlxsw_sp_port *mlxsw_sp_port,
589 			    bool ingress);
590 int mlxsw_sp_acl_block_unbind(struct mlxsw_sp *mlxsw_sp,
591 			      struct mlxsw_sp_acl_block *block,
592 			      struct mlxsw_sp_port *mlxsw_sp_port,
593 			      bool ingress);
594 bool mlxsw_sp_acl_block_is_egress_bound(struct mlxsw_sp_acl_block *block);
595 struct mlxsw_sp_acl_ruleset *
596 mlxsw_sp_acl_ruleset_lookup(struct mlxsw_sp *mlxsw_sp,
597 			    struct mlxsw_sp_acl_block *block, u32 chain_index,
598 			    enum mlxsw_sp_acl_profile profile);
599 struct mlxsw_sp_acl_ruleset *
600 mlxsw_sp_acl_ruleset_get(struct mlxsw_sp *mlxsw_sp,
601 			 struct mlxsw_sp_acl_block *block, u32 chain_index,
602 			 enum mlxsw_sp_acl_profile profile,
603 			 struct mlxsw_afk_element_usage *tmplt_elusage);
604 void mlxsw_sp_acl_ruleset_put(struct mlxsw_sp *mlxsw_sp,
605 			      struct mlxsw_sp_acl_ruleset *ruleset);
606 u16 mlxsw_sp_acl_ruleset_group_id(struct mlxsw_sp_acl_ruleset *ruleset);
607 
608 struct mlxsw_sp_acl_rule_info *
609 mlxsw_sp_acl_rulei_create(struct mlxsw_sp_acl *acl);
610 void mlxsw_sp_acl_rulei_destroy(struct mlxsw_sp_acl_rule_info *rulei);
611 int mlxsw_sp_acl_rulei_commit(struct mlxsw_sp_acl_rule_info *rulei);
612 void mlxsw_sp_acl_rulei_priority(struct mlxsw_sp_acl_rule_info *rulei,
613 				 unsigned int priority);
614 void mlxsw_sp_acl_rulei_keymask_u32(struct mlxsw_sp_acl_rule_info *rulei,
615 				    enum mlxsw_afk_element element,
616 				    u32 key_value, u32 mask_value);
617 void mlxsw_sp_acl_rulei_keymask_buf(struct mlxsw_sp_acl_rule_info *rulei,
618 				    enum mlxsw_afk_element element,
619 				    const char *key_value,
620 				    const char *mask_value, unsigned int len);
621 int mlxsw_sp_acl_rulei_act_continue(struct mlxsw_sp_acl_rule_info *rulei);
622 int mlxsw_sp_acl_rulei_act_jump(struct mlxsw_sp_acl_rule_info *rulei,
623 				u16 group_id);
624 int mlxsw_sp_acl_rulei_act_terminate(struct mlxsw_sp_acl_rule_info *rulei);
625 int mlxsw_sp_acl_rulei_act_drop(struct mlxsw_sp_acl_rule_info *rulei);
626 int mlxsw_sp_acl_rulei_act_trap(struct mlxsw_sp_acl_rule_info *rulei);
627 int mlxsw_sp_acl_rulei_act_mirror(struct mlxsw_sp *mlxsw_sp,
628 				  struct mlxsw_sp_acl_rule_info *rulei,
629 				  struct mlxsw_sp_acl_block *block,
630 				  struct net_device *out_dev,
631 				  struct netlink_ext_ack *extack);
632 int mlxsw_sp_acl_rulei_act_fwd(struct mlxsw_sp *mlxsw_sp,
633 			       struct mlxsw_sp_acl_rule_info *rulei,
634 			       struct net_device *out_dev,
635 			       struct netlink_ext_ack *extack);
636 int mlxsw_sp_acl_rulei_act_vlan(struct mlxsw_sp *mlxsw_sp,
637 				struct mlxsw_sp_acl_rule_info *rulei,
638 				u32 action, u16 vid, u16 proto, u8 prio,
639 				struct netlink_ext_ack *extack);
640 int mlxsw_sp_acl_rulei_act_count(struct mlxsw_sp *mlxsw_sp,
641 				 struct mlxsw_sp_acl_rule_info *rulei,
642 				 struct netlink_ext_ack *extack);
643 int mlxsw_sp_acl_rulei_act_fid_set(struct mlxsw_sp *mlxsw_sp,
644 				   struct mlxsw_sp_acl_rule_info *rulei,
645 				   u16 fid, struct netlink_ext_ack *extack);
646 
647 struct mlxsw_sp_acl_rule;
648 
649 struct mlxsw_sp_acl_rule *
650 mlxsw_sp_acl_rule_create(struct mlxsw_sp *mlxsw_sp,
651 			 struct mlxsw_sp_acl_ruleset *ruleset,
652 			 unsigned long cookie,
653 			 struct netlink_ext_ack *extack);
654 void mlxsw_sp_acl_rule_destroy(struct mlxsw_sp *mlxsw_sp,
655 			       struct mlxsw_sp_acl_rule *rule);
656 int mlxsw_sp_acl_rule_add(struct mlxsw_sp *mlxsw_sp,
657 			  struct mlxsw_sp_acl_rule *rule);
658 void mlxsw_sp_acl_rule_del(struct mlxsw_sp *mlxsw_sp,
659 			   struct mlxsw_sp_acl_rule *rule);
660 struct mlxsw_sp_acl_rule *
661 mlxsw_sp_acl_rule_lookup(struct mlxsw_sp *mlxsw_sp,
662 			 struct mlxsw_sp_acl_ruleset *ruleset,
663 			 unsigned long cookie);
664 struct mlxsw_sp_acl_rule_info *
665 mlxsw_sp_acl_rule_rulei(struct mlxsw_sp_acl_rule *rule);
666 int mlxsw_sp_acl_rule_get_stats(struct mlxsw_sp *mlxsw_sp,
667 				struct mlxsw_sp_acl_rule *rule,
668 				u64 *packets, u64 *bytes, u64 *last_use);
669 
670 struct mlxsw_sp_fid *mlxsw_sp_acl_dummy_fid(struct mlxsw_sp *mlxsw_sp);
671 
672 int mlxsw_sp_acl_init(struct mlxsw_sp *mlxsw_sp);
673 void mlxsw_sp_acl_fini(struct mlxsw_sp *mlxsw_sp);
674 
675 /* spectrum_acl_tcam.c */
676 struct mlxsw_sp_acl_tcam;
677 struct mlxsw_sp_acl_tcam_region;
678 
679 struct mlxsw_sp_acl_tcam_ops {
680 	enum mlxsw_reg_ptar_key_type key_type;
681 	size_t priv_size;
682 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv,
683 		    struct mlxsw_sp_acl_tcam *tcam);
684 	void (*fini)(struct mlxsw_sp *mlxsw_sp, void *priv);
685 	size_t region_priv_size;
686 	int (*region_init)(struct mlxsw_sp *mlxsw_sp, void *region_priv,
687 			   void *tcam_priv,
688 			   struct mlxsw_sp_acl_tcam_region *region);
689 	void (*region_fini)(struct mlxsw_sp *mlxsw_sp, void *region_priv);
690 	int (*region_associate)(struct mlxsw_sp *mlxsw_sp,
691 				struct mlxsw_sp_acl_tcam_region *region);
692 	size_t chunk_priv_size;
693 	void (*chunk_init)(void *region_priv, void *chunk_priv,
694 			   unsigned int priority);
695 	void (*chunk_fini)(void *chunk_priv);
696 	size_t entry_priv_size;
697 	int (*entry_add)(struct mlxsw_sp *mlxsw_sp,
698 			 void *region_priv, void *chunk_priv,
699 			 void *entry_priv,
700 			 struct mlxsw_sp_acl_rule_info *rulei);
701 	void (*entry_del)(struct mlxsw_sp *mlxsw_sp,
702 			  void *region_priv, void *chunk_priv,
703 			  void *entry_priv);
704 	int (*entry_activity_get)(struct mlxsw_sp *mlxsw_sp,
705 				  void *region_priv, void *entry_priv,
706 				  bool *activity);
707 };
708 
709 /* spectrum1_acl_tcam.c */
710 extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp1_acl_tcam_ops;
711 
712 /* spectrum2_acl_tcam.c */
713 extern const struct mlxsw_sp_acl_tcam_ops mlxsw_sp2_acl_tcam_ops;
714 
715 /* spectrum_acl_flex_actions.c */
716 extern const struct mlxsw_afa_ops mlxsw_sp1_act_afa_ops;
717 extern const struct mlxsw_afa_ops mlxsw_sp2_act_afa_ops;
718 
719 /* spectrum_acl_flex_keys.c */
720 extern const struct mlxsw_afk_ops mlxsw_sp1_afk_ops;
721 extern const struct mlxsw_afk_ops mlxsw_sp2_afk_ops;
722 
723 /* spectrum_flower.c */
724 int mlxsw_sp_flower_replace(struct mlxsw_sp *mlxsw_sp,
725 			    struct mlxsw_sp_acl_block *block,
726 			    struct tc_cls_flower_offload *f);
727 void mlxsw_sp_flower_destroy(struct mlxsw_sp *mlxsw_sp,
728 			     struct mlxsw_sp_acl_block *block,
729 			     struct tc_cls_flower_offload *f);
730 int mlxsw_sp_flower_stats(struct mlxsw_sp *mlxsw_sp,
731 			  struct mlxsw_sp_acl_block *block,
732 			  struct tc_cls_flower_offload *f);
733 int mlxsw_sp_flower_tmplt_create(struct mlxsw_sp *mlxsw_sp,
734 				 struct mlxsw_sp_acl_block *block,
735 				 struct tc_cls_flower_offload *f);
736 void mlxsw_sp_flower_tmplt_destroy(struct mlxsw_sp *mlxsw_sp,
737 				   struct mlxsw_sp_acl_block *block,
738 				   struct tc_cls_flower_offload *f);
739 
740 /* spectrum_qdisc.c */
741 int mlxsw_sp_tc_qdisc_init(struct mlxsw_sp_port *mlxsw_sp_port);
742 void mlxsw_sp_tc_qdisc_fini(struct mlxsw_sp_port *mlxsw_sp_port);
743 int mlxsw_sp_setup_tc_red(struct mlxsw_sp_port *mlxsw_sp_port,
744 			  struct tc_red_qopt_offload *p);
745 int mlxsw_sp_setup_tc_prio(struct mlxsw_sp_port *mlxsw_sp_port,
746 			   struct tc_prio_qopt_offload *p);
747 
748 /* spectrum_fid.c */
749 bool mlxsw_sp_fid_lag_vid_valid(const struct mlxsw_sp_fid *fid);
750 struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_index(struct mlxsw_sp *mlxsw_sp,
751 						  u16 fid_index);
752 int mlxsw_sp_fid_nve_ifindex(const struct mlxsw_sp_fid *fid, int *nve_ifindex);
753 int mlxsw_sp_fid_nve_type(const struct mlxsw_sp_fid *fid,
754 			  enum mlxsw_sp_nve_type *p_type);
755 struct mlxsw_sp_fid *mlxsw_sp_fid_lookup_by_vni(struct mlxsw_sp *mlxsw_sp,
756 						__be32 vni);
757 int mlxsw_sp_fid_vni(const struct mlxsw_sp_fid *fid, __be32 *vni);
758 int mlxsw_sp_fid_nve_flood_index_set(struct mlxsw_sp_fid *fid,
759 				     u32 nve_flood_index);
760 void mlxsw_sp_fid_nve_flood_index_clear(struct mlxsw_sp_fid *fid);
761 bool mlxsw_sp_fid_nve_flood_index_is_set(const struct mlxsw_sp_fid *fid);
762 int mlxsw_sp_fid_vni_set(struct mlxsw_sp_fid *fid, enum mlxsw_sp_nve_type type,
763 			 __be32 vni, int nve_ifindex);
764 void mlxsw_sp_fid_vni_clear(struct mlxsw_sp_fid *fid);
765 bool mlxsw_sp_fid_vni_is_set(const struct mlxsw_sp_fid *fid);
766 void mlxsw_sp_fid_fdb_clear_offload(const struct mlxsw_sp_fid *fid,
767 				    const struct net_device *nve_dev);
768 int mlxsw_sp_fid_flood_set(struct mlxsw_sp_fid *fid,
769 			   enum mlxsw_sp_flood_type packet_type, u8 local_port,
770 			   bool member);
771 int mlxsw_sp_fid_port_vid_map(struct mlxsw_sp_fid *fid,
772 			      struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
773 void mlxsw_sp_fid_port_vid_unmap(struct mlxsw_sp_fid *fid,
774 				 struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
775 enum mlxsw_sp_rif_type mlxsw_sp_fid_rif_type(const struct mlxsw_sp_fid *fid);
776 u16 mlxsw_sp_fid_index(const struct mlxsw_sp_fid *fid);
777 enum mlxsw_sp_fid_type mlxsw_sp_fid_type(const struct mlxsw_sp_fid *fid);
778 void mlxsw_sp_fid_rif_set(struct mlxsw_sp_fid *fid, struct mlxsw_sp_rif *rif);
779 enum mlxsw_sp_rif_type
780 mlxsw_sp_fid_type_rif_type(const struct mlxsw_sp *mlxsw_sp,
781 			   enum mlxsw_sp_fid_type type);
782 u16 mlxsw_sp_fid_8021q_vid(const struct mlxsw_sp_fid *fid);
783 struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_get(struct mlxsw_sp *mlxsw_sp, u16 vid);
784 struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_get(struct mlxsw_sp *mlxsw_sp,
785 					    int br_ifindex);
786 struct mlxsw_sp_fid *mlxsw_sp_fid_8021q_lookup(struct mlxsw_sp *mlxsw_sp,
787 					       u16 vid);
788 struct mlxsw_sp_fid *mlxsw_sp_fid_8021d_lookup(struct mlxsw_sp *mlxsw_sp,
789 					       int br_ifindex);
790 struct mlxsw_sp_fid *mlxsw_sp_fid_rfid_get(struct mlxsw_sp *mlxsw_sp,
791 					   u16 rif_index);
792 struct mlxsw_sp_fid *mlxsw_sp_fid_dummy_get(struct mlxsw_sp *mlxsw_sp);
793 void mlxsw_sp_fid_put(struct mlxsw_sp_fid *fid);
794 int mlxsw_sp_port_fids_init(struct mlxsw_sp_port *mlxsw_sp_port);
795 void mlxsw_sp_port_fids_fini(struct mlxsw_sp_port *mlxsw_sp_port);
796 int mlxsw_sp_fids_init(struct mlxsw_sp *mlxsw_sp);
797 void mlxsw_sp_fids_fini(struct mlxsw_sp *mlxsw_sp);
798 
799 /* spectrum_mr.c */
800 enum mlxsw_sp_mr_route_prio {
801 	MLXSW_SP_MR_ROUTE_PRIO_SG,
802 	MLXSW_SP_MR_ROUTE_PRIO_STARG,
803 	MLXSW_SP_MR_ROUTE_PRIO_CATCHALL,
804 	__MLXSW_SP_MR_ROUTE_PRIO_MAX
805 };
806 
807 #define MLXSW_SP_MR_ROUTE_PRIO_MAX (__MLXSW_SP_MR_ROUTE_PRIO_MAX - 1)
808 
809 struct mlxsw_sp_mr_route_key;
810 
811 struct mlxsw_sp_mr_tcam_ops {
812 	size_t priv_size;
813 	int (*init)(struct mlxsw_sp *mlxsw_sp, void *priv);
814 	void (*fini)(void *priv);
815 	size_t route_priv_size;
816 	int (*route_create)(struct mlxsw_sp *mlxsw_sp, void *priv,
817 			    void *route_priv,
818 			    struct mlxsw_sp_mr_route_key *key,
819 			    struct mlxsw_afa_block *afa_block,
820 			    enum mlxsw_sp_mr_route_prio prio);
821 	void (*route_destroy)(struct mlxsw_sp *mlxsw_sp, void *priv,
822 			      void *route_priv,
823 			      struct mlxsw_sp_mr_route_key *key);
824 	int (*route_update)(struct mlxsw_sp *mlxsw_sp, void *route_priv,
825 			    struct mlxsw_sp_mr_route_key *key,
826 			    struct mlxsw_afa_block *afa_block);
827 };
828 
829 /* spectrum1_mr_tcam.c */
830 extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp1_mr_tcam_ops;
831 
832 /* spectrum2_mr_tcam.c */
833 extern const struct mlxsw_sp_mr_tcam_ops mlxsw_sp2_mr_tcam_ops;
834 
835 /* spectrum_nve.c */
836 struct mlxsw_sp_nve_params {
837 	enum mlxsw_sp_nve_type type;
838 	__be32 vni;
839 	const struct net_device *dev;
840 };
841 
842 extern const struct mlxsw_sp_nve_ops *mlxsw_sp1_nve_ops_arr[];
843 extern const struct mlxsw_sp_nve_ops *mlxsw_sp2_nve_ops_arr[];
844 
845 int mlxsw_sp_nve_learned_ip_resolve(struct mlxsw_sp *mlxsw_sp, u32 uip,
846 				    enum mlxsw_sp_l3proto proto,
847 				    union mlxsw_sp_l3addr *addr);
848 int mlxsw_sp_nve_flood_ip_add(struct mlxsw_sp *mlxsw_sp,
849 			      struct mlxsw_sp_fid *fid,
850 			      enum mlxsw_sp_l3proto proto,
851 			      union mlxsw_sp_l3addr *addr);
852 void mlxsw_sp_nve_flood_ip_del(struct mlxsw_sp *mlxsw_sp,
853 			       struct mlxsw_sp_fid *fid,
854 			       enum mlxsw_sp_l3proto proto,
855 			       union mlxsw_sp_l3addr *addr);
856 u32 mlxsw_sp_nve_decap_tunnel_index_get(const struct mlxsw_sp *mlxsw_sp);
857 bool mlxsw_sp_nve_ipv4_route_is_decap(const struct mlxsw_sp *mlxsw_sp,
858 				      u32 tb_id, __be32 addr);
859 int mlxsw_sp_nve_fid_enable(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *fid,
860 			    struct mlxsw_sp_nve_params *params,
861 			    struct netlink_ext_ack *extack);
862 void mlxsw_sp_nve_fid_disable(struct mlxsw_sp *mlxsw_sp,
863 			      struct mlxsw_sp_fid *fid);
864 int mlxsw_sp_port_nve_init(struct mlxsw_sp_port *mlxsw_sp_port);
865 void mlxsw_sp_port_nve_fini(struct mlxsw_sp_port *mlxsw_sp_port);
866 int mlxsw_sp_nve_init(struct mlxsw_sp *mlxsw_sp);
867 void mlxsw_sp_nve_fini(struct mlxsw_sp *mlxsw_sp);
868 
869 #endif
870