blob: 877a8793fd97c40906d1c9732a2d8ed74d263c12 [file] [log] [blame]
Jiri Pirko56ade8f2015-10-16 14:01:37 +02001/*
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/bitops.h>
43#include <linux/if_vlan.h>
Ido Schimmel7f71eb42015-12-15 16:03:37 +010044#include <linux/list.h>
Ido Schimmel8e8dfe92016-04-06 17:10:10 +020045#include <linux/dcbnl.h>
Jiri Pirko5e9c16c2016-07-04 08:23:04 +020046#include <linux/in6.h>
Jiri Pirko56ade8f2015-10-16 14:01:37 +020047#include <net/switchdev.h>
48
Elad Raz3a49b4f2016-01-10 21:06:28 +010049#include "port.h"
Jiri Pirko56ade8f2015-10-16 14:01:37 +020050#include "core.h"
51
52#define MLXSW_SP_VFID_BASE VLAN_N_VID
Ido Schimmel7f71eb42015-12-15 16:03:37 +010053#define MLXSW_SP_VFID_PORT_MAX 512 /* Non-bridged VLAN interfaces */
Ido Schimmelb555cf42016-04-05 10:20:02 +020054#define MLXSW_SP_VFID_BR_MAX 6144 /* Bridged VLAN interfaces */
Ido Schimmel7f71eb42015-12-15 16:03:37 +010055#define MLXSW_SP_VFID_MAX (MLXSW_SP_VFID_PORT_MAX + MLXSW_SP_VFID_BR_MAX)
56
Jiri Pirko0d65fc12015-12-03 12:12:28 +010057#define MLXSW_SP_LAG_MAX 64
58#define MLXSW_SP_PORT_PER_LAG_MAX 16
Jiri Pirko56ade8f2015-10-16 14:01:37 +020059
Elad Raz53ae6282016-01-10 21:06:26 +010060#define MLXSW_SP_MID_MAX 7000
61
Ido Schimmel18f1e702016-02-26 17:32:31 +010062#define MLXSW_SP_PORTS_PER_CLUSTER_MAX 4
63
Jiri Pirko53342022016-07-04 08:23:08 +020064#define MLXSW_SP_LPM_TREE_MIN 2 /* trees 0 and 1 are reserved */
65#define MLXSW_SP_LPM_TREE_MAX 22
66#define MLXSW_SP_LPM_TREE_COUNT (MLXSW_SP_LPM_TREE_MAX - MLXSW_SP_LPM_TREE_MIN)
67
Jiri Pirko6b75c482016-07-04 08:23:09 +020068#define MLXSW_SP_VIRTUAL_ROUTER_MAX 256
69
Ido Schimmel18f1e702016-02-26 17:32:31 +010070#define MLXSW_SP_PORT_BASE_SPEED 25000 /* Mb/s */
71
Ido Schimmel1a198442016-04-06 17:10:02 +020072#define MLXSW_SP_BYTES_PER_CELL 96
73
74#define MLXSW_SP_BYTES_TO_CELLS(b) DIV_ROUND_UP(b, MLXSW_SP_BYTES_PER_CELL)
Jiri Pirko0f433fa2016-04-14 18:19:24 +020075#define MLXSW_SP_CELLS_TO_BYTES(c) (c * MLXSW_SP_BYTES_PER_CELL)
Ido Schimmel1a198442016-04-06 17:10:02 +020076
Ido Schimmel9f7ec052016-04-06 17:10:14 +020077/* Maximum delay buffer needed in case of PAUSE frames, in cells.
78 * Assumes 100m cable and maximum MTU.
79 */
80#define MLXSW_SP_PAUSE_DELAY 612
81
Ido Schimmeld81a6bd2016-04-06 17:10:16 +020082#define MLXSW_SP_CELL_FACTOR 2 /* 2 * cell_size / (IPG + cell_size + 1) */
83
Ido Schimmel464dce12016-07-02 11:00:15 +020084#define MLXSW_SP_RIF_MAX 800
85
Ido Schimmeld81a6bd2016-04-06 17:10:16 +020086static inline u16 mlxsw_sp_pfc_delay_get(int mtu, u16 delay)
87{
88 delay = MLXSW_SP_BYTES_TO_CELLS(DIV_ROUND_UP(delay, BITS_PER_BYTE));
89 return MLXSW_SP_CELL_FACTOR * delay + MLXSW_SP_BYTES_TO_CELLS(mtu);
90}
91
Jiri Pirko56ade8f2015-10-16 14:01:37 +020092struct mlxsw_sp_port;
93
Jiri Pirko0d65fc12015-12-03 12:12:28 +010094struct mlxsw_sp_upper {
95 struct net_device *dev;
96 unsigned int ref_count;
97};
98
Ido Schimmeld0ec8752016-06-20 23:04:12 +020099struct mlxsw_sp_fid {
Ido Schimmel1c800752016-06-20 23:04:20 +0200100 void (*leave)(struct mlxsw_sp_port *mlxsw_sp_vport);
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100101 struct list_head list;
Ido Schimmeld0ec8752016-06-20 23:04:12 +0200102 unsigned int ref_count;
103 struct net_device *dev;
104 u16 fid;
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100105 u16 vid;
106};
107
Ido Schimmelfa3054f2016-07-02 11:00:16 +0200108struct mlxsw_sp_rif {
109 struct net_device *dev;
110 u16 rif;
111};
112
Elad Raz3a49b4f2016-01-10 21:06:28 +0100113struct mlxsw_sp_mid {
114 struct list_head list;
115 unsigned char addr[ETH_ALEN];
116 u16 vid;
117 u16 mid;
118 unsigned int ref_count;
119};
120
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100121static inline u16 mlxsw_sp_vfid_to_fid(u16 vfid)
122{
123 return MLXSW_SP_VFID_BASE + vfid;
124}
125
Ido Schimmelaac78a42015-12-15 16:03:42 +0100126static inline u16 mlxsw_sp_fid_to_vfid(u16 fid)
127{
128 return fid - MLXSW_SP_VFID_BASE;
129}
130
131static inline bool mlxsw_sp_fid_is_vfid(u16 fid)
132{
133 return fid >= MLXSW_SP_VFID_BASE;
134}
135
Jiri Pirko078f9c72016-04-14 18:19:19 +0200136struct mlxsw_sp_sb_pr {
137 enum mlxsw_reg_sbpr_mode mode;
138 u32 size;
139};
140
Jiri Pirko2d0ed392016-04-14 18:19:30 +0200141struct mlxsw_cp_sb_occ {
142 u32 cur;
143 u32 max;
144};
145
Jiri Pirko078f9c72016-04-14 18:19:19 +0200146struct mlxsw_sp_sb_cm {
147 u32 min_buff;
148 u32 max_buff;
149 u8 pool;
Jiri Pirko2d0ed392016-04-14 18:19:30 +0200150 struct mlxsw_cp_sb_occ occ;
Jiri Pirko078f9c72016-04-14 18:19:19 +0200151};
152
153struct mlxsw_sp_sb_pm {
154 u32 min_buff;
155 u32 max_buff;
Jiri Pirko2d0ed392016-04-14 18:19:30 +0200156 struct mlxsw_cp_sb_occ occ;
Jiri Pirko078f9c72016-04-14 18:19:19 +0200157};
158
159#define MLXSW_SP_SB_POOL_COUNT 4
160#define MLXSW_SP_SB_TC_COUNT 8
161
162struct mlxsw_sp_sb {
163 struct mlxsw_sp_sb_pr prs[2][MLXSW_SP_SB_POOL_COUNT];
164 struct {
165 struct mlxsw_sp_sb_cm cms[2][MLXSW_SP_SB_TC_COUNT];
166 struct mlxsw_sp_sb_pm pms[2][MLXSW_SP_SB_POOL_COUNT];
167 } ports[MLXSW_PORT_MAX_PORTS];
168};
169
Jiri Pirko5e9c16c2016-07-04 08:23:04 +0200170#define MLXSW_SP_PREFIX_COUNT (sizeof(struct in6_addr) * BITS_PER_BYTE)
171
172struct mlxsw_sp_prefix_usage {
173 DECLARE_BITMAP(b, MLXSW_SP_PREFIX_COUNT);
174};
175
Jiri Pirko53342022016-07-04 08:23:08 +0200176enum mlxsw_sp_l3proto {
177 MLXSW_SP_L3_PROTO_IPV4,
178 MLXSW_SP_L3_PROTO_IPV6,
179};
180
181struct mlxsw_sp_lpm_tree {
182 u8 id; /* tree ID */
183 unsigned int ref_count;
184 enum mlxsw_sp_l3proto proto;
185 struct mlxsw_sp_prefix_usage prefix_usage;
186};
187
Jiri Pirko6b75c482016-07-04 08:23:09 +0200188struct mlxsw_sp_fib;
189
190struct mlxsw_sp_vr {
191 u16 id; /* virtual router ID */
192 bool used;
193 enum mlxsw_sp_l3proto proto;
194 u32 tb_id; /* kernel fib table id */
195 struct mlxsw_sp_lpm_tree *lpm_tree;
196 struct mlxsw_sp_fib *fib;
197};
198
Jiri Pirko53342022016-07-04 08:23:08 +0200199struct mlxsw_sp_router {
200 struct mlxsw_sp_lpm_tree lpm_trees[MLXSW_SP_LPM_TREE_COUNT];
Jiri Pirko6b75c482016-07-04 08:23:09 +0200201 struct mlxsw_sp_vr vrs[MLXSW_SP_VIRTUAL_ROUTER_MAX];
Jiri Pirko53342022016-07-04 08:23:08 +0200202};
203
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200204struct mlxsw_sp {
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100205 struct {
206 struct list_head list;
Ido Schimmeld8651fd2016-06-20 23:04:07 +0200207 DECLARE_BITMAP(mapped, MLXSW_SP_VFID_PORT_MAX);
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100208 } port_vfids;
Ido Schimmel26f0e7f2015-12-15 16:03:44 +0100209 struct {
210 struct list_head list;
Ido Schimmeld8651fd2016-06-20 23:04:07 +0200211 DECLARE_BITMAP(mapped, MLXSW_SP_VFID_BR_MAX);
Ido Schimmel26f0e7f2015-12-15 16:03:44 +0100212 } br_vfids;
Elad Raz3a49b4f2016-01-10 21:06:28 +0100213 struct {
214 struct list_head list;
Ido Schimmeld8651fd2016-06-20 23:04:07 +0200215 DECLARE_BITMAP(mapped, MLXSW_SP_MID_MAX);
Elad Raz3a49b4f2016-01-10 21:06:28 +0100216 } br_mids;
Ido Schimmel14d39462016-06-20 23:04:15 +0200217 struct list_head fids; /* VLAN-aware bridge FIDs */
Ido Schimmelfa3054f2016-07-02 11:00:16 +0200218 struct mlxsw_sp_rif *rifs[MLXSW_SP_RIF_MAX];
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200219 struct mlxsw_sp_port **ports;
220 struct mlxsw_core *core;
221 const struct mlxsw_bus_info *bus_info;
222 unsigned char base_mac[ETH_ALEN];
223 struct {
224 struct delayed_work dw;
225#define MLXSW_SP_DEFAULT_LEARNING_INTERVAL 100
226 unsigned int interval; /* ms */
227 } fdb_notify;
Ido Schimmel869f63a2016-03-08 12:59:33 -0800228#define MLXSW_SP_MIN_AGEING_TIME 10
229#define MLXSW_SP_MAX_AGEING_TIME 1000000
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200230#define MLXSW_SP_DEFAULT_AGEING_TIME 300
231 u32 ageing_time;
Jiri Pirko0d65fc12015-12-03 12:12:28 +0100232 struct mlxsw_sp_upper master_bridge;
233 struct mlxsw_sp_upper lags[MLXSW_SP_LAG_MAX];
Ido Schimmel558c2d52016-02-26 17:32:29 +0100234 u8 port_to_module[MLXSW_PORT_MAX_PORTS];
Jiri Pirko078f9c72016-04-14 18:19:19 +0200235 struct mlxsw_sp_sb sb;
Jiri Pirko53342022016-07-04 08:23:08 +0200236 struct mlxsw_sp_router router;
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200237};
238
Jiri Pirko0d65fc12015-12-03 12:12:28 +0100239static inline struct mlxsw_sp_upper *
240mlxsw_sp_lag_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id)
241{
242 return &mlxsw_sp->lags[lag_id];
243}
244
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200245struct mlxsw_sp_port_pcpu_stats {
246 u64 rx_packets;
247 u64 rx_bytes;
248 u64 tx_packets;
249 u64 tx_bytes;
250 struct u64_stats_sync syncp;
251 u32 tx_dropped;
252};
253
254struct mlxsw_sp_port {
Jiri Pirko932762b2016-04-08 19:11:21 +0200255 struct mlxsw_core_port core_port; /* must be first */
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200256 struct net_device *dev;
257 struct mlxsw_sp_port_pcpu_stats __percpu *pcpu_stats;
258 struct mlxsw_sp *mlxsw_sp;
259 u8 local_port;
260 u8 stp_state;
Jiri Pirko0d9b9702015-10-28 10:16:56 +0100261 u8 learning:1,
262 learning_sync:1,
Ido Schimmel02930382015-10-28 10:16:58 +0100263 uc_flood:1,
Jiri Pirko0d65fc12015-12-03 12:12:28 +0100264 bridged:1,
Ido Schimmel18f1e702016-02-26 17:32:31 +0100265 lagged:1,
266 split:1;
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200267 u16 pvid;
Jiri Pirko0d65fc12015-12-03 12:12:28 +0100268 u16 lag_id;
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100269 struct {
270 struct list_head list;
Ido Schimmeld0ec8752016-06-20 23:04:12 +0200271 struct mlxsw_sp_fid *f;
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100272 u16 vid;
273 } vport;
Ido Schimmel8e8dfe92016-04-06 17:10:10 +0200274 struct {
Ido Schimmel9f7ec052016-04-06 17:10:14 +0200275 u8 tx_pause:1,
276 rx_pause:1;
277 } link;
278 struct {
Ido Schimmel8e8dfe92016-04-06 17:10:10 +0200279 struct ieee_ets *ets;
Ido Schimmelcc7cf512016-04-06 17:10:11 +0200280 struct ieee_maxrate *maxrate;
Ido Schimmeld81a6bd2016-04-06 17:10:16 +0200281 struct ieee_pfc *pfc;
Ido Schimmel8e8dfe92016-04-06 17:10:10 +0200282 } dcb;
Ido Schimmeld664b412016-06-09 09:51:40 +0200283 struct {
284 u8 module;
285 u8 width;
286 u8 lane;
287 } mapping;
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200288 /* 802.1Q bridge VLANs */
Ido Schimmelbd40e9d2015-12-15 16:03:36 +0100289 unsigned long *active_vlans;
Elad Razfc1273a2016-01-06 13:01:11 +0100290 unsigned long *untagged_vlans;
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200291 /* VLAN interfaces */
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100292 struct list_head vports_list;
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200293};
294
Ido Schimmel9f7ec052016-04-06 17:10:14 +0200295static inline bool
296mlxsw_sp_port_is_pause_en(const struct mlxsw_sp_port *mlxsw_sp_port)
297{
298 return mlxsw_sp_port->link.tx_pause || mlxsw_sp_port->link.rx_pause;
299}
300
Jiri Pirko0d65fc12015-12-03 12:12:28 +0100301static inline struct mlxsw_sp_port *
302mlxsw_sp_port_lagged_get(struct mlxsw_sp *mlxsw_sp, u16 lag_id, u8 port_index)
303{
304 struct mlxsw_sp_port *mlxsw_sp_port;
305 u8 local_port;
306
307 local_port = mlxsw_core_lag_mapping_get(mlxsw_sp->core,
308 lag_id, port_index);
309 mlxsw_sp_port = mlxsw_sp->ports[local_port];
310 return mlxsw_sp_port && mlxsw_sp_port->lagged ? mlxsw_sp_port : NULL;
311}
312
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100313static inline u16
314mlxsw_sp_vport_vid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
315{
316 return mlxsw_sp_vport->vport.vid;
317}
318
Ido Schimmel6381b3a2016-06-20 23:04:16 +0200319static inline bool
320mlxsw_sp_port_is_vport(const struct mlxsw_sp_port *mlxsw_sp_port)
321{
322 u16 vid = mlxsw_sp_vport_vid_get(mlxsw_sp_port);
323
324 return vid != 0;
325}
326
Ido Schimmel41b996c2016-06-20 23:04:17 +0200327static inline void mlxsw_sp_vport_fid_set(struct mlxsw_sp_port *mlxsw_sp_vport,
328 struct mlxsw_sp_fid *f)
329{
330 mlxsw_sp_vport->vport.f = f;
331}
332
333static inline struct mlxsw_sp_fid *
Ido Schimmeld0ec8752016-06-20 23:04:12 +0200334mlxsw_sp_vport_fid_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100335{
Ido Schimmel41b996c2016-06-20 23:04:17 +0200336 return mlxsw_sp_vport->vport.f;
337}
338
339static inline struct net_device *
340mlxsw_sp_vport_br_get(const struct mlxsw_sp_port *mlxsw_sp_vport)
341{
342 struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
343
Ido Schimmel56918b62016-06-20 23:04:18 +0200344 return f ? f->dev : NULL;
Ido Schimmel7f71eb42015-12-15 16:03:37 +0100345}
346
347static inline struct mlxsw_sp_port *
348mlxsw_sp_port_vport_find(const struct mlxsw_sp_port *mlxsw_sp_port, u16 vid)
349{
350 struct mlxsw_sp_port *mlxsw_sp_vport;
351
352 list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
353 vport.list) {
354 if (mlxsw_sp_vport_vid_get(mlxsw_sp_vport) == vid)
355 return mlxsw_sp_vport;
356 }
357
358 return NULL;
359}
360
Ido Schimmelaac78a42015-12-15 16:03:42 +0100361static inline struct mlxsw_sp_port *
Ido Schimmeld0ec8752016-06-20 23:04:12 +0200362mlxsw_sp_port_vport_find_by_fid(const struct mlxsw_sp_port *mlxsw_sp_port,
363 u16 fid)
Ido Schimmelaac78a42015-12-15 16:03:42 +0100364{
365 struct mlxsw_sp_port *mlxsw_sp_vport;
366
367 list_for_each_entry(mlxsw_sp_vport, &mlxsw_sp_port->vports_list,
368 vport.list) {
Ido Schimmel41b996c2016-06-20 23:04:17 +0200369 struct mlxsw_sp_fid *f = mlxsw_sp_vport_fid_get(mlxsw_sp_vport);
370
Ido Schimmel56918b62016-06-20 23:04:18 +0200371 if (f && f->fid == fid)
Ido Schimmelaac78a42015-12-15 16:03:42 +0100372 return mlxsw_sp_vport;
373 }
374
375 return NULL;
376}
377
Ido Schimmelfa3054f2016-07-02 11:00:16 +0200378static inline struct mlxsw_sp_rif *
379mlxsw_sp_rif_find_by_dev(const struct mlxsw_sp *mlxsw_sp,
380 const struct net_device *dev)
381{
382 int i;
383
384 for (i = 0; i < MLXSW_SP_RIF_MAX; i++)
385 if (mlxsw_sp->rifs[i] && mlxsw_sp->rifs[i]->dev == dev)
386 return mlxsw_sp->rifs[i];
387
388 return NULL;
389}
390
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200391enum mlxsw_sp_flood_table {
392 MLXSW_SP_FLOOD_TABLE_UC,
393 MLXSW_SP_FLOOD_TABLE_BM,
394};
395
396int mlxsw_sp_buffers_init(struct mlxsw_sp *mlxsw_sp);
Jiri Pirko0f433fa2016-04-14 18:19:24 +0200397void mlxsw_sp_buffers_fini(struct mlxsw_sp *mlxsw_sp);
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200398int mlxsw_sp_port_buffers_init(struct mlxsw_sp_port *mlxsw_sp_port);
Jiri Pirko0f433fa2016-04-14 18:19:24 +0200399int mlxsw_sp_sb_pool_get(struct mlxsw_core *mlxsw_core,
400 unsigned int sb_index, u16 pool_index,
401 struct devlink_sb_pool_info *pool_info);
402int mlxsw_sp_sb_pool_set(struct mlxsw_core *mlxsw_core,
403 unsigned int sb_index, u16 pool_index, u32 size,
404 enum devlink_sb_threshold_type threshold_type);
405int mlxsw_sp_sb_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
406 unsigned int sb_index, u16 pool_index,
407 u32 *p_threshold);
408int mlxsw_sp_sb_port_pool_set(struct mlxsw_core_port *mlxsw_core_port,
409 unsigned int sb_index, u16 pool_index,
410 u32 threshold);
411int mlxsw_sp_sb_tc_pool_bind_get(struct mlxsw_core_port *mlxsw_core_port,
412 unsigned int sb_index, u16 tc_index,
413 enum devlink_sb_pool_type pool_type,
414 u16 *p_pool_index, u32 *p_threshold);
415int mlxsw_sp_sb_tc_pool_bind_set(struct mlxsw_core_port *mlxsw_core_port,
416 unsigned int sb_index, u16 tc_index,
417 enum devlink_sb_pool_type pool_type,
418 u16 pool_index, u32 threshold);
Jiri Pirko2d0ed392016-04-14 18:19:30 +0200419int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
420 unsigned int sb_index);
421int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
422 unsigned int sb_index);
423int mlxsw_sp_sb_occ_port_pool_get(struct mlxsw_core_port *mlxsw_core_port,
424 unsigned int sb_index, u16 pool_index,
425 u32 *p_cur, u32 *p_max);
426int mlxsw_sp_sb_occ_tc_port_bind_get(struct mlxsw_core_port *mlxsw_core_port,
427 unsigned int sb_index, u16 tc_index,
428 enum devlink_sb_pool_type pool_type,
429 u32 *p_cur, u32 *p_max);
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200430
431int mlxsw_sp_switchdev_init(struct mlxsw_sp *mlxsw_sp);
432void mlxsw_sp_switchdev_fini(struct mlxsw_sp *mlxsw_sp);
433int mlxsw_sp_port_vlan_init(struct mlxsw_sp_port *mlxsw_sp_port);
434void mlxsw_sp_port_switchdev_init(struct mlxsw_sp_port *mlxsw_sp_port);
435void mlxsw_sp_port_switchdev_fini(struct mlxsw_sp_port *mlxsw_sp_port);
436int mlxsw_sp_port_vid_to_fid_set(struct mlxsw_sp_port *mlxsw_sp_port,
437 enum mlxsw_reg_svfa_mt mt, bool valid, u16 fid,
438 u16 vid);
439int mlxsw_sp_port_vlan_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid_begin,
440 u16 vid_end, bool is_member, bool untagged);
441int mlxsw_sp_port_add_vid(struct net_device *dev, __be16 __always_unused proto,
442 u16 vid);
Ido Schimmele6060022016-06-20 23:04:11 +0200443int mlxsw_sp_vport_flood_set(struct mlxsw_sp_port *mlxsw_sp_vport, u16 fid,
Ido Schimmel47a0a9e2016-06-20 23:04:08 +0200444 bool set);
Ido Schimmel4dc236c2016-01-27 15:20:16 +0100445void mlxsw_sp_port_active_vlans_del(struct mlxsw_sp_port *mlxsw_sp_port);
Ido Schimmel28a01d22016-02-18 11:30:02 +0100446int mlxsw_sp_port_pvid_set(struct mlxsw_sp_port *mlxsw_sp_port, u16 vid);
Ido Schimmelfe3f6d12016-06-20 23:04:19 +0200447int mlxsw_sp_port_fdb_flush(struct mlxsw_sp_port *mlxsw_sp_port, u16 fid);
Ido Schimmel8e8dfe92016-04-06 17:10:10 +0200448int mlxsw_sp_port_ets_set(struct mlxsw_sp_port *mlxsw_sp_port,
449 enum mlxsw_reg_qeec_hr hr, u8 index, u8 next_index,
450 bool dwrr, u8 dwrr_weight);
451int mlxsw_sp_port_prio_tc_set(struct mlxsw_sp_port *mlxsw_sp_port,
452 u8 switch_prio, u8 tclass);
453int __mlxsw_sp_port_headroom_set(struct mlxsw_sp_port *mlxsw_sp_port, int mtu,
Ido Schimmeld81a6bd2016-04-06 17:10:16 +0200454 u8 *prio_tc, bool pause_en,
455 struct ieee_pfc *my_pfc);
Ido Schimmelcc7cf512016-04-06 17:10:11 +0200456int mlxsw_sp_port_ets_maxrate_set(struct mlxsw_sp_port *mlxsw_sp_port,
457 enum mlxsw_reg_qeec_hr hr, u8 index,
458 u8 next_index, u32 maxrate);
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200459
Ido Schimmelf00817d2016-04-06 17:10:09 +0200460#ifdef CONFIG_MLXSW_SPECTRUM_DCB
461
462int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port);
463void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port);
464
465#else
466
467static inline int mlxsw_sp_port_dcb_init(struct mlxsw_sp_port *mlxsw_sp_port)
468{
469 return 0;
470}
471
472static inline void mlxsw_sp_port_dcb_fini(struct mlxsw_sp_port *mlxsw_sp_port)
473{}
474
475#endif
476
Ido Schimmel464dce12016-07-02 11:00:15 +0200477int mlxsw_sp_router_init(struct mlxsw_sp *mlxsw_sp);
478void mlxsw_sp_router_fini(struct mlxsw_sp *mlxsw_sp);
Jiri Pirko61c503f2016-07-04 08:23:11 +0200479int mlxsw_sp_router_fib4_add(struct mlxsw_sp_port *mlxsw_sp_port,
480 const struct switchdev_obj_ipv4_fib *fib4,
481 struct switchdev_trans *trans);
482int mlxsw_sp_router_fib4_del(struct mlxsw_sp_port *mlxsw_sp_port,
483 const struct switchdev_obj_ipv4_fib *fib4);
Ido Schimmel464dce12016-07-02 11:00:15 +0200484
Jiri Pirko56ade8f2015-10-16 14:01:37 +0200485#endif