xref: /linux/drivers/net/can/kvaser_pciefd/kvaser_pciefd_devlink.c (revision 8be4d31cb8aaeea27bde4b7ddb26e28a89062ebf)
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