kvaser_pciefd_devlink.c 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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. #include <linux/netdevice.h>
  8. #include <net/devlink.h>
  9. static int kvaser_pciefd_devlink_info_get(struct devlink *devlink,
  10. struct devlink_info_req *req,
  11. struct netlink_ext_ack *extack)
  12. {
  13. struct kvaser_pciefd *pcie = devlink_priv(devlink);
  14. char buf[] = "xxx.xxx.xxxxx";
  15. int ret;
  16. if (pcie->fw_version.major) {
  17. snprintf(buf, sizeof(buf), "%u.%u.%u",
  18. pcie->fw_version.major,
  19. pcie->fw_version.minor,
  20. pcie->fw_version.build);
  21. ret = devlink_info_version_running_put(req,
  22. DEVLINK_INFO_VERSION_GENERIC_FW,
  23. buf);
  24. if (ret)
  25. return ret;
  26. }
  27. return 0;
  28. }
  29. const struct devlink_ops kvaser_pciefd_devlink_ops = {
  30. .info_get = kvaser_pciefd_devlink_info_get,
  31. };
  32. int kvaser_pciefd_devlink_port_register(struct kvaser_pciefd_can *can)
  33. {
  34. int ret;
  35. struct devlink_port_attrs attrs = {
  36. .flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL,
  37. .phys.port_number = can->can.dev->dev_port,
  38. };
  39. devlink_port_attrs_set(&can->devlink_port, &attrs);
  40. ret = devlink_port_register(priv_to_devlink(can->kv_pcie),
  41. &can->devlink_port, can->can.dev->dev_port);
  42. if (ret)
  43. return ret;
  44. SET_NETDEV_DEVLINK_PORT(can->can.dev, &can->devlink_port);
  45. return 0;
  46. }
  47. void kvaser_pciefd_devlink_port_unregister(struct kvaser_pciefd_can *can)
  48. {
  49. devlink_port_unregister(&can->devlink_port);
  50. }