1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (c) 2016 Mellanox Technologies. All rights reserved.
4 * Copyright (c) 2016 Jiri Pirko <jiri@mellanox.com>
7 #include <linux/device.h>
8 #include <net/genetlink.h>
10 #include "devl_internal.h"
12 struct devlink_info_req
{
14 void (*version_cb
)(const char *version_name
,
15 enum devlink_info_version_type version_type
,
16 void *version_cb_priv
);
17 void *version_cb_priv
;
20 struct devlink_reload_combination
{
21 enum devlink_reload_action action
;
22 enum devlink_reload_limit limit
;
25 static const struct devlink_reload_combination devlink_reload_invalid_combinations
[] = {
27 /* can't reinitialize driver with no down time */
28 .action
= DEVLINK_RELOAD_ACTION_DRIVER_REINIT
,
29 .limit
= DEVLINK_RELOAD_LIMIT_NO_RESET
,
34 devlink_reload_combination_is_invalid(enum devlink_reload_action action
,
35 enum devlink_reload_limit limit
)
39 for (i
= 0; i
< ARRAY_SIZE(devlink_reload_invalid_combinations
); i
++)
40 if (devlink_reload_invalid_combinations
[i
].action
== action
&&
41 devlink_reload_invalid_combinations
[i
].limit
== limit
)
47 devlink_reload_action_is_supported(struct devlink
*devlink
, enum devlink_reload_action action
)
49 return test_bit(action
, &devlink
->ops
->reload_actions
);
53 devlink_reload_limit_is_supported(struct devlink
*devlink
, enum devlink_reload_limit limit
)
55 return test_bit(limit
, &devlink
->ops
->reload_limits
);
58 static int devlink_reload_stat_put(struct sk_buff
*msg
,
59 enum devlink_reload_limit limit
, u32 value
)
61 struct nlattr
*reload_stats_entry
;
63 reload_stats_entry
= nla_nest_start(msg
, DEVLINK_ATTR_RELOAD_STATS_ENTRY
);
64 if (!reload_stats_entry
)
67 if (nla_put_u8(msg
, DEVLINK_ATTR_RELOAD_STATS_LIMIT
, limit
) ||
68 nla_put_u32(msg
, DEVLINK_ATTR_RELOAD_STATS_VALUE
, value
))
70 nla_nest_end(msg
, reload_stats_entry
);
74 nla_nest_cancel(msg
, reload_stats_entry
);
79 devlink_reload_stats_put(struct sk_buff
*msg
, struct devlink
*devlink
, bool is_remote
)
81 struct nlattr
*reload_stats_attr
, *act_info
, *act_stats
;
86 reload_stats_attr
= nla_nest_start(msg
, DEVLINK_ATTR_RELOAD_STATS
);
88 reload_stats_attr
= nla_nest_start(msg
, DEVLINK_ATTR_REMOTE_RELOAD_STATS
);
90 if (!reload_stats_attr
)
93 for (i
= 0; i
<= DEVLINK_RELOAD_ACTION_MAX
; i
++) {
95 !devlink_reload_action_is_supported(devlink
, i
)) ||
96 i
== DEVLINK_RELOAD_ACTION_UNSPEC
)
98 act_info
= nla_nest_start(msg
, DEVLINK_ATTR_RELOAD_ACTION_INFO
);
100 goto nla_put_failure
;
102 if (nla_put_u8(msg
, DEVLINK_ATTR_RELOAD_ACTION
, i
))
103 goto action_info_nest_cancel
;
104 act_stats
= nla_nest_start(msg
, DEVLINK_ATTR_RELOAD_ACTION_STATS
);
106 goto action_info_nest_cancel
;
108 for (j
= 0; j
<= DEVLINK_RELOAD_LIMIT_MAX
; j
++) {
109 /* Remote stats are shown even if not locally supported.
110 * Stats of actions with unspecified limit are shown
111 * though drivers don't need to register unspecified
114 if ((!is_remote
&& j
!= DEVLINK_RELOAD_LIMIT_UNSPEC
&&
115 !devlink_reload_limit_is_supported(devlink
, j
)) ||
116 devlink_reload_combination_is_invalid(i
, j
))
119 stat_idx
= j
* __DEVLINK_RELOAD_ACTION_MAX
+ i
;
121 value
= devlink
->stats
.reload_stats
[stat_idx
];
123 value
= devlink
->stats
.remote_reload_stats
[stat_idx
];
124 if (devlink_reload_stat_put(msg
, j
, value
))
125 goto action_stats_nest_cancel
;
127 nla_nest_end(msg
, act_stats
);
128 nla_nest_end(msg
, act_info
);
130 nla_nest_end(msg
, reload_stats_attr
);
133 action_stats_nest_cancel
:
134 nla_nest_cancel(msg
, act_stats
);
135 action_info_nest_cancel
:
136 nla_nest_cancel(msg
, act_info
);
138 nla_nest_cancel(msg
, reload_stats_attr
);
142 static int devlink_nl_nested_fill(struct sk_buff
*msg
, struct devlink
*devlink
)
144 unsigned long rel_index
;
148 xa_for_each(&devlink
->nested_rels
, rel_index
, unused
) {
149 err
= devlink_rel_devlink_handle_put(msg
, devlink
,
151 DEVLINK_ATTR_NESTED_DEVLINK
,
159 static int devlink_nl_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
160 enum devlink_command cmd
, u32 portid
,
163 struct nlattr
*dev_stats
;
166 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
, cmd
);
170 if (devlink_nl_put_handle(msg
, devlink
))
171 goto nla_put_failure
;
172 if (nla_put_u8(msg
, DEVLINK_ATTR_RELOAD_FAILED
, devlink
->reload_failed
))
173 goto nla_put_failure
;
175 dev_stats
= nla_nest_start(msg
, DEVLINK_ATTR_DEV_STATS
);
177 goto nla_put_failure
;
179 if (devlink_reload_stats_put(msg
, devlink
, false))
180 goto dev_stats_nest_cancel
;
181 if (devlink_reload_stats_put(msg
, devlink
, true))
182 goto dev_stats_nest_cancel
;
184 nla_nest_end(msg
, dev_stats
);
186 if (devlink_nl_nested_fill(msg
, devlink
))
187 goto nla_put_failure
;
189 genlmsg_end(msg
, hdr
);
192 dev_stats_nest_cancel
:
193 nla_nest_cancel(msg
, dev_stats
);
195 genlmsg_cancel(msg
, hdr
);
199 static void devlink_notify(struct devlink
*devlink
, enum devlink_command cmd
)
204 WARN_ON(cmd
!= DEVLINK_CMD_NEW
&& cmd
!= DEVLINK_CMD_DEL
);
205 WARN_ON(!devl_is_registered(devlink
));
207 if (!devlink_nl_notify_need(devlink
))
210 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
214 err
= devlink_nl_fill(msg
, devlink
, cmd
, 0, 0, 0);
220 devlink_nl_notify_send(devlink
, msg
);
223 int devlink_nl_get_doit(struct sk_buff
*skb
, struct genl_info
*info
)
225 struct devlink
*devlink
= info
->user_ptr
[0];
229 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
233 err
= devlink_nl_fill(msg
, devlink
, DEVLINK_CMD_NEW
,
234 info
->snd_portid
, info
->snd_seq
, 0);
240 return genlmsg_reply(msg
, info
);
244 devlink_nl_get_dump_one(struct sk_buff
*msg
, struct devlink
*devlink
,
245 struct netlink_callback
*cb
, int flags
)
247 return devlink_nl_fill(msg
, devlink
, DEVLINK_CMD_NEW
,
248 NETLINK_CB(cb
->skb
).portid
,
249 cb
->nlh
->nlmsg_seq
, flags
);
252 int devlink_nl_get_dumpit(struct sk_buff
*msg
, struct netlink_callback
*cb
)
254 return devlink_nl_dumpit(msg
, cb
, devlink_nl_get_dump_one
);
257 static void devlink_rel_notify_cb(struct devlink
*devlink
, u32 obj_index
)
259 devlink_notify(devlink
, DEVLINK_CMD_NEW
);
262 static void devlink_rel_cleanup_cb(struct devlink
*devlink
, u32 obj_index
,
265 xa_erase(&devlink
->nested_rels
, rel_index
);
268 int devl_nested_devlink_set(struct devlink
*devlink
,
269 struct devlink
*nested_devlink
)
274 err
= devlink_rel_nested_in_add(&rel_index
, devlink
->index
, 0,
275 devlink_rel_notify_cb
,
276 devlink_rel_cleanup_cb
,
280 return xa_insert(&devlink
->nested_rels
, rel_index
,
281 xa_mk_value(0), GFP_KERNEL
);
283 EXPORT_SYMBOL_GPL(devl_nested_devlink_set
);
285 void devlink_notify_register(struct devlink
*devlink
)
287 devlink_notify(devlink
, DEVLINK_CMD_NEW
);
288 devlink_linecards_notify_register(devlink
);
289 devlink_ports_notify_register(devlink
);
290 devlink_trap_policers_notify_register(devlink
);
291 devlink_trap_groups_notify_register(devlink
);
292 devlink_traps_notify_register(devlink
);
293 devlink_rates_notify_register(devlink
);
294 devlink_regions_notify_register(devlink
);
295 devlink_params_notify_register(devlink
);
298 void devlink_notify_unregister(struct devlink
*devlink
)
300 devlink_params_notify_unregister(devlink
);
301 devlink_regions_notify_unregister(devlink
);
302 devlink_rates_notify_unregister(devlink
);
303 devlink_traps_notify_unregister(devlink
);
304 devlink_trap_groups_notify_unregister(devlink
);
305 devlink_trap_policers_notify_unregister(devlink
);
306 devlink_ports_notify_unregister(devlink
);
307 devlink_linecards_notify_unregister(devlink
);
308 devlink_notify(devlink
, DEVLINK_CMD_DEL
);
311 static void devlink_reload_failed_set(struct devlink
*devlink
,
314 if (devlink
->reload_failed
== reload_failed
)
316 devlink
->reload_failed
= reload_failed
;
317 devlink_notify(devlink
, DEVLINK_CMD_NEW
);
320 bool devlink_is_reload_failed(const struct devlink
*devlink
)
322 return devlink
->reload_failed
;
324 EXPORT_SYMBOL_GPL(devlink_is_reload_failed
);
327 __devlink_reload_stats_update(struct devlink
*devlink
, u32
*reload_stats
,
328 enum devlink_reload_limit limit
, u32 actions_performed
)
330 unsigned long actions
= actions_performed
;
334 for_each_set_bit(action
, &actions
, __DEVLINK_RELOAD_ACTION_MAX
) {
335 stat_idx
= limit
* __DEVLINK_RELOAD_ACTION_MAX
+ action
;
336 reload_stats
[stat_idx
]++;
338 devlink_notify(devlink
, DEVLINK_CMD_NEW
);
342 devlink_reload_stats_update(struct devlink
*devlink
, enum devlink_reload_limit limit
,
343 u32 actions_performed
)
345 __devlink_reload_stats_update(devlink
, devlink
->stats
.reload_stats
, limit
,
350 * devlink_remote_reload_actions_performed - Update devlink on reload actions
351 * performed which are not a direct result of devlink reload call.
353 * This should be called by a driver after performing reload actions in case it was not
354 * a result of devlink reload call. For example fw_activate was performed as a result
355 * of devlink reload triggered fw_activate on another host.
356 * The motivation for this function is to keep data on reload actions performed on this
357 * function whether it was done due to direct devlink reload call or not.
360 * @limit: reload limit
361 * @actions_performed: bitmask of actions performed
363 void devlink_remote_reload_actions_performed(struct devlink
*devlink
,
364 enum devlink_reload_limit limit
,
365 u32 actions_performed
)
367 if (WARN_ON(!actions_performed
||
368 actions_performed
& BIT(DEVLINK_RELOAD_ACTION_UNSPEC
) ||
369 actions_performed
>= BIT(__DEVLINK_RELOAD_ACTION_MAX
) ||
370 limit
> DEVLINK_RELOAD_LIMIT_MAX
))
373 __devlink_reload_stats_update(devlink
, devlink
->stats
.remote_reload_stats
, limit
,
376 EXPORT_SYMBOL_GPL(devlink_remote_reload_actions_performed
);
378 static struct net
*devlink_netns_get(struct sk_buff
*skb
,
379 struct genl_info
*info
)
381 struct nlattr
*netns_pid_attr
= info
->attrs
[DEVLINK_ATTR_NETNS_PID
];
382 struct nlattr
*netns_fd_attr
= info
->attrs
[DEVLINK_ATTR_NETNS_FD
];
383 struct nlattr
*netns_id_attr
= info
->attrs
[DEVLINK_ATTR_NETNS_ID
];
386 if (!!netns_pid_attr
+ !!netns_fd_attr
+ !!netns_id_attr
> 1) {
387 NL_SET_ERR_MSG(info
->extack
, "multiple netns identifying attributes specified");
388 return ERR_PTR(-EINVAL
);
391 if (netns_pid_attr
) {
392 net
= get_net_ns_by_pid(nla_get_u32(netns_pid_attr
));
393 } else if (netns_fd_attr
) {
394 net
= get_net_ns_by_fd(nla_get_u32(netns_fd_attr
));
395 } else if (netns_id_attr
) {
396 net
= get_net_ns_by_id(sock_net(skb
->sk
),
397 nla_get_u32(netns_id_attr
));
399 net
= ERR_PTR(-EINVAL
);
402 net
= ERR_PTR(-EINVAL
);
405 NL_SET_ERR_MSG(info
->extack
, "Unknown network namespace");
406 return ERR_PTR(-EINVAL
);
408 if (!netlink_ns_capable(skb
, net
->user_ns
, CAP_NET_ADMIN
)) {
410 return ERR_PTR(-EPERM
);
415 static void devlink_reload_netns_change(struct devlink
*devlink
,
416 struct net
*curr_net
,
417 struct net
*dest_net
)
419 /* Userspace needs to be notified about devlink objects
420 * removed from original and entering new network namespace.
421 * The rest of the devlink objects are re-created during
422 * reload process so the notifications are generated separatelly.
424 devlink_notify_unregister(devlink
);
425 write_pnet(&devlink
->_net
, dest_net
);
426 devlink_notify_register(devlink
);
427 devlink_rel_nested_in_notify(devlink
);
430 static void devlink_reload_reinit_sanity_check(struct devlink
*devlink
)
432 WARN_ON(!list_empty(&devlink
->trap_policer_list
));
433 WARN_ON(!list_empty(&devlink
->trap_group_list
));
434 WARN_ON(!list_empty(&devlink
->trap_list
));
435 WARN_ON(!list_empty(&devlink
->dpipe_table_list
));
436 WARN_ON(!list_empty(&devlink
->sb_list
));
437 WARN_ON(!list_empty(&devlink
->rate_list
));
438 WARN_ON(!list_empty(&devlink
->linecard_list
));
439 WARN_ON(!xa_empty(&devlink
->ports
));
442 int devlink_reload(struct devlink
*devlink
, struct net
*dest_net
,
443 enum devlink_reload_action action
,
444 enum devlink_reload_limit limit
,
445 u32
*actions_performed
, struct netlink_ext_ack
*extack
)
447 u32 remote_reload_stats
[DEVLINK_RELOAD_STATS_ARRAY_SIZE
];
448 struct net
*curr_net
;
451 /* Make sure the reload operations are invoked with the device lock
452 * held to allow drivers to trigger functionality that expects it
453 * (e.g., PCI reset) and to close possible races between these
454 * operations and probe/remove.
456 device_lock_assert(devlink
->dev
);
458 memcpy(remote_reload_stats
, devlink
->stats
.remote_reload_stats
,
459 sizeof(remote_reload_stats
));
461 err
= devlink
->ops
->reload_down(devlink
, !!dest_net
, action
, limit
, extack
);
465 curr_net
= devlink_net(devlink
);
466 if (dest_net
&& !net_eq(dest_net
, curr_net
))
467 devlink_reload_netns_change(devlink
, curr_net
, dest_net
);
469 if (action
== DEVLINK_RELOAD_ACTION_DRIVER_REINIT
) {
470 devlink_params_driverinit_load_new(devlink
);
471 devlink_reload_reinit_sanity_check(devlink
);
474 err
= devlink
->ops
->reload_up(devlink
, action
, limit
, actions_performed
, extack
);
475 devlink_reload_failed_set(devlink
, !!err
);
479 WARN_ON(!(*actions_performed
& BIT(action
)));
480 /* Catch driver on updating the remote action within devlink reload */
481 WARN_ON(memcmp(remote_reload_stats
, devlink
->stats
.remote_reload_stats
,
482 sizeof(remote_reload_stats
)));
483 devlink_reload_stats_update(devlink
, limit
, *actions_performed
);
488 devlink_nl_reload_actions_performed_snd(struct devlink
*devlink
, u32 actions_performed
,
489 enum devlink_command cmd
, struct genl_info
*info
)
494 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
498 hdr
= genlmsg_put(msg
, info
->snd_portid
, info
->snd_seq
, &devlink_nl_family
, 0, cmd
);
502 if (devlink_nl_put_handle(msg
, devlink
))
503 goto nla_put_failure
;
505 if (nla_put_bitfield32(msg
, DEVLINK_ATTR_RELOAD_ACTIONS_PERFORMED
, actions_performed
,
507 goto nla_put_failure
;
508 genlmsg_end(msg
, hdr
);
510 return genlmsg_reply(msg
, info
);
513 genlmsg_cancel(msg
, hdr
);
519 int devlink_nl_reload_doit(struct sk_buff
*skb
, struct genl_info
*info
)
521 struct devlink
*devlink
= info
->user_ptr
[0];
522 enum devlink_reload_action action
;
523 enum devlink_reload_limit limit
;
524 struct net
*dest_net
= NULL
;
525 u32 actions_performed
;
528 err
= devlink_resources_validate(devlink
, NULL
, info
);
530 NL_SET_ERR_MSG(info
->extack
, "resources size validation failed");
534 action
= nla_get_u8_default(info
->attrs
[DEVLINK_ATTR_RELOAD_ACTION
],
535 DEVLINK_RELOAD_ACTION_DRIVER_REINIT
);
537 if (!devlink_reload_action_is_supported(devlink
, action
)) {
538 NL_SET_ERR_MSG(info
->extack
, "Requested reload action is not supported by the driver");
542 limit
= DEVLINK_RELOAD_LIMIT_UNSPEC
;
543 if (info
->attrs
[DEVLINK_ATTR_RELOAD_LIMITS
]) {
544 struct nla_bitfield32 limits
;
547 limits
= nla_get_bitfield32(info
->attrs
[DEVLINK_ATTR_RELOAD_LIMITS
]);
548 limits_selected
= limits
.value
& limits
.selector
;
549 if (!limits_selected
) {
550 NL_SET_ERR_MSG(info
->extack
, "Invalid limit selected");
553 for (limit
= 0 ; limit
<= DEVLINK_RELOAD_LIMIT_MAX
; limit
++)
554 if (limits_selected
& BIT(limit
))
556 /* UAPI enables multiselection, but currently it is not used */
557 if (limits_selected
!= BIT(limit
)) {
558 NL_SET_ERR_MSG(info
->extack
, "Multiselection of limit is not supported");
561 if (!devlink_reload_limit_is_supported(devlink
, limit
)) {
562 NL_SET_ERR_MSG(info
->extack
, "Requested limit is not supported by the driver");
565 if (devlink_reload_combination_is_invalid(action
, limit
)) {
566 NL_SET_ERR_MSG(info
->extack
, "Requested limit is invalid for this action");
570 if (info
->attrs
[DEVLINK_ATTR_NETNS_PID
] ||
571 info
->attrs
[DEVLINK_ATTR_NETNS_FD
] ||
572 info
->attrs
[DEVLINK_ATTR_NETNS_ID
]) {
573 dest_net
= devlink_netns_get(skb
, info
);
574 if (IS_ERR(dest_net
))
575 return PTR_ERR(dest_net
);
576 if (!net_eq(dest_net
, devlink_net(devlink
)) &&
577 action
!= DEVLINK_RELOAD_ACTION_DRIVER_REINIT
) {
578 NL_SET_ERR_MSG_MOD(info
->extack
,
579 "Changing namespace is only supported for reinit action");
584 err
= devlink_reload(devlink
, dest_net
, action
, limit
, &actions_performed
, info
->extack
);
591 /* For backward compatibility generate reply only if attributes used by user */
592 if (!info
->attrs
[DEVLINK_ATTR_RELOAD_ACTION
] && !info
->attrs
[DEVLINK_ATTR_RELOAD_LIMITS
])
595 return devlink_nl_reload_actions_performed_snd(devlink
, actions_performed
,
596 DEVLINK_CMD_RELOAD
, info
);
599 bool devlink_reload_actions_valid(const struct devlink_ops
*ops
)
601 const struct devlink_reload_combination
*comb
;
604 if (!devlink_reload_supported(ops
)) {
605 if (WARN_ON(ops
->reload_actions
))
610 if (WARN_ON(!ops
->reload_actions
||
611 ops
->reload_actions
& BIT(DEVLINK_RELOAD_ACTION_UNSPEC
) ||
612 ops
->reload_actions
>= BIT(__DEVLINK_RELOAD_ACTION_MAX
)))
615 if (WARN_ON(ops
->reload_limits
& BIT(DEVLINK_RELOAD_LIMIT_UNSPEC
) ||
616 ops
->reload_limits
>= BIT(__DEVLINK_RELOAD_LIMIT_MAX
)))
619 for (i
= 0; i
< ARRAY_SIZE(devlink_reload_invalid_combinations
); i
++) {
620 comb
= &devlink_reload_invalid_combinations
[i
];
621 if (ops
->reload_actions
== BIT(comb
->action
) &&
622 ops
->reload_limits
== BIT(comb
->limit
))
628 static int devlink_nl_eswitch_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
629 enum devlink_command cmd
, u32 portid
,
632 const struct devlink_ops
*ops
= devlink
->ops
;
633 enum devlink_eswitch_encap_mode encap_mode
;
639 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
, cmd
);
643 err
= devlink_nl_put_handle(msg
, devlink
);
645 goto nla_put_failure
;
647 if (ops
->eswitch_mode_get
) {
648 err
= ops
->eswitch_mode_get(devlink
, &mode
);
650 goto nla_put_failure
;
651 err
= nla_put_u16(msg
, DEVLINK_ATTR_ESWITCH_MODE
, mode
);
653 goto nla_put_failure
;
656 if (ops
->eswitch_inline_mode_get
) {
657 err
= ops
->eswitch_inline_mode_get(devlink
, &inline_mode
);
659 goto nla_put_failure
;
660 err
= nla_put_u8(msg
, DEVLINK_ATTR_ESWITCH_INLINE_MODE
,
663 goto nla_put_failure
;
666 if (ops
->eswitch_encap_mode_get
) {
667 err
= ops
->eswitch_encap_mode_get(devlink
, &encap_mode
);
669 goto nla_put_failure
;
670 err
= nla_put_u8(msg
, DEVLINK_ATTR_ESWITCH_ENCAP_MODE
, encap_mode
);
672 goto nla_put_failure
;
675 genlmsg_end(msg
, hdr
);
679 genlmsg_cancel(msg
, hdr
);
683 int devlink_nl_eswitch_get_doit(struct sk_buff
*skb
, struct genl_info
*info
)
685 struct devlink
*devlink
= info
->user_ptr
[0];
689 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
693 err
= devlink_nl_eswitch_fill(msg
, devlink
, DEVLINK_CMD_ESWITCH_GET
,
694 info
->snd_portid
, info
->snd_seq
, 0);
701 return genlmsg_reply(msg
, info
);
704 int devlink_nl_eswitch_set_doit(struct sk_buff
*skb
, struct genl_info
*info
)
706 struct devlink
*devlink
= info
->user_ptr
[0];
707 const struct devlink_ops
*ops
= devlink
->ops
;
708 enum devlink_eswitch_encap_mode encap_mode
;
713 if (info
->attrs
[DEVLINK_ATTR_ESWITCH_MODE
]) {
714 if (!ops
->eswitch_mode_set
)
716 mode
= nla_get_u16(info
->attrs
[DEVLINK_ATTR_ESWITCH_MODE
]);
717 err
= devlink_rate_nodes_check(devlink
, mode
, info
->extack
);
720 err
= ops
->eswitch_mode_set(devlink
, mode
, info
->extack
);
725 if (info
->attrs
[DEVLINK_ATTR_ESWITCH_INLINE_MODE
]) {
726 if (!ops
->eswitch_inline_mode_set
)
728 inline_mode
= nla_get_u8(info
->attrs
[DEVLINK_ATTR_ESWITCH_INLINE_MODE
]);
729 err
= ops
->eswitch_inline_mode_set(devlink
, inline_mode
,
735 if (info
->attrs
[DEVLINK_ATTR_ESWITCH_ENCAP_MODE
]) {
736 if (!ops
->eswitch_encap_mode_set
)
738 encap_mode
= nla_get_u8(info
->attrs
[DEVLINK_ATTR_ESWITCH_ENCAP_MODE
]);
739 err
= ops
->eswitch_encap_mode_set(devlink
, encap_mode
,
748 int devlink_info_serial_number_put(struct devlink_info_req
*req
, const char *sn
)
752 return nla_put_string(req
->msg
, DEVLINK_ATTR_INFO_SERIAL_NUMBER
, sn
);
754 EXPORT_SYMBOL_GPL(devlink_info_serial_number_put
);
756 int devlink_info_board_serial_number_put(struct devlink_info_req
*req
,
761 return nla_put_string(req
->msg
, DEVLINK_ATTR_INFO_BOARD_SERIAL_NUMBER
,
764 EXPORT_SYMBOL_GPL(devlink_info_board_serial_number_put
);
766 static int devlink_info_version_put(struct devlink_info_req
*req
, int attr
,
767 const char *version_name
,
768 const char *version_value
,
769 enum devlink_info_version_type version_type
)
775 req
->version_cb(version_name
, version_type
,
776 req
->version_cb_priv
);
781 nest
= nla_nest_start_noflag(req
->msg
, attr
);
785 err
= nla_put_string(req
->msg
, DEVLINK_ATTR_INFO_VERSION_NAME
,
788 goto nla_put_failure
;
790 err
= nla_put_string(req
->msg
, DEVLINK_ATTR_INFO_VERSION_VALUE
,
793 goto nla_put_failure
;
795 nla_nest_end(req
->msg
, nest
);
800 nla_nest_cancel(req
->msg
, nest
);
804 int devlink_info_version_fixed_put(struct devlink_info_req
*req
,
805 const char *version_name
,
806 const char *version_value
)
808 return devlink_info_version_put(req
, DEVLINK_ATTR_INFO_VERSION_FIXED
,
809 version_name
, version_value
,
810 DEVLINK_INFO_VERSION_TYPE_NONE
);
812 EXPORT_SYMBOL_GPL(devlink_info_version_fixed_put
);
814 int devlink_info_version_stored_put(struct devlink_info_req
*req
,
815 const char *version_name
,
816 const char *version_value
)
818 return devlink_info_version_put(req
, DEVLINK_ATTR_INFO_VERSION_STORED
,
819 version_name
, version_value
,
820 DEVLINK_INFO_VERSION_TYPE_NONE
);
822 EXPORT_SYMBOL_GPL(devlink_info_version_stored_put
);
824 int devlink_info_version_stored_put_ext(struct devlink_info_req
*req
,
825 const char *version_name
,
826 const char *version_value
,
827 enum devlink_info_version_type version_type
)
829 return devlink_info_version_put(req
, DEVLINK_ATTR_INFO_VERSION_STORED
,
830 version_name
, version_value
,
833 EXPORT_SYMBOL_GPL(devlink_info_version_stored_put_ext
);
835 int devlink_info_version_running_put(struct devlink_info_req
*req
,
836 const char *version_name
,
837 const char *version_value
)
839 return devlink_info_version_put(req
, DEVLINK_ATTR_INFO_VERSION_RUNNING
,
840 version_name
, version_value
,
841 DEVLINK_INFO_VERSION_TYPE_NONE
);
843 EXPORT_SYMBOL_GPL(devlink_info_version_running_put
);
845 int devlink_info_version_running_put_ext(struct devlink_info_req
*req
,
846 const char *version_name
,
847 const char *version_value
,
848 enum devlink_info_version_type version_type
)
850 return devlink_info_version_put(req
, DEVLINK_ATTR_INFO_VERSION_RUNNING
,
851 version_name
, version_value
,
854 EXPORT_SYMBOL_GPL(devlink_info_version_running_put_ext
);
856 static int devlink_nl_driver_info_get(struct device_driver
*drv
,
857 struct devlink_info_req
*req
)
863 return nla_put_string(req
->msg
, DEVLINK_ATTR_INFO_DRIVER_NAME
,
870 devlink_nl_info_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
871 enum devlink_command cmd
, u32 portid
,
872 u32 seq
, int flags
, struct netlink_ext_ack
*extack
)
874 struct device
*dev
= devlink_to_dev(devlink
);
875 struct devlink_info_req req
= {};
879 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
, cmd
);
884 if (devlink_nl_put_handle(msg
, devlink
))
888 if (devlink
->ops
->info_get
) {
889 err
= devlink
->ops
->info_get(devlink
, &req
, extack
);
894 err
= devlink_nl_driver_info_get(dev
->driver
, &req
);
898 genlmsg_end(msg
, hdr
);
902 genlmsg_cancel(msg
, hdr
);
906 int devlink_nl_info_get_doit(struct sk_buff
*skb
, struct genl_info
*info
)
908 struct devlink
*devlink
= info
->user_ptr
[0];
912 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
916 err
= devlink_nl_info_fill(msg
, devlink
, DEVLINK_CMD_INFO_GET
,
917 info
->snd_portid
, info
->snd_seq
, 0,
924 return genlmsg_reply(msg
, info
);
928 devlink_nl_info_get_dump_one(struct sk_buff
*msg
, struct devlink
*devlink
,
929 struct netlink_callback
*cb
, int flags
)
933 err
= devlink_nl_info_fill(msg
, devlink
, DEVLINK_CMD_INFO_GET
,
934 NETLINK_CB(cb
->skb
).portid
,
935 cb
->nlh
->nlmsg_seq
, flags
,
937 if (err
== -EOPNOTSUPP
)
942 int devlink_nl_info_get_dumpit(struct sk_buff
*msg
, struct netlink_callback
*cb
)
944 return devlink_nl_dumpit(msg
, cb
, devlink_nl_info_get_dump_one
);
947 static int devlink_nl_flash_update_fill(struct sk_buff
*msg
,
948 struct devlink
*devlink
,
949 enum devlink_command cmd
,
950 struct devlink_flash_notify
*params
)
954 hdr
= genlmsg_put(msg
, 0, 0, &devlink_nl_family
, 0, cmd
);
958 if (devlink_nl_put_handle(msg
, devlink
))
959 goto nla_put_failure
;
961 if (cmd
!= DEVLINK_CMD_FLASH_UPDATE_STATUS
)
964 if (params
->status_msg
&&
965 nla_put_string(msg
, DEVLINK_ATTR_FLASH_UPDATE_STATUS_MSG
,
967 goto nla_put_failure
;
968 if (params
->component
&&
969 nla_put_string(msg
, DEVLINK_ATTR_FLASH_UPDATE_COMPONENT
,
971 goto nla_put_failure
;
972 if (devlink_nl_put_u64(msg
, DEVLINK_ATTR_FLASH_UPDATE_STATUS_DONE
,
974 goto nla_put_failure
;
975 if (devlink_nl_put_u64(msg
, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TOTAL
,
977 goto nla_put_failure
;
978 if (devlink_nl_put_u64(msg
, DEVLINK_ATTR_FLASH_UPDATE_STATUS_TIMEOUT
,
980 goto nla_put_failure
;
983 genlmsg_end(msg
, hdr
);
987 genlmsg_cancel(msg
, hdr
);
991 static void __devlink_flash_update_notify(struct devlink
*devlink
,
992 enum devlink_command cmd
,
993 struct devlink_flash_notify
*params
)
998 WARN_ON(cmd
!= DEVLINK_CMD_FLASH_UPDATE
&&
999 cmd
!= DEVLINK_CMD_FLASH_UPDATE_END
&&
1000 cmd
!= DEVLINK_CMD_FLASH_UPDATE_STATUS
);
1002 if (!devl_is_registered(devlink
) || !devlink_nl_notify_need(devlink
))
1005 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
1009 err
= devlink_nl_flash_update_fill(msg
, devlink
, cmd
, params
);
1013 devlink_nl_notify_send(devlink
, msg
);
1020 static void devlink_flash_update_begin_notify(struct devlink
*devlink
)
1022 struct devlink_flash_notify params
= {};
1024 __devlink_flash_update_notify(devlink
,
1025 DEVLINK_CMD_FLASH_UPDATE
,
1029 static void devlink_flash_update_end_notify(struct devlink
*devlink
)
1031 struct devlink_flash_notify params
= {};
1033 __devlink_flash_update_notify(devlink
,
1034 DEVLINK_CMD_FLASH_UPDATE_END
,
1038 void devlink_flash_update_status_notify(struct devlink
*devlink
,
1039 const char *status_msg
,
1040 const char *component
,
1042 unsigned long total
)
1044 struct devlink_flash_notify params
= {
1045 .status_msg
= status_msg
,
1046 .component
= component
,
1051 __devlink_flash_update_notify(devlink
,
1052 DEVLINK_CMD_FLASH_UPDATE_STATUS
,
1055 EXPORT_SYMBOL_GPL(devlink_flash_update_status_notify
);
1057 void devlink_flash_update_timeout_notify(struct devlink
*devlink
,
1058 const char *status_msg
,
1059 const char *component
,
1060 unsigned long timeout
)
1062 struct devlink_flash_notify params
= {
1063 .status_msg
= status_msg
,
1064 .component
= component
,
1068 __devlink_flash_update_notify(devlink
,
1069 DEVLINK_CMD_FLASH_UPDATE_STATUS
,
1072 EXPORT_SYMBOL_GPL(devlink_flash_update_timeout_notify
);
1074 struct devlink_flash_component_lookup_ctx
{
1075 const char *lookup_name
;
1076 bool lookup_name_found
;
1080 devlink_flash_component_lookup_cb(const char *version_name
,
1081 enum devlink_info_version_type version_type
,
1082 void *version_cb_priv
)
1084 struct devlink_flash_component_lookup_ctx
*lookup_ctx
= version_cb_priv
;
1086 if (version_type
!= DEVLINK_INFO_VERSION_TYPE_COMPONENT
||
1087 lookup_ctx
->lookup_name_found
)
1090 lookup_ctx
->lookup_name_found
=
1091 !strcmp(lookup_ctx
->lookup_name
, version_name
);
1094 static int devlink_flash_component_get(struct devlink
*devlink
,
1095 struct nlattr
*nla_component
,
1096 const char **p_component
,
1097 struct netlink_ext_ack
*extack
)
1099 struct devlink_flash_component_lookup_ctx lookup_ctx
= {};
1100 struct devlink_info_req req
= {};
1101 const char *component
;
1107 component
= nla_data(nla_component
);
1109 if (!devlink
->ops
->info_get
) {
1110 NL_SET_ERR_MSG_ATTR(extack
, nla_component
,
1111 "component update is not supported by this device");
1115 lookup_ctx
.lookup_name
= component
;
1116 req
.version_cb
= devlink_flash_component_lookup_cb
;
1117 req
.version_cb_priv
= &lookup_ctx
;
1119 ret
= devlink
->ops
->info_get(devlink
, &req
, NULL
);
1123 if (!lookup_ctx
.lookup_name_found
) {
1124 NL_SET_ERR_MSG_ATTR(extack
, nla_component
,
1125 "selected component is not supported by this device");
1128 *p_component
= component
;
1132 int devlink_nl_flash_update_doit(struct sk_buff
*skb
, struct genl_info
*info
)
1134 struct nlattr
*nla_overwrite_mask
, *nla_file_name
;
1135 struct devlink_flash_update_params params
= {};
1136 struct devlink
*devlink
= info
->user_ptr
[0];
1137 const char *file_name
;
1138 u32 supported_params
;
1141 if (!devlink
->ops
->flash_update
)
1144 if (GENL_REQ_ATTR_CHECK(info
, DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME
))
1147 ret
= devlink_flash_component_get(devlink
,
1148 info
->attrs
[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT
],
1149 ¶ms
.component
, info
->extack
);
1153 supported_params
= devlink
->ops
->supported_flash_update_params
;
1155 nla_overwrite_mask
= info
->attrs
[DEVLINK_ATTR_FLASH_UPDATE_OVERWRITE_MASK
];
1156 if (nla_overwrite_mask
) {
1157 struct nla_bitfield32 sections
;
1159 if (!(supported_params
& DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK
)) {
1160 NL_SET_ERR_MSG_ATTR(info
->extack
, nla_overwrite_mask
,
1161 "overwrite settings are not supported by this device");
1164 sections
= nla_get_bitfield32(nla_overwrite_mask
);
1165 params
.overwrite_mask
= sections
.value
& sections
.selector
;
1168 nla_file_name
= info
->attrs
[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME
];
1169 file_name
= nla_data(nla_file_name
);
1170 ret
= request_firmware(¶ms
.fw
, file_name
, devlink
->dev
);
1172 NL_SET_ERR_MSG_ATTR(info
->extack
, nla_file_name
,
1173 "failed to locate the requested firmware file");
1177 devlink_flash_update_begin_notify(devlink
);
1178 ret
= devlink
->ops
->flash_update(devlink
, ¶ms
, info
->extack
);
1179 devlink_flash_update_end_notify(devlink
);
1181 release_firmware(params
.fw
);
1186 static void __devlink_compat_running_version(struct devlink
*devlink
,
1187 char *buf
, size_t len
)
1189 struct devlink_info_req req
= {};
1190 const struct nlattr
*nlattr
;
1191 struct sk_buff
*msg
;
1194 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
1199 err
= devlink
->ops
->info_get(devlink
, &req
, NULL
);
1203 nla_for_each_attr_type(nlattr
, DEVLINK_ATTR_INFO_VERSION_RUNNING
,
1204 (void *)msg
->data
, msg
->len
, rem
) {
1205 const struct nlattr
*kv
;
1208 nla_for_each_nested_type(kv
, DEVLINK_ATTR_INFO_VERSION_VALUE
,
1210 strlcat(buf
, nla_data(kv
), len
);
1211 strlcat(buf
, " ", len
);
1218 void devlink_compat_running_version(struct devlink
*devlink
,
1219 char *buf
, size_t len
)
1221 if (!devlink
->ops
->info_get
)
1225 if (devl_is_registered(devlink
))
1226 __devlink_compat_running_version(devlink
, buf
, len
);
1227 devl_unlock(devlink
);
1230 int devlink_compat_flash_update(struct devlink
*devlink
, const char *file_name
)
1232 struct devlink_flash_update_params params
= {};
1236 if (!devl_is_registered(devlink
)) {
1241 if (!devlink
->ops
->flash_update
) {
1246 ret
= request_firmware(¶ms
.fw
, file_name
, devlink
->dev
);
1250 devlink_flash_update_begin_notify(devlink
);
1251 ret
= devlink
->ops
->flash_update(devlink
, ¶ms
, NULL
);
1252 devlink_flash_update_end_notify(devlink
);
1254 release_firmware(params
.fw
);
1256 devl_unlock(devlink
);
1262 devlink_nl_selftests_fill(struct sk_buff
*msg
, struct devlink
*devlink
,
1263 u32 portid
, u32 seq
, int flags
,
1264 struct netlink_ext_ack
*extack
)
1266 struct nlattr
*selftests
;
1271 hdr
= genlmsg_put(msg
, portid
, seq
, &devlink_nl_family
, flags
,
1272 DEVLINK_CMD_SELFTESTS_GET
);
1277 if (devlink_nl_put_handle(msg
, devlink
))
1278 goto err_cancel_msg
;
1280 selftests
= nla_nest_start(msg
, DEVLINK_ATTR_SELFTESTS
);
1282 goto err_cancel_msg
;
1284 for (i
= DEVLINK_ATTR_SELFTEST_ID_UNSPEC
+ 1;
1285 i
<= DEVLINK_ATTR_SELFTEST_ID_MAX
; i
++) {
1286 if (devlink
->ops
->selftest_check(devlink
, i
, extack
)) {
1287 err
= nla_put_flag(msg
, i
);
1289 goto err_cancel_msg
;
1293 nla_nest_end(msg
, selftests
);
1294 genlmsg_end(msg
, hdr
);
1298 genlmsg_cancel(msg
, hdr
);
1302 int devlink_nl_selftests_get_doit(struct sk_buff
*skb
, struct genl_info
*info
)
1304 struct devlink
*devlink
= info
->user_ptr
[0];
1305 struct sk_buff
*msg
;
1308 if (!devlink
->ops
->selftest_check
)
1311 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
1315 err
= devlink_nl_selftests_fill(msg
, devlink
, info
->snd_portid
,
1316 info
->snd_seq
, 0, info
->extack
);
1322 return genlmsg_reply(msg
, info
);
1325 static int devlink_nl_selftests_get_dump_one(struct sk_buff
*msg
,
1326 struct devlink
*devlink
,
1327 struct netlink_callback
*cb
,
1330 if (!devlink
->ops
->selftest_check
)
1333 return devlink_nl_selftests_fill(msg
, devlink
,
1334 NETLINK_CB(cb
->skb
).portid
,
1335 cb
->nlh
->nlmsg_seq
, flags
,
1339 int devlink_nl_selftests_get_dumpit(struct sk_buff
*skb
,
1340 struct netlink_callback
*cb
)
1342 return devlink_nl_dumpit(skb
, cb
, devlink_nl_selftests_get_dump_one
);
1345 static int devlink_selftest_result_put(struct sk_buff
*skb
, unsigned int id
,
1346 enum devlink_selftest_status test_status
)
1348 struct nlattr
*result_attr
;
1350 result_attr
= nla_nest_start(skb
, DEVLINK_ATTR_SELFTEST_RESULT
);
1354 if (nla_put_u32(skb
, DEVLINK_ATTR_SELFTEST_RESULT_ID
, id
) ||
1355 nla_put_u8(skb
, DEVLINK_ATTR_SELFTEST_RESULT_STATUS
,
1357 goto nla_put_failure
;
1359 nla_nest_end(skb
, result_attr
);
1363 nla_nest_cancel(skb
, result_attr
);
1367 static const struct nla_policy devlink_selftest_nl_policy
[DEVLINK_ATTR_SELFTEST_ID_MAX
+ 1] = {
1368 [DEVLINK_ATTR_SELFTEST_ID_FLASH
] = { .type
= NLA_FLAG
},
1371 int devlink_nl_selftests_run_doit(struct sk_buff
*skb
, struct genl_info
*info
)
1373 struct nlattr
*tb
[DEVLINK_ATTR_SELFTEST_ID_MAX
+ 1];
1374 struct devlink
*devlink
= info
->user_ptr
[0];
1375 struct nlattr
*attrs
, *selftests
;
1376 struct sk_buff
*msg
;
1381 if (!devlink
->ops
->selftest_run
|| !devlink
->ops
->selftest_check
)
1384 if (GENL_REQ_ATTR_CHECK(info
, DEVLINK_ATTR_SELFTESTS
))
1387 attrs
= info
->attrs
[DEVLINK_ATTR_SELFTESTS
];
1389 err
= nla_parse_nested(tb
, DEVLINK_ATTR_SELFTEST_ID_MAX
, attrs
,
1390 devlink_selftest_nl_policy
, info
->extack
);
1394 msg
= nlmsg_new(NLMSG_DEFAULT_SIZE
, GFP_KERNEL
);
1399 hdr
= genlmsg_put(msg
, info
->snd_portid
, info
->snd_seq
,
1400 &devlink_nl_family
, 0, DEVLINK_CMD_SELFTESTS_RUN
);
1404 if (devlink_nl_put_handle(msg
, devlink
))
1405 goto genlmsg_cancel
;
1407 selftests
= nla_nest_start(msg
, DEVLINK_ATTR_SELFTESTS
);
1409 goto genlmsg_cancel
;
1411 for (i
= DEVLINK_ATTR_SELFTEST_ID_UNSPEC
+ 1;
1412 i
<= DEVLINK_ATTR_SELFTEST_ID_MAX
; i
++) {
1413 enum devlink_selftest_status test_status
;
1415 if (nla_get_flag(tb
[i
])) {
1416 if (!devlink
->ops
->selftest_check(devlink
, i
,
1418 if (devlink_selftest_result_put(msg
, i
,
1419 DEVLINK_SELFTEST_STATUS_SKIP
))
1420 goto selftests_nest_cancel
;
1424 test_status
= devlink
->ops
->selftest_run(devlink
, i
,
1426 if (devlink_selftest_result_put(msg
, i
, test_status
))
1427 goto selftests_nest_cancel
;
1431 nla_nest_end(msg
, selftests
);
1432 genlmsg_end(msg
, hdr
);
1433 return genlmsg_reply(msg
, info
);
1435 selftests_nest_cancel
:
1436 nla_nest_cancel(msg
, selftests
);
1438 genlmsg_cancel(msg
, hdr
);