mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-08 15:04:45 +00:00
can: dev: add generic function can_eth_ioctl_hwts()
Tools based on libpcap (such as tcpdump) expect the SIOCSHWTSTAMP ioctl call to be supported. This is also specified in the kernel doc [1]. The purpose of this ioctl is to toggle the hardware timestamps. Currently, CAN devices which support hardware timestamping have those always activated. can_eth_ioctl_hwts() is a dumb function that will always succeed when requested to set tx_type to HWTSTAMP_TX_ON or rx_filter to HWTSTAMP_FILTER_ALL. [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-9-mailhol.vincent@wanadoo.fr Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
This commit is contained in:
parent
7fb48d25b5
commit
90f942c5a6
@ -322,6 +322,35 @@ int can_change_mtu(struct net_device *dev, int new_mtu)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(can_change_mtu);
|
||||
|
||||
/* generic implementation of netdev_ops::ndo_eth_ioctl for CAN devices
|
||||
* supporting hardware timestamps
|
||||
*/
|
||||
int can_eth_ioctl_hwts(struct net_device *netdev, struct ifreq *ifr, int cmd)
|
||||
{
|
||||
struct hwtstamp_config hwts_cfg = { 0 };
|
||||
|
||||
switch (cmd) {
|
||||
case SIOCSHWTSTAMP: /* set */
|
||||
if (copy_from_user(&hwts_cfg, ifr->ifr_data, sizeof(hwts_cfg)))
|
||||
return -EFAULT;
|
||||
if (hwts_cfg.tx_type == HWTSTAMP_TX_ON &&
|
||||
hwts_cfg.rx_filter == HWTSTAMP_FILTER_ALL)
|
||||
return 0;
|
||||
return -ERANGE;
|
||||
|
||||
case SIOCGHWTSTAMP: /* get */
|
||||
hwts_cfg.tx_type = HWTSTAMP_TX_ON;
|
||||
hwts_cfg.rx_filter = HWTSTAMP_FILTER_ALL;
|
||||
if (copy_to_user(ifr->ifr_data, &hwts_cfg, sizeof(hwts_cfg)))
|
||||
return -EFAULT;
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(can_eth_ioctl_hwts);
|
||||
|
||||
/* generic implementation of ethtool_ops::get_ts_info for CAN devices
|
||||
* supporting hardware timestamps
|
||||
*/
|
||||
|
@ -163,6 +163,7 @@ struct can_priv *safe_candev_priv(struct net_device *dev);
|
||||
int open_candev(struct net_device *dev);
|
||||
void close_candev(struct net_device *dev);
|
||||
int can_change_mtu(struct net_device *dev, int new_mtu);
|
||||
int can_eth_ioctl_hwts(struct net_device *netdev, struct ifreq *ifr, int cmd);
|
||||
int can_ethtool_op_get_ts_info_hwts(struct net_device *dev,
|
||||
struct ethtool_ts_info *info);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user