Commit 4895d780 authored by Florian Fainelli's avatar Florian Fainelli Committed by David S. Miller

net: ethtool: Introduce ethtool_phy_ops

In order to decouple ethtool from its PHY library dependency, define an
ethtool_phy_ops singleton which can be overriden by the PHY library when
it loads with an appropriate set of function pointers.
Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1a4d6816
...@@ -502,5 +502,30 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev, ...@@ -502,5 +502,30 @@ int ethtool_virtdev_set_link_ksettings(struct net_device *dev,
const struct ethtool_link_ksettings *cmd, const struct ethtool_link_ksettings *cmd,
u32 *dev_speed, u8 *dev_duplex); u32 *dev_speed, u8 *dev_duplex);
struct netlink_ext_ack;
struct phy_device;
struct phy_tdr_config;
/**
* struct ethtool_phy_ops - Optional PHY device options
* @start_cable_test - Start a cable test
* @start_cable_test_tdr - Start a Time Domain Reflectometry cable test
*
* All operations are optional (i.e. the function pointer may be set to %NULL)
* and callers must take this into account. Callers must hold the RTNL lock.
*/
struct ethtool_phy_ops {
int (*start_cable_test)(struct phy_device *phydev,
struct netlink_ext_ack *extack);
int (*start_cable_test_tdr)(struct phy_device *phydev,
struct netlink_ext_ack *extack,
const struct phy_tdr_config *config);
};
/**
* ethtool_set_ethtool_phy_ops - Set the ethtool_phy_ops singleton
* @ops: Ethtool PHY operations to set
*/
void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops);
#endif /* _LINUX_ETHTOOL_H */ #endif /* _LINUX_ETHTOOL_H */
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
#include <linux/net_tstamp.h> #include <linux/net_tstamp.h>
#include <linux/phy.h> #include <linux/phy.h>
#include <linux/rtnetlink.h>
#include "common.h" #include "common.h"
...@@ -373,3 +374,13 @@ int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) ...@@ -373,3 +374,13 @@ int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
return 0; return 0;
} }
const struct ethtool_phy_ops *ethtool_phy_ops;
void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)
{
rtnl_lock();
ethtool_phy_ops = ops;
rtnl_unlock();
}
EXPORT_SYMBOL_GPL(ethtool_set_ethtool_phy_ops);
...@@ -37,4 +37,6 @@ bool convert_legacy_settings_to_link_ksettings( ...@@ -37,4 +37,6 @@ bool convert_legacy_settings_to_link_ksettings(
int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max); int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max);
int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info); int __ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info);
extern const struct ethtool_phy_ops *ethtool_phy_ops;
#endif /* _ETHTOOL_COMMON_H */ #endif /* _ETHTOOL_COMMON_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment