diff options
| author | Kory Maincent <kory.maincent@bootlin.com> | 2024-12-12 18:06:43 +0100 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2024-12-16 12:51:40 +0000 |
| commit | 35f7cad1743e04bf2944a2aadb6b6a42adc57bca (patch) | |
| tree | 63ae79d9fb92533e051e790d52083fb0190b08f1 /drivers/net/phy/phy_device.c | |
| parent | b18fe47c0c093cc429f7e4d7694fdf0fc362aaf5 (diff) | |
| download | linux-35f7cad1743e04bf2944a2aadb6b6a42adc57bca.tar.gz linux-35f7cad1743e04bf2944a2aadb6b6a42adc57bca.tar.bz2 linux-35f7cad1743e04bf2944a2aadb6b6a42adc57bca.zip | |
net: Add the possibility to support a selected hwtstamp in netdevice
Introduce the description of a hwtstamp provider, mainly defined with a
the hwtstamp source and the phydev pointer.
Add a hwtstamp provider description within the netdev structure to
allow saving the hwtstamp we want to use. This prepares for future
support of an ethtool netlink command to select the desired hwtstamp
provider. By default, the old API that does not support hwtstamp
selectability is used, meaning the hwtstamp provider pointer is unset.
Signed-off-by: Kory Maincent <kory.maincent@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/phy_device.c')
| -rw-r--r-- | drivers/net/phy/phy_device.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index b26bb33cd1d4..1a908af4175b 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -32,6 +32,7 @@ #include <linux/phy_link_topology.h> #include <linux/pse-pd/pse.h> #include <linux/property.h> +#include <linux/ptp_clock_kernel.h> #include <linux/rtnetlink.h> #include <linux/sfp.h> #include <linux/skbuff.h> @@ -1998,6 +1999,15 @@ void phy_detach(struct phy_device *phydev) phy_suspend(phydev); if (dev) { + struct hwtstamp_provider *hwprov; + + hwprov = rtnl_dereference(dev->hwprov); + /* Disable timestamp if it is the one selected */ + if (hwprov && hwprov->phydev == phydev) { + rcu_assign_pointer(dev->hwprov, NULL); + kfree_rcu(hwprov, rcu_head); + } + phydev->attached_dev->phydev = NULL; phydev->attached_dev = NULL; phy_link_topo_del_phy(dev, phydev); |
