net: devlink: introduce port registered assert helper and use it
[linux-block.git] / include / net / devlink.h
CommitLineData
2874c5fd 1/* SPDX-License-Identifier: GPL-2.0-or-later */
bfcd3a46
JP
2/*
3 * include/net/devlink.h - Network physical device Netlink interface
4 * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
5 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
bfcd3a46
JP
6 */
7#ifndef _NET_DEVLINK_H_
8#define _NET_DEVLINK_H_
9
10#include <linux/device.h>
11#include <linux/slab.h>
12#include <linux/gfp.h>
13#include <linux/list.h>
14#include <linux/netdevice.h>
b8f97554 15#include <linux/spinlock.h>
136bf27f 16#include <linux/workqueue.h>
0f420b6c 17#include <linux/refcount.h>
bfcd3a46 18#include <net/net_namespace.h>
5a2e106c 19#include <net/flow_offload.h>
bfcd3a46 20#include <uapi/linux/devlink.h>
12102436 21#include <linux/xarray.h>
b44cfd4f 22#include <linux/firmware.h>
bfcd3a46 23
21314638 24struct devlink;
c246f9b5 25struct devlink_linecard;
bfcd3a46 26
378ef01b
PP
27struct devlink_port_phys_attrs {
28 u32 port_number; /* Same value as "split group".
29 * A physical port which is visible to the user
30 * for a given port flavour.
31 */
71ad8d55 32 u32 split_subport_number; /* If the port is split, this is the number of subport. */
378ef01b
PP
33};
34
ff03e63a
PP
35/**
36 * struct devlink_port_pci_pf_attrs - devlink port's PCI PF attributes
3a2d9588 37 * @controller: Associated controller number
ff03e63a 38 * @pf: Associated PCI PF number for this port.
05b595e9 39 * @external: when set, indicates if a port is for an external controller
ff03e63a 40 */
98fd2d65 41struct devlink_port_pci_pf_attrs {
3a2d9588 42 u32 controller;
ff03e63a 43 u16 pf;
05b595e9 44 u8 external:1;
98fd2d65
PP
45};
46
ff03e63a
PP
47/**
48 * struct devlink_port_pci_vf_attrs - devlink port's PCI VF attributes
3a2d9588 49 * @controller: Associated controller number
ff03e63a
PP
50 * @pf: Associated PCI PF number for this port.
51 * @vf: Associated PCI VF for of the PCI PF for this port.
05b595e9 52 * @external: when set, indicates if a port is for an external controller
ff03e63a 53 */
e41b6bf3 54struct devlink_port_pci_vf_attrs {
3a2d9588 55 u32 controller;
ff03e63a
PP
56 u16 pf;
57 u16 vf;
05b595e9 58 u8 external:1;
e41b6bf3
PP
59};
60
b8288837
PP
61/**
62 * struct devlink_port_pci_sf_attrs - devlink port's PCI SF attributes
63 * @controller: Associated controller number
64 * @sf: Associated PCI SF for of the PCI PF for this port.
65 * @pf: Associated PCI PF number for this port.
a1ab3e45 66 * @external: when set, indicates if a port is for an external controller
b8288837
PP
67 */
68struct devlink_port_pci_sf_attrs {
69 u32 controller;
70 u32 sf;
71 u16 pf;
a1ab3e45 72 u8 external:1;
b8288837
PP
73};
74
71ad8d55
DR
75/**
76 * struct devlink_port_attrs - devlink port object
77 * @flavour: flavour of the port
78 * @split: indicates if this is split port
a0f49b54 79 * @splittable: indicates if the port can be split.
a21cf0a8 80 * @lanes: maximum number of lanes the port supports. 0 value is not passed to netlink.
71ad8d55 81 * @switch_id: if the port is part of switch, this is buffer with ID, otherwise this is NULL
2efbe6ae
PP
82 * @phys: physical port attributes
83 * @pci_pf: PCI PF port attributes
84 * @pci_vf: PCI VF port attributes
b8288837 85 * @pci_sf: PCI SF port attributes
71ad8d55 86 */
b9ffcbaf 87struct devlink_port_attrs {
a0f49b54
DR
88 u8 split:1,
89 splittable:1;
a21cf0a8 90 u32 lanes;
5ec1380a 91 enum devlink_port_flavour flavour;
bec5267c 92 struct netdev_phys_item_id switch_id;
378ef01b
PP
93 union {
94 struct devlink_port_phys_attrs phys;
98fd2d65 95 struct devlink_port_pci_pf_attrs pci_pf;
e41b6bf3 96 struct devlink_port_pci_vf_attrs pci_vf;
b8288837 97 struct devlink_port_pci_sf_attrs pci_sf;
378ef01b 98 };
b9ffcbaf
JP
99};
100
4677efc4
DL
101struct devlink_rate {
102 struct list_head list;
103 enum devlink_rate_type type;
104 struct devlink *devlink;
105 void *priv;
1897db2e
DL
106 u64 tx_share;
107 u64 tx_max;
4677efc4 108
d7555984 109 struct devlink_rate *parent;
a8ecb93e
DL
110 union {
111 struct devlink_port *devlink_port;
d7555984
DL
112 struct {
113 char *name;
114 refcount_t refcnt;
115 };
a8ecb93e 116 };
4677efc4
DL
117};
118
bfcd3a46
JP
119struct devlink_port {
120 struct list_head list;
544e7c33 121 struct list_head region_list;
bfcd3a46 122 struct devlink *devlink;
c7282b50 123 unsigned int index;
b8f97554
JP
124 spinlock_t type_lock; /* Protects type and type_dev
125 * pointer consistency.
126 */
bfcd3a46
JP
127 enum devlink_port_type type;
128 enum devlink_port_type desired_type;
129 void *type_dev;
b9ffcbaf 130 struct devlink_port_attrs attrs;
46737a19
DR
131 u8 attrs_set:1,
132 switch_port:1;
136bf27f 133 struct delayed_work type_warn_dw;
f4f54166
VT
134 struct list_head reporter_list;
135 struct mutex reporters_lock; /* Protects reporter_list */
4677efc4
DL
136
137 struct devlink_rate *devlink_rate;
b8375859 138 struct devlink_linecard *linecard;
bfcd3a46
JP
139};
140
cd76dcd6
PP
141struct devlink_port_new_attrs {
142 enum devlink_port_flavour flavour;
143 unsigned int port_index;
144 u32 controller;
145 u32 sfnum;
146 u16 pfnum;
147 u8 port_index_valid:1,
148 controller_valid:1,
149 sfnum_valid:1;
150};
151
fcdc8ce2
JP
152/**
153 * struct devlink_linecard_ops - Linecard operations
154 * @provision: callback to provision the linecard slot with certain
155 * type of linecard. As a result of this operation,
156 * driver is expected to eventually (could be after
157 * the function call returns) call one of:
158 * devlink_linecard_provision_set()
159 * devlink_linecard_provision_fail()
160 * @unprovision: callback to unprovision the linecard slot. As a result
161 * of this operation, driver is expected to eventually
162 * (could be after the function call returns) call
163 * devlink_linecard_provision_clear()
164 * devlink_linecard_provision_fail()
165 * @same_provision: callback to ask the driver if linecard is already
166 * provisioned in the same way user asks this linecard to be
167 * provisioned.
168 * @types_count: callback to get number of supported types
169 * @types_get: callback to get next type in list
170 */
171struct devlink_linecard_ops {
172 int (*provision)(struct devlink_linecard *linecard, void *priv,
173 const char *type, const void *type_priv,
174 struct netlink_ext_ack *extack);
175 int (*unprovision)(struct devlink_linecard *linecard, void *priv,
176 struct netlink_ext_ack *extack);
177 bool (*same_provision)(struct devlink_linecard *linecard, void *priv,
178 const char *type, const void *type_priv);
179 unsigned int (*types_count)(struct devlink_linecard *linecard,
180 void *priv);
181 void (*types_get)(struct devlink_linecard *linecard,
182 void *priv, unsigned int index, const char **type,
183 const void **type_priv);
184};
185
bf797471
JP
186struct devlink_sb_pool_info {
187 enum devlink_sb_pool_type pool_type;
188 u32 size;
189 enum devlink_sb_threshold_type threshold_type;
bff5731d 190 u32 cell_size;
bf797471
JP
191};
192
1555d204
AS
193/**
194 * struct devlink_dpipe_field - dpipe field object
195 * @name: field name
196 * @id: index inside the headers field array
197 * @bitwidth: bitwidth
198 * @mapping_type: mapping type
199 */
200struct devlink_dpipe_field {
201 const char *name;
202 unsigned int id;
203 unsigned int bitwidth;
204 enum devlink_dpipe_field_mapping_type mapping_type;
205};
206
207/**
208 * struct devlink_dpipe_header - dpipe header object
209 * @name: header name
210 * @id: index, global/local detrmined by global bit
211 * @fields: fields
212 * @fields_count: number of fields
213 * @global: indicates if header is shared like most protocol header
214 * or driver specific
215 */
216struct devlink_dpipe_header {
217 const char *name;
218 unsigned int id;
219 struct devlink_dpipe_field *fields;
220 unsigned int fields_count;
221 bool global;
222};
223
224/**
225 * struct devlink_dpipe_match - represents match operation
226 * @type: type of match
227 * @header_index: header index (packets can have several headers of same
228 * type like in case of tunnels)
229 * @header: header
230 * @fieled_id: field index
231 */
232struct devlink_dpipe_match {
233 enum devlink_dpipe_match_type type;
234 unsigned int header_index;
235 struct devlink_dpipe_header *header;
236 unsigned int field_id;
237};
238
239/**
240 * struct devlink_dpipe_action - represents action operation
241 * @type: type of action
242 * @header_index: header index (packets can have several headers of same
243 * type like in case of tunnels)
244 * @header: header
245 * @fieled_id: field index
246 */
247struct devlink_dpipe_action {
248 enum devlink_dpipe_action_type type;
249 unsigned int header_index;
250 struct devlink_dpipe_header *header;
251 unsigned int field_id;
252};
253
254/**
255 * struct devlink_dpipe_value - represents value of match/action
256 * @action: action
257 * @match: match
258 * @mapping_value: in case the field has some mapping this value
259 * specified the mapping value
260 * @mapping_valid: specify if mapping value is valid
261 * @value_size: value size
262 * @value: value
263 * @mask: bit mask
264 */
265struct devlink_dpipe_value {
266 union {
267 struct devlink_dpipe_action *action;
268 struct devlink_dpipe_match *match;
269 };
270 unsigned int mapping_value;
271 bool mapping_valid;
272 unsigned int value_size;
273 void *value;
274 void *mask;
275};
276
277/**
278 * struct devlink_dpipe_entry - table entry object
279 * @index: index of the entry in the table
280 * @match_values: match values
281 * @matche_values_count: count of matches tuples
282 * @action_values: actions values
283 * @action_values_count: count of actions values
284 * @counter: value of counter
285 * @counter_valid: Specify if value is valid from hardware
286 */
287struct devlink_dpipe_entry {
288 u64 index;
289 struct devlink_dpipe_value *match_values;
290 unsigned int match_values_count;
291 struct devlink_dpipe_value *action_values;
292 unsigned int action_values_count;
293 u64 counter;
294 bool counter_valid;
295};
296
297/**
298 * struct devlink_dpipe_dump_ctx - context provided to driver in order
299 * to dump
300 * @info: info
301 * @cmd: devlink command
302 * @skb: skb
303 * @nest: top attribute
304 * @hdr: hdr
305 */
306struct devlink_dpipe_dump_ctx {
307 struct genl_info *info;
308 enum devlink_command cmd;
309 struct sk_buff *skb;
310 struct nlattr *nest;
311 void *hdr;
312};
313
314struct devlink_dpipe_table_ops;
315
316/**
317 * struct devlink_dpipe_table - table object
318 * @priv: private
319 * @name: table name
1555d204
AS
320 * @counters_enabled: indicates if counters are active
321 * @counter_control_extern: indicates if counter control is in dpipe or
322 * external tool
56dc7cd0
AS
323 * @resource_valid: Indicate that the resource id is valid
324 * @resource_id: relative resource this table is related to
325 * @resource_units: number of resource's unit consumed per table's entry
1555d204
AS
326 * @table_ops: table operations
327 * @rcu: rcu
328 */
329struct devlink_dpipe_table {
330 void *priv;
331 struct list_head list;
332 const char *name;
1555d204
AS
333 bool counters_enabled;
334 bool counter_control_extern;
56dc7cd0
AS
335 bool resource_valid;
336 u64 resource_id;
337 u64 resource_units;
1555d204
AS
338 struct devlink_dpipe_table_ops *table_ops;
339 struct rcu_head rcu;
340};
341
342/**
343 * struct devlink_dpipe_table_ops - dpipe_table ops
344 * @actions_dump - dumps all tables actions
345 * @matches_dump - dumps all tables matches
346 * @entries_dump - dumps all active entries in the table
347 * @counters_set_update - when changing the counter status hardware sync
348 * maybe needed to allocate/free counter related
349 * resources
ffd3cdcc 350 * @size_get - get size
1555d204
AS
351 */
352struct devlink_dpipe_table_ops {
353 int (*actions_dump)(void *priv, struct sk_buff *skb);
354 int (*matches_dump)(void *priv, struct sk_buff *skb);
355 int (*entries_dump)(void *priv, bool counters_enabled,
356 struct devlink_dpipe_dump_ctx *dump_ctx);
357 int (*counters_set_update)(void *priv, bool enable);
ffd3cdcc 358 u64 (*size_get)(void *priv);
1555d204
AS
359};
360
361/**
362 * struct devlink_dpipe_headers - dpipe headers
363 * @headers - header array can be shared (global bit) or driver specific
364 * @headers_count - count of headers
365 */
366struct devlink_dpipe_headers {
367 struct devlink_dpipe_header **headers;
368 unsigned int headers_count;
369};
370
d9f9b9a4
AS
371/**
372 * struct devlink_resource_size_params - resource's size parameters
373 * @size_min: minimum size which can be set
374 * @size_max: maximum size which can be set
375 * @size_granularity: size granularity
376 * @size_unit: resource's basic unit
377 */
378struct devlink_resource_size_params {
379 u64 size_min;
380 u64 size_max;
381 u64 size_granularity;
382 enum devlink_resource_unit unit;
383};
384
77d27096
JP
385static inline void
386devlink_resource_size_params_init(struct devlink_resource_size_params *size_params,
387 u64 size_min, u64 size_max,
388 u64 size_granularity,
389 enum devlink_resource_unit unit)
390{
391 size_params->size_min = size_min;
392 size_params->size_max = size_max;
393 size_params->size_granularity = size_granularity;
394 size_params->unit = unit;
395}
396
fc56be47
JP
397typedef u64 devlink_resource_occ_get_t(void *priv);
398
d9f9b9a4
AS
399#define DEVLINK_RESOURCE_ID_PARENT_TOP 0
400
321f7ab0
DR
401#define DEVLINK_RESOURCE_GENERIC_NAME_PORTS "physical_ports"
402
bde74ad1 403#define __DEVLINK_PARAM_MAX_STRING_VALUE 32
eabaef18
MS
404enum devlink_param_type {
405 DEVLINK_PARAM_TYPE_U8,
406 DEVLINK_PARAM_TYPE_U16,
407 DEVLINK_PARAM_TYPE_U32,
408 DEVLINK_PARAM_TYPE_STRING,
409 DEVLINK_PARAM_TYPE_BOOL,
410};
411
412union devlink_param_value {
413 u8 vu8;
414 u16 vu16;
415 u32 vu32;
bde74ad1 416 char vstr[__DEVLINK_PARAM_MAX_STRING_VALUE];
eabaef18
MS
417 bool vbool;
418};
419
420struct devlink_param_gset_ctx {
421 union devlink_param_value val;
422 enum devlink_param_cmode cmode;
423};
424
6700acc5
SN
425/**
426 * struct devlink_flash_notify - devlink dev flash notify data
427 * @status_msg: current status string
428 * @component: firmware component being updated
429 * @done: amount of work completed of total amount
430 * @total: amount of work expected to be done
431 * @timeout: expected max timeout in seconds
432 *
433 * These are values to be given to userland to be displayed in order
434 * to show current activity in a firmware update process.
435 */
436struct devlink_flash_notify {
437 const char *status_msg;
438 const char *component;
439 unsigned long done;
440 unsigned long total;
441 unsigned long timeout;
442};
443
eabaef18
MS
444/**
445 * struct devlink_param - devlink configuration parameter data
446 * @name: name of the parameter
447 * @generic: indicates if the parameter is generic or driver specific
448 * @type: parameter type
449 * @supported_cmodes: bitmap of supported configuration modes
450 * @get: get parameter value, used for runtime and permanent
451 * configuration modes
452 * @set: set parameter value, used for runtime and permanent
453 * configuration modes
e3b7ca18 454 * @validate: validate input value is applicable (within value range, etc.)
eabaef18
MS
455 *
456 * This struct should be used by the driver to fill the data for
457 * a parameter it registers.
458 */
459struct devlink_param {
460 u32 id;
461 const char *name;
462 bool generic;
463 enum devlink_param_type type;
464 unsigned long supported_cmodes;
465 int (*get)(struct devlink *devlink, u32 id,
466 struct devlink_param_gset_ctx *ctx);
467 int (*set)(struct devlink *devlink, u32 id,
468 struct devlink_param_gset_ctx *ctx);
e3b7ca18
MS
469 int (*validate)(struct devlink *devlink, u32 id,
470 union devlink_param_value val,
471 struct netlink_ext_ack *extack);
eabaef18
MS
472};
473
474struct devlink_param_item {
475 struct list_head list;
476 const struct devlink_param *param;
477 union devlink_param_value driverinit_value;
478 bool driverinit_value_valid;
479};
480
481enum devlink_param_generic_id {
036467c3
MS
482 DEVLINK_PARAM_GENERIC_ID_INT_ERR_RESET,
483 DEVLINK_PARAM_GENERIC_ID_MAX_MACS,
f567bcda 484 DEVLINK_PARAM_GENERIC_ID_ENABLE_SRIOV,
f6a69885 485 DEVLINK_PARAM_GENERIC_ID_REGION_SNAPSHOT,
e3b51061 486 DEVLINK_PARAM_GENERIC_ID_IGNORE_ARI,
f61cba42 487 DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MAX,
16511789 488 DEVLINK_PARAM_GENERIC_ID_MSIX_VEC_PER_PF_MIN,
846e980a 489 DEVLINK_PARAM_GENERIC_ID_FW_LOAD_POLICY,
5bbd21df 490 DEVLINK_PARAM_GENERIC_ID_RESET_DEV_ON_DRV_PROBE,
6c7295e1 491 DEVLINK_PARAM_GENERIC_ID_ENABLE_ROCE,
195d9dec 492 DEVLINK_PARAM_GENERIC_ID_ENABLE_REMOTE_DEV_RESET,
f13a5ad8 493 DEVLINK_PARAM_GENERIC_ID_ENABLE_ETH,
8ddaabee 494 DEVLINK_PARAM_GENERIC_ID_ENABLE_RDMA,
076b2a9d 495 DEVLINK_PARAM_GENERIC_ID_ENABLE_VNET,
325e0d0a 496 DEVLINK_PARAM_GENERIC_ID_ENABLE_IWARP,
47402385 497 DEVLINK_PARAM_GENERIC_ID_IO_EQ_SIZE,
0b5705eb 498 DEVLINK_PARAM_GENERIC_ID_EVENT_EQ_SIZE,
eabaef18
MS
499
500 /* add new param generic ids above here*/
501 __DEVLINK_PARAM_GENERIC_ID_MAX,
502 DEVLINK_PARAM_GENERIC_ID_MAX = __DEVLINK_PARAM_GENERIC_ID_MAX - 1,
503};
504
036467c3
MS
505#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_NAME "internal_error_reset"
506#define DEVLINK_PARAM_GENERIC_INT_ERR_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
507
508#define DEVLINK_PARAM_GENERIC_MAX_MACS_NAME "max_macs"
509#define DEVLINK_PARAM_GENERIC_MAX_MACS_TYPE DEVLINK_PARAM_TYPE_U32
510
f567bcda
VV
511#define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_NAME "enable_sriov"
512#define DEVLINK_PARAM_GENERIC_ENABLE_SRIOV_TYPE DEVLINK_PARAM_TYPE_BOOL
513
f6a69885
AV
514#define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_NAME "region_snapshot_enable"
515#define DEVLINK_PARAM_GENERIC_REGION_SNAPSHOT_TYPE DEVLINK_PARAM_TYPE_BOOL
516
e3b51061
VV
517#define DEVLINK_PARAM_GENERIC_IGNORE_ARI_NAME "ignore_ari"
518#define DEVLINK_PARAM_GENERIC_IGNORE_ARI_TYPE DEVLINK_PARAM_TYPE_BOOL
519
f61cba42
VV
520#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_NAME "msix_vec_per_pf_max"
521#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MAX_TYPE DEVLINK_PARAM_TYPE_U32
522
16511789
VV
523#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_NAME "msix_vec_per_pf_min"
524#define DEVLINK_PARAM_GENERIC_MSIX_VEC_PER_PF_MIN_TYPE DEVLINK_PARAM_TYPE_U32
525
846e980a
ST
526#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_NAME "fw_load_policy"
527#define DEVLINK_PARAM_GENERIC_FW_LOAD_POLICY_TYPE DEVLINK_PARAM_TYPE_U8
528
5bbd21df
DM
529#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_NAME \
530 "reset_dev_on_drv_probe"
531#define DEVLINK_PARAM_GENERIC_RESET_DEV_ON_DRV_PROBE_TYPE DEVLINK_PARAM_TYPE_U8
532
6c7295e1
MG
533#define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_NAME "enable_roce"
534#define DEVLINK_PARAM_GENERIC_ENABLE_ROCE_TYPE DEVLINK_PARAM_TYPE_BOOL
535
195d9dec
MS
536#define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_NAME "enable_remote_dev_reset"
537#define DEVLINK_PARAM_GENERIC_ENABLE_REMOTE_DEV_RESET_TYPE DEVLINK_PARAM_TYPE_BOOL
538
f13a5ad8
PP
539#define DEVLINK_PARAM_GENERIC_ENABLE_ETH_NAME "enable_eth"
540#define DEVLINK_PARAM_GENERIC_ENABLE_ETH_TYPE DEVLINK_PARAM_TYPE_BOOL
541
8ddaabee
PP
542#define DEVLINK_PARAM_GENERIC_ENABLE_RDMA_NAME "enable_rdma"
543#define DEVLINK_PARAM_GENERIC_ENABLE_RDMA_TYPE DEVLINK_PARAM_TYPE_BOOL
544
076b2a9d
PP
545#define DEVLINK_PARAM_GENERIC_ENABLE_VNET_NAME "enable_vnet"
546#define DEVLINK_PARAM_GENERIC_ENABLE_VNET_TYPE DEVLINK_PARAM_TYPE_BOOL
547
325e0d0a
SS
548#define DEVLINK_PARAM_GENERIC_ENABLE_IWARP_NAME "enable_iwarp"
549#define DEVLINK_PARAM_GENERIC_ENABLE_IWARP_TYPE DEVLINK_PARAM_TYPE_BOOL
550
47402385
SD
551#define DEVLINK_PARAM_GENERIC_IO_EQ_SIZE_NAME "io_eq_size"
552#define DEVLINK_PARAM_GENERIC_IO_EQ_SIZE_TYPE DEVLINK_PARAM_TYPE_U32
553
0b5705eb
SD
554#define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_NAME "event_eq_size"
555#define DEVLINK_PARAM_GENERIC_EVENT_EQ_SIZE_TYPE DEVLINK_PARAM_TYPE_U32
556
036467c3
MS
557#define DEVLINK_PARAM_GENERIC(_id, _cmodes, _get, _set, _validate) \
558{ \
559 .id = DEVLINK_PARAM_GENERIC_ID_##_id, \
560 .name = DEVLINK_PARAM_GENERIC_##_id##_NAME, \
561 .type = DEVLINK_PARAM_GENERIC_##_id##_TYPE, \
562 .generic = true, \
563 .supported_cmodes = _cmodes, \
564 .get = _get, \
565 .set = _set, \
566 .validate = _validate, \
567}
568
569#define DEVLINK_PARAM_DRIVER(_id, _name, _type, _cmodes, _get, _set, _validate) \
570{ \
571 .id = _id, \
572 .name = _name, \
573 .type = _type, \
574 .supported_cmodes = _cmodes, \
575 .get = _get, \
576 .set = _set, \
577 .validate = _validate, \
578}
579
785bd550
JK
580/* Part number, identifier of board design */
581#define DEVLINK_INFO_VERSION_GENERIC_BOARD_ID "board.id"
582/* Revision of board design */
583#define DEVLINK_INFO_VERSION_GENERIC_BOARD_REV "board.rev"
14fd1901
JK
584/* Maker of the board */
585#define DEVLINK_INFO_VERSION_GENERIC_BOARD_MANUFACTURE "board.manufacture"
785bd550 586
7d5aa9a5
SN
587/* Part number, identifier of asic design */
588#define DEVLINK_INFO_VERSION_GENERIC_ASIC_ID "asic.id"
589/* Revision of asic design */
590#define DEVLINK_INFO_VERSION_GENERIC_ASIC_REV "asic.rev"
591
592/* Overall FW version */
593#define DEVLINK_INFO_VERSION_GENERIC_FW "fw"
785bd550
JK
594/* Control processor FW version */
595#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT "fw.mgmt"
2d9eade8
VV
596/* FW interface specification version */
597#define DEVLINK_INFO_VERSION_GENERIC_FW_MGMT_API "fw.mgmt.api"
785bd550
JK
598/* Data path microcode controlling high-speed packet processing */
599#define DEVLINK_INFO_VERSION_GENERIC_FW_APP "fw.app"
600/* UNDI software version */
601#define DEVLINK_INFO_VERSION_GENERIC_FW_UNDI "fw.undi"
602/* NCSI support/handler version */
603#define DEVLINK_INFO_VERSION_GENERIC_FW_NCSI "fw.ncsi"
468672b2
JK
604/* FW parameter set id */
605#define DEVLINK_INFO_VERSION_GENERIC_FW_PSID "fw.psid"
41c0d917
VV
606/* RoCE FW version */
607#define DEVLINK_INFO_VERSION_GENERIC_FW_ROCE "fw.roce"
c90977a3
JK
608/* Firmware bundle identifier */
609#define DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID "fw.bundle_id"
785bd550 610
bc75c054
JK
611/**
612 * struct devlink_flash_update_params - Flash Update parameters
b44cfd4f 613 * @fw: pointer to the firmware data to update from
bc75c054
JK
614 * @component: the flash component to update
615 *
b44cfd4f 616 * With the exception of fw, drivers must opt-in to parameters by
bc75c054
JK
617 * setting the appropriate bit in the supported_flash_update_params field in
618 * their devlink_ops structure.
619 */
620struct devlink_flash_update_params {
b44cfd4f 621 const struct firmware *fw;
bc75c054 622 const char *component;
5d5b4128 623 u32 overwrite_mask;
bc75c054
JK
624};
625
f94b6063 626#define DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK BIT(0)
22ec3d23 627
b16ebe92 628struct devlink_region;
c4a67a21 629struct devlink_info_req;
b16ebe92 630
e8937681
JK
631/**
632 * struct devlink_region_ops - Region operations
633 * @name: region name
a0a09f6b 634 * @destructor: callback used to free snapshot memory when deleting
b9a17abf
JK
635 * @snapshot: callback to request an immediate snapshot. On success,
636 * the data variable must be updated to point to the snapshot data.
637 * The function will be called while the devlink instance lock is
638 * held.
e14e05e7 639 * @priv: Pointer to driver private data for the region operation
e8937681
JK
640 */
641struct devlink_region_ops {
642 const char *name;
a0a09f6b 643 void (*destructor)(const void *data);
d4602a9f
AL
644 int (*snapshot)(struct devlink *devlink,
645 const struct devlink_region_ops *ops,
646 struct netlink_ext_ack *extack,
b9a17abf 647 u8 **data);
e14e05e7 648 void *priv;
e8937681
JK
649};
650
544e7c33
AL
651/**
652 * struct devlink_port_region_ops - Region operations for a port
653 * @name: region name
654 * @destructor: callback used to free snapshot memory when deleting
655 * @snapshot: callback to request an immediate snapshot. On success,
656 * the data variable must be updated to point to the snapshot data.
657 * The function will be called while the devlink instance lock is
658 * held.
659 * @priv: Pointer to driver private data for the region operation
660 */
661struct devlink_port_region_ops {
662 const char *name;
663 void (*destructor)(const void *data);
664 int (*snapshot)(struct devlink_port *port,
665 const struct devlink_port_region_ops *ops,
666 struct netlink_ext_ack *extack,
667 u8 **data);
668 void *priv;
669};
670
1db64e87 671struct devlink_fmsg;
a0bdcc59
EBE
672struct devlink_health_reporter;
673
3167b27a
EBE
674enum devlink_health_reporter_state {
675 DEVLINK_HEALTH_REPORTER_STATE_HEALTHY,
676 DEVLINK_HEALTH_REPORTER_STATE_ERROR,
677};
678
a0bdcc59
EBE
679/**
680 * struct devlink_health_reporter_ops - Reporter operations
681 * @name: reporter name
682 * @recover: callback to recover from reported error
683 * if priv_ctx is NULL, run a full recover
684 * @dump: callback to dump an object
685 * if priv_ctx is NULL, run a full dump
686 * @diagnose: callback to diagnose the current status
e2ce94dc 687 * @test: callback to trigger a test event
a0bdcc59
EBE
688 */
689
690struct devlink_health_reporter_ops {
691 char *name;
692 int (*recover)(struct devlink_health_reporter *reporter,
e7a98105 693 void *priv_ctx, struct netlink_ext_ack *extack);
a0bdcc59 694 int (*dump)(struct devlink_health_reporter *reporter,
e7a98105
JP
695 struct devlink_fmsg *fmsg, void *priv_ctx,
696 struct netlink_ext_ack *extack);
a0bdcc59 697 int (*diagnose)(struct devlink_health_reporter *reporter,
e7a98105
JP
698 struct devlink_fmsg *fmsg,
699 struct netlink_ext_ack *extack);
e2ce94dc
JP
700 int (*test)(struct devlink_health_reporter *reporter,
701 struct netlink_ext_ack *extack);
a0bdcc59 702};
1db64e87 703
5b88823b
IS
704/**
705 * struct devlink_trap_metadata - Packet trap metadata.
706 * @trap_name: Trap name.
707 * @trap_group_name: Trap group name.
708 * @input_dev: Input netdevice.
4dbd24f6 709 * @dev_tracker: refcount tracker for @input_dev.
5b88823b 710 * @fa_cookie: Flow action user cookie.
93e15596 711 * @trap_type: Trap type.
5b88823b
IS
712 */
713struct devlink_trap_metadata {
714 const char *trap_name;
715 const char *trap_group_name;
4dbd24f6 716
5b88823b 717 struct net_device *input_dev;
4dbd24f6
ED
718 netdevice_tracker dev_tracker;
719
5b88823b 720 const struct flow_action_cookie *fa_cookie;
93e15596 721 enum devlink_trap_type trap_type;
5b88823b
IS
722};
723
1e8c6619
IS
724/**
725 * struct devlink_trap_policer - Immutable packet trap policer attributes.
726 * @id: Policer identifier.
727 * @init_rate: Initial rate in packets / sec.
728 * @init_burst: Initial burst size in packets.
729 * @max_rate: Maximum rate.
730 * @min_rate: Minimum rate.
731 * @max_burst: Maximum burst size.
732 * @min_burst: Minimum burst size.
733 *
734 * Describes immutable attributes of packet trap policers that drivers register
735 * with devlink.
736 */
737struct devlink_trap_policer {
738 u32 id;
739 u64 init_rate;
740 u64 init_burst;
741 u64 max_rate;
742 u64 min_rate;
743 u64 max_burst;
744 u64 min_burst;
745};
746
0f420b6c
IS
747/**
748 * struct devlink_trap_group - Immutable packet trap group attributes.
749 * @name: Trap group name.
750 * @id: Trap group identifier.
751 * @generic: Whether the trap group is generic or not.
f9f54392 752 * @init_policer_id: Initial policer identifier.
0f420b6c
IS
753 *
754 * Describes immutable attributes of packet trap groups that drivers register
755 * with devlink.
756 */
757struct devlink_trap_group {
758 const char *name;
759 u16 id;
760 bool generic;
f9f54392 761 u32 init_policer_id;
0f420b6c
IS
762};
763
764#define DEVLINK_TRAP_METADATA_TYPE_F_IN_PORT BIT(0)
85b0589e 765#define DEVLINK_TRAP_METADATA_TYPE_F_FA_COOKIE BIT(1)
0f420b6c
IS
766
767/**
768 * struct devlink_trap - Immutable packet trap attributes.
769 * @type: Trap type.
770 * @init_action: Initial trap action.
771 * @generic: Whether the trap is generic or not.
772 * @id: Trap identifier.
773 * @name: Trap name.
107f1678 774 * @init_group_id: Initial group identifier.
0f420b6c
IS
775 * @metadata_cap: Metadata types that can be provided by the trap.
776 *
777 * Describes immutable attributes of packet traps that drivers register with
778 * devlink.
779 */
780struct devlink_trap {
781 enum devlink_trap_type type;
782 enum devlink_trap_action init_action;
783 bool generic;
784 u16 id;
785 const char *name;
107f1678 786 u16 init_group_id;
0f420b6c
IS
787 u32 metadata_cap;
788};
789
f3047ca0 790/* All traps must be documented in
f4bdd710 791 * Documentation/networking/devlink/devlink-trap.rst
f3047ca0 792 */
0f420b6c 793enum devlink_trap_generic_id {
391203ab
IS
794 DEVLINK_TRAP_GENERIC_ID_SMAC_MC,
795 DEVLINK_TRAP_GENERIC_ID_VLAN_TAG_MISMATCH,
796 DEVLINK_TRAP_GENERIC_ID_INGRESS_VLAN_FILTER,
797 DEVLINK_TRAP_GENERIC_ID_INGRESS_STP_FILTER,
798 DEVLINK_TRAP_GENERIC_ID_EMPTY_TX_LIST,
799 DEVLINK_TRAP_GENERIC_ID_PORT_LOOPBACK_FILTER,
800 DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_ROUTE,
801 DEVLINK_TRAP_GENERIC_ID_TTL_ERROR,
802 DEVLINK_TRAP_GENERIC_ID_TAIL_DROP,
6896cc4d
AC
803 DEVLINK_TRAP_GENERIC_ID_NON_IP_PACKET,
804 DEVLINK_TRAP_GENERIC_ID_UC_DIP_MC_DMAC,
805 DEVLINK_TRAP_GENERIC_ID_DIP_LB,
806 DEVLINK_TRAP_GENERIC_ID_SIP_MC,
807 DEVLINK_TRAP_GENERIC_ID_SIP_LB,
808 DEVLINK_TRAP_GENERIC_ID_CORRUPTED_IP_HDR,
809 DEVLINK_TRAP_GENERIC_ID_IPV4_SIP_BC,
810 DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_RESERVED_SCOPE,
811 DEVLINK_TRAP_GENERIC_ID_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE,
3b063ae5
AC
812 DEVLINK_TRAP_GENERIC_ID_MTU_ERROR,
813 DEVLINK_TRAP_GENERIC_ID_UNRESOLVED_NEIGH,
814 DEVLINK_TRAP_GENERIC_ID_RPF,
815 DEVLINK_TRAP_GENERIC_ID_REJECT_ROUTE,
816 DEVLINK_TRAP_GENERIC_ID_IPV4_LPM_UNICAST_MISS,
817 DEVLINK_TRAP_GENERIC_ID_IPV6_LPM_UNICAST_MISS,
95f0ead8 818 DEVLINK_TRAP_GENERIC_ID_NON_ROUTABLE,
13c056ec 819 DEVLINK_TRAP_GENERIC_ID_DECAP_ERROR,
c3cae491 820 DEVLINK_TRAP_GENERIC_ID_OVERLAY_SMAC_MC,
ecd942a0
JP
821 DEVLINK_TRAP_GENERIC_ID_INGRESS_FLOW_ACTION_DROP,
822 DEVLINK_TRAP_GENERIC_ID_EGRESS_FLOW_ACTION_DROP,
515eac67
IS
823 DEVLINK_TRAP_GENERIC_ID_STP,
824 DEVLINK_TRAP_GENERIC_ID_LACP,
825 DEVLINK_TRAP_GENERIC_ID_LLDP,
826 DEVLINK_TRAP_GENERIC_ID_IGMP_QUERY,
827 DEVLINK_TRAP_GENERIC_ID_IGMP_V1_REPORT,
828 DEVLINK_TRAP_GENERIC_ID_IGMP_V2_REPORT,
829 DEVLINK_TRAP_GENERIC_ID_IGMP_V3_REPORT,
830 DEVLINK_TRAP_GENERIC_ID_IGMP_V2_LEAVE,
831 DEVLINK_TRAP_GENERIC_ID_MLD_QUERY,
832 DEVLINK_TRAP_GENERIC_ID_MLD_V1_REPORT,
833 DEVLINK_TRAP_GENERIC_ID_MLD_V2_REPORT,
834 DEVLINK_TRAP_GENERIC_ID_MLD_V1_DONE,
d77cfd16
IS
835 DEVLINK_TRAP_GENERIC_ID_IPV4_DHCP,
836 DEVLINK_TRAP_GENERIC_ID_IPV6_DHCP,
837 DEVLINK_TRAP_GENERIC_ID_ARP_REQUEST,
838 DEVLINK_TRAP_GENERIC_ID_ARP_RESPONSE,
839 DEVLINK_TRAP_GENERIC_ID_ARP_OVERLAY,
840 DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_SOLICIT,
841 DEVLINK_TRAP_GENERIC_ID_IPV6_NEIGH_ADVERT,
842 DEVLINK_TRAP_GENERIC_ID_IPV4_BFD,
843 DEVLINK_TRAP_GENERIC_ID_IPV6_BFD,
844 DEVLINK_TRAP_GENERIC_ID_IPV4_OSPF,
845 DEVLINK_TRAP_GENERIC_ID_IPV6_OSPF,
846 DEVLINK_TRAP_GENERIC_ID_IPV4_BGP,
847 DEVLINK_TRAP_GENERIC_ID_IPV6_BGP,
848 DEVLINK_TRAP_GENERIC_ID_IPV4_VRRP,
849 DEVLINK_TRAP_GENERIC_ID_IPV6_VRRP,
850 DEVLINK_TRAP_GENERIC_ID_IPV4_PIM,
851 DEVLINK_TRAP_GENERIC_ID_IPV6_PIM,
852 DEVLINK_TRAP_GENERIC_ID_UC_LB,
853 DEVLINK_TRAP_GENERIC_ID_LOCAL_ROUTE,
854 DEVLINK_TRAP_GENERIC_ID_EXTERNAL_ROUTE,
855 DEVLINK_TRAP_GENERIC_ID_IPV6_UC_DIP_LINK_LOCAL_SCOPE,
856 DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_NODES,
857 DEVLINK_TRAP_GENERIC_ID_IPV6_DIP_ALL_ROUTERS,
858 DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_SOLICIT,
859 DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ADVERT,
860 DEVLINK_TRAP_GENERIC_ID_IPV6_REDIRECT,
861 DEVLINK_TRAP_GENERIC_ID_IPV4_ROUTER_ALERT,
862 DEVLINK_TRAP_GENERIC_ID_IPV6_ROUTER_ALERT,
863 DEVLINK_TRAP_GENERIC_ID_PTP_EVENT,
864 DEVLINK_TRAP_GENERIC_ID_PTP_GENERAL,
5eb18a2b
IS
865 DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_SAMPLE,
866 DEVLINK_TRAP_GENERIC_ID_FLOW_ACTION_TRAP,
08e335f6 867 DEVLINK_TRAP_GENERIC_ID_EARLY_DROP,
10c24eb2
IC
868 DEVLINK_TRAP_GENERIC_ID_VXLAN_PARSING,
869 DEVLINK_TRAP_GENERIC_ID_LLC_SNAP_PARSING,
870 DEVLINK_TRAP_GENERIC_ID_VLAN_PARSING,
871 DEVLINK_TRAP_GENERIC_ID_PPPOE_PPP_PARSING,
872 DEVLINK_TRAP_GENERIC_ID_MPLS_PARSING,
873 DEVLINK_TRAP_GENERIC_ID_ARP_PARSING,
874 DEVLINK_TRAP_GENERIC_ID_IP_1_PARSING,
875 DEVLINK_TRAP_GENERIC_ID_IP_N_PARSING,
876 DEVLINK_TRAP_GENERIC_ID_GRE_PARSING,
877 DEVLINK_TRAP_GENERIC_ID_UDP_PARSING,
878 DEVLINK_TRAP_GENERIC_ID_TCP_PARSING,
879 DEVLINK_TRAP_GENERIC_ID_IPSEC_PARSING,
880 DEVLINK_TRAP_GENERIC_ID_SCTP_PARSING,
881 DEVLINK_TRAP_GENERIC_ID_DCCP_PARSING,
882 DEVLINK_TRAP_GENERIC_ID_GTP_PARSING,
883 DEVLINK_TRAP_GENERIC_ID_ESP_PARSING,
f0a5013e 884 DEVLINK_TRAP_GENERIC_ID_BLACKHOLE_NEXTHOP,
e78ab164 885 DEVLINK_TRAP_GENERIC_ID_DMAC_FILTER,
391203ab 886
0f420b6c
IS
887 /* Add new generic trap IDs above */
888 __DEVLINK_TRAP_GENERIC_ID_MAX,
889 DEVLINK_TRAP_GENERIC_ID_MAX = __DEVLINK_TRAP_GENERIC_ID_MAX - 1,
890};
891
f3047ca0 892/* All trap groups must be documented in
f4bdd710 893 * Documentation/networking/devlink/devlink-trap.rst
f3047ca0 894 */
0f420b6c 895enum devlink_trap_group_generic_id {
391203ab
IS
896 DEVLINK_TRAP_GROUP_GENERIC_ID_L2_DROPS,
897 DEVLINK_TRAP_GROUP_GENERIC_ID_L3_DROPS,
678eb199 898 DEVLINK_TRAP_GROUP_GENERIC_ID_L3_EXCEPTIONS,
391203ab 899 DEVLINK_TRAP_GROUP_GENERIC_ID_BUFFER_DROPS,
13c056ec 900 DEVLINK_TRAP_GROUP_GENERIC_ID_TUNNEL_DROPS,
ecd942a0 901 DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_DROPS,
515eac67
IS
902 DEVLINK_TRAP_GROUP_GENERIC_ID_STP,
903 DEVLINK_TRAP_GROUP_GENERIC_ID_LACP,
904 DEVLINK_TRAP_GROUP_GENERIC_ID_LLDP,
905 DEVLINK_TRAP_GROUP_GENERIC_ID_MC_SNOOPING,
d77cfd16
IS
906 DEVLINK_TRAP_GROUP_GENERIC_ID_DHCP,
907 DEVLINK_TRAP_GROUP_GENERIC_ID_NEIGH_DISCOVERY,
908 DEVLINK_TRAP_GROUP_GENERIC_ID_BFD,
909 DEVLINK_TRAP_GROUP_GENERIC_ID_OSPF,
910 DEVLINK_TRAP_GROUP_GENERIC_ID_BGP,
911 DEVLINK_TRAP_GROUP_GENERIC_ID_VRRP,
912 DEVLINK_TRAP_GROUP_GENERIC_ID_PIM,
913 DEVLINK_TRAP_GROUP_GENERIC_ID_UC_LB,
914 DEVLINK_TRAP_GROUP_GENERIC_ID_LOCAL_DELIVERY,
ec4f5b36 915 DEVLINK_TRAP_GROUP_GENERIC_ID_EXTERNAL_DELIVERY,
d77cfd16
IS
916 DEVLINK_TRAP_GROUP_GENERIC_ID_IPV6,
917 DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_EVENT,
918 DEVLINK_TRAP_GROUP_GENERIC_ID_PTP_GENERAL,
5eb18a2b
IS
919 DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_SAMPLE,
920 DEVLINK_TRAP_GROUP_GENERIC_ID_ACL_TRAP,
10c24eb2 921 DEVLINK_TRAP_GROUP_GENERIC_ID_PARSER_ERROR_DROPS,
391203ab 922
0f420b6c
IS
923 /* Add new generic trap group IDs above */
924 __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX,
925 DEVLINK_TRAP_GROUP_GENERIC_ID_MAX =
926 __DEVLINK_TRAP_GROUP_GENERIC_ID_MAX - 1,
927};
928
391203ab
IS
929#define DEVLINK_TRAP_GENERIC_NAME_SMAC_MC \
930 "source_mac_is_multicast"
931#define DEVLINK_TRAP_GENERIC_NAME_VLAN_TAG_MISMATCH \
932 "vlan_tag_mismatch"
933#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_VLAN_FILTER \
934 "ingress_vlan_filter"
935#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_STP_FILTER \
936 "ingress_spanning_tree_filter"
937#define DEVLINK_TRAP_GENERIC_NAME_EMPTY_TX_LIST \
938 "port_list_is_empty"
939#define DEVLINK_TRAP_GENERIC_NAME_PORT_LOOPBACK_FILTER \
940 "port_loopback_filter"
941#define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_ROUTE \
942 "blackhole_route"
943#define DEVLINK_TRAP_GENERIC_NAME_TTL_ERROR \
944 "ttl_value_is_too_small"
945#define DEVLINK_TRAP_GENERIC_NAME_TAIL_DROP \
946 "tail_drop"
6896cc4d
AC
947#define DEVLINK_TRAP_GENERIC_NAME_NON_IP_PACKET \
948 "non_ip"
949#define DEVLINK_TRAP_GENERIC_NAME_UC_DIP_MC_DMAC \
950 "uc_dip_over_mc_dmac"
951#define DEVLINK_TRAP_GENERIC_NAME_DIP_LB \
952 "dip_is_loopback_address"
953#define DEVLINK_TRAP_GENERIC_NAME_SIP_MC \
954 "sip_is_mc"
955#define DEVLINK_TRAP_GENERIC_NAME_SIP_LB \
956 "sip_is_loopback_address"
957#define DEVLINK_TRAP_GENERIC_NAME_CORRUPTED_IP_HDR \
958 "ip_header_corrupted"
959#define DEVLINK_TRAP_GENERIC_NAME_IPV4_SIP_BC \
960 "ipv4_sip_is_limited_bc"
961#define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_RESERVED_SCOPE \
962 "ipv6_mc_dip_reserved_scope"
963#define DEVLINK_TRAP_GENERIC_NAME_IPV6_MC_DIP_INTERFACE_LOCAL_SCOPE \
964 "ipv6_mc_dip_interface_local_scope"
3b063ae5
AC
965#define DEVLINK_TRAP_GENERIC_NAME_MTU_ERROR \
966 "mtu_value_is_too_small"
967#define DEVLINK_TRAP_GENERIC_NAME_UNRESOLVED_NEIGH \
968 "unresolved_neigh"
969#define DEVLINK_TRAP_GENERIC_NAME_RPF \
970 "mc_reverse_path_forwarding"
971#define DEVLINK_TRAP_GENERIC_NAME_REJECT_ROUTE \
972 "reject_route"
973#define DEVLINK_TRAP_GENERIC_NAME_IPV4_LPM_UNICAST_MISS \
974 "ipv4_lpm_miss"
975#define DEVLINK_TRAP_GENERIC_NAME_IPV6_LPM_UNICAST_MISS \
976 "ipv6_lpm_miss"
95f0ead8
AC
977#define DEVLINK_TRAP_GENERIC_NAME_NON_ROUTABLE \
978 "non_routable_packet"
13c056ec
AC
979#define DEVLINK_TRAP_GENERIC_NAME_DECAP_ERROR \
980 "decap_error"
c3cae491
AC
981#define DEVLINK_TRAP_GENERIC_NAME_OVERLAY_SMAC_MC \
982 "overlay_smac_is_mc"
ecd942a0
JP
983#define DEVLINK_TRAP_GENERIC_NAME_INGRESS_FLOW_ACTION_DROP \
984 "ingress_flow_action_drop"
985#define DEVLINK_TRAP_GENERIC_NAME_EGRESS_FLOW_ACTION_DROP \
986 "egress_flow_action_drop"
515eac67
IS
987#define DEVLINK_TRAP_GENERIC_NAME_STP \
988 "stp"
989#define DEVLINK_TRAP_GENERIC_NAME_LACP \
990 "lacp"
991#define DEVLINK_TRAP_GENERIC_NAME_LLDP \
992 "lldp"
993#define DEVLINK_TRAP_GENERIC_NAME_IGMP_QUERY \
994 "igmp_query"
995#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V1_REPORT \
996 "igmp_v1_report"
997#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_REPORT \
998 "igmp_v2_report"
999#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V3_REPORT \
1000 "igmp_v3_report"
1001#define DEVLINK_TRAP_GENERIC_NAME_IGMP_V2_LEAVE \
1002 "igmp_v2_leave"
1003#define DEVLINK_TRAP_GENERIC_NAME_MLD_QUERY \
1004 "mld_query"
1005#define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_REPORT \
1006 "mld_v1_report"
1007#define DEVLINK_TRAP_GENERIC_NAME_MLD_V2_REPORT \
1008 "mld_v2_report"
1009#define DEVLINK_TRAP_GENERIC_NAME_MLD_V1_DONE \
1010 "mld_v1_done"
d77cfd16
IS
1011#define DEVLINK_TRAP_GENERIC_NAME_IPV4_DHCP \
1012 "ipv4_dhcp"
1013#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DHCP \
1014 "ipv6_dhcp"
1015#define DEVLINK_TRAP_GENERIC_NAME_ARP_REQUEST \
1016 "arp_request"
1017#define DEVLINK_TRAP_GENERIC_NAME_ARP_RESPONSE \
1018 "arp_response"
1019#define DEVLINK_TRAP_GENERIC_NAME_ARP_OVERLAY \
1020 "arp_overlay"
1021#define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_SOLICIT \
1022 "ipv6_neigh_solicit"
1023#define DEVLINK_TRAP_GENERIC_NAME_IPV6_NEIGH_ADVERT \
1024 "ipv6_neigh_advert"
1025#define DEVLINK_TRAP_GENERIC_NAME_IPV4_BFD \
1026 "ipv4_bfd"
1027#define DEVLINK_TRAP_GENERIC_NAME_IPV6_BFD \
1028 "ipv6_bfd"
1029#define DEVLINK_TRAP_GENERIC_NAME_IPV4_OSPF \
1030 "ipv4_ospf"
1031#define DEVLINK_TRAP_GENERIC_NAME_IPV6_OSPF \
1032 "ipv6_ospf"
1033#define DEVLINK_TRAP_GENERIC_NAME_IPV4_BGP \
1034 "ipv4_bgp"
1035#define DEVLINK_TRAP_GENERIC_NAME_IPV6_BGP \
1036 "ipv6_bgp"
1037#define DEVLINK_TRAP_GENERIC_NAME_IPV4_VRRP \
1038 "ipv4_vrrp"
1039#define DEVLINK_TRAP_GENERIC_NAME_IPV6_VRRP \
1040 "ipv6_vrrp"
1041#define DEVLINK_TRAP_GENERIC_NAME_IPV4_PIM \
1042 "ipv4_pim"
1043#define DEVLINK_TRAP_GENERIC_NAME_IPV6_PIM \
1044 "ipv6_pim"
1045#define DEVLINK_TRAP_GENERIC_NAME_UC_LB \
1046 "uc_loopback"
1047#define DEVLINK_TRAP_GENERIC_NAME_LOCAL_ROUTE \
1048 "local_route"
1049#define DEVLINK_TRAP_GENERIC_NAME_EXTERNAL_ROUTE \
1050 "external_route"
1051#define DEVLINK_TRAP_GENERIC_NAME_IPV6_UC_DIP_LINK_LOCAL_SCOPE \
1052 "ipv6_uc_dip_link_local_scope"
1053#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_NODES \
1054 "ipv6_dip_all_nodes"
1055#define DEVLINK_TRAP_GENERIC_NAME_IPV6_DIP_ALL_ROUTERS \
1056 "ipv6_dip_all_routers"
1057#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_SOLICIT \
1058 "ipv6_router_solicit"
1059#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ADVERT \
1060 "ipv6_router_advert"
1061#define DEVLINK_TRAP_GENERIC_NAME_IPV6_REDIRECT \
1062 "ipv6_redirect"
1063#define DEVLINK_TRAP_GENERIC_NAME_IPV4_ROUTER_ALERT \
1064 "ipv4_router_alert"
1065#define DEVLINK_TRAP_GENERIC_NAME_IPV6_ROUTER_ALERT \
1066 "ipv6_router_alert"
1067#define DEVLINK_TRAP_GENERIC_NAME_PTP_EVENT \
1068 "ptp_event"
1069#define DEVLINK_TRAP_GENERIC_NAME_PTP_GENERAL \
1070 "ptp_general"
5eb18a2b
IS
1071#define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_SAMPLE \
1072 "flow_action_sample"
1073#define DEVLINK_TRAP_GENERIC_NAME_FLOW_ACTION_TRAP \
1074 "flow_action_trap"
08e335f6
AC
1075#define DEVLINK_TRAP_GENERIC_NAME_EARLY_DROP \
1076 "early_drop"
10c24eb2
IC
1077#define DEVLINK_TRAP_GENERIC_NAME_VXLAN_PARSING \
1078 "vxlan_parsing"
1079#define DEVLINK_TRAP_GENERIC_NAME_LLC_SNAP_PARSING \
1080 "llc_snap_parsing"
1081#define DEVLINK_TRAP_GENERIC_NAME_VLAN_PARSING \
1082 "vlan_parsing"
1083#define DEVLINK_TRAP_GENERIC_NAME_PPPOE_PPP_PARSING \
1084 "pppoe_ppp_parsing"
1085#define DEVLINK_TRAP_GENERIC_NAME_MPLS_PARSING \
1086 "mpls_parsing"
1087#define DEVLINK_TRAP_GENERIC_NAME_ARP_PARSING \
1088 "arp_parsing"
1089#define DEVLINK_TRAP_GENERIC_NAME_IP_1_PARSING \
1090 "ip_1_parsing"
1091#define DEVLINK_TRAP_GENERIC_NAME_IP_N_PARSING \
1092 "ip_n_parsing"
1093#define DEVLINK_TRAP_GENERIC_NAME_GRE_PARSING \
1094 "gre_parsing"
1095#define DEVLINK_TRAP_GENERIC_NAME_UDP_PARSING \
1096 "udp_parsing"
1097#define DEVLINK_TRAP_GENERIC_NAME_TCP_PARSING \
1098 "tcp_parsing"
1099#define DEVLINK_TRAP_GENERIC_NAME_IPSEC_PARSING \
1100 "ipsec_parsing"
1101#define DEVLINK_TRAP_GENERIC_NAME_SCTP_PARSING \
1102 "sctp_parsing"
1103#define DEVLINK_TRAP_GENERIC_NAME_DCCP_PARSING \
1104 "dccp_parsing"
1105#define DEVLINK_TRAP_GENERIC_NAME_GTP_PARSING \
1106 "gtp_parsing"
1107#define DEVLINK_TRAP_GENERIC_NAME_ESP_PARSING \
1108 "esp_parsing"
f0a5013e
IS
1109#define DEVLINK_TRAP_GENERIC_NAME_BLACKHOLE_NEXTHOP \
1110 "blackhole_nexthop"
e78ab164 1111#define DEVLINK_TRAP_GENERIC_NAME_DMAC_FILTER \
e13e4536 1112 "dmac_filter"
391203ab
IS
1113
1114#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L2_DROPS \
1115 "l2_drops"
1116#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_DROPS \
1117 "l3_drops"
678eb199
IS
1118#define DEVLINK_TRAP_GROUP_GENERIC_NAME_L3_EXCEPTIONS \
1119 "l3_exceptions"
391203ab
IS
1120#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BUFFER_DROPS \
1121 "buffer_drops"
13c056ec
AC
1122#define DEVLINK_TRAP_GROUP_GENERIC_NAME_TUNNEL_DROPS \
1123 "tunnel_drops"
ecd942a0
JP
1124#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_DROPS \
1125 "acl_drops"
515eac67
IS
1126#define DEVLINK_TRAP_GROUP_GENERIC_NAME_STP \
1127 "stp"
1128#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LACP \
1129 "lacp"
1130#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LLDP \
1131 "lldp"
1132#define DEVLINK_TRAP_GROUP_GENERIC_NAME_MC_SNOOPING \
1133 "mc_snooping"
d77cfd16
IS
1134#define DEVLINK_TRAP_GROUP_GENERIC_NAME_DHCP \
1135 "dhcp"
1136#define DEVLINK_TRAP_GROUP_GENERIC_NAME_NEIGH_DISCOVERY \
1137 "neigh_discovery"
1138#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BFD \
1139 "bfd"
1140#define DEVLINK_TRAP_GROUP_GENERIC_NAME_OSPF \
1141 "ospf"
1142#define DEVLINK_TRAP_GROUP_GENERIC_NAME_BGP \
1143 "bgp"
1144#define DEVLINK_TRAP_GROUP_GENERIC_NAME_VRRP \
1145 "vrrp"
1146#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PIM \
1147 "pim"
1148#define DEVLINK_TRAP_GROUP_GENERIC_NAME_UC_LB \
1149 "uc_loopback"
1150#define DEVLINK_TRAP_GROUP_GENERIC_NAME_LOCAL_DELIVERY \
1151 "local_delivery"
ec4f5b36
IS
1152#define DEVLINK_TRAP_GROUP_GENERIC_NAME_EXTERNAL_DELIVERY \
1153 "external_delivery"
d77cfd16
IS
1154#define DEVLINK_TRAP_GROUP_GENERIC_NAME_IPV6 \
1155 "ipv6"
1156#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_EVENT \
1157 "ptp_event"
1158#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PTP_GENERAL \
1159 "ptp_general"
5eb18a2b
IS
1160#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_SAMPLE \
1161 "acl_sample"
1162#define DEVLINK_TRAP_GROUP_GENERIC_NAME_ACL_TRAP \
1163 "acl_trap"
10c24eb2
IC
1164#define DEVLINK_TRAP_GROUP_GENERIC_NAME_PARSER_ERROR_DROPS \
1165 "parser_error_drops"
391203ab 1166
107f1678
IS
1167#define DEVLINK_TRAP_GENERIC(_type, _init_action, _id, _group_id, \
1168 _metadata_cap) \
0f420b6c
IS
1169 { \
1170 .type = DEVLINK_TRAP_TYPE_##_type, \
1171 .init_action = DEVLINK_TRAP_ACTION_##_init_action, \
1172 .generic = true, \
1173 .id = DEVLINK_TRAP_GENERIC_ID_##_id, \
1174 .name = DEVLINK_TRAP_GENERIC_NAME_##_id, \
107f1678 1175 .init_group_id = _group_id, \
0f420b6c
IS
1176 .metadata_cap = _metadata_cap, \
1177 }
1178
107f1678 1179#define DEVLINK_TRAP_DRIVER(_type, _init_action, _id, _name, _group_id, \
0f420b6c
IS
1180 _metadata_cap) \
1181 { \
1182 .type = DEVLINK_TRAP_TYPE_##_type, \
1183 .init_action = DEVLINK_TRAP_ACTION_##_init_action, \
1184 .generic = false, \
1185 .id = _id, \
1186 .name = _name, \
107f1678 1187 .init_group_id = _group_id, \
0f420b6c
IS
1188 .metadata_cap = _metadata_cap, \
1189 }
1190
f9f54392 1191#define DEVLINK_TRAP_GROUP_GENERIC(_id, _policer_id) \
0f420b6c
IS
1192 { \
1193 .name = DEVLINK_TRAP_GROUP_GENERIC_NAME_##_id, \
1194 .id = DEVLINK_TRAP_GROUP_GENERIC_ID_##_id, \
1195 .generic = true, \
f9f54392 1196 .init_policer_id = _policer_id, \
0f420b6c
IS
1197 }
1198
1e8c6619
IS
1199#define DEVLINK_TRAP_POLICER(_id, _rate, _burst, _max_rate, _min_rate, \
1200 _max_burst, _min_burst) \
1201 { \
1202 .id = _id, \
1203 .init_rate = _rate, \
1204 .init_burst = _burst, \
1205 .max_rate = _max_rate, \
1206 .min_rate = _min_rate, \
1207 .max_burst = _max_burst, \
1208 .min_burst = _min_burst, \
1209 }
1210
bd032e35
LR
1211enum {
1212 /* device supports reload operations */
1213 DEVLINK_F_RELOAD = 1UL << 0,
1214};
1215
bfcd3a46 1216struct devlink_ops {
22ec3d23
JK
1217 /**
1218 * @supported_flash_update_params:
1219 * mask of parameters supported by the driver's .flash_update
1220 * implemementation.
1221 */
1222 u32 supported_flash_update_params;
ccdf0721 1223 unsigned long reload_actions;
dc64cc7c 1224 unsigned long reload_limits;
070c63f2 1225 int (*reload_down)(struct devlink *devlink, bool netns_change,
dc64cc7c
MS
1226 enum devlink_reload_action action,
1227 enum devlink_reload_limit limit,
1228 struct netlink_ext_ack *extack);
ccdf0721 1229 int (*reload_up)(struct devlink *devlink, enum devlink_reload_action action,
dc64cc7c
MS
1230 enum devlink_reload_limit limit, u32 *actions_performed,
1231 struct netlink_ext_ack *extack);
bfcd3a46
JP
1232 int (*port_type_set)(struct devlink_port *devlink_port,
1233 enum devlink_port_type port_type);
706217c1 1234 int (*port_split)(struct devlink *devlink, struct devlink_port *port,
ac0fc8a1 1235 unsigned int count, struct netlink_ext_ack *extack);
706217c1 1236 int (*port_unsplit)(struct devlink *devlink, struct devlink_port *port,
ac0fc8a1 1237 struct netlink_ext_ack *extack);
bf797471
JP
1238 int (*sb_pool_get)(struct devlink *devlink, unsigned int sb_index,
1239 u16 pool_index,
1240 struct devlink_sb_pool_info *pool_info);
1241 int (*sb_pool_set)(struct devlink *devlink, unsigned int sb_index,
1242 u16 pool_index, u32 size,
f2ad1a52
IS
1243 enum devlink_sb_threshold_type threshold_type,
1244 struct netlink_ext_ack *extack);
bf797471
JP
1245 int (*sb_port_pool_get)(struct devlink_port *devlink_port,
1246 unsigned int sb_index, u16 pool_index,
1247 u32 *p_threshold);
1248 int (*sb_port_pool_set)(struct devlink_port *devlink_port,
1249 unsigned int sb_index, u16 pool_index,
f2ad1a52 1250 u32 threshold, struct netlink_ext_ack *extack);
bf797471
JP
1251 int (*sb_tc_pool_bind_get)(struct devlink_port *devlink_port,
1252 unsigned int sb_index,
1253 u16 tc_index,
1254 enum devlink_sb_pool_type pool_type,
1255 u16 *p_pool_index, u32 *p_threshold);
1256 int (*sb_tc_pool_bind_set)(struct devlink_port *devlink_port,
1257 unsigned int sb_index,
1258 u16 tc_index,
1259 enum devlink_sb_pool_type pool_type,
f2ad1a52
IS
1260 u16 pool_index, u32 threshold,
1261 struct netlink_ext_ack *extack);
df38dafd
JP
1262 int (*sb_occ_snapshot)(struct devlink *devlink,
1263 unsigned int sb_index);
1264 int (*sb_occ_max_clear)(struct devlink *devlink,
1265 unsigned int sb_index);
1266 int (*sb_occ_port_pool_get)(struct devlink_port *devlink_port,
1267 unsigned int sb_index, u16 pool_index,
1268 u32 *p_cur, u32 *p_max);
1269 int (*sb_occ_tc_port_bind_get)(struct devlink_port *devlink_port,
1270 unsigned int sb_index,
1271 u16 tc_index,
1272 enum devlink_sb_pool_type pool_type,
1273 u32 *p_cur, u32 *p_max);
08f4b591
OG
1274
1275 int (*eswitch_mode_get)(struct devlink *devlink, u16 *p_mode);
db7ff19e
EB
1276 int (*eswitch_mode_set)(struct devlink *devlink, u16 mode,
1277 struct netlink_ext_ack *extack);
59bfde01 1278 int (*eswitch_inline_mode_get)(struct devlink *devlink, u8 *p_inline_mode);
db7ff19e
EB
1279 int (*eswitch_inline_mode_set)(struct devlink *devlink, u8 inline_mode,
1280 struct netlink_ext_ack *extack);
98fdbea5
LR
1281 int (*eswitch_encap_mode_get)(struct devlink *devlink,
1282 enum devlink_eswitch_encap_mode *p_encap_mode);
1283 int (*eswitch_encap_mode_set)(struct devlink *devlink,
1284 enum devlink_eswitch_encap_mode encap_mode,
db7ff19e 1285 struct netlink_ext_ack *extack);
f9cf2288
JK
1286 int (*info_get)(struct devlink *devlink, struct devlink_info_req *req,
1287 struct netlink_ext_ack *extack);
22ec3d23
JK
1288 /**
1289 * @flash_update: Device flash update function
1290 *
1291 * Used to perform a flash update for the device. The set of
1292 * parameters supported by the driver should be set in
1293 * supported_flash_update_params.
1294 */
bc75c054
JK
1295 int (*flash_update)(struct devlink *devlink,
1296 struct devlink_flash_update_params *params,
76726ccb 1297 struct netlink_ext_ack *extack);
0f420b6c
IS
1298 /**
1299 * @trap_init: Trap initialization function.
1300 *
1301 * Should be used by device drivers to initialize the trap in the
1302 * underlying device. Drivers should also store the provided trap
1303 * context, so that they could efficiently pass it to
1304 * devlink_trap_report() when the trap is triggered.
1305 */
1306 int (*trap_init)(struct devlink *devlink,
1307 const struct devlink_trap *trap, void *trap_ctx);
1308 /**
1309 * @trap_fini: Trap de-initialization function.
1310 *
1311 * Should be used by device drivers to de-initialize the trap in the
1312 * underlying device.
1313 */
1314 void (*trap_fini)(struct devlink *devlink,
1315 const struct devlink_trap *trap, void *trap_ctx);
1316 /**
1317 * @trap_action_set: Trap action set function.
1318 */
1319 int (*trap_action_set)(struct devlink *devlink,
1320 const struct devlink_trap *trap,
c88e11e0
IS
1321 enum devlink_trap_action action,
1322 struct netlink_ext_ack *extack);
0f420b6c
IS
1323 /**
1324 * @trap_group_init: Trap group initialization function.
1325 *
1326 * Should be used by device drivers to initialize the trap group in the
1327 * underlying device.
1328 */
1329 int (*trap_group_init)(struct devlink *devlink,
1330 const struct devlink_trap_group *group);
c064875a
IS
1331 /**
1332 * @trap_group_set: Trap group parameters set function.
1333 *
1334 * Note: @policer can be NULL when a policer is being unbound from
1335 * @group.
1336 */
1337 int (*trap_group_set)(struct devlink *devlink,
1338 const struct devlink_trap_group *group,
c88e11e0
IS
1339 const struct devlink_trap_policer *policer,
1340 struct netlink_ext_ack *extack);
c50bf2be
IC
1341 /**
1342 * @trap_group_action_set: Trap group action set function.
1343 *
1344 * If this callback is populated, it will take precedence over looping
1345 * over all traps in a group and calling .trap_action_set().
1346 */
1347 int (*trap_group_action_set)(struct devlink *devlink,
1348 const struct devlink_trap_group *group,
1349 enum devlink_trap_action action,
1350 struct netlink_ext_ack *extack);
ddee9dbc
OM
1351 /**
1352 * @trap_drop_counter_get: Trap drop counter get function.
1353 *
1354 * Should be used by device drivers to report number of packets
1355 * that have been dropped, and cannot be passed to the devlink
1356 * subsystem by the underlying device.
1357 */
1358 int (*trap_drop_counter_get)(struct devlink *devlink,
1359 const struct devlink_trap *trap,
1360 u64 *p_drops);
1e8c6619
IS
1361 /**
1362 * @trap_policer_init: Trap policer initialization function.
1363 *
1364 * Should be used by device drivers to initialize the trap policer in
1365 * the underlying device.
1366 */
1367 int (*trap_policer_init)(struct devlink *devlink,
1368 const struct devlink_trap_policer *policer);
1369 /**
1370 * @trap_policer_fini: Trap policer de-initialization function.
1371 *
1372 * Should be used by device drivers to de-initialize the trap policer
1373 * in the underlying device.
1374 */
1375 void (*trap_policer_fini)(struct devlink *devlink,
1376 const struct devlink_trap_policer *policer);
1377 /**
1378 * @trap_policer_set: Trap policer parameters set function.
1379 */
1380 int (*trap_policer_set)(struct devlink *devlink,
1381 const struct devlink_trap_policer *policer,
1382 u64 rate, u64 burst,
1383 struct netlink_ext_ack *extack);
1384 /**
1385 * @trap_policer_counter_get: Trap policer counter get function.
1386 *
1387 * Should be used by device drivers to report number of packets dropped
1388 * by the policer.
1389 */
1390 int (*trap_policer_counter_get)(struct devlink *devlink,
1391 const struct devlink_trap_policer *policer,
1392 u64 *p_drops);
2a916ecc
PP
1393 /**
1394 * @port_function_hw_addr_get: Port function's hardware address get function.
1395 *
1396 * Should be used by device drivers to report the hardware address of a function managed
1397 * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port
1398 * function handling for a particular port.
1399 *
1400 * Note: @extack can be NULL when port notifier queries the port function.
1401 */
82564f6c
LR
1402 int (*port_function_hw_addr_get)(struct devlink_port *port, u8 *hw_addr,
1403 int *hw_addr_len,
2a916ecc 1404 struct netlink_ext_ack *extack);
a1e8ae90
PP
1405 /**
1406 * @port_function_hw_addr_set: Port function's hardware address set function.
1407 *
1408 * Should be used by device drivers to set the hardware address of a function managed
1409 * by the devlink port. Driver should return -EOPNOTSUPP if it doesn't support port
1410 * function handling for a particular port.
1411 */
82564f6c 1412 int (*port_function_hw_addr_set)(struct devlink_port *port,
a1e8ae90
PP
1413 const u8 *hw_addr, int hw_addr_len,
1414 struct netlink_ext_ack *extack);
cd76dcd6
PP
1415 /**
1416 * port_new() - Add a new port function of a specified flavor
1417 * @devlink: Devlink instance
1418 * @attrs: attributes of the new port
1419 * @extack: extack for reporting error messages
1420 * @new_port_index: index of the new port
1421 *
1422 * Devlink core will call this device driver function upon user request
1423 * to create a new port function of a specified flavor and optional
1424 * attributes
1425 *
1426 * Notes:
1427 * - Called without devlink instance lock being held. Drivers must
1428 * implement own means of synchronization
1429 * - On success, drivers must register a port with devlink core
1430 *
1431 * Return: 0 on success, negative value otherwise.
1432 */
1433 int (*port_new)(struct devlink *devlink,
1434 const struct devlink_port_new_attrs *attrs,
1435 struct netlink_ext_ack *extack,
1436 unsigned int *new_port_index);
1437 /**
1438 * port_del() - Delete a port function
1439 * @devlink: Devlink instance
1440 * @port_index: port function index to delete
1441 * @extack: extack for reporting error messages
1442 *
1443 * Devlink core will call this device driver function upon user request
1444 * to delete a previously created port function
1445 *
1446 * Notes:
1447 * - Called without devlink instance lock being held. Drivers must
1448 * implement own means of synchronization
1449 * - On success, drivers must unregister the corresponding devlink
1450 * port
1451 *
1452 * Return: 0 on success, negative value otherwise.
1453 */
1454 int (*port_del)(struct devlink *devlink, unsigned int port_index,
1455 struct netlink_ext_ack *extack);
a556dded
PP
1456 /**
1457 * port_fn_state_get() - Get the state of a port function
1458 * @devlink: Devlink instance
1459 * @port: The devlink port
1460 * @state: Admin configured state
1461 * @opstate: Current operational state
1462 * @extack: extack for reporting error messages
1463 *
1464 * Reports the admin and operational state of a devlink port function
1465 *
1466 * Return: 0 on success, negative value otherwise.
1467 */
82564f6c 1468 int (*port_fn_state_get)(struct devlink_port *port,
a556dded
PP
1469 enum devlink_port_fn_state *state,
1470 enum devlink_port_fn_opstate *opstate,
1471 struct netlink_ext_ack *extack);
1472 /**
1473 * port_fn_state_set() - Set the admin state of a port function
1474 * @devlink: Devlink instance
1475 * @port: The devlink port
1476 * @state: Admin state
1477 * @extack: extack for reporting error messages
1478 *
1479 * Set the admin state of a devlink port function
1480 *
1481 * Return: 0 on success, negative value otherwise.
1482 */
82564f6c 1483 int (*port_fn_state_set)(struct devlink_port *port,
a556dded
PP
1484 enum devlink_port_fn_state state,
1485 struct netlink_ext_ack *extack);
1897db2e
DL
1486
1487 /**
1488 * Rate control callbacks.
1489 */
1490 int (*rate_leaf_tx_share_set)(struct devlink_rate *devlink_rate, void *priv,
1491 u64 tx_share, struct netlink_ext_ack *extack);
1492 int (*rate_leaf_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
1493 u64 tx_max, struct netlink_ext_ack *extack);
a8ecb93e
DL
1494 int (*rate_node_tx_share_set)(struct devlink_rate *devlink_rate, void *priv,
1495 u64 tx_share, struct netlink_ext_ack *extack);
1496 int (*rate_node_tx_max_set)(struct devlink_rate *devlink_rate, void *priv,
1497 u64 tx_max, struct netlink_ext_ack *extack);
1498 int (*rate_node_new)(struct devlink_rate *rate_node, void **priv,
1499 struct netlink_ext_ack *extack);
1500 int (*rate_node_del)(struct devlink_rate *rate_node, void *priv,
1501 struct netlink_ext_ack *extack);
d7555984
DL
1502 int (*rate_leaf_parent_set)(struct devlink_rate *child,
1503 struct devlink_rate *parent,
1504 void *priv_child, void *priv_parent,
1505 struct netlink_ext_ack *extack);
1506 int (*rate_node_parent_set)(struct devlink_rate *child,
1507 struct devlink_rate *parent,
1508 void *priv_child, void *priv_parent,
1509 struct netlink_ext_ack *extack);
08f588fa
VG
1510 /**
1511 * selftests_check() - queries if selftest is supported
1512 * @devlink: devlink instance
1513 * @id: test index
1514 * @extack: extack for reporting error messages
1515 *
1516 * Return: true if test is supported by the driver
1517 */
1518 bool (*selftest_check)(struct devlink *devlink, unsigned int id,
1519 struct netlink_ext_ack *extack);
1520 /**
1521 * selftest_run() - Runs a selftest
1522 * @devlink: devlink instance
1523 * @id: test index
1524 * @extack: extack for reporting error messages
1525 *
1526 * Return: status of the test
1527 */
1528 enum devlink_selftest_status
1529 (*selftest_run)(struct devlink *devlink, unsigned int id,
1530 struct netlink_ext_ack *extack);
bfcd3a46
JP
1531};
1532
21314638
LR
1533void *devlink_priv(struct devlink *devlink);
1534struct devlink *priv_to_devlink(void *priv);
1535struct device *devlink_to_dev(const struct devlink *devlink);
bfcd3a46 1536
2cb7b489
JK
1537/* Devlink instance explicit locking */
1538void devl_lock(struct devlink *devlink);
012ec02a 1539int devl_trylock(struct devlink *devlink);
2cb7b489
JK
1540void devl_unlock(struct devlink *devlink);
1541void devl_assert_locked(struct devlink *devlink);
1542bool devl_lock_is_held(struct devlink *devlink);
1543
bfcd3a46
JP
1544struct ib_device;
1545
471f894f 1546struct net *devlink_net(const struct devlink *devlink);
26713455
LR
1547/* This call is intended for software devices that can create
1548 * devlink instances in other namespaces than init_net.
1549 *
1550 * Drivers that operate on real HW must use devlink_alloc() instead.
1551 */
1552struct devlink *devlink_alloc_ns(const struct devlink_ops *ops,
919d13a7
LR
1553 size_t priv_size, struct net *net,
1554 struct device *dev);
26713455 1555static inline struct devlink *devlink_alloc(const struct devlink_ops *ops,
919d13a7
LR
1556 size_t priv_size,
1557 struct device *dev)
26713455 1558{
919d13a7 1559 return devlink_alloc_ns(ops, priv_size, &init_net, dev);
26713455 1560}
bd032e35 1561void devlink_set_features(struct devlink *devlink, u64 features);
db4278c5 1562void devlink_register(struct devlink *devlink);
bfcd3a46
JP
1563void devlink_unregister(struct devlink *devlink);
1564void devlink_free(struct devlink *devlink);
277cbb6b
JP
1565int devl_port_register(struct devlink *devlink,
1566 struct devlink_port *devlink_port,
1567 unsigned int port_index);
bfcd3a46
JP
1568int devlink_port_register(struct devlink *devlink,
1569 struct devlink_port *devlink_port,
1570 unsigned int port_index);
277cbb6b 1571void devl_port_unregister(struct devlink_port *devlink_port);
bfcd3a46
JP
1572void devlink_port_unregister(struct devlink_port *devlink_port);
1573void devlink_port_type_eth_set(struct devlink_port *devlink_port,
1574 struct net_device *netdev);
1575void devlink_port_type_ib_set(struct devlink_port *devlink_port,
1576 struct ib_device *ibdev);
1577void devlink_port_type_clear(struct devlink_port *devlink_port);
b9ffcbaf 1578void devlink_port_attrs_set(struct devlink_port *devlink_port,
71ad8d55 1579 struct devlink_port_attrs *devlink_port_attrs);
3a2d9588
PP
1580void devlink_port_attrs_pci_pf_set(struct devlink_port *devlink_port, u32 controller,
1581 u16 pf, bool external);
1582void devlink_port_attrs_pci_vf_set(struct devlink_port *devlink_port, u32 controller,
05b595e9 1583 u16 pf, u16 vf, bool external);
b8288837 1584void devlink_port_attrs_pci_sf_set(struct devlink_port *devlink_port,
a1ab3e45
PP
1585 u32 controller, u16 pf, u32 sf,
1586 bool external);
277cbb6b
JP
1587int devl_rate_leaf_create(struct devlink_port *port, void *priv);
1588void devl_rate_leaf_destroy(struct devlink_port *devlink_port);
1589void devl_rate_nodes_destroy(struct devlink *devlink);
b8375859
JP
1590void devlink_port_linecard_set(struct devlink_port *devlink_port,
1591 struct devlink_linecard *linecard);
fcdc8ce2
JP
1592struct devlink_linecard *
1593devlink_linecard_create(struct devlink *devlink, unsigned int linecard_index,
1594 const struct devlink_linecard_ops *ops, void *priv);
c246f9b5 1595void devlink_linecard_destroy(struct devlink_linecard *linecard);
fcdc8ce2
JP
1596void devlink_linecard_provision_set(struct devlink_linecard *linecard,
1597 const char *type);
1598void devlink_linecard_provision_clear(struct devlink_linecard *linecard);
1599void devlink_linecard_provision_fail(struct devlink_linecard *linecard);
fc9f50d5
JP
1600void devlink_linecard_activate(struct devlink_linecard *linecard);
1601void devlink_linecard_deactivate(struct devlink_linecard *linecard);
7b2d9a1a
JP
1602void devlink_linecard_nested_dl_set(struct devlink_linecard *linecard,
1603 struct devlink *nested_devlink);
755cfa69
JP
1604int devl_sb_register(struct devlink *devlink, unsigned int sb_index,
1605 u32 size, u16 ingress_pools_count,
1606 u16 egress_pools_count, u16 ingress_tc_count,
1607 u16 egress_tc_count);
bf797471
JP
1608int devlink_sb_register(struct devlink *devlink, unsigned int sb_index,
1609 u32 size, u16 ingress_pools_count,
1610 u16 egress_pools_count, u16 ingress_tc_count,
1611 u16 egress_tc_count);
755cfa69 1612void devl_sb_unregister(struct devlink *devlink, unsigned int sb_index);
bf797471 1613void devlink_sb_unregister(struct devlink *devlink, unsigned int sb_index);
70a2ff89
JP
1614int devl_dpipe_table_register(struct devlink *devlink,
1615 const char *table_name,
1616 struct devlink_dpipe_table_ops *table_ops,
1617 void *priv, bool counter_control_extern);
70a2ff89
JP
1618void devl_dpipe_table_unregister(struct devlink *devlink,
1619 const char *table_name);
70a2ff89
JP
1620void devl_dpipe_headers_register(struct devlink *devlink,
1621 struct devlink_dpipe_headers *dpipe_headers);
70a2ff89 1622void devl_dpipe_headers_unregister(struct devlink *devlink);
1555d204
AS
1623bool devlink_dpipe_table_counter_enabled(struct devlink *devlink,
1624 const char *table_name);
1625int devlink_dpipe_entry_ctx_prepare(struct devlink_dpipe_dump_ctx *dump_ctx);
1626int devlink_dpipe_entry_ctx_append(struct devlink_dpipe_dump_ctx *dump_ctx,
1627 struct devlink_dpipe_entry *entry);
1628int devlink_dpipe_entry_ctx_close(struct devlink_dpipe_dump_ctx *dump_ctx);
35807324 1629void devlink_dpipe_entry_clear(struct devlink_dpipe_entry *entry);
1555d204
AS
1630int devlink_dpipe_action_put(struct sk_buff *skb,
1631 struct devlink_dpipe_action *action);
1632int devlink_dpipe_match_put(struct sk_buff *skb,
1633 struct devlink_dpipe_match *match);
11770091 1634extern struct devlink_dpipe_header devlink_dpipe_header_ethernet;
3fb886ec 1635extern struct devlink_dpipe_header devlink_dpipe_header_ipv4;
1797f5b3 1636extern struct devlink_dpipe_header devlink_dpipe_header_ipv6;
bfcd3a46 1637
c223d6a4
JP
1638int devl_resource_register(struct devlink *devlink,
1639 const char *resource_name,
1640 u64 resource_size,
1641 u64 resource_id,
1642 u64 parent_resource_id,
1643 const struct devlink_resource_size_params *size_params);
d9f9b9a4
AS
1644int devlink_resource_register(struct devlink *devlink,
1645 const char *resource_name,
d9f9b9a4
AS
1646 u64 resource_size,
1647 u64 resource_id,
1648 u64 parent_resource_id,
fc56be47 1649 const struct devlink_resource_size_params *size_params);
c223d6a4 1650void devl_resources_unregister(struct devlink *devlink);
4c897cfc 1651void devlink_resources_unregister(struct devlink *devlink);
c223d6a4
JP
1652int devl_resource_size_get(struct devlink *devlink,
1653 u64 resource_id,
1654 u64 *p_resource_size);
70a2ff89
JP
1655int devl_dpipe_table_resource_set(struct devlink *devlink,
1656 const char *table_name, u64 resource_id,
1657 u64 resource_units);
56dc7cd0
AS
1658int devlink_dpipe_table_resource_set(struct devlink *devlink,
1659 const char *table_name, u64 resource_id,
1660 u64 resource_units);
c223d6a4
JP
1661void devl_resource_occ_get_register(struct devlink *devlink,
1662 u64 resource_id,
1663 devlink_resource_occ_get_t *occ_get,
1664 void *occ_get_priv);
fc56be47
JP
1665void devlink_resource_occ_get_register(struct devlink *devlink,
1666 u64 resource_id,
1667 devlink_resource_occ_get_t *occ_get,
1668 void *occ_get_priv);
c223d6a4
JP
1669void devl_resource_occ_get_unregister(struct devlink *devlink,
1670 u64 resource_id);
1671
fc56be47
JP
1672void devlink_resource_occ_get_unregister(struct devlink *devlink,
1673 u64 resource_id);
eabaef18
MS
1674int devlink_params_register(struct devlink *devlink,
1675 const struct devlink_param *params,
1676 size_t params_count);
1677void devlink_params_unregister(struct devlink *devlink,
1678 const struct devlink_param *params,
1679 size_t params_count);
b40c51ef
PP
1680int devlink_param_register(struct devlink *devlink,
1681 const struct devlink_param *param);
1682void devlink_param_unregister(struct devlink *devlink,
1683 const struct devlink_param *param);
ec01aeb1
MS
1684int devlink_param_driverinit_value_get(struct devlink *devlink, u32 param_id,
1685 union devlink_param_value *init_val);
1686int devlink_param_driverinit_value_set(struct devlink *devlink, u32 param_id,
1687 union devlink_param_value init_val);
ea601e17 1688void devlink_param_value_changed(struct devlink *devlink, u32 param_id);
eb0e9fa2
JP
1689struct devlink_region *devl_region_create(struct devlink *devlink,
1690 const struct devlink_region_ops *ops,
1691 u32 region_max_snapshots,
1692 u64 region_size);
e8937681
JK
1693struct devlink_region *
1694devlink_region_create(struct devlink *devlink,
1695 const struct devlink_region_ops *ops,
1696 u32 region_max_snapshots, u64 region_size);
544e7c33
AL
1697struct devlink_region *
1698devlink_port_region_create(struct devlink_port *port,
1699 const struct devlink_port_region_ops *ops,
1700 u32 region_max_snapshots, u64 region_size);
eb0e9fa2 1701void devl_region_destroy(struct devlink_region *region);
b16ebe92 1702void devlink_region_destroy(struct devlink_region *region);
544e7c33
AL
1703void devlink_port_region_destroy(struct devlink_region *region);
1704
7ef19d3b 1705int devlink_region_snapshot_id_get(struct devlink *devlink, u32 *id);
12102436 1706void devlink_region_snapshot_id_put(struct devlink *devlink, u32 id);
3a5e5234 1707int devlink_region_snapshot_create(struct devlink_region *region,
a0a09f6b 1708 u8 *data, u32 snapshot_id);
f9cf2288
JK
1709int devlink_info_serial_number_put(struct devlink_info_req *req,
1710 const char *sn);
1711int devlink_info_driver_name_put(struct devlink_info_req *req,
1712 const char *name);
b5872cd0
VV
1713int devlink_info_board_serial_number_put(struct devlink_info_req *req,
1714 const char *bsn);
bb670123
JP
1715
1716enum devlink_info_version_type {
1717 DEVLINK_INFO_VERSION_TYPE_NONE,
1718 DEVLINK_INFO_VERSION_TYPE_COMPONENT, /* May be used as flash update
1719 * component by name.
1720 */
1721};
1722
fc6fae7d
JK
1723int devlink_info_version_fixed_put(struct devlink_info_req *req,
1724 const char *version_name,
1725 const char *version_value);
1726int devlink_info_version_stored_put(struct devlink_info_req *req,
1727 const char *version_name,
1728 const char *version_value);
bb670123
JP
1729int devlink_info_version_stored_put_ext(struct devlink_info_req *req,
1730 const char *version_name,
1731 const char *version_value,
1732 enum devlink_info_version_type version_type);
fc6fae7d
JK
1733int devlink_info_version_running_put(struct devlink_info_req *req,
1734 const char *version_name,
1735 const char *version_value);
bb670123
JP
1736int devlink_info_version_running_put_ext(struct devlink_info_req *req,
1737 const char *version_name,
1738 const char *version_value,
1739 enum devlink_info_version_type version_type);
d9f9b9a4 1740
1db64e87
EBE
1741int devlink_fmsg_obj_nest_start(struct devlink_fmsg *fmsg);
1742int devlink_fmsg_obj_nest_end(struct devlink_fmsg *fmsg);
1743
1744int devlink_fmsg_pair_nest_start(struct devlink_fmsg *fmsg, const char *name);
1745int devlink_fmsg_pair_nest_end(struct devlink_fmsg *fmsg);
1746
1747int devlink_fmsg_arr_pair_nest_start(struct devlink_fmsg *fmsg,
1748 const char *name);
1749int devlink_fmsg_arr_pair_nest_end(struct devlink_fmsg *fmsg);
573ed90a
AL
1750int devlink_fmsg_binary_pair_nest_start(struct devlink_fmsg *fmsg,
1751 const char *name);
1752int devlink_fmsg_binary_pair_nest_end(struct devlink_fmsg *fmsg);
1db64e87 1753
1db64e87 1754int devlink_fmsg_u32_put(struct devlink_fmsg *fmsg, u32 value);
1db64e87 1755int devlink_fmsg_string_put(struct devlink_fmsg *fmsg, const char *value);
573ed90a
AL
1756int devlink_fmsg_binary_put(struct devlink_fmsg *fmsg, const void *value,
1757 u16 value_len);
1db64e87
EBE
1758
1759int devlink_fmsg_bool_pair_put(struct devlink_fmsg *fmsg, const char *name,
1760 bool value);
1761int devlink_fmsg_u8_pair_put(struct devlink_fmsg *fmsg, const char *name,
1762 u8 value);
1763int devlink_fmsg_u32_pair_put(struct devlink_fmsg *fmsg, const char *name,
1764 u32 value);
1765int devlink_fmsg_u64_pair_put(struct devlink_fmsg *fmsg, const char *name,
1766 u64 value);
1767int devlink_fmsg_string_pair_put(struct devlink_fmsg *fmsg, const char *name,
1768 const char *value);
1769int devlink_fmsg_binary_pair_put(struct devlink_fmsg *fmsg, const char *name,
e2cde864 1770 const void *value, u32 value_len);
1db64e87 1771
a0bdcc59
EBE
1772struct devlink_health_reporter *
1773devlink_health_reporter_create(struct devlink *devlink,
1774 const struct devlink_health_reporter_ops *ops,
ba7d16c7 1775 u64 graceful_period, void *priv);
15c724b9
VT
1776
1777struct devlink_health_reporter *
1778devlink_port_health_reporter_create(struct devlink_port *port,
1779 const struct devlink_health_reporter_ops *ops,
1780 u64 graceful_period, void *priv);
1781
a0bdcc59
EBE
1782void
1783devlink_health_reporter_destroy(struct devlink_health_reporter *reporter);
1784
15c724b9
VT
1785void
1786devlink_port_health_reporter_destroy(struct devlink_health_reporter *reporter);
1787
a0bdcc59
EBE
1788void *
1789devlink_health_reporter_priv(struct devlink_health_reporter *reporter);
c8e1da0b
EBE
1790int devlink_health_report(struct devlink_health_reporter *reporter,
1791 const char *msg, void *priv_ctx);
3167b27a
EBE
1792void
1793devlink_health_reporter_state_update(struct devlink_health_reporter *reporter,
1794 enum devlink_health_reporter_state state);
6181e5cb
VG
1795void
1796devlink_health_reporter_recovery_done(struct devlink_health_reporter *reporter);
a0bdcc59 1797
2670ac26 1798bool devlink_is_reload_failed(const struct devlink *devlink);
77069ba2
MS
1799void devlink_remote_reload_actions_performed(struct devlink *devlink,
1800 enum devlink_reload_limit limit,
1801 u32 actions_performed);
2670ac26 1802
191ed202
JP
1803void devlink_flash_update_status_notify(struct devlink *devlink,
1804 const char *status_msg,
1805 const char *component,
1806 unsigned long done,
1807 unsigned long total);
f92970c6
SN
1808void devlink_flash_update_timeout_notify(struct devlink *devlink,
1809 const char *status_msg,
1810 const char *component,
1811 unsigned long timeout);
191ed202 1812
852e85a7
JP
1813int devl_traps_register(struct devlink *devlink,
1814 const struct devlink_trap *traps,
1815 size_t traps_count, void *priv);
0f420b6c
IS
1816int devlink_traps_register(struct devlink *devlink,
1817 const struct devlink_trap *traps,
1818 size_t traps_count, void *priv);
852e85a7
JP
1819void devl_traps_unregister(struct devlink *devlink,
1820 const struct devlink_trap *traps,
1821 size_t traps_count);
0f420b6c
IS
1822void devlink_traps_unregister(struct devlink *devlink,
1823 const struct devlink_trap *traps,
1824 size_t traps_count);
5a2e106c
JP
1825void devlink_trap_report(struct devlink *devlink, struct sk_buff *skb,
1826 void *trap_ctx, struct devlink_port *in_devlink_port,
1827 const struct flow_action_cookie *fa_cookie);
0f420b6c 1828void *devlink_trap_ctx_priv(void *trap_ctx);
852e85a7
JP
1829int devl_trap_groups_register(struct devlink *devlink,
1830 const struct devlink_trap_group *groups,
1831 size_t groups_count);
95ad9555
IS
1832int devlink_trap_groups_register(struct devlink *devlink,
1833 const struct devlink_trap_group *groups,
1834 size_t groups_count);
852e85a7
JP
1835void devl_trap_groups_unregister(struct devlink *devlink,
1836 const struct devlink_trap_group *groups,
1837 size_t groups_count);
95ad9555
IS
1838void devlink_trap_groups_unregister(struct devlink *devlink,
1839 const struct devlink_trap_group *groups,
1840 size_t groups_count);
1e8c6619 1841int
852e85a7
JP
1842devl_trap_policers_register(struct devlink *devlink,
1843 const struct devlink_trap_policer *policers,
1844 size_t policers_count);
1e8c6619 1845void
852e85a7
JP
1846devl_trap_policers_unregister(struct devlink *devlink,
1847 const struct devlink_trap_policer *policers,
1848 size_t policers_count);
0f420b6c 1849
f6b19b35
JP
1850#if IS_ENABLED(CONFIG_NET_DEVLINK)
1851
46db1b77
JK
1852struct devlink *__must_check devlink_try_get(struct devlink *devlink);
1853void devlink_put(struct devlink *devlink);
1854
1af0a094 1855void devlink_compat_running_version(struct devlink *devlink,
f4b6bcc7 1856 char *buf, size_t len);
1af0a094 1857int devlink_compat_flash_update(struct devlink *devlink, const char *file_name);
af3836df
JP
1858int devlink_compat_phys_port_name_get(struct net_device *dev,
1859 char *name, size_t len);
7e1146e8
JP
1860int devlink_compat_switch_id_get(struct net_device *dev,
1861 struct netdev_phys_item_id *ppid);
f4b6bcc7 1862
bfcd3a46
JP
1863#else
1864
46db1b77
JK
1865static inline struct devlink *devlink_try_get(struct devlink *devlink)
1866{
1867 return NULL;
1868}
1869
1870static inline void devlink_put(struct devlink *devlink)
1871{
1872}
1873
ddb6e99e 1874static inline void
1af0a094 1875devlink_compat_running_version(struct devlink *devlink, char *buf, size_t len)
ddb6e99e
JK
1876{
1877}
4eceba17
JK
1878
1879static inline int
1af0a094 1880devlink_compat_flash_update(struct devlink *devlink, const char *file_name)
4eceba17
JK
1881{
1882 return -EOPNOTSUPP;
1883}
f6b19b35 1884
af3836df
JP
1885static inline int
1886devlink_compat_phys_port_name_get(struct net_device *dev,
1887 char *name, size_t len)
1888{
1889 return -EOPNOTSUPP;
1890}
1891
7e1146e8
JP
1892static inline int
1893devlink_compat_switch_id_get(struct net_device *dev,
1894 struct netdev_phys_item_id *ppid)
1895{
1896 return -EOPNOTSUPP;
1897}
1898
ddb6e99e
JK
1899#endif
1900
bfcd3a46 1901#endif /* _NET_DEVLINK_H_ */