]> www.infradead.org Git - users/hch/misc.git/commitdiff
net: wangxun: Support to get ts info
authorJiawen Wu <jiawenwu@trustnetic.com>
Tue, 18 Feb 2025 02:34:30 +0000 (10:34 +0800)
committerJakub Kicinski <kuba@kernel.org>
Thu, 20 Feb 2025 22:59:37 +0000 (14:59 -0800)
Implement the function get_ts_info and get_ts_stats in ethtool_ops to
get the HW capabilities and statistics for timestamping.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
Reviewed-by: Vadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20250218023432.146536-3-jiawenwu@trustnetic.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/wangxun/libwx/wx_ethtool.c
drivers/net/ethernet/wangxun/libwx/wx_ethtool.h
drivers/net/ethernet/wangxun/ngbe/ngbe_ethtool.c
drivers/net/ethernet/wangxun/txgbe/txgbe_ethtool.c

index c4b3b00b0926bc9054c9c0cbd06bdababbeda9e4..28f982fbc64c35d67d7171b67b0a0766d06413d3 100644 (file)
@@ -455,3 +455,53 @@ void wx_set_msglevel(struct net_device *netdev, u32 data)
        wx->msg_enable = data;
 }
 EXPORT_SYMBOL(wx_set_msglevel);
+
+int wx_get_ts_info(struct net_device *dev,
+                  struct kernel_ethtool_ts_info *info)
+{
+       struct wx *wx = netdev_priv(dev);
+
+       info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) |
+                          BIT(HWTSTAMP_FILTER_PTP_V1_L4_SYNC) |
+                          BIT(HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L2_EVENT) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L4_EVENT) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_SYNC) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L2_SYNC) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L4_SYNC) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_DELAY_REQ) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ) |
+                          BIT(HWTSTAMP_FILTER_PTP_V2_EVENT);
+
+       info->so_timestamping = SOF_TIMESTAMPING_TX_SOFTWARE |
+                               SOF_TIMESTAMPING_TX_HARDWARE |
+                               SOF_TIMESTAMPING_RX_HARDWARE |
+                               SOF_TIMESTAMPING_RAW_HARDWARE;
+
+       if (wx->ptp_clock)
+               info->phc_index = ptp_clock_index(wx->ptp_clock);
+       else
+               info->phc_index = -1;
+
+       info->tx_types = BIT(HWTSTAMP_TX_OFF) |
+                        BIT(HWTSTAMP_TX_ON);
+
+       return 0;
+}
+EXPORT_SYMBOL(wx_get_ts_info);
+
+void wx_get_ptp_stats(struct net_device *dev,
+                     struct ethtool_ts_stats *ts_stats)
+{
+       struct wx *wx = netdev_priv(dev);
+
+       if (wx->ptp_clock) {
+               ts_stats->pkts = wx->tx_hwtstamp_pkts;
+               ts_stats->lost = wx->tx_hwtstamp_timeouts +
+                                wx->tx_hwtstamp_skipped +
+                                wx->rx_hwtstamp_cleared;
+               ts_stats->err = wx->tx_hwtstamp_errors;
+       }
+}
+EXPORT_SYMBOL(wx_get_ptp_stats);
index 600c3b597d1a9072fad79d1a2461a3971fc48a79..9e002e699ecab373e8d6e740485007bc2eeade0b 100644 (file)
@@ -40,4 +40,8 @@ int wx_set_channels(struct net_device *dev,
                    struct ethtool_channels *ch);
 u32 wx_get_msglevel(struct net_device *netdev);
 void wx_set_msglevel(struct net_device *netdev, u32 data);
+int wx_get_ts_info(struct net_device *dev,
+                  struct kernel_ethtool_ts_info *info);
+void wx_get_ptp_stats(struct net_device *dev,
+                     struct ethtool_ts_stats *ts_stats);
 #endif /* _WX_ETHTOOL_H_ */
index e868f7ef492032ef5439a3d0fa530b2877bc370c..7e2d9ec38a3062447e45fe75e7a55be602aa2523 100644 (file)
@@ -138,6 +138,8 @@ static const struct ethtool_ops ngbe_ethtool_ops = {
        .set_channels           = ngbe_set_channels,
        .get_msglevel           = wx_get_msglevel,
        .set_msglevel           = wx_set_msglevel,
+       .get_ts_info            = wx_get_ts_info,
+       .get_ts_stats           = wx_get_ptp_stats,
 };
 
 void ngbe_set_ethtool_ops(struct net_device *netdev)
index d98314b26c19400513c6a0caeea8c12248c04ffa..78999d484f18e37b72450285ae2fa843877703f9 100644 (file)
@@ -529,6 +529,8 @@ static const struct ethtool_ops txgbe_ethtool_ops = {
        .set_rxnfc              = txgbe_set_rxnfc,
        .get_msglevel           = wx_get_msglevel,
        .set_msglevel           = wx_set_msglevel,
+       .get_ts_info            = wx_get_ts_info,
+       .get_ts_stats           = wx_get_ptp_stats,
 };
 
 void txgbe_set_ethtool_ops(struct net_device *netdev)