]> git.itanic.dy.fi Git - linux-stable/commitdiff
net: netdevsim: use mock PHC driver
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 7 Aug 2023 19:33:20 +0000 (22:33 +0300)
committerJakub Kicinski <kuba@kernel.org>
Wed, 9 Aug 2023 22:59:21 +0000 (15:59 -0700)
I'd like to make netdevsim offload tc-taprio, but currently, this Qdisc
emits a ETHTOOL_GET_TS_INFO call to the driver to make sure that it has
a PTP clock, so that it is reasonably capable of offloading the schedule.

By using the mock PHC driver, that becomes possible.

Hardware timestamping is not necessary, and netdevsim does not support
packet I/O anyway.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Link: https://lore.kernel.org/r/20230807193324.4128292-8-vladimir.oltean@nxp.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/Kconfig
drivers/net/netdevsim/ethtool.c
drivers/net/netdevsim/netdev.c
drivers/net/netdevsim/netdevsim.h

index 368c6f5b327e8a645ef1e440989b6ad172e88e9b..4953c14947234c47b1c6855b97ddbf00c3c0b27a 100644 (file)
@@ -592,6 +592,7 @@ config NETDEVSIM
        depends on INET
        depends on IPV6 || IPV6=n
        depends on PSAMPLE || PSAMPLE=n
+       depends on PTP_1588_CLOCK_MOCK || PTP_1588_CLOCK_MOCK=n
        select NET_DEVLINK
        help
          This driver is a developer testing tool and software model that can
index ffd9f84b6644359b77cc8f862e83a634916bcb0c..bd546d4d26c68135a917b144196f8b8a8098dc8e 100644 (file)
@@ -140,6 +140,16 @@ nsim_set_fecparam(struct net_device *dev, struct ethtool_fecparam *fecparam)
        return 0;
 }
 
+static int nsim_get_ts_info(struct net_device *dev,
+                           struct ethtool_ts_info *info)
+{
+       struct netdevsim *ns = netdev_priv(dev);
+
+       info->phc_index = mock_phc_index(ns->phc);
+
+       return 0;
+}
+
 static const struct ethtool_ops nsim_ethtool_ops = {
        .supported_coalesce_params      = ETHTOOL_COALESCE_ALL_PARAMS,
        .get_pause_stats                = nsim_get_pause_stats,
@@ -153,6 +163,7 @@ static const struct ethtool_ops nsim_ethtool_ops = {
        .set_channels                   = nsim_set_channels,
        .get_fecparam                   = nsim_get_fecparam,
        .set_fecparam                   = nsim_set_fecparam,
+       .get_ts_info                    = nsim_get_ts_info,
 };
 
 static void nsim_ethtool_ring_init(struct netdevsim *ns)
index 0c8daeb0d62b9bc1fedfa05e759e379a44866a44..2a4a0c4065cf41c9b15376380a30efadc0bc11d0 100644 (file)
@@ -291,13 +291,19 @@ static void nsim_setup(struct net_device *dev)
 
 static int nsim_init_netdevsim(struct netdevsim *ns)
 {
+       struct mock_phc *phc;
        int err;
 
+       phc = mock_phc_create(&ns->nsim_bus_dev->dev);
+       if (IS_ERR(phc))
+               return PTR_ERR(phc);
+
+       ns->phc = phc;
        ns->netdev->netdev_ops = &nsim_netdev_ops;
 
        err = nsim_udp_tunnels_info_create(ns->nsim_dev, ns->netdev);
        if (err)
-               return err;
+               goto err_phc_destroy;
 
        rtnl_lock();
        err = nsim_bpf_init(ns);
@@ -320,6 +326,8 @@ static int nsim_init_netdevsim(struct netdevsim *ns)
 err_utn_destroy:
        rtnl_unlock();
        nsim_udp_tunnels_info_destroy(ns->netdev);
+err_phc_destroy:
+       mock_phc_destroy(ns->phc);
        return err;
 }
 
@@ -383,6 +391,7 @@ void nsim_destroy(struct netdevsim *ns)
        rtnl_unlock();
        if (nsim_dev_port_is_pf(ns->nsim_dev_port))
                nsim_udp_tunnels_info_destroy(dev);
+       mock_phc_destroy(ns->phc);
        free_netdev(dev);
 }
 
index 7be98b7dcca96201fa6458709d3ea6f6d5f0e2cc..028c825b86db1edc5a1f2b8f3b8dc0d58beb096a 100644 (file)
@@ -19,6 +19,7 @@
 #include <linux/kernel.h>
 #include <linux/list.h>
 #include <linux/netdevice.h>
+#include <linux/ptp_mock.h>
 #include <linux/u64_stats_sync.h>
 #include <net/devlink.h>
 #include <net/udp_tunnel.h>
@@ -93,6 +94,7 @@ struct netdevsim {
        struct net_device *netdev;
        struct nsim_dev *nsim_dev;
        struct nsim_dev_port *nsim_dev_port;
+       struct mock_phc *phc;
 
        u64 tx_packets;
        u64 tx_bytes;