Commit 4ff4d86f authored by Kory Maincent's avatar Kory Maincent Committed by Paolo Abeni
Browse files

net: Add support for providing the PTP hardware source in tsinfo



Multi-PTP source support within a network topology has been merged,
but the hardware timestamp source is not yet exposed to users.
Currently, users only see the PTP index, which does not indicate
whether the timestamp comes from a PHY or a MAC.

Add support for reporting the hwtstamp source using a
hwtstamp-source field, alongside hwtstamp-phyindex, to describe
the origin of the hardware timestamp.

Remove HWTSTAMP_SOURCE_UNSPEC enum value as it is not used at all.

Signed-off-by: default avatarKory Maincent <kory.maincent@bootlin.com>
Link: https://patch.msgid.link/20250519-feature_ptp_source-v4-1-5d10e19a0265@bootlin.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 3da895b2
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -98,6 +98,24 @@ definitions:
    name: tcp-data-split
    type: enum
    entries: [ unknown, disabled, enabled ]
  -
    name: hwtstamp-source
    doc: Source of the hardware timestamp
    enum-name: hwtstamp-source
    name-prefix: hwtstamp-source-
    type: enum
    entries:
      -
        name: netdev
        doc: |
          Hardware timestamp comes from a MAC or a device
          which has MAC and PHY integrated
        value: 1
      -
        name: phylib
        doc: |
          Hardware timestamp comes from one PHY device
          of the network topology

attribute-sets:
  -
@@ -896,6 +914,13 @@ attribute-sets:
        name: hwtstamp-provider
        type: nest
        nested-attributes: ts-hwtstamp-provider
      -
        name: hwtstamp-source
        type: u32
        enum: hwtstamp-source
      -
        name: hwtstamp-phyindex
        type: u32
  -
    name: cable-result
    attr-cnt-name: __ethtool-a-cable-result-cnt
@@ -1981,6 +2006,8 @@ operations:
            - phc-index
            - stats
            - hwtstamp-provider
            - hwtstamp-source
            - hwtstamp-phyindex
      dump: *tsinfo-get-op
    -
      name: cable-test-act
+5 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@
#include <linux/netlink.h>
#include <linux/timer_types.h>
#include <uapi/linux/ethtool.h>
#include <uapi/linux/ethtool_netlink_generated.h>
#include <uapi/linux/net_tstamp.h>

#define ETHTOOL_MM_MAX_VERIFY_TIME_MS		128
@@ -830,6 +831,8 @@ struct ethtool_rxfh_param {
 * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags
 * @phc_index: device index of the associated PHC, or -1 if there is none
 * @phc_qualifier: qualifier of the associated PHC
 * @phc_source: source device of the associated PHC
 * @phc_phyindex: index of PHY device source of the associated PHC
 * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values
 * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values
 */
@@ -838,6 +841,8 @@ struct kernel_ethtool_ts_info {
	u32 so_timestamping;
	int phc_index;
	enum hwtstamp_provider_qualifier phc_qualifier;
	enum hwtstamp_source phc_source;
	int phc_phyindex;
	enum hwtstamp_tx_types tx_types;
	enum hwtstamp_rx_filters rx_filters;
};
+1 −6
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@
#define _LINUX_NET_TIMESTAMPING_H_

#include <uapi/linux/net_tstamp.h>
#include <uapi/linux/ethtool_netlink_generated.h>

#define SOF_TIMESTAMPING_SOFTWARE_MASK	(SOF_TIMESTAMPING_RX_SOFTWARE | \
					 SOF_TIMESTAMPING_TX_SOFTWARE | \
@@ -13,12 +14,6 @@
					 SOF_TIMESTAMPING_TX_HARDWARE | \
					 SOF_TIMESTAMPING_RAW_HARDWARE)

enum hwtstamp_source {
	HWTSTAMP_SOURCE_UNSPEC,
	HWTSTAMP_SOURCE_NETDEV,
	HWTSTAMP_SOURCE_PHYLIB,
};

/**
 * struct hwtstamp_provider_desc - hwtstamp provider description
 *
+14 −0
Original line number Diff line number Diff line
@@ -37,6 +37,18 @@ enum ethtool_tcp_data_split {
	ETHTOOL_TCP_DATA_SPLIT_ENABLED,
};

/**
 * enum hwtstamp_source - Source of the hardware timestamp
 * @HWTSTAMP_SOURCE_NETDEV: Hardware timestamp comes from a MAC or a device
 *   which has MAC and PHY integrated
 * @HWTSTAMP_SOURCE_PHYLIB: Hardware timestamp comes from one PHY device of the
 *   network topology
 */
enum hwtstamp_source {
	HWTSTAMP_SOURCE_NETDEV = 1,
	HWTSTAMP_SOURCE_PHYLIB,
};

enum {
	ETHTOOL_A_HEADER_UNSPEC,
	ETHTOOL_A_HEADER_DEV_INDEX,
@@ -401,6 +413,8 @@ enum {
	ETHTOOL_A_TSINFO_PHC_INDEX,
	ETHTOOL_A_TSINFO_STATS,
	ETHTOOL_A_TSINFO_HWTSTAMP_PROVIDER,
	ETHTOOL_A_TSINFO_HWTSTAMP_SOURCE,
	ETHTOOL_A_TSINFO_HWTSTAMP_PHYINDEX,

	__ETHTOOL_A_TSINFO_CNT,
	ETHTOOL_A_TSINFO_MAX = (__ETHTOOL_A_TSINFO_CNT - 1)
+24 −5
Original line number Diff line number Diff line
@@ -921,9 +921,18 @@ int ethtool_get_ts_info_by_phc(struct net_device *dev,

		phy = ethtool_phy_get_ts_info_by_phc(dev, info, hwprov_desc);
		if (IS_ERR(phy))
			err = PTR_ERR(phy);
		else
			return PTR_ERR(phy);

		/* Report the phc source only if we have a real
		 * phc source with an index.
		 */
		if (info->phc_index >= 0) {
			info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
			info->phc_phyindex = phy->phyindex;
		}
		err = 0;
	} else if (!err && info->phc_index >= 0) {
		info->phc_source = HWTSTAMP_SOURCE_NETDEV;
	}

	info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
@@ -947,10 +956,20 @@ int __ethtool_get_ts_info(struct net_device *dev,

		ethtool_init_tsinfo(info);
		if (phy_is_default_hwtstamp(phydev) &&
		    phy_has_tsinfo(phydev))
		    phy_has_tsinfo(phydev)) {
			err = phy_ts_info(phydev, info);
		else if (ops->get_ts_info)
			/* Report the phc source only if we have a real
			 * phc source with an index.
			 */
			if (!err && info->phc_index >= 0) {
				info->phc_source = HWTSTAMP_SOURCE_PHYLIB;
				info->phc_phyindex = phydev->phyindex;
			}
		} else if (ops->get_ts_info) {
			err = ops->get_ts_info(dev, info);
			if (!err && info->phc_index >= 0)
				info->phc_source = HWTSTAMP_SOURCE_NETDEV;
		}

		info->so_timestamping |= SOF_TIMESTAMPING_RX_SOFTWARE |
					 SOF_TIMESTAMPING_SOFTWARE;
Loading