]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: kvaser_usb: Expose device information via devlink info_get()
authorJimmy Assarsson <extja@kvaser.com>
Fri, 25 Jul 2025 12:34:50 +0000 (14:34 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 25 Jul 2025 16:01:21 +0000 (18:01 +0200)
Expose device information via devlink info_get():
  * Serial number
  * Firmware version
  * Hardware revision
  * EAN (product number)

Example output:
  $ devlink dev
  usb/1-1.2:1.0

  $ devlink dev info
  usb/1-1.2:1.0:
    driver kvaser_usb
    serial_number 1020
    versions:
        fixed:
          board.rev 1
          board.id 7330130009653
        running:
          fw 3.22.527

Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Signed-off-by: Jimmy Assarsson <extja@kvaser.com>
Link: https://patch.msgid.link/20250725123452.41-10-extja@kvaser.com
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/usb/kvaser_usb/kvaser_usb_devlink.c

index dbe7fa64558a28bc503db2260da7ae9cbe2b6c04..aa06bd1fa12530c41b9c84a12fc7113c0b4a6a1f 100644 (file)
@@ -7,5 +7,56 @@
 
 #include <net/devlink.h>
 
+#define KVASER_USB_EAN_MSB 0x00073301
+
+static int kvaser_usb_devlink_info_get(struct devlink *devlink,
+                                      struct devlink_info_req *req,
+                                      struct netlink_ext_ack *extack)
+{
+       struct kvaser_usb *dev = devlink_priv(devlink);
+       char buf[] = "73301XXXXXXXXXX";
+       int ret;
+
+       if (dev->serial_number) {
+               snprintf(buf, sizeof(buf), "%u", dev->serial_number);
+               ret = devlink_info_serial_number_put(req, buf);
+               if (ret)
+                       return ret;
+       }
+
+       if (dev->fw_version.major) {
+               snprintf(buf, sizeof(buf), "%u.%u.%u",
+                        dev->fw_version.major,
+                        dev->fw_version.minor,
+                        dev->fw_version.build);
+               ret = devlink_info_version_running_put(req,
+                                                      DEVLINK_INFO_VERSION_GENERIC_FW,
+                                                      buf);
+               if (ret)
+                       return ret;
+       }
+
+       if (dev->hw_revision) {
+               snprintf(buf, sizeof(buf), "%u", dev->hw_revision);
+               ret = devlink_info_version_fixed_put(req,
+                                                    DEVLINK_INFO_VERSION_GENERIC_BOARD_REV,
+                                                    buf);
+               if (ret)
+                       return ret;
+       }
+
+       if (dev->ean[1] == KVASER_USB_EAN_MSB) {
+               snprintf(buf, sizeof(buf), "%x%08x", dev->ean[1], dev->ean[0]);
+               ret = devlink_info_version_fixed_put(req,
+                                                    DEVLINK_INFO_VERSION_GENERIC_BOARD_ID,
+                                                    buf);
+               if (ret)
+                       return ret;
+       }
+
+       return 0;
+}
+
 const struct devlink_ops kvaser_usb_devlink_ops = {
+       .info_get = kvaser_usb_devlink_info_get,
 };