1 // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
2 /* kvaser_pciefd devlink functions
3 *
4 * Copyright (C) 2025 KVASER AB, Sweden. All rights reserved.
5 */
6 #include "kvaser_pciefd.h"
7
8 #include <linux/netdevice.h>
9 #include <net/devlink.h>
10
kvaser_pciefd_devlink_info_get(struct devlink * devlink,struct devlink_info_req * req,struct netlink_ext_ack * extack)11 static int kvaser_pciefd_devlink_info_get(struct devlink *devlink,
12 struct devlink_info_req *req,
13 struct netlink_ext_ack *extack)
14 {
15 struct kvaser_pciefd *pcie = devlink_priv(devlink);
16 char buf[] = "xxx.xxx.xxxxx";
17 int ret;
18
19 if (pcie->fw_version.major) {
20 snprintf(buf, sizeof(buf), "%u.%u.%u",
21 pcie->fw_version.major,
22 pcie->fw_version.minor,
23 pcie->fw_version.build);
24 ret = devlink_info_version_running_put(req,
25 DEVLINK_INFO_VERSION_GENERIC_FW,
26 buf);
27 if (ret)
28 return ret;
29 }
30
31 return 0;
32 }
33
34 const struct devlink_ops kvaser_pciefd_devlink_ops = {
35 .info_get = kvaser_pciefd_devlink_info_get,
36 };
37
kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can * can)38 int kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can *can)
39 {
40 int ret;
41 struct devlink_port_attrs attrs = {
42 .flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL,
43 .phys.port_number = can->can.dev->dev_port,
44 };
45 devlink_port_attrs_set(&can->devlink_port, &attrs);
46
47 ret = devlink_port_register(priv_to_devlink(can->kv_pcie),
48 &can->devlink_port, can->can.dev->dev_port);
49 if (ret)
50 return ret;
51
52 SET_NETDEV_DEVLINK_PORT(can->can.dev, &can->devlink_port);
53
54 return 0;
55 }
56
kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can * can)57 void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can)
58 {
59 devlink_port_unregister(&can->devlink_port);
60 }
61