Message ID | 20230406173308.401924-2-kory.maincent@bootlin.com (mailing list archive) |
---|---|
State | RFC |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | net: Make MAC/PHY time stamping selectable | expand |
On Thu, Apr 06, 2023 at 07:33:04PM +0200, Köry Maincent wrote: > From: Richard Cochran <richardcochran@gmail.com> > > The vlan, macvlan and the bonding drivers call their "real" device driver > in order to report the time stamping capabilities. Provide a core > ethtool helper function to avoid copy/paste in the stack. > > Signed-off-by: Richard Cochran <richardcochran@gmail.com> > Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> > --- > static netdev_features_t macvlan_fix_features(struct net_device *dev, > diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h > index 798d35890118..a21302032dfa 100644 > --- a/include/linux/ethtool.h > +++ b/include/linux/ethtool.h > @@ -1042,6 +1042,14 @@ static inline int ethtool_mm_frag_size_min_to_add(u32 val_min, u32 *val_add, > return -EINVAL; > } > > +/** > + * ethtool_get_ts_info_by_layer - Obtains time stamping capabilities from the MAC or PHY layer. > + * @dev: pointer to net_device structure > + * @info: buffer to hold the result > + * Returns zero on sauces, non-zero otherwise. Not sure if I'm missing some joke with the sauces here. > + */ > +int ethtool_get_ts_info_by_layer(struct net_device *dev, struct ethtool_ts_info *info); > + > /** > * ethtool_sprintf - Write formatted string to ethtool string data > * @data: Pointer to start of string to update
On Wed, 12 Apr 2023 16:16:36 +0300 Vladimir Oltean <vladimir.oltean@nxp.com> wrote: > On Thu, Apr 06, 2023 at 07:33:04PM +0200, Köry Maincent wrote: > > From: Richard Cochran <richardcochran@gmail.com> > > > > The vlan, macvlan and the bonding drivers call their "real" device driver > > in order to report the time stamping capabilities. Provide a core > > ethtool helper function to avoid copy/paste in the stack. > > > > Signed-off-by: Richard Cochran <richardcochran@gmail.com> > > Signed-off-by: Kory Maincent <kory.maincent@bootlin.com> > > --- > > static netdev_features_t macvlan_fix_features(struct net_device *dev, > > diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h > > index 798d35890118..a21302032dfa 100644 > > --- a/include/linux/ethtool.h > > +++ b/include/linux/ethtool.h > > @@ -1042,6 +1042,14 @@ static inline int > > ethtool_mm_frag_size_min_to_add(u32 val_min, u32 *val_add, return -EINVAL; > > } > > > > +/** > > + * ethtool_get_ts_info_by_layer - Obtains time stamping capabilities from > > the MAC or PHY layer. > > + * @dev: pointer to net_device structure > > + * @info: buffer to hold the result > > + * Returns zero on sauces, non-zero otherwise. > > Not sure if I'm missing some joke with the sauces here. mmh don't know. Richards it comes from your code, any joke here? I think it is merely a brain fart. I will fix it.
On Wed, Apr 12, 2023 at 03:49:58PM +0200, Köry Maincent wrote:
> mmh don't know. Richards it comes from your code, any joke here?
No, just a typo.
Thanks,
Richard
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c index 236e5219c811..322fef637059 100644 --- a/drivers/net/bonding/bond_main.c +++ b/drivers/net/bonding/bond_main.c @@ -5695,9 +5695,7 @@ static int bond_ethtool_get_ts_info(struct net_device *bond_dev, struct ethtool_ts_info *info) { struct bonding *bond = netdev_priv(bond_dev); - const struct ethtool_ops *ops; struct net_device *real_dev; - struct phy_device *phydev; int ret = 0; rcu_read_lock(); @@ -5706,16 +5704,8 @@ static int bond_ethtool_get_ts_info(struct net_device *bond_dev, rcu_read_unlock(); if (real_dev) { - ops = real_dev->ethtool_ops; - phydev = real_dev->phydev; - - if (phy_has_tsinfo(phydev)) { - ret = phy_ts_info(phydev, info); - goto out; - } else if (ops->get_ts_info) { - ret = ops->get_ts_info(real_dev, info); - goto out; - } + ret = ethtool_get_ts_info_by_layer(real_dev, info); + goto out; } info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 4a53debf9d7c..a396a35fec2e 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c @@ -1093,20 +1093,8 @@ static int macvlan_ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) { struct net_device *real_dev = macvlan_dev_real_dev(dev); - const struct ethtool_ops *ops = real_dev->ethtool_ops; - struct phy_device *phydev = real_dev->phydev; - if (phy_has_tsinfo(phydev)) { - return phy_ts_info(phydev, info); - } else if (ops->get_ts_info) { - return ops->get_ts_info(real_dev, info); - } else { - info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | - SOF_TIMESTAMPING_SOFTWARE; - info->phc_index = -1; - } - - return 0; + return ethtool_get_ts_info_by_layer(real_dev, info); } static netdev_features_t macvlan_fix_features(struct net_device *dev, diff --git a/include/linux/ethtool.h b/include/linux/ethtool.h index 798d35890118..a21302032dfa 100644 --- a/include/linux/ethtool.h +++ b/include/linux/ethtool.h @@ -1042,6 +1042,14 @@ static inline int ethtool_mm_frag_size_min_to_add(u32 val_min, u32 *val_add, return -EINVAL; } +/** + * ethtool_get_ts_info_by_layer - Obtains time stamping capabilities from the MAC or PHY layer. + * @dev: pointer to net_device structure + * @info: buffer to hold the result + * Returns zero on sauces, non-zero otherwise. + */ +int ethtool_get_ts_info_by_layer(struct net_device *dev, struct ethtool_ts_info *info); + /** * ethtool_sprintf - Write formatted string to ethtool string data * @data: Pointer to start of string to update diff --git a/net/8021q/vlan_dev.c b/net/8021q/vlan_dev.c index 5920544e93e8..7c33c7216f35 100644 --- a/net/8021q/vlan_dev.c +++ b/net/8021q/vlan_dev.c @@ -683,20 +683,7 @@ static int vlan_ethtool_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info) { const struct vlan_dev_priv *vlan = vlan_dev_priv(dev); - const struct ethtool_ops *ops = vlan->real_dev->ethtool_ops; - struct phy_device *phydev = vlan->real_dev->phydev; - - if (phy_has_tsinfo(phydev)) { - return phy_ts_info(phydev, info); - } else if (ops->get_ts_info) { - return ops->get_ts_info(vlan->real_dev, info); - } else { - info->so_timestamping = SOF_TIMESTAMPING_RX_SOFTWARE | - SOF_TIMESTAMPING_SOFTWARE; - info->phc_index = -1; - } - - return 0; + return ethtool_get_ts_info_by_layer(vlan->real_dev, info); } static void vlan_dev_get_stats64(struct net_device *dev, diff --git a/net/ethtool/common.c b/net/ethtool/common.c index 5fb19050991e..695c7c4a816b 100644 --- a/net/ethtool/common.c +++ b/net/ethtool/common.c @@ -661,6 +661,12 @@ int ethtool_get_phc_vclocks(struct net_device *dev, int **vclock_index) } EXPORT_SYMBOL(ethtool_get_phc_vclocks); +int ethtool_get_ts_info_by_layer(struct net_device *dev, struct ethtool_ts_info *info) +{ + return __ethtool_get_ts_info(dev, info); +} +EXPORT_SYMBOL(ethtool_get_ts_info_by_layer); + const struct ethtool_phy_ops *ethtool_phy_ops; void ethtool_set_ethtool_phy_ops(const struct ethtool_phy_ops *ops)