This series revolves around ethtool and timestamping. Its ultimate goal is that the timestamping implementation within socketCAN meets the specification of other network drivers in the kernel. This way, tcpdump or other tools derived from libpcap can be used to do timestamping on CAN devices. *Example on a device with hardware timestamp support * Before this series: | # tcpdump -j adapter_unsynced -i can0 | tcpdump: WARNING: When trying to set timestamp type | 'adapter_unsynced' on can0: That type of time stamp is not supported | by that device After applying this series, the warning disappears and tcpdump can be used to get RX hardware timestamps. This series is articulated in five major parts. * Part 1: Report driver information through ethtool This first part implements ethtool_ops::get_drvinfo() for all drivers. The actual change is made in the 10th patch. The patches 1 to 8 get rid of any hardcoded string and instead relies on either KBUILD_MODNAME or DRV_NAME macros to get the device name. Patch 9 removes the DRV_VERSION macro so that ethtool can instead rely on the kernel version. * Part 2: Add TX software timestamps and report the software timestamping capabilities through ethtool. All the drivers using can_put_echo_skb() already support TX software timestamps. However, the five drivers not using this function (namely can327, janz-ican3, slcan, vcan and vxcan) lack such support. Patch 11 to 14 adds this support. Finally, patch 15 advertises the timesamping capabilities of all drivers not support hardware timestamps. * Part 3: add TX hardware timestapms This part is a single patch. In SocetCAN TX hardware is equal to the RX hardware timestamps of the corresponding loopback frame. Reuse the TX hardware timestamp to populate the RX hardware timestamp. While the need of this feature can be debatable, we implement it here so that generic timestamping tools which are agnostic of the specificity of SocketCAN can still obtain the value. For example, tcpdump expects for both TX and RX hardware timestamps to be supported in order to do: | # tcpdump -j adapter_unsynced -i canX * Part 4: report the hardware timestamping capabilities and implement the hardware timestamps ioctls. The kernel documentation specifies in [1] that, for the drivers which support hardware timestamping, SIOCSHWTSTAMP ioctl must be supported and that SIOCGHWTSTAMP ioctl should be supported. Currently, none of the CAN drivers do so. This is a gap. Furthermore, even if not specified, the tools based on libpcap (e.g. tcpdump) also expect ethtool_ops::get_ts_info to be implemented. This last part first adds some generic implementation of net_device_ops::ndo_eth_ioctl and ethtool_ops::get_ts_info which can be used by the drivers with hardware timestamping capabilities. It then uses those generic functions to add ioctl and reporting functionalities to the drivers with hardware timestamping support (namely: mcp251xfd, etas_es58x, kvaser_{pciefd,usb}, peak_{canfd,usb}) [1] Kernel doc: Timestamping, section 3.1 "Hardware Timestamping Implementation: Device Drivers" Link: https://docs.kernel.org/networking/timestamping.html#hardware-timestamping-implementation-device-drivers Vincent Mailhol (24): can: can327: use KBUILD_MODNAME instead of hard coded name can: ems_ubs: use KBUILD_MODNAME instead of hard coded name can: slcan: add DRV_NAME and define pr_fmt to replace hardcoded names can: softing: add DRV_NAME to replace hardcoded names can: esd_usb: use KBUILD_MODNAME instead of hard coded name can: gs_ubs: use KBUILD_MODNAME instead of hard coded name can: softing: add DRV_NAME to replace hardcoded names can: ubs_8dev: use KBUILD_MODNAME instead of hard coded name can: etas_es58x: remove DRV_VERSION can: tree-wide: implement ethtool_ops::get_drvinfo() can: can327: add software tx timestamps can: janz-ican3: add software tx timestamp can: slcan: add software tx timestamps can: v(x)can: add software tx timestamps can: tree-wide: advertise software timestamping capabilities can: dev: add hardware TX timestamp can: dev: add generic function can_ethtool_op_get_ts_info_hwts() can: dev: add generic function can_eth_ioctl_hwts() can: mcp251xfd: advertise timestamping capabilities and add ioctl support can: etas_es58x: advertise timestamping capabilities and add ioctl support can: kvaser_pciefd: advertise timestamping capabilities and add ioctl support can: kvaser_usb: advertise timestamping capabilities and add ioctl support can: peak_canfd: advertise timestamping capabilities and add ioctl support can: peak_usb: advertise timestamping capabilities and add ioctl support drivers/net/can/at91_can.c | 13 +++++ drivers/net/can/c_can/c_can_main.c | 13 +++++ drivers/net/can/can327.c | 18 ++++++- drivers/net/can/cc770/cc770.c | 13 +++++ drivers/net/can/ctucanfd/ctucanfd_base.c | 13 +++++ drivers/net/can/dev/dev.c | 50 +++++++++++++++++++ drivers/net/can/dev/skb.c | 6 +++ drivers/net/can/flexcan/flexcan-core.c | 13 +++++ drivers/net/can/grcan.c | 13 +++++ drivers/net/can/ifi_canfd/ifi_canfd.c | 13 +++++ drivers/net/can/janz-ican3.c | 15 ++++++ drivers/net/can/kvaser_pciefd.c | 14 ++++++ drivers/net/can/m_can/m_can.c | 13 +++++ drivers/net/can/mscan/mscan.c | 1 + drivers/net/can/pch_can.c | 13 +++++ drivers/net/can/peak_canfd/peak_canfd.c | 14 ++++++ drivers/net/can/rcar/rcar_can.c | 13 +++++ drivers/net/can/rcar/rcar_canfd.c | 13 +++++ drivers/net/can/sja1000/sja1000.c | 13 +++++ drivers/net/can/slcan/slcan-core.c | 30 ++++++++--- drivers/net/can/softing/softing_main.c | 18 ++++++- drivers/net/can/spi/hi311x.c | 13 +++++ drivers/net/can/spi/mcp251x.c | 13 +++++ .../net/can/spi/mcp251xfd/mcp251xfd-core.c | 14 ++++++ drivers/net/can/sun4i_can.c | 13 +++++ drivers/net/can/ti_hecc.c | 13 +++++ drivers/net/can/usb/ems_usb.c | 17 ++++++- drivers/net/can/usb/esd_usb.c | 15 +++++- drivers/net/can/usb/etas_es58x/es58x_core.c | 23 ++++++--- drivers/net/can/usb/gs_usb.c | 15 ++++-- drivers/net/can/usb/kvaser_usb/kvaser_usb.h | 1 + .../net/can/usb/kvaser_usb/kvaser_usb_core.c | 39 +++++++++++++-- drivers/net/can/usb/mcba_usb.c | 13 +++++ drivers/net/can/usb/peak_usb/pcan_usb.c | 3 ++ drivers/net/can/usb/peak_usb/pcan_usb_core.c | 18 ++++++- drivers/net/can/usb/peak_usb/pcan_usb_core.h | 6 +++ drivers/net/can/usb/peak_usb/pcan_usb_fd.c | 3 ++ drivers/net/can/usb/peak_usb/pcan_usb_pro.c | 3 ++ drivers/net/can/usb/ucan.c | 13 +++++ drivers/net/can/usb/usb_8dev.c | 17 ++++++- drivers/net/can/vcan.c | 15 ++++++ drivers/net/can/vxcan.c | 15 ++++++ drivers/net/can/xilinx_can.c | 13 +++++ include/linux/can/dev.h | 4 ++ 44 files changed, 592 insertions(+), 29 deletions(-) -- 2.35.1