can: tree-wide: advertise software timestamping capabilities
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Wed, 27 Jul 2022 10:16:32 +0000 (19:16 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 28 Jul 2022 09:44:01 +0000 (11:44 +0200)
Currently, some CAN drivers support hardware timestamping, some do
not. But userland has no method to query which features are supported
(aside maybe of getting RX messages and observe whether or not
hardware timestamps stay at zero).

The canonical way for a network driver to advertised what kind of
timestamping it supports is to implement ethtool_ops::get_ts_info().

This patch only targets the CAN drivers which *do not* support
hardware timestamping.  For each of those CAN drivers, implement the
get_ts_info() using the generic ethtool_op_get_ts_info().

This way, userland can do:

| $ ethtool --show-time-stamping canX

to confirm the device timestamping capacities.

N.B. the drivers which support hardware timestamping will be migrated
in separate patches.

Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/all/20220727101641.198847-6-mailhol.vincent@wanadoo.fr
[mkl: mscan: add missing mscan_ethtool_ops]
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
30 files changed:
drivers/net/can/at91_can.c
drivers/net/can/c_can/c_can_ethtool.c
drivers/net/can/can327.c
drivers/net/can/cc770/cc770.c
drivers/net/can/ctucanfd/ctucanfd_base.c
drivers/net/can/flexcan/flexcan-ethtool.c
drivers/net/can/grcan.c
drivers/net/can/ifi_canfd/ifi_canfd.c
drivers/net/can/janz-ican3.c
drivers/net/can/m_can/m_can.c
drivers/net/can/mscan/mscan.c
drivers/net/can/pch_can.c
drivers/net/can/rcar/rcar_can.c
drivers/net/can/rcar/rcar_canfd.c
drivers/net/can/sja1000/sja1000.c
drivers/net/can/slcan/slcan-ethtool.c
drivers/net/can/softing/softing_main.c
drivers/net/can/spi/hi311x.c
drivers/net/can/spi/mcp251x.c
drivers/net/can/sun4i_can.c
drivers/net/can/ti_hecc.c
drivers/net/can/usb/ems_usb.c
drivers/net/can/usb/esd_usb.c
drivers/net/can/usb/gs_usb.c
drivers/net/can/usb/mcba_usb.c
drivers/net/can/usb/ucan.c
drivers/net/can/usb/usb_8dev.c
drivers/net/can/vcan.c
drivers/net/can/vxcan.c
drivers/net/can/xilinx_can.c

index 29ed0d3cd171cc57151cd9f8a3bb598b784890ba..3a2d109a3792fdfc61fbd64ffa472669a939dde7 100644 (file)
@@ -8,6 +8,7 @@
 
 #include <linux/clk.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/if_arp.h>
 #include <linux/interrupt.h>
 #include <linux/kernel.h>
@@ -1152,6 +1153,10 @@ static const struct net_device_ops at91_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops at91_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static ssize_t mb0_id_show(struct device *dev,
                           struct device_attribute *attr, char *buf)
 {
@@ -1293,6 +1298,7 @@ static int at91_can_probe(struct platform_device *pdev)
        }
 
        dev->netdev_ops = &at91_netdev_ops;
+       dev->ethtool_ops = &at91_ethtool_ops;
        dev->irq = irq;
        dev->flags |= IFF_ECHO;
 
index 36db2d9391d405280b79d07448bbefa23778053c..e41167eda673859ce1c385843de957a8a6445d73 100644 (file)
@@ -26,4 +26,5 @@ static void c_can_get_ringparam(struct net_device *netdev,
 
 const struct ethtool_ops c_can_ethtool_ops = {
        .get_ringparam = c_can_get_ringparam,
+       .get_ts_info = ethtool_op_get_ts_info,
 };
index 3f2156540716bbc16241f2a586e9974c5066df9d..50a374972ad93e282094f248a4749ad7f7bfc63e 100644 (file)
@@ -850,6 +850,10 @@ static const struct net_device_ops can327_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops can327_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static bool can327_is_valid_rx_char(u8 c)
 {
        static const bool lut_char_is_valid['z'] = {
@@ -1034,6 +1038,7 @@ static int can327_ldisc_open(struct tty_struct *tty)
        /* Configure netdev interface */
        elm->dev = dev;
        dev->netdev_ops = &can327_netdev_ops;
+       dev->ethtool_ops = &can327_ethtool_ops;
 
        /* Mark ldisc channel as alive */
        elm->tty = tty;
index 797a954bb1a0c316dbb02187fabe95d0f24d8328..0b9dfc76e769cf8338b32b299099fc7cc160b8c7 100644 (file)
@@ -17,6 +17,7 @@
 #include <linux/ptrace.h>
 #include <linux/string.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/if_ether.h>
@@ -836,6 +837,10 @@ static const struct net_device_ops cc770_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops cc770_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 int register_cc770dev(struct net_device *dev)
 {
        struct cc770_priv *priv = netdev_priv(dev);
@@ -846,6 +851,7 @@ int register_cc770dev(struct net_device *dev)
                return err;
 
        dev->netdev_ops = &cc770_netdev_ops;
+       dev->ethtool_ops = &cc770_ethtool_ops;
 
        dev->flags |= IFF_ECHO; /* we support local echo */
 
index 6b281f6eb9b41a0c2489bbddcaaef820e807861a..3c18d028bd8ced64bdc42c5cab6825fb39d76caa 100644 (file)
@@ -19,6 +19,7 @@
 
 #include <linux/clk.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/init.h>
 #include <linux/bitfield.h>
 #include <linux/interrupt.h>
@@ -1301,6 +1302,10 @@ static const struct net_device_ops ctucan_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops ctucan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 int ctucan_suspend(struct device *dev)
 {
        struct net_device *ndev = dev_get_drvdata(dev);
@@ -1377,6 +1382,7 @@ int ctucan_probe_common(struct device *dev, void __iomem *addr, int irq, unsigne
                set_drvdata_fnc(dev, ndev);
        SET_NETDEV_DEV(ndev, dev);
        ndev->netdev_ops = &ctucan_netdev_ops;
+       ndev->ethtool_ops = &ctucan_ethtool_ops;
 
        /* Getting the can_clk info */
        if (!can_clk_rate) {
index f0873f3a2f34d3d3cf1143fbb18cb7b91f1327ef..50e86b2da53286f5c2173b517897be8185a78d8b 100644 (file)
@@ -106,4 +106,5 @@ const struct ethtool_ops flexcan_ethtool_ops = {
        .get_priv_flags = flexcan_get_priv_flags,
        .set_priv_flags = flexcan_set_priv_flags,
        .get_sset_count = flexcan_get_sset_count,
+       .get_ts_info = ethtool_op_get_ts_info,
 };
index 24035a6187c98a7fa0c5aee50e1c04e7b1f543c1..6c37aab93eb3ae0dfa9d38be0bc3067af1020a27 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/interrupt.h>
 #include <linux/netdevice.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/io.h>
 #include <linux/can/dev.h>
 #include <linux/spinlock.h>
@@ -1561,6 +1562,10 @@ static const struct net_device_ops grcan_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops grcan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static int grcan_setup_netdev(struct platform_device *ofdev,
                              void __iomem *base,
                              int irq, u32 ambafreq, bool txbug)
@@ -1577,6 +1582,7 @@ static int grcan_setup_netdev(struct platform_device *ofdev,
        dev->irq = irq;
        dev->flags |= IFF_ECHO;
        dev->netdev_ops = &grcan_netdev_ops;
+       dev->ethtool_ops = &grcan_ethtool_ops;
        dev->sysfs_groups[0] = &sysfs_grcan_group;
 
        priv = netdev_priv(dev);
index 64e3be8b73af59908600be9197021e9003ed66e6..ad7a89b95da7128ac563ae3154b652248e85ddb6 100644 (file)
@@ -13,6 +13,7 @@
 
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
@@ -925,6 +926,10 @@ static const struct net_device_ops ifi_canfd_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops ifi_canfd_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static int ifi_canfd_plat_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
@@ -962,6 +967,7 @@ static int ifi_canfd_plat_probe(struct platform_device *pdev)
        ndev->irq = irq;
        ndev->flags |= IFF_ECHO;        /* we support local echo */
        ndev->netdev_ops = &ifi_canfd_netdev_ops;
+       ndev->ethtool_ops = &ifi_canfd_ethtool_ops;
 
        priv = netdev_priv(ndev);
        priv->ndev = ndev;
index 78d9190a4220494de40d80b58afdc25e55c39d19..71a2caae075792e230c768e212d265b654309f9a 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/platform_device.h>
 
 #include <linux/netdevice.h>
@@ -1754,6 +1755,10 @@ static const struct net_device_ops ican3_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops ican3_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 /*
  * Low-level CAN Device
  */
@@ -1925,6 +1930,7 @@ static int ican3_probe(struct platform_device *pdev)
        mod->free_page = DPM_FREE_START;
 
        ndev->netdev_ops = &ican3_netdev_ops;
+       ndev->ethtool_ops = &ican3_ethtool_ops;
        ndev->flags |= IFF_ECHO;
        SET_NETDEV_DEV(ndev, &pdev->dev);
 
index 713a4b0edf860b05caa72d8a6c1d285db05613d5..4709c012b1dc90c2ccf58d0c3b3d826911b7deb4 100644 (file)
@@ -9,6 +9,7 @@
  */
 
 #include <linux/bitfield.h>
+#include <linux/ethtool.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
 #include <linux/kernel.h>
@@ -1829,10 +1830,15 @@ static const struct net_device_ops m_can_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops m_can_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static int register_m_can_dev(struct net_device *dev)
 {
        dev->flags |= IFF_ECHO; /* we support local echo */
        dev->netdev_ops = &m_can_netdev_ops;
+       dev->ethtool_ops = &m_can_ethtool_ops;
 
        return register_candev(dev);
 }
index 78a21ab6360154387ae53ef3e8d335e463d235a0..2119fbb287efc93281eece23236364cf4256f4e2 100644 (file)
@@ -616,6 +616,10 @@ static const struct net_device_ops mscan_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops mscan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 int register_mscandev(struct net_device *dev, int mscan_clksrc)
 {
        struct mscan_priv *priv = netdev_priv(dev);
@@ -676,6 +680,7 @@ struct net_device *alloc_mscandev(void)
        priv = netdev_priv(dev);
 
        dev->netdev_ops = &mscan_netdev_ops;
+       dev->ethtool_ops = &mscan_ethtool_ops;
 
        dev->flags |= IFF_ECHO; /* we support local echo */
 
index 32804fed116c1ec0438451b905aff7dd1b366057..0558ff67ec6abf4841effc0270dc2bbf3ba71e92 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/io.h>
 #include <linux/module.h>
 #include <linux/sched.h>
@@ -938,6 +939,10 @@ static const struct net_device_ops pch_can_netdev_ops = {
        .ndo_change_mtu         = can_change_mtu,
 };
 
+static const struct ethtool_ops pch_can_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static void pch_can_remove(struct pci_dev *pdev)
 {
        struct net_device *ndev = pci_get_drvdata(pdev);
@@ -1188,6 +1193,7 @@ static int pch_can_probe(struct pci_dev *pdev,
        pci_set_drvdata(pdev, ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
        ndev->netdev_ops = &pch_can_netdev_ops;
+       ndev->ethtool_ops = &pch_can_ethtool_ops;
        priv->can.clock.freq = PCH_CAN_CLK; /* Hz */
 
        netif_napi_add_weight(ndev, &priv->napi, pch_can_poll, PCH_RX_OBJ_END);
index d11db2112a4a715101412f55d4d19752c469677a..6ee968c59ac90930272576c66a31be7b662cc5e4 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/platform_device.h>
 #include <linux/can/dev.h>
@@ -630,6 +631,10 @@ static const struct net_device_ops rcar_can_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops rcar_can_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static void rcar_can_rx_pkt(struct rcar_can_priv *priv)
 {
        struct net_device_stats *stats = &priv->ndev->stats;
@@ -785,6 +790,7 @@ static int rcar_can_probe(struct platform_device *pdev)
        }
 
        ndev->netdev_ops = &rcar_can_netdev_ops;
+       ndev->ethtool_ops = &rcar_can_ethtool_ops;
        ndev->irq = irq;
        ndev->flags |= IFF_ECHO;
        priv->ndev = ndev;
index d3e569a02b4dcb441509ab80fadedaaae1fe96b4..27085b796e752b8f4b0faef2a718684712cfdce8 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/platform_device.h>
 #include <linux/can/dev.h>
@@ -1695,6 +1696,10 @@ static const struct net_device_ops rcar_canfd_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops rcar_canfd_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
                                    u32 fcan_freq)
 {
@@ -1711,6 +1716,7 @@ static int rcar_canfd_channel_probe(struct rcar_canfd_global *gpriv, u32 ch,
        priv = netdev_priv(ndev);
 
        ndev->netdev_ops = &rcar_canfd_netdev_ops;
+       ndev->ethtool_ops = &rcar_canfd_ethtool_ops;
        ndev->flags |= IFF_ECHO;
        priv->ndev = ndev;
        priv->base = gpriv->base;
index 75a2f9bf8c16bb173518ccb0d9cd7b749eca6a92..98dfd5f295a7128045161b50c7e18bb1b3b13ef4 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/ptrace.h>
 #include <linux/string.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/if_ether.h>
@@ -654,6 +655,10 @@ static const struct net_device_ops sja1000_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops sja1000_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 int register_sja1000dev(struct net_device *dev)
 {
        int ret;
@@ -663,6 +668,7 @@ int register_sja1000dev(struct net_device *dev)
 
        dev->flags |= IFF_ECHO; /* we support local echo */
        dev->netdev_ops = &sja1000_netdev_ops;
+       dev->ethtool_ops = &sja1000_ethtool_ops;
 
        set_reset_mode(dev);
        chipset_init(dev);
index 328ae1fb065b5baedddc7be4ddc0aeaa23d056da..f598c653fbfaf7d3b64e9eee023cf73d37929ca8 100644 (file)
@@ -57,4 +57,5 @@ const struct ethtool_ops slcan_ethtool_ops = {
        .get_priv_flags = slcan_get_priv_flags,
        .set_priv_flags = slcan_set_priv_flags,
        .get_sset_count = slcan_get_sset_count,
+       .get_ts_info = ethtool_op_get_ts_info,
 };
index 8cca6f07e7c32a16e1d92d19f2c075c3de7f4fc2..a5ef57f415f732320f93256c1383b57ec67a2f6f 100644 (file)
@@ -5,6 +5,7 @@
  * - Kurt Van Dijck, EIA Electronics
  */
 
+#include <linux/ethtool.h>
 #include <linux/module.h>
 #include <linux/interrupt.h>
 #include <asm/io.h>
@@ -611,6 +612,10 @@ static const struct net_device_ops softing_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops softing_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct can_bittiming_const softing_btr_const = {
        .name = KBUILD_MODNAME,
        .tseg1_min = 1,
@@ -649,6 +654,7 @@ static struct net_device *softing_netdev_create(struct softing *card,
 
        netdev->flags |= IFF_ECHO;
        netdev->netdev_ops = &softing_netdev_ops;
+       netdev->ethtool_ops = &softing_ethtool_ops;
        priv->can.do_set_mode = softing_candev_set_mode;
        priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
 
index 167114aae6dd1f60aa13ee8da3e9fb4375ecdc99..b87dc420428d99b51189412d6613d1d67388e861 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/device.h>
+#include <linux/ethtool.h>
 #include <linux/freezer.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -802,6 +803,10 @@ static const struct net_device_ops hi3110_netdev_ops = {
        .ndo_start_xmit = hi3110_hard_start_xmit,
 };
 
+static const struct ethtool_ops hi3110_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct of_device_id hi3110_of_match[] = {
        {
                .compatible     = "holt,hi3110",
@@ -856,6 +861,7 @@ static int hi3110_can_probe(struct spi_device *spi)
                goto out_free;
 
        net->netdev_ops = &hi3110_netdev_ops;
+       net->ethtool_ops = &hi3110_ethtool_ops;
        net->flags |= IFF_ECHO;
 
        priv = netdev_priv(net);
index 666a4505a55a9ccd5fe98ac4954e8bcbfcc496f8..e750d13c884178d31b2edbd797bea08b0baeabd7 100644 (file)
@@ -26,6 +26,7 @@
 #include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/device.h>
+#include <linux/ethtool.h>
 #include <linux/freezer.h>
 #include <linux/gpio.h>
 #include <linux/gpio/driver.h>
@@ -1248,6 +1249,10 @@ static const struct net_device_ops mcp251x_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops mcp251x_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct of_device_id mcp251x_of_match[] = {
        {
                .compatible     = "microchip,mcp2510",
@@ -1313,6 +1318,7 @@ static int mcp251x_can_probe(struct spi_device *spi)
                goto out_free;
 
        net->netdev_ops = &mcp251x_netdev_ops;
+       net->ethtool_ops = &mcp251x_ethtool_ops;
        net->flags |= IFF_ECHO;
 
        priv = netdev_priv(net);
index b90dfb429ccdc33e617caae5df8c1de346f7a1a3..525309da1320a6bd98876d827f90b177efe88968 100644 (file)
@@ -53,6 +53,7 @@
 #include <linux/can/error.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
+#include <linux/ethtool.h>
 #include <linux/interrupt.h>
 #include <linux/init.h>
 #include <linux/io.h>
@@ -761,6 +762,10 @@ static const struct net_device_ops sun4ican_netdev_ops = {
        .ndo_start_xmit = sun4ican_start_xmit,
 };
 
+static const struct ethtool_ops sun4ican_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct sun4ican_quirks sun4ican_quirks_a10 = {
        .has_reset = false,
 };
@@ -851,6 +856,7 @@ static int sun4ican_probe(struct platform_device *pdev)
        }
 
        dev->netdev_ops = &sun4ican_netdev_ops;
+       dev->ethtool_ops = &sun4ican_ethtool_ops;
        dev->irq = irq;
        dev->flags |= IFF_ECHO;
 
index afa38771520ebcc95c6e0a3565dff46cfa6e6062..ec0ffeeb2015ad0e50692bdc64b3e85c17ae0f3c 100644 (file)
@@ -23,6 +23,7 @@
 #include <linux/types.h>
 #include <linux/interrupt.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/netdevice.h>
 #include <linux/skbuff.h>
 #include <linux/platform_device.h>
@@ -841,6 +842,10 @@ static const struct net_device_ops ti_hecc_netdev_ops = {
        .ndo_change_mtu         = can_change_mtu,
 };
 
+static const struct ethtool_ops ti_hecc_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct of_device_id ti_hecc_dt_ids[] = {
        {
                .compatible = "ti,am3517-hecc",
@@ -918,6 +923,7 @@ static int ti_hecc_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
        ndev->netdev_ops = &ti_hecc_netdev_ops;
+       ndev->ethtool_ops = &ti_hecc_ethtool_ops;
 
        priv->clk = clk_get(&pdev->dev, "hecc_ck");
        if (IS_ERR(priv->clk)) {
index e86a2033db600cf1d62586801bce65310e86ae66..d1e1a459c0456bd8524647a6f5d5290de9383428 100644 (file)
@@ -4,6 +4,7 @@
  *
  * Copyright (C) 2004-2009 EMS Dr. Thomas Wuensche
  */
+#include <linux/ethtool.h>
 #include <linux/signal.h>
 #include <linux/slab.h>
 #include <linux/module.h>
@@ -879,6 +880,10 @@ static const struct net_device_ops ems_usb_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops ems_usb_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct can_bittiming_const ems_usb_bittiming_const = {
        .name = KBUILD_MODNAME,
        .tseg1_min = 1,
@@ -990,6 +995,7 @@ static int ems_usb_probe(struct usb_interface *intf,
        dev->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES;
 
        netdev->netdev_ops = &ems_usb_netdev_ops;
+       netdev->ethtool_ops = &ems_usb_ethtool_ops;
 
        netdev->flags |= IFF_ECHO; /* we support local echo */
 
index 7b849bd3cc9cdbc2c3dc4767667af8c2a4ff870d..1bcfad11b1e4448e75d56c26eeec5114b48ecc08 100644 (file)
@@ -5,6 +5,7 @@
  * Copyright (C) 2010-2012 esd electronic system design gmbh, Matthias Fuchs <socketcan@esd.eu>
  * Copyright (C) 2022 esd electronics gmbh, Frank Jungclaus <frank.jungclaus@esd.eu>
  */
+#include <linux/ethtool.h>
 #include <linux/signal.h>
 #include <linux/slab.h>
 #include <linux/module.h>
@@ -882,6 +883,10 @@ static const struct net_device_ops esd_usb_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops esd_usb_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct can_bittiming_const esd_usb2_bittiming_const = {
        .name = "esd_usb2",
        .tseg1_min = ESD_USB2_TSEG1_MIN,
@@ -1015,6 +1020,7 @@ static int esd_usb_probe_one_net(struct usb_interface *intf, int index)
        netdev->flags |= IFF_ECHO; /* we support local echo */
 
        netdev->netdev_ops = &esd_usb_netdev_ops;
+       netdev->ethtool_ops = &esd_usb_ethtool_ops;
 
        SET_NETDEV_DEV(netdev, &intf->dev);
        netdev->dev_id = index;
index fd239b523c4248db7bbb4148bbf891ee0b7f8f3f..baf749c8cda3f5fb68be38625aa75b0d02fb6b81 100644 (file)
@@ -946,6 +946,7 @@ static int gs_usb_set_phys_id(struct net_device *dev,
 
 static const struct ethtool_ops gs_usb_ethtool_ops = {
        .set_phys_id = gs_usb_set_phys_id,
+       .get_ts_info = ethtool_op_get_ts_info,
 };
 
 static struct gs_can *gs_make_candev(unsigned int channel,
@@ -989,6 +990,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,
        dev = netdev_priv(netdev);
 
        netdev->netdev_ops = &gs_usb_netdev_ops;
+       netdev->ethtool_ops = &gs_usb_ethtool_ops;
 
        netdev->flags |= IFF_ECHO; /* we support full roundtrip echo */
 
index 792ab9da317d495b812706404d3a0d49f6248e69..69346c63021fee69a6bd9256d022ba9feb0cd56b 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/can.h>
 #include <linux/can/dev.h>
 #include <linux/can/error.h>
+#include <linux/ethtool.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
 #include <linux/signal.h>
@@ -758,6 +759,10 @@ static const struct net_device_ops mcba_netdev_ops = {
        .ndo_start_xmit = mcba_usb_start_xmit,
 };
 
+static const struct ethtool_ops mcba_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 /* Microchip CANBUS has hardcoded bittiming values by default.
  * This function sends request via USB to change the speed and align bittiming
  * values for presentation purposes only
@@ -836,6 +841,7 @@ static int mcba_usb_probe(struct usb_interface *intf,
        priv->can.do_set_bittiming = mcba_net_set_bittiming;
 
        netdev->netdev_ops = &mcba_netdev_ops;
+       netdev->ethtool_ops = &mcba_ethtool_ops;
 
        netdev->flags |= IFF_ECHO; /* we support local echo */
 
index 5ae0d7c017cc437dc892daa02569555546c5c8f2..7c35f50fda4eea3ddc3db4afef9019967e2bd225 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/can.h>
 #include <linux/can/dev.h>
 #include <linux/can/error.h>
+#include <linux/ethtool.h>
 #include <linux/module.h>
 #include <linux/netdevice.h>
 #include <linux/signal.h>
@@ -1233,6 +1234,10 @@ static const struct net_device_ops ucan_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops ucan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 /* Request to set bittiming
  *
  * This function generates an USB set bittiming message and transmits
@@ -1512,6 +1517,7 @@ static int ucan_probe(struct usb_interface *intf,
        spin_lock_init(&up->context_lock);
        spin_lock_init(&up->echo_skb_lock);
        netdev->netdev_ops = &ucan_netdev_ops;
+       netdev->ethtool_ops = &ucan_ethtool_ops;
 
        usb_set_intfdata(intf, up);
        SET_NETDEV_DEV(netdev, &intf->dev);
index 6665a66745a718c8e5dbdf82c8724b9ce8cfa23b..64c00abe91cf01d5e446a06251f0ebaffe171516 100644 (file)
@@ -12,6 +12,7 @@
  * who were very cooperative and answered my questions.
  */
 
+#include <linux/ethtool.h>
 #include <linux/signal.h>
 #include <linux/slab.h>
 #include <linux/module.h>
@@ -870,6 +871,10 @@ static const struct net_device_ops usb_8dev_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops usb_8dev_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static const struct can_bittiming_const usb_8dev_bittiming_const = {
        .name = KBUILD_MODNAME,
        .tseg1_min = 1,
@@ -927,6 +932,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
                                      CAN_CTRLMODE_CC_LEN8_DLC;
 
        netdev->netdev_ops = &usb_8dev_netdev_ops;
+       netdev->ethtool_ops = &usb_8dev_ethtool_ops;
 
        netdev->flags |= IFF_ECHO; /* we support local echo */
 
index 4a363cfcf97cc83e867c679e655d41e6b3b1641e..36b6310a2e5b02e3c997f87e1b23180c288e2d9b 100644 (file)
@@ -40,6 +40,7 @@
 
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
+#include <linux/ethtool.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
@@ -148,6 +149,10 @@ static const struct net_device_ops vcan_netdev_ops = {
        .ndo_change_mtu = vcan_change_mtu,
 };
 
+static const struct ethtool_ops vcan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static void vcan_setup(struct net_device *dev)
 {
        dev->type               = ARPHRD_CAN;
@@ -163,6 +168,7 @@ static void vcan_setup(struct net_device *dev)
                dev->flags |= IFF_ECHO;
 
        dev->netdev_ops         = &vcan_netdev_ops;
+       dev->ethtool_ops        = &vcan_ethtool_ops;
        dev->needs_free_netdev  = true;
 }
 
index 61b6eca383f8d7d844bd2ef760fa829647491a3c..cffd107d8b28293768588e02e9fbbb79c43f28dc 100644 (file)
@@ -9,6 +9,7 @@
  * Copyright (c) 2017 Oliver Hartkopp <socketcan@hartkopp.net>
  */
 
+#include <linux/ethtool.h>
 #include <linux/module.h>
 #include <linux/init.h>
 #include <linux/netdevice.h>
@@ -146,6 +147,10 @@ static const struct net_device_ops vxcan_netdev_ops = {
        .ndo_change_mtu = vxcan_change_mtu,
 };
 
+static const struct ethtool_ops vxcan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 static void vxcan_setup(struct net_device *dev)
 {
        struct can_ml_priv *can_ml;
@@ -157,6 +162,7 @@ static void vxcan_setup(struct net_device *dev)
        dev->tx_queue_len       = 0;
        dev->flags              = IFF_NOARP;
        dev->netdev_ops         = &vxcan_netdev_ops;
+       dev->ethtool_ops        = &vxcan_ethtool_ops;
        dev->needs_free_netdev  = true;
 
        can_ml = netdev_priv(dev) + ALIGN(sizeof(struct vxcan_priv), NETDEV_ALIGN);
index caa6b4cee63f2ec09b10e3e1b89017f43cfbb016..5d3172795ad01d4402a5d0164c74596af1f208f8 100644 (file)
@@ -12,6 +12,7 @@
 #include <linux/bitfield.h>
 #include <linux/clk.h>
 #include <linux/errno.h>
+#include <linux/ethtool.h>
 #include <linux/init.h>
 #include <linux/interrupt.h>
 #include <linux/io.h>
@@ -1540,6 +1541,10 @@ static const struct net_device_ops xcan_netdev_ops = {
        .ndo_change_mtu = can_change_mtu,
 };
 
+static const struct ethtool_ops xcan_ethtool_ops = {
+       .get_ts_info = ethtool_op_get_ts_info,
+};
+
 /**
  * xcan_suspend - Suspend method for the driver
  * @dev:       Address of the device structure
@@ -1821,6 +1826,7 @@ static int xcan_probe(struct platform_device *pdev)
        platform_set_drvdata(pdev, ndev);
        SET_NETDEV_DEV(ndev, &pdev->dev);
        ndev->netdev_ops = &xcan_netdev_ops;
+       ndev->ethtool_ops = &xcan_ethtool_ops;
 
        /* Getting the CAN can_clk info */
        priv->can_clk = devm_clk_get(&pdev->dev, "can_clk");