]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
can: kvaser_usb: Add support for ethtool set_phys_id()
authorJimmy Assarsson <extja@kvaser.com>
Fri, 25 Jul 2025 12:34:43 +0000 (14:34 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 25 Jul 2025 16:01:19 +0000 (18:01 +0200)
Add support for ethtool set_phys_id(), to physically locate devices by
flashing a LED on the device.

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

index daf42080f9428245f6813f6490593bbdb5621e3e..c74875f978c473d3e57f0095d2d384fa3d132119 100644 (file)
@@ -753,6 +753,31 @@ freeurb:
        return ret;
 }
 
+static int kvaser_usb_set_phys_id(struct net_device *netdev,
+                                 enum ethtool_phys_id_state state)
+{
+       struct kvaser_usb_net_priv *priv = netdev_priv(netdev);
+       const struct kvaser_usb_dev_ops *ops = priv->dev->driver_info->ops;
+
+       switch (state) {
+       case ETHTOOL_ID_ACTIVE:
+               return 3; /* 3 On/Off cycles per second */
+
+       case ETHTOOL_ID_ON:
+               return ops->dev_set_led(priv, KVASER_USB_LED_ON, 1000);
+
+       case ETHTOOL_ID_OFF:
+               return ops->dev_set_led(priv, KVASER_USB_LED_OFF, 1000);
+
+       case ETHTOOL_ID_INACTIVE:
+               /* Turn LED off and restore standard function after 1ms */
+               return ops->dev_set_led(priv, KVASER_USB_LED_OFF, 1);
+
+       default:
+               return -EINVAL;
+       }
+}
+
 static const struct net_device_ops kvaser_usb_netdev_ops = {
        .ndo_open = kvaser_usb_open,
        .ndo_stop = kvaser_usb_close,
@@ -763,6 +788,7 @@ static const struct net_device_ops kvaser_usb_netdev_ops = {
 
 static const struct ethtool_ops kvaser_usb_ethtool_ops = {
        .get_ts_info = can_ethtool_op_get_ts_info_hwts,
+       .set_phys_id = kvaser_usb_set_phys_id,
 };
 
 static void kvaser_usb_remove_interfaces(struct kvaser_usb *dev)