can: mcp251xfd: advertise timestamping capabilities and add ioctl support
authorVincent Mailhol <mailhol.vincent@wanadoo.fr>
Wed, 27 Jul 2022 10:16:36 +0000 (19:16 +0900)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Thu, 28 Jul 2022 09:44:30 +0000 (11:44 +0200)
Currently, userland has no methods to query which timestamping
features are supported by the mcp251xfd driver (aside maybe of getting
RX messages and observe whether or not hardware timestamps stay at
zero).

The canonical way for a network driver to advertise what kind of
timestamping it supports is to implement
ethtool_ops::get_ts_info(). Here, we use the CAN specific
can_ethtool_op_get_ts_info_hwts() function to achieve this.

In addition, the driver currently does not support the hardware
timestamps ioctls. According to [1], SIOCSHWTSTAMP is "must" and
SIOCGHWTSTAMP is "should". This patch fills up that gap by
implementing net_device_ops::ndo_eth_ioctl() using the CAN specific
function can_eth_ioctl_hwts().

[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
Signed-off-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
Link: https://lore.kernel.org/all/20220727101641.198847-10-mailhol.vincent@wanadoo.fr
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c

index 7fc86ed405c6e9f322b7c3adeb27449baee4d9f7..68df6d4641b5cff09061c2af41a39ccccec43a7a 100644 (file)
@@ -1671,6 +1671,7 @@ static const struct net_device_ops mcp251xfd_netdev_ops = {
        .ndo_open = mcp251xfd_open,
        .ndo_stop = mcp251xfd_stop,
        .ndo_start_xmit = mcp251xfd_start_xmit,
+       .ndo_eth_ioctl = can_eth_ioctl_hwts,
        .ndo_change_mtu = can_change_mtu,
 };
 
index 6c7a57f16cc6c1120d762c82853094eb64abb0ec..3585f02575dfbd005d268522dd247f4fbeb180a3 100644 (file)
@@ -124,6 +124,7 @@ static const struct ethtool_ops mcp251xfd_ethtool_ops = {
        .set_ringparam = mcp251xfd_ring_set_ringparam,
        .get_coalesce = mcp251xfd_ring_get_coalesce,
        .set_coalesce = mcp251xfd_ring_set_coalesce,
+       .get_ts_info = can_ethtool_op_get_ts_info_hwts,
 };
 
 void mcp251xfd_ethtool_init(struct mcp251xfd_priv *priv)