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 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 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 57 void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can) 58 { 59 devlink_port_unregister(&can->devlink_port); 60 } 61