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