net: ethtool: create and export ethtool_dev_mm_supported()
authorVladimir Oltean <vladimir.oltean@nxp.com>
Tue, 11 Apr 2023 18:01:49 +0000 (21:01 +0300)
committerJakub Kicinski <kuba@kernel.org>
Fri, 14 Apr 2023 05:22:10 +0000 (22:22 -0700)
Create a wrapper over __ethtool_dev_mm_supported() which also calls
ethnl_ops_begin() and ethnl_ops_complete(). It can be used by other code
layers, such as tc, to make sure that preemptible TCs are supported
(this is true if an underlying MAC Merge layer exists).

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Reviewed-by: Ferenc Fejes <fejes@inf.elte.hu>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
include/linux/ethtool_netlink.h
net/ethtool/mm.c

index 17003b3..fae0dfb 100644 (file)
@@ -39,6 +39,7 @@ void ethtool_aggregate_pause_stats(struct net_device *dev,
                                   struct ethtool_pause_stats *pause_stats);
 void ethtool_aggregate_rmon_stats(struct net_device *dev,
                                  struct ethtool_rmon_stats *rmon_stats);
+bool ethtool_dev_mm_supported(struct net_device *dev);
 
 #else
 static inline int ethnl_cable_test_alloc(struct phy_device *phydev, u8 cmd)
@@ -112,5 +113,10 @@ ethtool_aggregate_rmon_stats(struct net_device *dev,
 {
 }
 
+static inline bool ethtool_dev_mm_supported(struct net_device *dev)
+{
+       return false;
+}
+
 #endif /* IS_ENABLED(CONFIG_ETHTOOL_NETLINK) */
 #endif /* _LINUX_ETHTOOL_NETLINK_H_ */
index fce3cc2..e00d7d5 100644 (file)
@@ -249,3 +249,26 @@ bool __ethtool_dev_mm_supported(struct net_device *dev)
 
        return !ret;
 }
+
+bool ethtool_dev_mm_supported(struct net_device *dev)
+{
+       const struct ethtool_ops *ops = dev->ethtool_ops;
+       bool supported;
+       int ret;
+
+       ASSERT_RTNL();
+
+       if (!ops)
+               return false;
+
+       ret = ethnl_ops_begin(dev);
+       if (ret < 0)
+               return false;
+
+       supported = __ethtool_dev_mm_supported(dev);
+
+       ethnl_ops_complete(dev);
+
+       return supported;
+}
+EXPORT_SYMBOL_GPL(ethtool_dev_mm_supported);