Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ethtool: add timestamping related string sets

Add three string sets related to timestamping information:

ETH_SS_SOF_TIMESTAMPING: SOF_TIMESTAMPING_* flags
ETH_SS_TS_TX_TYPES: timestamping Tx types
ETH_SS_TS_RX_FILTERS: timestamping Rx filters

These will be used for TIMESTAMP_GET request.

v2: avoid compiler warning ("enumeration value not handled in switch")
in net_hwtstamp_validate()

v3: omit dash in Tx type names ("one-step-*" -> "onestep-*"), suggested by
Richard Cochran

Signed-off-by: Michal Kubecek <mkubecek@suse.cz>
Acked-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Michal Kubecek and committed by
David S. Miller
f76510b4 6c5bc8fe

+87
+6
include/uapi/linux/ethtool.h
··· 596 596 * @ETH_SS_LINK_MODES: link mode names 597 597 * @ETH_SS_MSG_CLASSES: debug message class names 598 598 * @ETH_SS_WOL_MODES: wake-on-lan modes 599 + * @ETH_SS_SOF_TIMESTAMPING: SOF_TIMESTAMPING_* flags 600 + * @ETH_SS_TS_TX_TYPES: timestamping Tx types 601 + * @ETH_SS_TS_RX_FILTERS: timestamping Rx filters 599 602 */ 600 603 enum ethtool_stringset { 601 604 ETH_SS_TEST = 0, ··· 613 610 ETH_SS_LINK_MODES, 614 611 ETH_SS_MSG_CLASSES, 615 612 ETH_SS_WOL_MODES, 613 + ETH_SS_SOF_TIMESTAMPING, 614 + ETH_SS_TS_TX_TYPES, 615 + ETH_SS_TS_RX_FILTERS, 616 616 617 617 /* add new constants above here */ 618 618 ETH_SS_COUNT
+6
include/uapi/linux/net_tstamp.h
··· 98 98 * receive a time stamp via the socket error queue. 99 99 */ 100 100 HWTSTAMP_TX_ONESTEP_P2P, 101 + 102 + /* add new constants above here */ 103 + __HWTSTAMP_TX_CNT 101 104 }; 102 105 103 106 /* possible values for hwtstamp_config->rx_filter */ ··· 143 140 144 141 /* NTP, UDP, all versions and packet modes */ 145 142 HWTSTAMP_FILTER_NTP_ALL, 143 + 144 + /* add new constants above here */ 145 + __HWTSTAMP_FILTER_CNT 146 146 }; 147 147 148 148 /* SCM_TIMESTAMPING_PKTINFO control message */
+6
net/core/dev_ioctl.c
··· 190 190 case HWTSTAMP_TX_ONESTEP_P2P: 191 191 tx_type_valid = 1; 192 192 break; 193 + case __HWTSTAMP_TX_CNT: 194 + /* not a real value */ 195 + break; 193 196 } 194 197 195 198 switch (rx_filter) { ··· 213 210 case HWTSTAMP_FILTER_PTP_V2_DELAY_REQ: 214 211 case HWTSTAMP_FILTER_NTP_ALL: 215 212 rx_filter_valid = 1; 213 + break; 214 + case __HWTSTAMP_FILTER_CNT: 215 + /* not a real value */ 216 216 break; 217 217 } 218 218
+49
net/ethtool/common.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 3 + #include <linux/net_tstamp.h> 4 + 3 5 #include "common.h" 4 6 5 7 const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = { ··· 205 203 [const_ilog2(WAKE_FILTER)] = "filter", 206 204 }; 207 205 static_assert(ARRAY_SIZE(wol_mode_names) == WOL_MODE_COUNT); 206 + 207 + const char sof_timestamping_names[][ETH_GSTRING_LEN] = { 208 + [const_ilog2(SOF_TIMESTAMPING_TX_HARDWARE)] = "hardware-transmit", 209 + [const_ilog2(SOF_TIMESTAMPING_TX_SOFTWARE)] = "software-transmit", 210 + [const_ilog2(SOF_TIMESTAMPING_RX_HARDWARE)] = "hardware-receive", 211 + [const_ilog2(SOF_TIMESTAMPING_RX_SOFTWARE)] = "software-receive", 212 + [const_ilog2(SOF_TIMESTAMPING_SOFTWARE)] = "software-system-clock", 213 + [const_ilog2(SOF_TIMESTAMPING_SYS_HARDWARE)] = "hardware-legacy-clock", 214 + [const_ilog2(SOF_TIMESTAMPING_RAW_HARDWARE)] = "hardware-raw-clock", 215 + [const_ilog2(SOF_TIMESTAMPING_OPT_ID)] = "option-id", 216 + [const_ilog2(SOF_TIMESTAMPING_TX_SCHED)] = "sched-transmit", 217 + [const_ilog2(SOF_TIMESTAMPING_TX_ACK)] = "ack-transmit", 218 + [const_ilog2(SOF_TIMESTAMPING_OPT_CMSG)] = "option-cmsg", 219 + [const_ilog2(SOF_TIMESTAMPING_OPT_TSONLY)] = "option-tsonly", 220 + [const_ilog2(SOF_TIMESTAMPING_OPT_STATS)] = "option-stats", 221 + [const_ilog2(SOF_TIMESTAMPING_OPT_PKTINFO)] = "option-pktinfo", 222 + [const_ilog2(SOF_TIMESTAMPING_OPT_TX_SWHW)] = "option-tx-swhw", 223 + }; 224 + static_assert(ARRAY_SIZE(sof_timestamping_names) == __SOF_TIMESTAMPING_CNT); 225 + 226 + const char ts_tx_type_names[][ETH_GSTRING_LEN] = { 227 + [HWTSTAMP_TX_OFF] = "off", 228 + [HWTSTAMP_TX_ON] = "on", 229 + [HWTSTAMP_TX_ONESTEP_SYNC] = "onestep-sync", 230 + [HWTSTAMP_TX_ONESTEP_P2P] = "onestep-p2p", 231 + }; 232 + static_assert(ARRAY_SIZE(ts_tx_type_names) == __HWTSTAMP_TX_CNT); 233 + 234 + const char ts_rx_filter_names[][ETH_GSTRING_LEN] = { 235 + [HWTSTAMP_FILTER_NONE] = "none", 236 + [HWTSTAMP_FILTER_ALL] = "all", 237 + [HWTSTAMP_FILTER_SOME] = "some", 238 + [HWTSTAMP_FILTER_PTP_V1_L4_EVENT] = "ptpv1-l4-event", 239 + [HWTSTAMP_FILTER_PTP_V1_L4_SYNC] = "ptpv1-l4-sync", 240 + [HWTSTAMP_FILTER_PTP_V1_L4_DELAY_REQ] = "ptpv1-l4-delay-req", 241 + [HWTSTAMP_FILTER_PTP_V2_L4_EVENT] = "ptpv2-l4-event", 242 + [HWTSTAMP_FILTER_PTP_V2_L4_SYNC] = "ptpv2-l4-sync", 243 + [HWTSTAMP_FILTER_PTP_V2_L4_DELAY_REQ] = "ptpv2-l4-delay-req", 244 + [HWTSTAMP_FILTER_PTP_V2_L2_EVENT] = "ptpv2-l2-event", 245 + [HWTSTAMP_FILTER_PTP_V2_L2_SYNC] = "ptpv2-l2-sync", 246 + [HWTSTAMP_FILTER_PTP_V2_L2_DELAY_REQ] = "ptpv2-l2-delay-req", 247 + [HWTSTAMP_FILTER_PTP_V2_EVENT] = "ptpv2-event", 248 + [HWTSTAMP_FILTER_PTP_V2_SYNC] = "ptpv2-sync", 249 + [HWTSTAMP_FILTER_PTP_V2_DELAY_REQ] = "ptpv2-delay-req", 250 + [HWTSTAMP_FILTER_NTP_ALL] = "ntp-all", 251 + }; 252 + static_assert(ARRAY_SIZE(ts_rx_filter_names) == __HWTSTAMP_FILTER_CNT); 208 253 209 254 /* return false if legacy contained non-0 deprecated fields 210 255 * maxtxpkt/maxrxpkt. rest of ksettings always updated
+5
net/ethtool/common.h
··· 12 12 #define ETHTOOL_LINK_MODE(speed, type, duplex) \ 13 13 ETHTOOL_LINK_MODE_ ## speed ## base ## type ## _ ## duplex ## _BIT 14 14 15 + #define __SOF_TIMESTAMPING_CNT (const_ilog2(SOF_TIMESTAMPING_LAST) + 1) 16 + 15 17 extern const char 16 18 netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN]; 17 19 extern const char ··· 25 23 extern const char link_mode_names[][ETH_GSTRING_LEN]; 26 24 extern const char netif_msg_class_names[][ETH_GSTRING_LEN]; 27 25 extern const char wol_mode_names[][ETH_GSTRING_LEN]; 26 + extern const char sof_timestamping_names[][ETH_GSTRING_LEN]; 27 + extern const char ts_tx_type_names[][ETH_GSTRING_LEN]; 28 + extern const char ts_rx_filter_names[][ETH_GSTRING_LEN]; 28 29 29 30 int __ethtool_get_link(struct net_device *dev); 30 31
+15
net/ethtool/strset.c
··· 60 60 .count = WOL_MODE_COUNT, 61 61 .strings = wol_mode_names, 62 62 }, 63 + [ETH_SS_SOF_TIMESTAMPING] = { 64 + .per_dev = false, 65 + .count = __SOF_TIMESTAMPING_CNT, 66 + .strings = sof_timestamping_names, 67 + }, 68 + [ETH_SS_TS_TX_TYPES] = { 69 + .per_dev = false, 70 + .count = __HWTSTAMP_TX_CNT, 71 + .strings = ts_tx_type_names, 72 + }, 73 + [ETH_SS_TS_RX_FILTERS] = { 74 + .per_dev = false, 75 + .count = __HWTSTAMP_FILTER_CNT, 76 + .strings = ts_rx_filter_names, 77 + }, 63 78 }; 64 79 65 80 struct strset_req_info {