10d1b337bSJimmy Assarsson // SPDX-License-Identifier: GPL-2.0 OR BSD-2-Clause
20d1b337bSJimmy Assarsson /* kvaser_pciefd devlink functions
30d1b337bSJimmy Assarsson *
40d1b337bSJimmy Assarsson * Copyright (C) 2025 KVASER AB, Sweden. All rights reserved.
50d1b337bSJimmy Assarsson */
60d1b337bSJimmy Assarsson #include "kvaser_pciefd.h"
70d1b337bSJimmy Assarsson
8*6271c8b8SJimmy Assarsson #include <linux/netdevice.h>
90d1b337bSJimmy Assarsson #include <net/devlink.h>
100d1b337bSJimmy Assarsson
kvaser_pciefd_devlink_info_get(struct devlink * devlink,struct devlink_info_req * req,struct netlink_ext_ack * extack)113d68ecf4SJimmy Assarsson static int kvaser_pciefd_devlink_info_get(struct devlink *devlink,
123d68ecf4SJimmy Assarsson struct devlink_info_req *req,
133d68ecf4SJimmy Assarsson struct netlink_ext_ack *extack)
143d68ecf4SJimmy Assarsson {
153d68ecf4SJimmy Assarsson struct kvaser_pciefd *pcie = devlink_priv(devlink);
163d68ecf4SJimmy Assarsson char buf[] = "xxx.xxx.xxxxx";
173d68ecf4SJimmy Assarsson int ret;
183d68ecf4SJimmy Assarsson
193d68ecf4SJimmy Assarsson if (pcie->fw_version.major) {
203d68ecf4SJimmy Assarsson snprintf(buf, sizeof(buf), "%u.%u.%u",
213d68ecf4SJimmy Assarsson pcie->fw_version.major,
223d68ecf4SJimmy Assarsson pcie->fw_version.minor,
233d68ecf4SJimmy Assarsson pcie->fw_version.build);
243d68ecf4SJimmy Assarsson ret = devlink_info_version_running_put(req,
253d68ecf4SJimmy Assarsson DEVLINK_INFO_VERSION_GENERIC_FW,
263d68ecf4SJimmy Assarsson buf);
273d68ecf4SJimmy Assarsson if (ret)
283d68ecf4SJimmy Assarsson return ret;
293d68ecf4SJimmy Assarsson }
303d68ecf4SJimmy Assarsson
313d68ecf4SJimmy Assarsson return 0;
323d68ecf4SJimmy Assarsson }
333d68ecf4SJimmy Assarsson
340d1b337bSJimmy Assarsson const struct devlink_ops kvaser_pciefd_devlink_ops = {
353d68ecf4SJimmy Assarsson .info_get = kvaser_pciefd_devlink_info_get,
360d1b337bSJimmy Assarsson };
37*6271c8b8SJimmy Assarsson
kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can * can)38*6271c8b8SJimmy Assarsson int kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can *can)
39*6271c8b8SJimmy Assarsson {
40*6271c8b8SJimmy Assarsson int ret;
41*6271c8b8SJimmy Assarsson struct devlink_port_attrs attrs = {
42*6271c8b8SJimmy Assarsson .flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL,
43*6271c8b8SJimmy Assarsson .phys.port_number = can->can.dev->dev_port,
44*6271c8b8SJimmy Assarsson };
45*6271c8b8SJimmy Assarsson devlink_port_attrs_set(&can->devlink_port, &attrs);
46*6271c8b8SJimmy Assarsson
47*6271c8b8SJimmy Assarsson ret = devlink_port_register(priv_to_devlink(can->kv_pcie),
48*6271c8b8SJimmy Assarsson &can->devlink_port, can->can.dev->dev_port);
49*6271c8b8SJimmy Assarsson if (ret)
50*6271c8b8SJimmy Assarsson return ret;
51*6271c8b8SJimmy Assarsson
52*6271c8b8SJimmy Assarsson SET_NETDEV_DEVLINK_PORT(can->can.dev, &can->devlink_port);
53*6271c8b8SJimmy Assarsson
54*6271c8b8SJimmy Assarsson return 0;
55*6271c8b8SJimmy Assarsson }
56*6271c8b8SJimmy Assarsson
kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can * can)57*6271c8b8SJimmy Assarsson void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can)
58*6271c8b8SJimmy Assarsson {
59*6271c8b8SJimmy Assarsson devlink_port_unregister(&can->devlink_port);
60*6271c8b8SJimmy Assarsson }
61