]> git.karo-electronics.de Git - linux-beck.git/blob - drivers/net/ethernet/mellanox/mlxsw/spectrum.h
mlxsw: spectrum_router: Add the nexthop neigh activity update
[linux-beck.git] / drivers / net / ethernet / mellanox / mlxsw / spectrum.h
1 /*
2  * drivers/net/ethernet/mellanox/mlxsw/spectrum.h
3  * Copyright (c) 2015 Mellanox Technologies. All rights reserved.
4  * Copyright (c) 2015 Jiri Pirko <jiri@mellanox.com>
5  * Copyright (c) 2015 Ido Schimmel <idosch@mellanox.com>
6  * Copyright (c) 2015 Elad Raz <eladr@mellanox.com>
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the names of the copyright holders nor the names of its
17  *    contributors may be used to endorse or promote products derived from
18  *    this software without specific prior written permission.
19  *
20  * Alternatively, this software may be distributed under the terms of the
21  * GNU General Public License ("GPL") version 2 as published by the Free
22  * Software Foundation.
23  *
24  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34  * POSSIBILITY OF SUCH DAMAGE.
35  */
36
37 #ifndef _MLXSW_SPECTRUM_H
38 #define _MLXSW_SPECTRUM_H
39
40 #include <linux/types.h>
41 #include <linux/netdevice.h>
42 #include <linux/rhashtable.h>
43 #include <linux/bitops.h>
44 #include <linux/if_vlan.h>
45 #include <linux/list.h>
46 #include <linux/dcbnl.h>
47 #include <linux/in6.h>
48 #include <net/switchdev.h>
49
50 #include "port.h"
51 #include "core.h"
52
53 #define MLXSW_SP_VFID_BASE VLAN_N_VID
54 #define MLXSW_SP_VFID_MAX 6656  /* Bridged VLAN interfaces */
55
56 #define MLXSW_SP_RFID_BASE 15360
57 #define MLXSW_SP_RIF_MAX 800
58
59 #define MLXSW_SP_LAG_MAX 64
60 #define MLXSW_SP_PORT_PER_LAG_MAX 16
61
62 #define MLXSW_SP_MID_MAX 7000
63
64 #define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
65
66 #define MLXSW_SP_LPM_TREE_MIN 2 /* trees 0 and 1 are reserved */
67 #define MLXSW_SP_LPM_TREE_MAX 22
68 #define MLXSW_SP_LPM_TREE_COUNT (MLXSW_SP_LPM_TREE_MAX - MLXSW_SP_LPM_TREE_MIN)
69
70 #define MLXSW_SP_VIRTUAL_ROUTER_MAX 256
71
72 #define MLXSW_SP_PORT_BASE_SPEED 25000  /* Mb/s */
73
74 #define MLXSW_SP_BYTES_PER_CELL 96
75
76 #define MLXSW_SP_BYTES_TO_CELLS(b) DIV_ROUND_UP(b, MLXSW_SP_BYTES_PER_CELL)
77 #define MLXSW_SP_CELLS_TO_BYTES(c) (c * MLXSW_SP_BYTES_PER_CELL)
78
79 #define MLXSW_SP_KVD_LINEAR_SIZE 65536 /* entries */
80 #define MLXSW_SP_KVD_HASH_SINGLE_SIZE 163840 /* entries */
81 #define MLXSW_SP_KVD_HASH_DOUBLE_SIZE 32768 /* entries */
82
83 /* Maximum delay buffer needed in case of PAUSE frames, in cells.
84  * Assumes 100m cable and maximum MTU.
85  */
86 #define MLXSW_SP_PAUSE_DELAY 612
87
88 #define MLXSW_SP_CELL_FACTOR 2  /* 2 * cell_size / (IPG + cell_size + 1) */
89
90 static inline u16 mlxsw_sp_pfc_delay_get(int mtu, u16 delay)
91 {
92         delay = MLXSW_SP_BYTES_TO_CELLS(DIV_ROUND_UP(delay, BITS_PER_BYTE));
93         return MLXSW_SP_CELL_FACTOR * delay + MLXSW_SP_BYTES_TO_CELLS(mtu);
94 }
95
96 struct mlxsw_sp_port;
97
98 struct mlxsw_sp_upper {
99         struct net_device *dev;
100         unsigned int ref_count;
101 };
102
103 struct mlxsw_sp_fid {
104         void (*leave)(struct mlxsw_sp_port *mlxsw_sp_vport);
105         struct list_head list;
106         unsigned int ref_count;
107         struct net_device *dev;
108         struct mlxsw_sp_rif *r;
109         u16 fid;
110 };
111
112 struct mlxsw_sp_rif {
113         struct net_device *dev;
114         unsigned int ref_count;
115         struct mlxsw_sp_fid *f;
116         unsigned char addr[ETH_ALEN];
117         int mtu;
118         u16 rif;
119 };
120
121 struct mlxsw_sp_mid {
122         struct list_head list;
123         unsigned char addr[ETH_ALEN];
124         u16 vid;
125         u16 mid;
126         unsigned int ref_count;
127 };
128
129 static inline u16 mlxsw_sp_vfid_to_fid(u16 vfid)
130 {
131         return MLXSW_SP_VFID_BASE + vfid;
132 }
133
134 static inline u16 mlxsw_sp_fid_to_vfid(u16 fid)
135 {
136         return fid - MLXSW_SP_VFID_BASE;
137 }
138
139 static inline bool mlxsw_sp_fid_is_vfid(u16 fid)
140 {
141         return fid >= MLXSW_SP_VFID_BASE && fid < MLXSW_SP_RFID_BASE;
142 }
143
144 static inline bool mlxsw_sp_fid_is_rfid(u16 fid)
145 {
146         return fid >= MLXSW_SP_RFID_BASE;
147 }
148
149 static inline u16 mlxsw_sp_rif_sp_to_fid(u16 rif)
150 {
151         return MLXSW_SP_RFID_BASE + rif;
152 }
153
154 struct mlxsw_sp_sb_pr {
155         enum mlxsw_reg_sbpr_mode mode;
156         u32 size;
157 };
158
159 struct mlxsw_cp_sb_occ {
160         u32 cur;
161         u32 max;
162 };
163
164 struct mlxsw_sp_sb_cm {
165         u32 min_buff;
166         u32 max_buff;
167         u8 pool;
168         struct mlxsw_cp_sb_occ occ;
169 };
170
171 struct mlxsw_sp_sb_pm {
172         u32 min_buff;
173         u32 max_buff;
174         struct mlxsw_cp_sb_occ occ;
175 };
176
177 #define MLXSW_SP_SB_POOL_COUNT  4
178 #define MLXSW_SP_SB_TC_COUNT    8
179
180 struct mlxsw_sp_sb {
181         struct mlxsw_sp_sb_pr prs[2][MLXSW_SP_SB_POOL_COUNT];
182         struct {
183                 struct mlxsw_sp_sb_cm cms[2][MLXSW_SP_SB_TC_COUNT];
184                 struct mlxsw_sp_sb_pm pms[2][MLXSW_SP_SB_POOL_COUNT];
185         } ports[MLXSW_PORT_MAX_PORTS];
186 };
187
188 #define MLXSW_SP_PREFIX_COUNT (sizeof(struct in6_addr) * BITS_PER_BYTE)
189
190 struct mlxsw_sp_prefix_usage {
191         DECLARE_BITMAP(b, MLXSW_SP_PREFIX_COUNT);
192 };
193
194 enum mlxsw_sp_l3proto {
195         MLXSW_SP_L3_PROTO_IPV4,
196         MLXSW_SP_L3_PROTO_IPV6,
197 };
198
199 struct mlxsw_sp_lpm_tree {
200         u8 id; /* tree ID */
201         unsigned int ref_count;
202         enum mlxsw_sp_l3proto proto;
203         struct mlxsw_sp_prefix_usage prefix_usage;
204 };
205
206 struct mlxsw_sp_fib;
207
208 struct mlxsw_sp_vr {
209         u16 id; /* virtual router ID */
210         bool used;
211         enum mlxsw_sp_l3proto proto;
212         u32 tb_id; /* kernel fib table id */
213         struct mlxsw_sp_lpm_tree *lpm_tree;
214         struct mlxsw_sp_fib *fib;
215 };
216
217 struct mlxsw_sp_router {
218         struct mlxsw_sp_lpm_tree lpm_trees[MLXSW_SP_LPM_TREE_COUNT];
219         struct mlxsw_sp_vr vrs[MLXSW_SP_VIRTUAL_ROUTER_MAX];
220         struct rhashtable neigh_ht;
221         struct {
222                 struct delayed_work dw;
223                 unsigned long interval; /* ms */
224         } neighs_update;
225         struct list_head nexthop_group_list;
226         struct list_head nexthop_neighs_list;
227 };
228
229 struct mlxsw_sp {
230         struct {
231                 struct list_head list;
232                 DECLARE_BITMAP(mapped, MLXSW_SP_VFID_MAX);
233         } vfids;
234         struct {
235                 struct list_head list;
236                 DECLARE_BITMAP(mapped, MLXSW_SP_MID_MAX);
237         } br_mids;
238         struct list_head fids;  /* VLAN-aware bridge FIDs */
239         struct mlxsw_sp_rif *rifs[MLXSW_SP_RIF_MAX];
240         struct mlxsw_sp_port **ports;
241         struct mlxsw_core *core;
242         const struct mlxsw_bus_info *bus_info;
243         unsigned char base_mac[ETH_ALEN];
244         struct {
245                 struct delayed_work dw;
246 #define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
247                 unsigned int interval; /* ms */
248         } fdb_notify;
249 #define MLXSW_SP_MIN_AGEING_TIME 10
250 #define MLXSW_SP_MAX_AGEING_TIME 1000000
251 #define MLXSW_SP_DEFAULT_AGEING_TIME 300
252         u32 ageing_time;
253         struct mlxsw_sp_upper master_bridge;
254         struct mlxsw_sp_upper lags[MLXSW_SP_LAG_MAX];
255         u8 port_to_module[MLXSW_PORT_MAX_PORTS];
256         struct mlxsw_sp_sb sb;
257         struct mlxsw_sp_router router;
258         struct {
259                 DECLARE_BITMAP(usage, MLXSW_SP_KVD_LINEAR_SIZE);
260         } kvdl;
261 };
262
263 static inline struct mlxsw_sp_upper *
264 mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
265 {
266         return &mlxsw_sp->lags[lag_id];
267 }
268
269 struct mlxsw_sp_port_pcpu_stats {
270         u64                     rx_packets;
271         u64                     rx_bytes;
272         u64                     tx_packets;
273         u64                     tx_bytes;
274         struct u64_stats_sync   syncp;
275         u32                     tx_dropped;
276 };
277
278 struct mlxsw_sp_port {
279         struct mlxsw_core_port core_port; /* must be first */
280         struct net_device *dev;
281         struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
282         struct mlxsw_sp *mlxsw_sp;
283         u8 local_port;
284         u8 stp_state;
285         u8 learning:1,
286            learning_sync:1,
287            uc_flood:1,
288            bridged:1,
289            lagged:1,
290            split:1;
291         u16 pvid;
292         u16 lag_id;
293         struct {
294                 struct list_head list;
295                 struct mlxsw_sp_fid *f;
296                 u16 vid;
297         } vport;
298         struct {
299                 u8 tx_pause:1,
300                    rx_pause:1;
301         } link;
302         struct {
303                 struct ieee_ets *ets;
304                 struct ieee_maxrate *maxrate;
305                 struct ieee_pfc *pfc;
306         } dcb;
307         struct {
308                 u8 module;
309                 u8 width;
310                 u8 lane;
311         } mapping;
312         /* 802.1Q bridge VLANs */
313         unsigned long *active_vlans;
314         unsigned long *untagged_vlans;
315         /* VLAN interfaces */
316         struct list_head vports_list;
317 };
318
319 struct mlxsw_sp_port *mlxsw_sp_port_lower_dev_hold(struct net_device *dev);
320 void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port);
321
322 static inline bool
323 mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
324 {
325         return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
326 }
327
328 static inline struct mlxsw_sp_port *
329 mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
330 {
331         struct mlxsw_sp_port *mlxsw_sp_port;
332         u8 local_port;
333
334         local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
335                                                 lag_id, port_index);
336         mlxsw_sp_port = mlxsw_sp->ports[local_port];
337         return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
338 }
339
340 static inline u16
341 mlxsw_sp_vport_vid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
342 {
343         return mlxsw_sp_vport->vport.vid;
344 }
345
346 static inline bool
347 mlxsw_sp_port_is_vport(const struct mlxsw_sp_port *mlxsw_sp_port)
348 {
349         u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
350
351         return vid != 0;
352 }
353
354 static inline void mlxsw_sp_vport_fid_set(struct mlxsw_sp_port *mlxsw_sp_vport,
355                                           struct mlxsw_sp_fid *f)
356 {
357         mlxsw_sp_vport->vport.f = f;
358 }
359
360 static inline struct mlxsw_sp_fid *
361 mlxsw_sp_vport_fid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
362 {
363         return mlxsw_sp_vport->vport.f;
364 }
365
366 static inline struct net_device *
367 mlxsw_sp_vport_dev_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
368 {
369         struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
370
371         return f ? f->dev : NULL;
372 }
373
374 static inline struct mlxsw_sp_port *
375 mlxsw_sp_port_vport_find(const struct mlxsw_sp_port *mlxsw_sp_port, u16 vid)
376 {
377         struct mlxsw_sp_port *mlxsw_sp_vport;
378
379         list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
380                             vport.list) {
381                 if (mlxsw_sp_vport_vid_get(mlxsw_sp_vport) == vid)
382                         return mlxsw_sp_vport;
383         }
384
385         return NULL;
386 }
387
388 static inline struct mlxsw_sp_port *
389 mlxsw_sp_port_vport_find_by_fid(const struct mlxsw_sp_port *mlxsw_sp_port,
390                                 u16 fid)
391 {
392         struct mlxsw_sp_port *mlxsw_sp_vport;
393
394         list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
395                             vport.list) {
396                 struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
397
398                 if (f && f->fid == fid)
399                         return mlxsw_sp_vport;
400         }
401
402         return NULL;
403 }
404
405 static inline struct mlxsw_sp_fid *mlxsw_sp_fid_find(struct mlxsw_sp *mlxsw_sp,
406                                                      u16 fid)
407 {
408         struct mlxsw_sp_fid *f;
409
410         list_for_each_entry(f, &mlxsw_sp->fids, list)
411                 if (f->fid == fid)
412                         return f;
413
414         return NULL;
415 }
416
417 static inline struct mlxsw_sp_fid *
418 mlxsw_sp_vfid_find(const struct mlxsw_sp *mlxsw_sp,
419                    const struct net_device *br_dev)
420 {
421         struct mlxsw_sp_fid *f;
422
423         list_for_each_entry(f, &mlxsw_sp->vfids.list, list)
424                 if (f->dev == br_dev)
425                         return f;
426
427         return NULL;
428 }
429
430 static inline struct mlxsw_sp_rif *
431 mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp,
432                          const struct net_device *dev)
433 {
434         int i;
435
436         for (i = 0; i < MLXSW_SP_RIF_MAX; i++)
437                 if (mlxsw_sp->rifs[i] && mlxsw_sp->rifs[i]->dev == dev)
438                         return mlxsw_sp->rifs[i];
439
440         return NULL;
441 }
442
443 enum mlxsw_sp_flood_table {
444         MLXSW_SP_FLOOD_TABLE_UC,
445         MLXSW_SP_FLOOD_TABLE_BM,
446 };
447
448 int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
449 void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
450 int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
451 int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
452                          unsigned int sb_index, u16 pool_index,
453                          struct devlink_sb_pool_info *pool_info);
454 int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
455                          unsigned int sb_index, u16 pool_index, u32 size,
456                          enum devlink_sb_threshold_type threshold_type);
457 int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
458                               unsigned int sb_index, u16 pool_index,
459                               u32 *p_threshold);
460 int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
461                               unsigned int sb_index, u16 pool_index,
462                               u32 threshold);
463 int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
464                                  unsigned int sb_index, u16 tc_index,
465                                  enum devlink_sb_pool_type pool_type,
466                                  u16 *p_pool_index, u32 *p_threshold);
467 int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
468                                  unsigned int sb_index, u16 tc_index,
469                                  enum devlink_sb_pool_type pool_type,
470                                  u16 pool_index, u32 threshold);
471 int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
472                              unsigned int sb_index);
473 int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
474                               unsigned int sb_index);
475 int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
476                                   unsigned int sb_index, u16 pool_index,
477                                   u32 *p_cur, u32 *p_max);
478 int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
479                                      unsigned int sb_index, u16 tc_index,
480                                      enum devlink_sb_pool_type pool_type,
481                                      u32 *p_cur, u32 *p_max);
482
483 int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
484 void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
485 int mlxsw_sp_port_vlan_init(struct mlxsw_sp_port *mlxsw_sp_port);
486 void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port);
487 void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port);
488 int mlxsw_sp_port_vid_to_fid_set(struct mlxsw_sp_port *mlxsw_sp_port,
489                                  enum mlxsw_reg_svfa_mt mt, bool valid, u16 fid,
490                                  u16 vid);
491 int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
492                            u16 vid_end, bool is_member, bool untagged);
493 int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
494                           u16 vid);
495 int mlxsw_sp_vport_flood_set(struct mlxsw_sp_port *mlxsw_sp_vport, u16 fid,
496                              bool set);
497 void mlxsw_sp_port_active_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port);
498 int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
499 int mlxsw_sp_port_fdb_flush(struct mlxsw_sp_port *mlxsw_sp_port, u16 fid);
500 int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
501                         bool adding);
502 struct mlxsw_sp_fid *mlxsw_sp_fid_create(struct mlxsw_sp *mlxsw_sp, u16 fid);
503 void mlxsw_sp_fid_destroy(struct mlxsw_sp *mlxsw_sp, struct mlxsw_sp_fid *f);
504 void mlxsw_sp_rif_bridge_destroy(struct mlxsw_sp *mlxsw_sp,
505                                  struct mlxsw_sp_rif *r);
506 int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
507                           enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
508                           bool dwrr, u8 dwrr_weight);
509 int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
510                               u8 switch_prio, u8 tclass);
511 int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
512                                  u8 *prio_tc, bool pause_en,
513                                  struct ieee_pfc *my_pfc);
514 int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
515                                   enum mlxsw_reg_qeec_hr hr, u8 index,
516                                   u8 next_index, u32 maxrate);
517
518 #ifdef CONFIG_MLXSW_SPECTRUM_DCB
519
520 int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
521 void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
522
523 #else
524
525 static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
526 {
527         return 0;
528 }
529
530 static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
531 {}
532
533 #endif
534
535 int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
536 void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
537 int mlxsw_sp_router_fib4_add(struct mlxsw_sp_port *mlxsw_sp_port,
538                              const struct switchdev_obj_ipv4_fib *fib4,
539                              struct switchdev_trans *trans);
540 int mlxsw_sp_router_fib4_del(struct mlxsw_sp_port *mlxsw_sp_port,
541                              const struct switchdev_obj_ipv4_fib *fib4);
542 int mlxsw_sp_router_neigh_construct(struct net_device *dev,
543                                     struct neighbour *n);
544 void mlxsw_sp_router_neigh_destroy(struct net_device *dev,
545                                    struct neighbour *n);
546
547 int mlxsw_sp_kvdl_alloc(struct mlxsw_sp *mlxsw_sp, unsigned int entry_count);
548 void mlxsw_sp_kvdl_free(struct mlxsw_sp *mlxsw_sp, int entry_index);
549
550 #endif