]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: dsa: enable selftest support for all switches by default
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 19 Apr 2021 13:01:06 +0000 (15:01 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 20 Apr 2021 23:08:02 +0000 (16:08 -0700)
Most of generic selftest should be able to work with probably all ethernet
controllers. The DSA switches are not exception, so enable it by default at
least for DSA.

This patch was tested with SJA1105 and AR9331.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/dsa.h
net/dsa/Kconfig
net/dsa/slave.c

index 1259b0f406841399ce6616021a397f05597b8de9..b52e9b057be407478c95823562548b9deef0d60b 100644 (file)
@@ -577,6 +577,8 @@ struct dsa_switch_ops {
                                         int port, uint64_t *data);
        void    (*get_stats64)(struct dsa_switch *ds, int port,
                                   struct rtnl_link_stats64 *s);
+       void    (*self_test)(struct dsa_switch *ds, int port,
+                            struct ethtool_test *etest, u64 *data);
 
        /*
         * ethtool Wake-on-LAN
index 8746b07668ae2df821ad73448d2de1a8982a1c42..cbc2bd643ab24bd3abd08eb0f1d98adc7bb7caea 100644 (file)
@@ -9,6 +9,7 @@ menuconfig NET_DSA
        select NET_SWITCHDEV
        select PHYLINK
        select NET_DEVLINK
+       select NET_SELFTESTS
        help
          Say Y if you want to enable support for the hardware switches supported
          by the Distributed Switch Architecture.
index 3ae67202fda2ff45a069d0255d321f98072936bb..77b33bd161b845f9c25c974ad7412c86f4fb13e6 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/mdio.h>
 #include <net/rtnetlink.h>
 #include <net/pkt_cls.h>
+#include <net/selftests.h>
 #include <net/tc_act/tc_mirred.h>
 #include <linux/if_bridge.h>
 #include <linux/if_hsr.h>
@@ -748,7 +749,10 @@ static void dsa_slave_get_strings(struct net_device *dev,
                if (ds->ops->get_strings)
                        ds->ops->get_strings(ds, dp->index, stringset,
                                             data + 4 * len);
+       } else if (stringset ==  ETH_SS_TEST) {
+               net_selftest_get_strings(data);
        }
+
 }
 
 static void dsa_slave_get_ethtool_stats(struct net_device *dev,
@@ -794,11 +798,27 @@ static int dsa_slave_get_sset_count(struct net_device *dev, int sset)
                        count += ds->ops->get_sset_count(ds, dp->index, sset);
 
                return count;
+       } else if (sset ==  ETH_SS_TEST) {
+               return net_selftest_get_count();
        }
 
        return -EOPNOTSUPP;
 }
 
+static void dsa_slave_net_selftest(struct net_device *ndev,
+                                  struct ethtool_test *etest, u64 *buf)
+{
+       struct dsa_port *dp = dsa_slave_to_port(ndev);
+       struct dsa_switch *ds = dp->ds;
+
+       if (ds->ops->self_test) {
+               ds->ops->self_test(ds, dp->index, etest, buf);
+               return;
+       }
+
+       net_selftest(ndev, etest, buf);
+}
+
 static void dsa_slave_get_wol(struct net_device *dev, struct ethtool_wolinfo *w)
 {
        struct dsa_port *dp = dsa_slave_to_port(dev);
@@ -1630,6 +1650,7 @@ static const struct ethtool_ops dsa_slave_ethtool_ops = {
        .get_rxnfc              = dsa_slave_get_rxnfc,
        .set_rxnfc              = dsa_slave_set_rxnfc,
        .get_ts_info            = dsa_slave_get_ts_info,
+       .self_test              = dsa_slave_net_selftest,
 };
 
 /* legacy way, bypassing the bridge *****************************************/